Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Oct 2012 15:47:57 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r242230 - stable/9/sys/boot/zfs
Message-ID:  <201210281547.q9SFlvBi041969@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Sun Oct 28 15:47:56 2012
New Revision: 242230
URL: http://svn.freebsd.org/changeset/base/242230

Log:
  MFC r241289: boot/zfs: call zfs_spa_init for all found pools

Modified:
  stable/9/sys/boot/zfs/zfs.c
  stable/9/sys/boot/zfs/zfsimpl.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/boot/   (props changed)

Modified: stable/9/sys/boot/zfs/zfs.c
==============================================================================
--- stable/9/sys/boot/zfs/zfs.c	Sun Oct 28 15:45:18 2012	(r242229)
+++ stable/9/sys/boot/zfs/zfs.c	Sun Oct 28 15:47:56 2012	(r242230)
@@ -369,10 +369,28 @@ vdev_read(vdev_t *vdev, void *priv, off_
 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 @@ 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) {
@@ -517,9 +532,6 @@ zfs_parsedev(struct zfs_devdesc *dev, co
 	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 @@ 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);
@@ -597,9 +605,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

Modified: stable/9/sys/boot/zfs/zfsimpl.c
==============================================================================
--- stable/9/sys/boot/zfs/zfsimpl.c	Sun Oct 28 15:45:18 2012	(r242229)
+++ stable/9/sys/boot/zfs/zfsimpl.c	Sun Oct 28 15:47:56 2012	(r242230)
@@ -1826,13 +1826,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);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210281547.q9SFlvBi041969>