Illumos #1092: zfs refratio property
[zfs.git] / module / zfs / dsl_dataset.c
index 226e988..26362c9 100644 (file)
@@ -20,6 +20,7 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
  */
 
 #include <sys/dmu_objset.h>
@@ -393,11 +394,12 @@ dsl_dataset_get_ref(dsl_pool_t *dp, uint64_t dsobj, void *tag,
                ds->ds_dbuf = dbuf;
                ds->ds_object = dsobj;
                ds->ds_phys = dbuf->db_data;
+               list_link_init(&ds->ds_synced_link);
 
                mutex_init(&ds->ds_lock, NULL, MUTEX_DEFAULT, NULL);
                mutex_init(&ds->ds_recvlock, NULL, MUTEX_DEFAULT, NULL);
                mutex_init(&ds->ds_opening_lock, NULL, MUTEX_DEFAULT, NULL);
-               rw_init(&ds->ds_rwlock, 0, 0, 0);
+               rw_init(&ds->ds_rwlock, NULL, RW_DEFAULT, NULL);
                cv_init(&ds->ds_exclusive_cv, NULL, CV_DEFAULT, NULL);
 
                bplist_create(&ds->ds_pending_deadlist);
@@ -1054,7 +1056,7 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
        dsl_dir_t *dd;
        uint64_t obj;
        struct dsl_ds_destroyarg dsda = { 0 };
-       dsl_dataset_t dummy_ds = { 0 };
+       dsl_dataset_t *dummy_ds;
 
        dsda.ds = ds;
 
@@ -1074,8 +1076,9 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
        }
 
        dd = ds->ds_dir;
-       dummy_ds.ds_dir = dd;
-       dummy_ds.ds_object = ds->ds_object;
+       dummy_ds = kmem_zalloc(sizeof (dsl_dataset_t), KM_SLEEP);
+       dummy_ds->ds_dir = dd;
+       dummy_ds->ds_object = ds->ds_object;
 
        /*
         * Check for errors and mark this ds as inconsistent, in
@@ -1084,11 +1087,11 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
        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;
+               goto out_free;
 
        err = dmu_objset_from_ds(ds, &os);
        if (err)
-               goto out;
+               goto out_free;
 
        /*
         * remove the objects in open context, so that we won't
@@ -1103,7 +1106,7 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
                (void) dmu_free_object(os, obj);
        }
        if (err != ESRCH)
-               goto out;
+               goto out_free;
 
        /*
         * Only the ZIL knows how to free log blocks.
@@ -1133,7 +1136,7 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
        rw_exit(&dd->dd_pool->dp_config_rwlock);
 
        if (err)
-               goto out;
+               goto out_free;
 
        /*
         * Blow away the dsl_dir + head dataset.
@@ -1149,7 +1152,7 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
                        err = dsl_dataset_origin_rm_prep(&dsda, tag);
                        if (err) {
                                dsl_dir_close(dd, FTAG);
-                               goto out;
+                               goto out_free;
                        }
                }
 
@@ -1157,7 +1160,7 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
                dsl_sync_task_create(dstg, dsl_dataset_destroy_check,
                    dsl_dataset_destroy_sync, &dsda, tag, 0);
                dsl_sync_task_create(dstg, dsl_dir_destroy_check,
-                   dsl_dir_destroy_sync, &dummy_ds, FTAG, 0);
+                   dsl_dir_destroy_sync, dummy_ds, FTAG, 0);
                err = dsl_sync_task_group_wait(dstg);
                dsl_sync_task_group_destroy(dstg);
 
@@ -1180,6 +1183,9 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
        /* if it is successful, dsl_dir_destroy_sync will close the dd */
        if (err)
                dsl_dir_close(dd, FTAG);
+
+out_free:
+       kmem_free(dummy_ds, sizeof (dsl_dataset_t));
 out:
        dsl_dataset_disown(ds, tag);
        return (err);
@@ -2148,7 +2154,7 @@ dsl_dataset_sync(dsl_dataset_t *ds, zio_t *zio, dmu_tx_t *tx)
 void
 dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
 {
-       uint64_t refd, avail, uobjs, aobjs;
+       uint64_t refd, avail, uobjs, aobjs, ratio;
 
        dsl_dir_stats(ds->ds_dir, nv);
 
@@ -2175,6 +2181,11 @@ dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
        dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_DEFER_DESTROY,
            DS_IS_DEFER_DESTROY(ds) ? 1 : 0);
 
+       ratio = ds->ds_phys->ds_compressed_bytes == 0 ? 100 :
+           (ds->ds_phys->ds_uncompressed_bytes * 100 /
+           ds->ds_phys->ds_compressed_bytes);
+       dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REFRATIO, ratio);
+
        if (ds->ds_phys->ds_next_snap_obj) {
                /*
                 * This is a snapshot; override the dd's space used with
@@ -2182,10 +2193,7 @@ dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
                 */
                dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_USED,
                    ds->ds_phys->ds_unique_bytes);
-               dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_COMPRESSRATIO,
-                   ds->ds_phys->ds_compressed_bytes == 0 ? 100 :
-                   (ds->ds_phys->ds_uncompressed_bytes * 100 /
-                   ds->ds_phys->ds_compressed_bytes));
+               dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_COMPRESSRATIO, ratio);
        }
 }
 
@@ -2365,7 +2373,8 @@ dsl_snapshot_rename_one(const char *name, void *arg)
                return (err == ENOENT ? 0 : err);
        }
 
-#ifdef _KERNEL
+/* XXX: Ignore for SPL version until mounting the FS is supported */
+#if defined(_KERNEL) && !defined(HAVE_SPL)
        /*
         * For all filesystems undergoing rename, we'll need to unmount it.
         */
@@ -4031,3 +4040,51 @@ dsl_destroy_inconsistent(const char *dsname, void *arg)
        }
        return (0);
 }
+
+#if defined(_KERNEL) && defined(HAVE_SPL)
+EXPORT_SYMBOL(dsl_dataset_hold);
+EXPORT_SYMBOL(dsl_dataset_hold_obj);
+EXPORT_SYMBOL(dsl_dataset_own);
+EXPORT_SYMBOL(dsl_dataset_own_obj);
+EXPORT_SYMBOL(dsl_dataset_name);
+EXPORT_SYMBOL(dsl_dataset_rele);
+EXPORT_SYMBOL(dsl_dataset_disown);
+EXPORT_SYMBOL(dsl_dataset_drop_ref);
+EXPORT_SYMBOL(dsl_dataset_tryown);
+EXPORT_SYMBOL(dsl_dataset_make_exclusive);
+EXPORT_SYMBOL(dsl_dataset_create_sync);
+EXPORT_SYMBOL(dsl_dataset_create_sync_dd);
+EXPORT_SYMBOL(dsl_dataset_destroy);
+EXPORT_SYMBOL(dsl_snapshots_destroy);
+EXPORT_SYMBOL(dsl_dataset_destroy_check);
+EXPORT_SYMBOL(dsl_dataset_destroy_sync);
+EXPORT_SYMBOL(dsl_dataset_snapshot_check);
+EXPORT_SYMBOL(dsl_dataset_snapshot_sync);
+EXPORT_SYMBOL(dsl_dataset_rename);
+EXPORT_SYMBOL(dsl_dataset_promote);
+EXPORT_SYMBOL(dsl_dataset_clone_swap);
+EXPORT_SYMBOL(dsl_dataset_user_hold);
+EXPORT_SYMBOL(dsl_dataset_user_release);
+EXPORT_SYMBOL(dsl_dataset_user_release_tmp);
+EXPORT_SYMBOL(dsl_dataset_get_holds);
+EXPORT_SYMBOL(dsl_dataset_get_blkptr);
+EXPORT_SYMBOL(dsl_dataset_set_blkptr);
+EXPORT_SYMBOL(dsl_dataset_get_spa);
+EXPORT_SYMBOL(dsl_dataset_modified_since_lastsnap);
+EXPORT_SYMBOL(dsl_dataset_sync);
+EXPORT_SYMBOL(dsl_dataset_block_born);
+EXPORT_SYMBOL(dsl_dataset_block_kill);
+EXPORT_SYMBOL(dsl_dataset_block_freeable);
+EXPORT_SYMBOL(dsl_dataset_prev_snap_txg);
+EXPORT_SYMBOL(dsl_dataset_dirty);
+EXPORT_SYMBOL(dsl_dataset_stats);
+EXPORT_SYMBOL(dsl_dataset_fast_stat);
+EXPORT_SYMBOL(dsl_dataset_space);
+EXPORT_SYMBOL(dsl_dataset_fsid_guid);
+EXPORT_SYMBOL(dsl_dsobj_to_dsname);
+EXPORT_SYMBOL(dsl_dataset_check_quota);
+EXPORT_SYMBOL(dsl_dataset_set_quota);
+EXPORT_SYMBOL(dsl_dataset_set_quota_sync);
+EXPORT_SYMBOL(dsl_dataset_set_reservation);
+EXPORT_SYMBOL(dsl_destroy_inconsistent);
+#endif