summaryrefslogtreecommitdiffstats
path: root/cddl
diff options
context:
space:
mode:
authoravg <avg@FreeBSD.org>2015-06-24 14:30:04 +0000
committeravg <avg@FreeBSD.org>2015-06-24 14:30:04 +0000
commit77286cbd994e15d9c779bbe84fe79d772bf6e91f (patch)
tree26e89bfa3718d9eed79173df1268e51038636393 /cddl
parent22520d35deea361fe372e1c9366304617a4b7b23 (diff)
downloadFreeBSD-src-77286cbd994e15d9c779bbe84fe79d772bf6e91f.zip
FreeBSD-src-77286cbd994e15d9c779bbe84fe79d772bf6e91f.tar.gz
MFC r284309: zfs clone should not mount the clone if canmount == noauto
Diffstat (limited to 'cddl')
-rw-r--r--cddl/contrib/opensolaris/cmd/zfs/zfs_main.c41
1 files changed, 30 insertions, 11 deletions
diff --git a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
index f883186..089772f 100644
--- a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
+++ b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
@@ -593,6 +593,17 @@ finish_progress(char *done)
}
/*
+ * Check if the dataset is mountable and should be automatically mounted.
+ */
+static boolean_t
+should_auto_mount(zfs_handle_t *zhp)
+{
+ if (!zfs_prop_valid_for_type(ZFS_PROP_CANMOUNT, zfs_get_type(zhp)))
+ return (B_FALSE);
+ return (zfs_prop_get_int(zhp, ZFS_PROP_CANMOUNT) == ZFS_CANMOUNT_ON);
+}
+
+/*
* zfs clone [-p] [-o prop=value] ... <snap> <fs | vol>
*
* Given an existing dataset, create a writable copy whose initial contents
@@ -677,9 +688,22 @@ zfs_do_clone(int argc, char **argv)
clone = zfs_open(g_zfs, argv[1], ZFS_TYPE_DATASET);
if (clone != NULL) {
- if (zfs_get_type(clone) != ZFS_TYPE_VOLUME)
- if ((ret = zfs_mount(clone, NULL, 0)) == 0)
- ret = zfs_share(clone);
+ /*
+ * If the user doesn't want the dataset
+ * automatically mounted, then skip the mount/share
+ * step.
+ */
+ if (should_auto_mount(clone)) {
+ if ((ret = zfs_mount(clone, NULL, 0)) != 0) {
+ (void) fprintf(stderr, gettext("clone "
+ "successfully created, "
+ "but not mounted\n"));
+ } else if ((ret = zfs_share(clone)) != 0) {
+ (void) fprintf(stderr, gettext("clone "
+ "successfully created, "
+ "but not shared\n"));
+ }
+ }
zfs_close(clone);
}
}
@@ -728,7 +752,6 @@ zfs_do_create(int argc, char **argv)
int ret = 1;
nvlist_t *props;
uint64_t intval;
- int canmount = ZFS_CANMOUNT_OFF;
if (nvlist_alloc(&props, NV_UNIQUE_NAME, 0) != 0)
nomem();
@@ -868,19 +891,15 @@ zfs_do_create(int argc, char **argv)
goto error;
ret = 0;
- /*
- * if the user doesn't want the dataset automatically mounted,
- * then skip the mount/share step
- */
- if (zfs_prop_valid_for_type(ZFS_PROP_CANMOUNT, type))
- canmount = zfs_prop_get_int(zhp, ZFS_PROP_CANMOUNT);
/*
* Mount and/or share the new filesystem as appropriate. We provide a
* verbose error message to let the user know that their filesystem was
* in fact created, even if we failed to mount or share it.
+ * If the user doesn't want the dataset automatically mounted,
+ * then skip the mount/share step altogether.
*/
- if (!nomount && canmount == ZFS_CANMOUNT_ON) {
+ if (!nomount && should_auto_mount(zhp)) {
if (zfs_mount(zhp, NULL, 0) != 0) {
(void) fprintf(stderr, gettext("filesystem "
"successfully created, but not mounted\n"));
OpenPOWER on IntegriCloud