[Midnightbsd-cvs] src [8292] trunk/sys/boot/zfs: zfs boot: call zfs_spa_init
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Sat Sep 17 18:09:37 EDT 2016
Revision: 8292
http://svnweb.midnightbsd.org/src/?rev=8292
Author: laffer1
Date: 2016-09-17 18:09:37 -0400 (Sat, 17 Sep 2016)
Log Message:
-----------
zfs boot: call zfs_spa_init
Modified Paths:
--------------
trunk/sys/boot/zfs/zfs.c
trunk/sys/boot/zfs/zfsimpl.c
Modified: trunk/sys/boot/zfs/zfs.c
===================================================================
--- trunk/sys/boot/zfs/zfs.c 2016-09-17 22:09:15 UTC (rev 8291)
+++ trunk/sys/boot/zfs/zfs.c 2016-09-17 22:09:37 UTC (rev 8292)
@@ -369,10 +369,28 @@
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);
}
@@ -435,9 +453,6 @@
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) {
@@ -517,9 +532,6 @@
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);
@@ -554,10 +566,6 @@
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);
@@ -597,9 +605,6 @@
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
Modified: trunk/sys/boot/zfs/zfsimpl.c
===================================================================
--- trunk/sys/boot/zfs/zfsimpl.c 2016-09-17 22:09:15 UTC (rev 8291)
+++ trunk/sys/boot/zfs/zfsimpl.c 2016-09-17 22:09:37 UTC (rev 8292)
@@ -1826,13 +1826,14 @@
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);
}
More information about the Midnightbsd-cvs
mailing list