Add AUTHORS to master branch
[zfs.git] / module / zfs / spa_config.c
index ee425a9..b2063bb 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -36,6 +36,7 @@
 #include <sys/sunddi.h>
 #ifdef _KERNEL
 #include <sys/kobj.h>
+#include <sys/zone.h>
 #endif
 
 /*
@@ -208,6 +209,9 @@ spa_config_sync(spa_t *target, boolean_t removing, boolean_t postsysevent)
 
        ASSERT(MUTEX_HELD(&spa_namespace_lock));
 
+       if (rootdir == NULL || !(spa_mode_global & FWRITE))
+               return;
+
        /*
         * Iterate over all cachefiles for the pool, past or present.  When the
         * cachefile is changed, the new one is pushed onto this list, allowing
@@ -349,7 +353,15 @@ spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg, int getstats)
            txg) == 0);
        VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_GUID,
            spa_guid(spa)) == 0);
+#ifdef _KERNEL
+       hostid = zone_get_hostid(NULL);
+#else  /* _KERNEL */
+       /*
+        * We're emulating the system's hostid in userland, so we can't use
+        * zone_get_hostid().
+        */
        (void) ddi_strtoul(hw_serial, NULL, 10, &hostid);
+#endif /* _KERNEL */
        if (hostid != 0) {
                VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_HOSTID,
                    hostid) == 0);
@@ -382,23 +394,12 @@ spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg, int getstats)
 }
 
 /*
- * For a pool that's not currently a booting rootpool, update all disk labels,
- * generate a fresh config based on the current in-core state, and sync the
- * global config cache.
- */
-void
-spa_config_update(spa_t *spa, int what)
-{
-       spa_config_update_common(spa, what, FALSE);
-}
-
-/*
  * Update all disk labels, generate a fresh config based on the current
  * in-core state, and sync the global config cache (do not sync the config
  * cache if this is a booting rootpool).
  */
 void
-spa_config_update_common(spa_t *spa, int what, boolean_t isroot)
+spa_config_update(spa_t *spa, int what)
 {
        vdev_t *rvd = spa->spa_root_vdev;
        uint64_t txg;
@@ -420,10 +421,9 @@ spa_config_update_common(spa_t *spa, int what, boolean_t isroot)
                 */
                for (c = 0; c < rvd->vdev_children; c++) {
                        vdev_t *tvd = rvd->vdev_child[c];
-                       if (tvd->vdev_ms_array == 0) {
-                               vdev_init(tvd, txg);
-                               vdev_config_dirty(tvd);
-                       }
+                       if (tvd->vdev_ms_array == 0)
+                               vdev_metaslab_set_size(tvd);
+                       vdev_expand(tvd, txg);
                }
        }
        spa_config_exit(spa, SCL_ALL, FTAG);
@@ -436,9 +436,9 @@ spa_config_update_common(spa_t *spa, int what, boolean_t isroot)
        /*
         * Update the global config cache to reflect the new mosconfig.
         */
-       if (!isroot)
+       if (!spa->spa_is_root)
                spa_config_sync(spa, B_FALSE, what != SPA_CONFIG_UPDATE_POOL);
 
        if (what == SPA_CONFIG_UPDATE_POOL)
-               spa_config_update_common(spa, SPA_CONFIG_UPDATE_VDEVS, isroot);
+               spa_config_update(spa, SPA_CONFIG_UPDATE_VDEVS);
 }