Illumos #3006
[zfs.git] / module / zfs / dsl_dataset.c
index 872d44a..c1a029b 100644 (file)
@@ -105,14 +105,8 @@ dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx)
        ASSERT(BP_GET_TYPE(bp) != DMU_OT_NONE);
        ASSERT(DMU_OT_IS_VALID(BP_GET_TYPE(bp)));
        if (ds == NULL) {
-               /*
-                * Account for the meta-objset space in its placeholder
-                * dsl_dir.
-                */
-               ASSERT3U(compressed, ==, uncompressed); /* it's all metadata */
-               dsl_dir_diduse_space(tx->tx_pool->dp_mos_dir, DD_USED_HEAD,
-                   used, compressed, uncompressed, tx);
-               dsl_dir_dirty(tx->tx_pool->dp_mos_dir, tx);
+               dsl_pool_mos_diduse_space(tx->tx_pool,
+                   used, compressed, uncompressed);
                return;
        }
        dmu_buf_will_dirty(ds->ds_dbuf, tx);
@@ -150,15 +144,9 @@ dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx,
 
        ASSERT(used > 0);
        if (ds == NULL) {
-               /*
-                * Account for the meta-objset space in its placeholder
-                * dataset.
-                */
                dsl_free(tx->tx_pool, tx->tx_txg, bp);
-
-               dsl_dir_diduse_space(tx->tx_pool->dp_mos_dir, DD_USED_HEAD,
-                   -used, -compressed, -uncompressed, tx);
-               dsl_dir_dirty(tx->tx_pool->dp_mos_dir, tx);
+               dsl_pool_mos_diduse_space(tx->tx_pool,
+                   -used, -compressed, -uncompressed);
                return (used);
        }
        ASSERT3P(tx->tx_pool, ==, ds->ds_dir->dd_pool);
@@ -326,7 +314,7 @@ dsl_dataset_get_snapname(dsl_dataset_t *ds)
        return (err);
 }
 
-static int
+int
 dsl_dataset_snap_lookup(dsl_dataset_t *ds, const char *name, uint64_t *value)
 {
        objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
@@ -1074,26 +1062,26 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
        dummy_ds->ds_dir = dd;
        dummy_ds->ds_object = ds->ds_object;
 
-       /*
-        * Check for errors and mark this ds as inconsistent, in
-        * case we crash while freeing the objects.
-        */
-       err = dsl_sync_task_do(dd->dd_pool, dsl_dataset_destroy_begin_check,
-           dsl_dataset_destroy_begin_sync, ds, NULL, 0);
-       if (err)
-               goto out_free;
-
-       err = dmu_objset_from_ds(ds, &os);
-       if (err)
-               goto out_free;
-
-       /*
-        * If async destruction is not enabled try to remove all objects
-        * while in the open context so that there is less work to do in
-        * the syncing context.
-        */
        if (!spa_feature_is_enabled(dsl_dataset_get_spa(ds),
            &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY])) {
+               /*
+                * Check for errors and mark this ds as inconsistent, in
+                * case we crash while freeing the objects.
+                */
+               err = dsl_sync_task_do(dd->dd_pool,
+                   dsl_dataset_destroy_begin_check,
+                   dsl_dataset_destroy_begin_sync, ds, NULL, 0);
+               if (err)
+                       goto out_free;
+
+               err = dmu_objset_from_ds(ds, &os);
+               if (err)
+                       goto out_free;
+
+               /*
+                * Remove all objects while in the open context so that
+                * there is less work to do in the syncing context.
+                */
                for (obj = 0; err == 0; err = dmu_object_next(os, &obj, FALSE,
                    ds->ds_phys->ds_prev_snap_txg)) {
                        /*
@@ -1104,29 +1092,25 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
                }
                if (err != ESRCH)
                        goto out_free;
-       }
 
-       /*
-        * Only the ZIL knows how to free log blocks.
-        */
-       zil_destroy(dmu_objset_zil(os), B_FALSE);
-
-       /*
-        * Sync out all in-flight IO.
-        */
-       txg_wait_synced(dd->dd_pool, 0);
+               /*
+                * Sync out all in-flight IO.
+                */
+               txg_wait_synced(dd->dd_pool, 0);
 
-       /*
-        * If we managed to free all the objects in open
-        * context, the user space accounting should be zero.
-        */
-       if (ds->ds_phys->ds_bp.blk_fill == 0 &&
-           dmu_objset_userused_enabled(os)) {
-               ASSERTV(uint64_t count);
-               ASSERT(zap_count(os, DMU_USERUSED_OBJECT, &count) != 0 ||
-                   count == 0);
-               ASSERT(zap_count(os, DMU_GROUPUSED_OBJECT, &count) != 0 ||
-                   count == 0);
+               /*
+                * If we managed to free all the objects in open
+                * context, the user space accounting should be zero.
+                */
+               if (ds->ds_phys->ds_bp.blk_fill == 0 &&
+                   dmu_objset_userused_enabled(os)) {
+                       ASSERTV(uint64_t count);
+
+                       ASSERT(zap_count(os, DMU_USERUSED_OBJECT,
+                           &count) != 0 || count == 0);
+                       ASSERT(zap_count(os, DMU_GROUPUSED_OBJECT,
+                           &count) != 0 || count == 0);
+               }
        }
 
        rw_enter(&dd->dd_pool->dp_config_rwlock, RW_READER);
@@ -1527,7 +1511,7 @@ remove_from_next_clones(dsl_dataset_t *ds, uint64_t obj, dmu_tx_t *tx)
         * remove this one.
         */
        if (err != ENOENT) {
-               VERIFY3U(err, ==, 0);
+               VERIFY0(err);
        }
        ASSERT3U(0, ==, zap_count(mos, ds->ds_phys->ds_next_clones_obj,
            &count));
@@ -1614,7 +1598,7 @@ process_old_deadlist(dsl_dataset_t *ds, dsl_dataset_t *ds_prev,
        poa.pio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
        VERIFY3U(0, ==, bpobj_iterate(&ds_next->ds_deadlist.dl_bpobj,
            process_old_cb, &poa, tx));
-       VERIFY3U(zio_wait(poa.pio), ==, 0);
+       VERIFY0(zio_wait(poa.pio));
        ASSERT3U(poa.used, ==, ds->ds_phys->ds_unique_bytes);
 
        /* change snapused */
@@ -1649,7 +1633,7 @@ old_synchronous_dataset_destroy(dsl_dataset_t *ds, dmu_tx_t *tx)
        err = traverse_dataset(ds,
            ds->ds_phys->ds_prev_snap_txg, TRAVERSE_POST,
            kill_blkptr, &ka);
-       ASSERT3U(err, ==, 0);
+       ASSERT0(err);
        ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0);
 
        return (err);
@@ -1701,7 +1685,7 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx)
                psa.psa_effective_value = 0;    /* predict default value */
 
                dsl_dataset_set_reservation_sync(ds, &psa, tx);
-               ASSERT3U(ds->ds_reserved, ==, 0);
+               ASSERT0(ds->ds_reserved);
        }
 
        ASSERT(RW_WRITE_HELD(&dp->dp_config_rwlock));
@@ -1878,6 +1862,7 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx)
        } else {
                zfeature_info_t *async_destroy =
                    &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY];
+               objset_t *os;
 
                /*
                 * There's no next snapshot, so this is a head dataset.
@@ -1889,6 +1874,8 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx)
                dsl_deadlist_free(mos, ds->ds_phys->ds_deadlist_obj, tx);
                ds->ds_phys->ds_deadlist_obj = 0;
 
+               VERIFY3U(0, ==, dmu_objset_from_ds(ds, &os));
+
                if (!spa_feature_is_enabled(dp->dp_spa, async_destroy)) {
                        err = old_synchronous_dataset_destroy(ds, tx);
                } else {
@@ -1898,12 +1885,12 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx)
                         */
                        uint64_t used, comp, uncomp;
 
-                       ASSERT(err == 0 || err == EBUSY);
+                       zil_destroy_sync(dmu_objset_zil(os), tx);
+
                        if (!spa_feature_is_active(dp->dp_spa, async_destroy)) {
                                spa_feature_incr(dp->dp_spa, async_destroy, tx);
-                               dp->dp_bptree_obj = bptree_alloc(
-                                   dp->dp_meta_objset, tx);
-                               VERIFY(zap_add(dp->dp_meta_objset,
+                               dp->dp_bptree_obj = bptree_alloc(mos, tx);
+                               VERIFY(zap_add(mos,
                                    DMU_POOL_DIRECTORY_OBJECT,
                                    DMU_POOL_BPTREE_OBJ, sizeof (uint64_t), 1,
                                    &dp->dp_bptree_obj, tx) == 0);
@@ -1916,7 +1903,7 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx)
                        ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) ||
                            ds->ds_phys->ds_unique_bytes == used);
 
-                       bptree_add(dp->dp_meta_objset, dp->dp_bptree_obj,
+                       bptree_add(mos, dp->dp_bptree_obj,
                            &ds->ds_phys->ds_bp, ds->ds_phys->ds_prev_snap_txg,
                            used, comp, uncomp, tx);
                        dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD,
@@ -1965,7 +1952,7 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx)
 
                        err = dsl_dataset_snap_lookup(ds_head,
                            ds->ds_snapname, &val);
-                       ASSERT3U(err, ==, 0);
+                       ASSERT0(err);
                        ASSERT3U(val, ==, obj);
                }
 #endif
@@ -2203,7 +2190,6 @@ dsl_dataset_sync(dsl_dataset_t *ds, zio_t *zio, dmu_tx_t *tx)
        dmu_buf_will_dirty(ds->ds_dbuf, tx);
        ds->ds_phys->ds_fsid_guid = ds->ds_fsid_guid;
 
-       dsl_dir_dirty(ds->ds_dir, tx);
        dmu_objset_sync(ds->ds_objset, zio, tx);
 }
 
@@ -2472,13 +2458,13 @@ dsl_dataset_snapshot_rename_sync(void *arg1, void *arg2, dmu_tx_t *tx)
 
        VERIFY(0 == dsl_dataset_get_snapname(ds));
        err = dsl_dataset_snap_remove(hds, ds->ds_snapname, tx);
-       ASSERT3U(err, ==, 0);
+       ASSERT0(err);
        mutex_enter(&ds->ds_lock);
        (void) strcpy(ds->ds_snapname, newsnapname);
        mutex_exit(&ds->ds_lock);
        err = zap_add(mos, hds->ds_phys->ds_snapnames_zapobj,
            ds->ds_snapname, 8, 1, &ds->ds_object, tx);
-       ASSERT3U(err, ==, 0);
+       ASSERT0(err);
 
        spa_history_log_internal(LOG_DS_RENAME, dd->dd_pool->dp_spa, tx,
            "dataset = %llu", ds->ds_object);
@@ -2931,7 +2917,7 @@ dsl_dataset_promote_sync(void *arg1, void *arg2, dmu_tx_t *tx)
                        zap_cursor_fini(&zc);
                }
 
-               ASSERT3U(dsl_prop_numcb(ds), ==, 0);
+               ASSERT0(dsl_prop_numcb(ds));
        }
 
        /*