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);
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to