[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