diff options
author | LOLi <[email protected]> | 2017-04-20 21:09:40 +0200 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2017-04-20 12:09:40 -0700 |
commit | 587e228a6fcc03aa1135fda368666841dcb0e4c8 (patch) | |
tree | 1cc987fa06fc4669498c7e4e028dd0366d508023 /cmd | |
parent | 3e67c38c3457989fc212bea8361adf9f38a51452 (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')
-rw-r--r-- | cmd/zfs/zfs_main.c | 22 |
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; |