summaryrefslogtreecommitdiffstats
path: root/cmd/zfs
diff options
context:
space:
mode:
authorLOLi <[email protected]>2017-04-20 21:09:40 +0200
committerBrian Behlendorf <[email protected]>2017-04-20 12:09:40 -0700
commit587e228a6fcc03aa1135fda368666841dcb0e4c8 (patch)
tree1cc987fa06fc4669498c7e4e028dd0366d508023 /cmd/zfs
parent3e67c38c3457989fc212bea8361adf9f38a51452 (diff)
Allow bookmark short name in 'zfs bookmark'
This lets users create a bookmark from the command line by its name only, without the need to specify the dataset path which is extacted from the snapshot parameter. These commands are now equivalent: zfs bookmark poolname/fs@snap poolname/fs#bookmark zfs bookmark @snap poolname/fs#bookmark zfs bookmark poolname/fs@snap \#bookmark Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: loli10K <[email protected]> Closes #3665 Closes #6027
Diffstat (limited to 'cmd/zfs')
-rw-r--r--cmd/zfs/zfs_main.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c
index 5074913a5..9713d8ff2 100644
--- a/cmd/zfs/zfs_main.c
+++ b/cmd/zfs/zfs_main.c
@@ -6864,6 +6864,7 @@ static int
zfs_do_bookmark(int argc, char **argv)
{
char snapname[ZFS_MAX_DATASET_NAME_LEN];
+ char bookname[ZFS_MAX_DATASET_NAME_LEN];
zfs_handle_t *zhp;
nvlist_t *nvl;
int ret = 0;
@@ -6894,7 +6895,7 @@ zfs_do_bookmark(int argc, char **argv)
if (strchr(argv[1], '#') == NULL) {
(void) fprintf(stderr,
- gettext("invalid bookmark name '%s' -- "
+ gettext("invalid bookmark name '%s': "
"must contain a '#'\n"), argv[1]);
goto usage;
}
@@ -6910,6 +6911,18 @@ zfs_do_bookmark(int argc, char **argv)
} else {
(void) strlcpy(snapname, argv[0], sizeof (snapname));
}
+ if (argv[1][0] == '#') {
+ /*
+ * Bookmark name begins with #.
+ * Default to same fs as snapshot.
+ */
+ (void) strlcpy(bookname, argv[0], sizeof (bookname));
+ *strchr(bookname, '@') = '\0';
+ (void) strlcat(bookname, argv[1], sizeof (bookname));
+ } else {
+ (void) strlcpy(bookname, argv[1], sizeof (bookname));
+ }
+
zhp = zfs_open(g_zfs, snapname, ZFS_TYPE_SNAPSHOT);
if (zhp == NULL)
goto usage;
@@ -6917,7 +6930,7 @@ zfs_do_bookmark(int argc, char **argv)
nvl = fnvlist_alloc();
- fnvlist_add_string(nvl, argv[1], snapname);
+ fnvlist_add_string(nvl, bookname, snapname);
ret = lzc_bookmark(nvl, NULL);
fnvlist_free(nvl);
@@ -6927,7 +6940,7 @@ zfs_do_bookmark(int argc, char **argv)
(void) snprintf(errbuf, sizeof (errbuf),
dgettext(TEXT_DOMAIN,
- "cannot create bookmark '%s'"), argv[1]);
+ "cannot create bookmark '%s'"), bookname);
switch (ret) {
case EXDEV:
@@ -6945,6 +6958,9 @@ zfs_do_bookmark(int argc, char **argv)
case ENOSPC:
err_msg = "out of space";
break;
+ case ENOENT:
+ err_msg = "dataset does not exist";
+ break;
default:
err_msg = "unknown error";
break;