]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/zfs/dsl_dataset.c
Illumos 4171, 4172
[mirror_zfs.git] / module / zfs / dsl_dataset.c
index 9a9e24684f2e42b456ef6951e7859ecf0f748a13..cbdf393c014fdcf342cf620dfcb433533a1c0880 100644 (file)
@@ -22,6 +22,7 @@
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2013 by Delphix. All rights reserved.
  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ * Copyright (c) 2014 RackTop Systems.
  */
 
 #include <sys/dmu_objset.h>
@@ -102,9 +103,8 @@ dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx)
                    used, compressed, uncompressed);
                return;
        }
-       dmu_buf_will_dirty(ds->ds_dbuf, tx);
 
-       mutex_enter(&ds->ds_dir->dd_lock);
+       dmu_buf_will_dirty(ds->ds_dbuf, tx);
        mutex_enter(&ds->ds_lock);
        delta = parent_delta(ds, used);
        ds->ds_phys->ds_referenced_bytes += used;
@@ -116,7 +116,6 @@ dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx)
            compressed, uncompressed, tx);
        dsl_dir_transfer_space(ds->ds_dir, used - delta,
            DD_USED_REFRSRV, DD_USED_HEAD, tx);
-       mutex_exit(&ds->ds_dir->dd_lock);
 }
 
 int
@@ -153,7 +152,6 @@ dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx,
                dprintf_bp(bp, "freeing ds=%llu", ds->ds_object);
                dsl_free(tx->tx_pool, tx->tx_txg, bp);
 
-               mutex_enter(&ds->ds_dir->dd_lock);
                mutex_enter(&ds->ds_lock);
                ASSERT(ds->ds_phys->ds_unique_bytes >= used ||
                    !DS_UNIQUE_IS_ACCURATE(ds));
@@ -164,7 +162,6 @@ dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx,
                    delta, -compressed, -uncompressed, tx);
                dsl_dir_transfer_space(ds->ds_dir, -used - delta,
                    DD_USED_REFRSRV, DD_USED_HEAD, tx);
-               mutex_exit(&ds->ds_dir->dd_lock);
        } else {
                dprintf_bp(bp, "putting on dead list: %s", "");
                if (async) {
@@ -360,7 +357,7 @@ dsl_dataset_hold_obj(dsl_pool_t *dp, uint64_t dsobj, void *tag,
 
        /* Make sure dsobj has the correct object type. */
        dmu_object_info_from_db(dbuf, &doi);
-       if (doi.doi_type != DMU_OT_DSL_DATASET) {
+       if (doi.doi_bonus_type != DMU_OT_DSL_DATASET) {
                dmu_buf_rele(dbuf, tag);
                return (SET_ERROR(EINVAL));
        }
@@ -1233,6 +1230,16 @@ dsl_dataset_snapshot(nvlist_t *snaps, nvlist_t *props, nvlist_t *errors)
                fnvlist_free(suspended);
        }
 
+#ifdef _KERNEL
+       if (error == 0) {
+               for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL;
+                   pair = nvlist_next_nvpair(snaps, pair)) {
+                       char *snapname = nvpair_name(pair);
+                       zvol_create_minors(snapname);
+               }
+       }
+#endif
+
        return (error);
 }
 
@@ -1365,7 +1372,7 @@ get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv)
         * Only trust it if it has the right number of entries.
         */
        if (ds->ds_phys->ds_next_clones_obj != 0) {
-               ASSERT0(zap_count(mos, ds->ds_phys->ds_next_clones_obj,
+               VERIFY0(zap_count(mos, ds->ds_phys->ds_next_clones_obj,
                    &count));
        }
        if (count != ds->ds_phys->ds_num_children - 1)
@@ -1605,6 +1612,9 @@ static int
 dsl_dataset_rename_snapshot_sync_impl(dsl_pool_t *dp,
     dsl_dataset_t *hds, void *arg)
 {
+#ifdef _KERNEL
+       char *oldname, *newname;
+#endif
        dsl_dataset_rename_snapshot_arg_t *ddrsa = arg;
        dsl_dataset_t *ds;
        uint64_t val;
@@ -1631,6 +1641,18 @@ dsl_dataset_rename_snapshot_sync_impl(dsl_pool_t *dp,
        VERIFY0(zap_add(dp->dp_meta_objset, hds->ds_phys->ds_snapnames_zapobj,
            ds->ds_snapname, 8, 1, &ds->ds_object, tx));
 
+#ifdef _KERNEL
+       oldname = kmem_alloc(MAXPATHLEN, KM_PUSHPAGE);
+       newname = kmem_alloc(MAXPATHLEN, KM_PUSHPAGE);
+       snprintf(oldname, MAXPATHLEN, "%s@%s", ddrsa->ddrsa_fsname,
+           ddrsa->ddrsa_oldsnapname);
+       snprintf(newname, MAXPATHLEN, "%s@%s", ddrsa->ddrsa_fsname,
+           ddrsa->ddrsa_newsnapname);
+       zvol_rename_minors(oldname, newname);
+       kmem_free(newname, MAXPATHLEN);
+       kmem_free(oldname, MAXPATHLEN);
+#endif
+
        dsl_dataset_rele(ds, FTAG);
        return (0);
 }
@@ -2200,7 +2222,7 @@ snaplist_make(dsl_pool_t *dp,
                if (first_obj == 0)
                        first_obj = ds->ds_dir->dd_phys->dd_origin_obj;
 
-               snap = kmem_alloc(sizeof (*snap), KM_SLEEP);
+               snap = kmem_alloc(sizeof (*snap), KM_PUSHPAGE);
                snap->ds = ds;
                list_insert_tail(l, snap);
                obj = ds->ds_phys->ds_prev_snap_obj;
@@ -2983,6 +3005,14 @@ dsl_dataset_is_before(dsl_dataset_t *later, dsl_dataset_t *earlier)
        return (ret);
 }
 
+
+void
+dsl_dataset_zapify(dsl_dataset_t *ds, dmu_tx_t *tx)
+{
+       objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
+       dmu_object_zapify(mos, ds->ds_object, DMU_OT_DSL_DATASET, tx);
+}
+
 #if defined(_KERNEL) && defined(HAVE_SPL)
 EXPORT_SYMBOL(dsl_dataset_hold);
 EXPORT_SYMBOL(dsl_dataset_hold_obj);