diff options
author | pjd <pjd@FreeBSD.org> | 2012-09-23 20:12:10 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2012-09-23 20:12:10 +0000 |
commit | 212634d921b6016d77a964b0299d6df7a93aacc1 (patch) | |
tree | 0772e4df508e44f9ca88d1971c54fb2acb4e2d85 /cddl/contrib/opensolaris/cmd/zfs | |
parent | 462a1240363ef90831d9b6cf6d345fc3c6e2ee0d (diff) | |
download | FreeBSD-src-212634d921b6016d77a964b0299d6df7a93aacc1.zip FreeBSD-src-212634d921b6016d77a964b0299d6df7a93aacc1.tar.gz |
It is possible to recursively destroy snapshots even if the snapshot
doesn't exist on a dataset we are starting from. For example if we
have the following configuration:
tank
tank/foo
tank/foo@snap
tank/bar
tank/bar@snap
We can execute:
# zfs destroy -t tank@snap
eventhough tank@snap doesn't exit.
Unfortunately it is not possible to do the same with recursive rename:
# zfs rename -r tank@snap tank@pans
cannot open 'tank@snap': dataset does not exist
...until now. This change allows to recursively rename snapshots even if
snapshot doesn't exist on the starting dataset.
Sponsored by: rsync.net
MFC after: 2 weeks
Diffstat (limited to 'cddl/contrib/opensolaris/cmd/zfs')
-rw-r--r-- | cddl/contrib/opensolaris/cmd/zfs/zfs_main.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c index e0bc3d7..ea313ba 100644 --- a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c +++ b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c @@ -3081,6 +3081,7 @@ zfs_do_rename(int argc, char **argv) int ret = 0; int types; boolean_t parents = B_FALSE; + char *snapshot = NULL; /* check options */ while ((c = getopt(argc, argv, "fpru")) != -1) { @@ -3149,6 +3150,19 @@ zfs_do_rename(int argc, char **argv) else types = ZFS_TYPE_DATASET; + if (flags.recurse) { + /* + * When we do recursive rename we are fine when the given + * snapshot for the given dataset doesn't exist - it can + * still exists below. + */ + + snapshot = strchr(argv[0], '@'); + assert(snapshot != NULL); + *snapshot = '\0'; + snapshot++; + } + if ((zhp = zfs_open(g_zfs, argv[0], types)) == NULL) return (1); @@ -3159,7 +3173,7 @@ zfs_do_rename(int argc, char **argv) return (1); } - ret = (zfs_rename(zhp, argv[1], flags) != 0); + ret = (zfs_rename(zhp, snapshot, argv[1], flags) != 0); zfs_close(zhp); return (ret); |