Print this page
4101 metaslab_debug should allow for fine-grained control
4102 space_maps should store more information about themselves
4103 space map object blocksize should be increased
4104 ::spa_space no longer works
4105 removing a mirrored log device results in a leaked object
4106 asynchronously load metaslab
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Sebastien Roy <seb@delphix.com>

@@ -1225,11 +1225,20 @@
                 spa->spa_async_zio_root = NULL;
         }
 
         bpobj_close(&spa->spa_deferred_bpobj);
 
+        spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
+
         /*
+         * Close all vdevs.
+         */
+        if (spa->spa_root_vdev)
+                vdev_free(spa->spa_root_vdev);
+        ASSERT(spa->spa_root_vdev == NULL);
+
+        /*
          * Close the dsl pool.
          */
         if (spa->spa_dsl_pool) {
                 dsl_pool_close(spa->spa_dsl_pool);
                 spa->spa_dsl_pool = NULL;

@@ -1236,24 +1245,16 @@
                 spa->spa_meta_objset = NULL;
         }
 
         ddt_unload(spa);
 
-        spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
 
         /*
          * Drop and purge level 2 cache
          */
         spa_l2cache_drop(spa);
 
-        /*
-         * Close all vdevs.
-         */
-        if (spa->spa_root_vdev)
-                vdev_free(spa->spa_root_vdev);
-        ASSERT(spa->spa_root_vdev == NULL);
-
         for (i = 0; i < spa->spa_spares.sav_count; i++)
                 vdev_free(spa->spa_spares.sav_vdevs[i]);
         if (spa->spa_spares.sav_vdevs) {
                 kmem_free(spa->spa_spares.sav_vdevs,
                     spa->spa_spares.sav_count * sizeof (void *));

@@ -4499,11 +4500,13 @@
          * Mark newvd's DTL dirty in this txg.
          */
         vdev_dirty(tvd, VDD_DTL, newvd, txg);
 
         /*
-         * Restart the resilver
+         * Schedule the resilver to restart in the future. We do this to
+         * ensure that dmu_sync-ed blocks have been stitched into the
+         * respective datasets.
          */
         dsl_resilver_restart(spa->spa_dsl_pool, dtl_max_txg);
 
         /*
          * Commit the config

@@ -5121,11 +5124,11 @@
          * associated with this vdev, and wait for these changes to sync.
          */
         ASSERT0(vd->vdev_stat.vs_alloc);
         txg = spa_vdev_config_enter(spa);
         vd->vdev_removing = B_TRUE;
-        vdev_dirty(vd, 0, NULL, txg);
+        vdev_dirty_leaves(vd, VDD_DTL, txg);
         vdev_config_dirty(vd);
         spa_vdev_config_exit(spa, NULL, txg, 0, FTAG);
 
         return (0);
 }

@@ -5921,19 +5924,19 @@
                          * We checked this earlier in spa_prop_validate().
                          */
                         ASSERT(zpool_prop_feature(nvpair_name(elem)));
 
                         fname = strchr(nvpair_name(elem), '@') + 1;
-                        VERIFY3U(0, ==, zfeature_lookup_name(fname, &feature));
+                        VERIFY0(zfeature_lookup_name(fname, &feature));
 
                         spa_feature_enable(spa, feature, tx);
                         spa_history_log_internal(spa, "set", tx,
                             "%s=enabled", nvpair_name(elem));
                         break;
 
                 case ZPOOL_PROP_VERSION:
-                        VERIFY(nvpair_value_uint64(elem, &intval) == 0);
+                        intval = fnvpair_value_uint64(elem);
                         /*
                          * The version is synced seperatly before other
                          * properties and should be correct by now.
                          */
                         ASSERT3U(spa_version(spa), >=, intval);

@@ -5953,11 +5956,11 @@
                          * 'readonly' and 'cachefile' are also non-persisitent
                          * properties.
                          */
                         break;
                 case ZPOOL_PROP_COMMENT:
-                        VERIFY(nvpair_value_string(elem, &strval) == 0);
+                        strval = fnvpair_value_string(elem);
                         if (spa->spa_comment != NULL)
                                 spa_strfree(spa->spa_comment);
                         spa->spa_comment = spa_strdup(strval);
                         /*
                          * We need to dirty the configuration on all the vdevs

@@ -5985,27 +5988,27 @@
                         propname = zpool_prop_to_name(prop);
                         proptype = zpool_prop_get_type(prop);
 
                         if (nvpair_type(elem) == DATA_TYPE_STRING) {
                                 ASSERT(proptype == PROP_TYPE_STRING);
-                                VERIFY(nvpair_value_string(elem, &strval) == 0);
-                                VERIFY(zap_update(mos,
+                                strval = fnvpair_value_string(elem);
+                                VERIFY0(zap_update(mos,
                                     spa->spa_pool_props_object, propname,
-                                    1, strlen(strval) + 1, strval, tx) == 0);
+                                    1, strlen(strval) + 1, strval, tx));
                                 spa_history_log_internal(spa, "set", tx,
                                     "%s=%s", nvpair_name(elem), strval);
                         } else if (nvpair_type(elem) == DATA_TYPE_UINT64) {
-                                VERIFY(nvpair_value_uint64(elem, &intval) == 0);
+                                intval = fnvpair_value_uint64(elem);
 
                                 if (proptype == PROP_TYPE_INDEX) {
                                         const char *unused;
-                                        VERIFY(zpool_prop_index_to_string(
-                                            prop, intval, &unused) == 0);
+                                        VERIFY0(zpool_prop_index_to_string(
+                                            prop, intval, &unused));
                                 }
-                                VERIFY(zap_update(mos,
+                                VERIFY0(zap_update(mos,
                                     spa->spa_pool_props_object, propname,
-                                    8, 1, &intval, tx) == 0);
+                                    8, 1, &intval, tx));
                                 spa_history_log_internal(spa, "set", tx,
                                     "%s=%lld", nvpair_name(elem), intval);
                         } else {
                                 ASSERT(0); /* not allowed */
                         }