]> granicus.if.org Git - zfs/commitdiff
Allow bookmark short name in 'zfs bookmark'
authorLOLi <loli10K@users.noreply.github.com>
Thu, 20 Apr 2017 19:09:40 +0000 (21:09 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 20 Apr 2017 19:09:40 +0000 (12:09 -0700)
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 <behlendorf1@llnl.gov>
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
Closes #3665
Closes #6027

cmd/zfs/zfs_main.c

index 5074913a5ecf3b0869ac19a1343b00aa27d68661..9713d8ff23c54e1bce2b7014460feda99e9de4e7 100644 (file)
@@ -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;