usr/src/uts/common/fs/zfs/dsl_prop.c
changeset 2885 c0259887ebbc
parent 2676 5cee47eddab6
child 4543 12bb2876a62e
--- a/usr/src/uts/common/fs/zfs/dsl_prop.c	Sun Oct 08 21:26:45 2006 -0700
+++ b/usr/src/uts/common/fs/zfs/dsl_prop.c	Mon Oct 09 10:56:01 2006 -0700
@@ -185,17 +185,6 @@
 }
 
 /*
- * Return 0 on success, ENOENT if ddname is invalid, EOVERFLOW if
- * valuelen not big enough.
- */
-int
-dsl_prop_get_string(const char *ddname, const char *propname,
-    char *value, int valuelen, char *setpoint)
-{
-	return (dsl_prop_get(ddname, propname, 1, valuelen, value, setpoint));
-}
-
-/*
  * Get the current property value.  It may have changed by the time this
  * function returns, so it is NOT safe to follow up with
  * dsl_prop_register() and assume that the value has not changed in
@@ -210,13 +199,6 @@
 	return (dsl_prop_get(ddname, propname, 8, 1, valuep, setpoint));
 }
 
-int
-dsl_prop_get_ds_integer(dsl_dir_t *dd, const char *propname,
-    uint64_t *valuep, char *setpoint)
-{
-	return (dsl_prop_get_ds(dd, propname, 8, 1, valuep, setpoint));
-}
-
 /*
  * Unregister this callback.  Return 0 on success, ENOENT if ddname is
  * invalid, ENOMSG if no matching callback registered.
@@ -366,12 +348,26 @@
 }
 
 int
+dsl_prop_set_dd(dsl_dir_t *dd, const char *propname,
+    int intsz, int numints, const void *buf)
+{
+	struct prop_set_arg psa;
+
+	psa.name = propname;
+	psa.intsz = intsz;
+	psa.numints = numints;
+	psa.buf = buf;
+
+	return (dsl_sync_task_do(dd->dd_pool,
+	    NULL, dsl_prop_set_sync, dd, &psa, 2));
+}
+
+int
 dsl_prop_set(const char *ddname, const char *propname,
     int intsz, int numints, const void *buf)
 {
 	dsl_dir_t *dd;
 	int err;
-	struct prop_set_arg psa;
 
 	/*
 	 * We must do these checks before we get to the syncfunc, since
@@ -385,16 +381,8 @@
 	err = dsl_dir_open(ddname, FTAG, &dd, NULL);
 	if (err)
 		return (err);
-
-	psa.name = propname;
-	psa.intsz = intsz;
-	psa.numints = numints;
-	psa.buf = buf;
-	err = dsl_sync_task_do(dd->dd_pool,
-	    NULL, dsl_prop_set_sync, dd, &psa, 2);
-
+	err = dsl_prop_set_dd(dd, propname, intsz, numints, buf);
 	dsl_dir_close(dd, FTAG);
-
 	return (err);
 }
 
@@ -409,12 +397,6 @@
 	int err = 0;
 	dsl_pool_t *dp;
 	objset_t *mos;
-	zap_cursor_t zc;
-	zap_attribute_t za;
-	char setpoint[MAXNAMELEN];
-	char *tmp;
-	nvlist_t *propval;
-	zfs_prop_t prop;
 
 	if (dsl_dataset_is_snapshot(ds)) {
 		VERIFY(nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0);
@@ -428,11 +410,17 @@
 
 	rw_enter(&dp->dp_config_rwlock, RW_READER);
 	for (; dd != NULL; dd = dd->dd_parent) {
+		char setpoint[MAXNAMELEN];
+		zap_cursor_t zc;
+		zap_attribute_t za;
+
 		dsl_dir_name(dd, setpoint);
 
 		for (zap_cursor_init(&zc, mos, dd->dd_phys->dd_props_zapobj);
 		    (err = zap_cursor_retrieve(&zc, &za)) == 0;
 		    zap_cursor_advance(&zc)) {
+			nvlist_t *propval;
+			zfs_prop_t prop;
 			/*
 			 * Skip non-inheritable properties.
 			 */
@@ -451,7 +439,8 @@
 				/*
 				 * String property
 				 */
-				tmp = kmem_alloc(za.za_num_integers, KM_SLEEP);
+				char *tmp = kmem_alloc(za.za_num_integers,
+				    KM_SLEEP);
 				err = zap_lookup(mos,
 				    dd->dd_phys->dd_props_zapobj,
 				    za.za_name, 1, za.za_num_integers,
@@ -488,3 +477,25 @@
 
 	return (err);
 }
+
+void
+dsl_prop_nvlist_add_uint64(nvlist_t *nv, zfs_prop_t prop, uint64_t value)
+{
+	nvlist_t *propval;
+
+	VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+	VERIFY(nvlist_add_uint64(propval, ZFS_PROP_VALUE, value) == 0);
+	VERIFY(nvlist_add_nvlist(nv, zfs_prop_to_name(prop), propval) == 0);
+	nvlist_free(propval);
+}
+
+void
+dsl_prop_nvlist_add_string(nvlist_t *nv, zfs_prop_t prop, const char *value)
+{
+	nvlist_t *propval;
+
+	VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+	VERIFY(nvlist_add_string(propval, ZFS_PROP_VALUE, value) == 0);
+	VERIFY(nvlist_add_nvlist(nv, zfs_prop_to_name(prop), propval) == 0);
+	nvlist_free(propval);
+}