usr/src/uts/common/fs/zfs/zfs_ioctl.c
changeset 3444 dc160a70a50d
parent 3265 967e0fca6143
child 3638 6b28ebc717aa
--- a/usr/src/uts/common/fs/zfs/zfs_ioctl.c	Thu Jan 18 13:37:54 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/zfs_ioctl.c	Thu Jan 18 14:25:26 2007 -0800
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -535,6 +535,49 @@
 }
 
 static int
+zfs_ioc_dsobj_to_dsname(zfs_cmd_t *zc)
+{
+	spa_t *spa;
+	dsl_pool_t *dp;
+	dsl_dataset_t *ds = NULL;
+	int error;
+
+	if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+		return (error);
+	dp = spa_get_dsl(spa);
+	rw_enter(&dp->dp_config_rwlock, RW_READER);
+	if ((error = dsl_dataset_open_obj(dp, zc->zc_obj,
+	    NULL, DS_MODE_NONE, FTAG, &ds)) != 0) {
+		rw_exit(&dp->dp_config_rwlock);
+		spa_close(spa, FTAG);
+		return (error);
+	}
+	dsl_dataset_name(ds, zc->zc_value);
+	dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
+	rw_exit(&dp->dp_config_rwlock);
+	spa_close(spa, FTAG);
+
+	return (0);
+}
+
+static int
+zfs_ioc_obj_to_path(zfs_cmd_t *zc)
+{
+	objset_t *osp;
+	int error;
+
+	if ((error = dmu_objset_open(zc->zc_name, DMU_OST_ZFS,
+	    DS_MODE_NONE | DS_MODE_READONLY, &osp)) != 0)
+		return (error);
+
+	error = zfs_obj_to_path(osp, zc->zc_obj, zc->zc_value,
+	    sizeof (zc->zc_value));
+	dmu_objset_close(osp);
+
+	return (error);
+}
+
+static int
 zfs_ioc_vdev_add(zfs_cmd_t *zc)
 {
 	spa_t *spa;
@@ -1379,28 +1422,6 @@
 }
 
 static int
-zfs_ioc_bookmark_name(zfs_cmd_t *zc)
-{
-	spa_t *spa;
-	int error;
-	nvlist_t *nvl;
-
-	if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
-		return (error);
-
-	VERIFY(nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP) == 0);
-
-	error = spa_bookmark_name(spa, &zc->zc_bookmark, nvl);
-	if (error == 0)
-		error = put_nvlist(zc, nvl);
-	nvlist_free(nvl);
-
-	spa_close(spa, FTAG);
-
-	return (error);
-}
-
-static int
 zfs_ioc_promote(zfs_cmd_t *zc)
 {
 	char *cp;
@@ -1454,10 +1475,11 @@
 	{ zfs_ioc_inject_list_next,	zfs_secpolicy_inject,	no_name },
 	{ zfs_ioc_error_log,		zfs_secpolicy_inject,	pool_name },
 	{ zfs_ioc_clear,		zfs_secpolicy_config,	pool_name },
-	{ zfs_ioc_bookmark_name,	zfs_secpolicy_inject,	pool_name },
 	{ zfs_ioc_promote,		zfs_secpolicy_write,	dataset_name },
 	{ zfs_ioc_destroy_snaps,	zfs_secpolicy_write,	dataset_name },
-	{ zfs_ioc_snapshot,		zfs_secpolicy_write,	dataset_name }
+	{ zfs_ioc_snapshot,		zfs_secpolicy_write,	dataset_name },
+	{ zfs_ioc_dsobj_to_dsname,	zfs_secpolicy_config,	pool_name },
+	{ zfs_ioc_obj_to_path,		zfs_secpolicy_config,	no_name }
 };
 
 static int