Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 6 Oct 2012 19:40:13 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r241289 - head/sys/boot/zfs
Message-ID:  <201210061940.q96JeDAj027175@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Sat Oct  6 19:40:12 2012
New Revision: 241289
URL: http://svn.freebsd.org/changeset/base/241289

Log:
  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

Modified:
  head/sys/boot/zfs/zfs.c
  head/sys/boot/zfs/zfsimpl.c

Modified: head/sys/boot/zfs/zfs.c
==============================================================================
--- head/sys/boot/zfs/zfs.c	Sat Oct  6 19:38:33 2012	(r241288)
+++ head/sys/boot/zfs/zfs.c	Sat Oct  6 19:40:12 2012	(r241289)
@@ -370,10 +370,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);
 }
 
@@ -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, 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);
@@ -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

Modified: head/sys/boot/zfs/zfsimpl.c
==============================================================================
--- head/sys/boot/zfs/zfsimpl.c	Sat Oct  6 19:38:33 2012	(r241288)
+++ head/sys/boot/zfs/zfsimpl.c	Sat Oct  6 19:40:12 2012	(r241289)
@@ -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);
 }
 



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