Author: avg
Date: Sun Oct 28 15:48:15 2012
New Revision: 242231
URL: http://svn.freebsd.org/changeset/base/242231

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

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

Modified: stable/8/sys/boot/zfs/zfs.c
==============================================================================
--- stable/8/sys/boot/zfs/zfs.c Sun Oct 28 15:47:56 2012        (r242230)
+++ stable/8/sys/boot/zfs/zfs.c Sun Oct 28 15:48:15 2012        (r242231)
@@ -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/8/sys/boot/zfs/zfsimpl.c
==============================================================================
--- stable/8/sys/boot/zfs/zfsimpl.c     Sun Oct 28 15:47:56 2012        
(r242230)
+++ stable/8/sys/boot/zfs/zfsimpl.c     Sun Oct 28 15:48:15 2012        
(r242231)
@@ -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);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to