mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-06 16:40:47 +00:00
boot/zfs: call zfs_spa_init for all found pools
... and drop those for which it fails. Also, add more sanity checking to the function. MFC after: 16 days
This commit is contained in:
parent
f152e0b5be
commit
62c725a9db
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=241289
|
@ -370,10 +370,28 @@ vdev_read(vdev_t *vdev, void *priv, off_t offset, void *buf, size_t size)
|
|||
static int
|
||||
zfs_dev_init(void)
|
||||
{
|
||||
spa_t *spa;
|
||||
spa_t *next;
|
||||
spa_t *prev;
|
||||
|
||||
zfs_init();
|
||||
if (archsw.arch_zfs_probe == NULL)
|
||||
return (ENXIO);
|
||||
archsw.arch_zfs_probe();
|
||||
|
||||
prev = NULL;
|
||||
spa = STAILQ_FIRST(&zfs_pools);
|
||||
while (spa != NULL) {
|
||||
next = STAILQ_NEXT(spa, spa_link);
|
||||
if (zfs_spa_init(spa)) {
|
||||
if (prev == NULL)
|
||||
STAILQ_REMOVE_HEAD(&zfs_pools, spa_link);
|
||||
else
|
||||
STAILQ_REMOVE_AFTER(&zfs_pools, prev, spa_link);
|
||||
} else
|
||||
prev = spa;
|
||||
spa = next;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
@ -519,9 +537,6 @@ zfs_dev_open(struct open_file *f, ...)
|
|||
spa = spa_find_by_guid(dev->pool_guid);
|
||||
if (!spa)
|
||||
return (ENXIO);
|
||||
rv = zfs_spa_init(spa);
|
||||
if (rv != 0)
|
||||
return (rv);
|
||||
mount = malloc(sizeof(*mount));
|
||||
rv = zfs_mount(spa, dev->root_guid, mount);
|
||||
if (rv != 0) {
|
||||
|
@ -601,9 +616,6 @@ zfs_parsedev(struct zfs_devdesc *dev, const char *devspec, const char **path)
|
|||
spa = spa_find_by_name(poolname);
|
||||
if (!spa)
|
||||
return (ENXIO);
|
||||
rv = zfs_spa_init(spa);
|
||||
if (rv != 0)
|
||||
return (rv);
|
||||
dev->pool_guid = spa->spa_guid;
|
||||
if (rootname[0] != '\0') {
|
||||
rv = zfs_lookup_dataset(spa, rootname, &dev->root_guid);
|
||||
|
@ -638,10 +650,6 @@ zfs_fmtdev(void *vdev)
|
|||
printf("ZFS: can't find pool by guid\n");
|
||||
return (buf);
|
||||
}
|
||||
if (zfs_spa_init(spa) != 0) {
|
||||
printf("ZFS: can't init pool\n");
|
||||
return (buf);
|
||||
}
|
||||
if (dev->root_guid == 0 && zfs_get_root(spa, &dev->root_guid)) {
|
||||
printf("ZFS: can't find root filesystem\n");
|
||||
return (buf);
|
||||
|
@ -681,9 +689,6 @@ zfs_list(const char *name)
|
|||
spa = spa_find_by_name(poolname);
|
||||
if (!spa)
|
||||
return (ENXIO);
|
||||
rv = zfs_spa_init(spa);
|
||||
if (rv != 0)
|
||||
return (rv);
|
||||
if (dsname != NULL)
|
||||
rv = zfs_lookup_dataset(spa, dsname, &objid);
|
||||
else
|
||||
|
|
|
@ -1881,13 +1881,14 @@ static int
|
|||
zfs_spa_init(spa_t *spa)
|
||||
{
|
||||
|
||||
if (spa->spa_inited)
|
||||
return (0);
|
||||
if (zio_read(spa, &spa->spa_uberblock.ub_rootbp, &spa->spa_mos)) {
|
||||
printf("ZFS: can't read MOS of pool %s\n", spa->spa_name);
|
||||
return (EIO);
|
||||
}
|
||||
spa->spa_inited = 1;
|
||||
if (spa->spa_mos.os_type != DMU_OST_META) {
|
||||
printf("ZFS: corrupted MOS of pool %s\n", spa->spa_name);
|
||||
return (EIO);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue