]> granicus.if.org Git - zfs/commitdiff
Improve error message for zfs create with @ or # in name
authorDamian Wojsław <damian@wojslaw.pl>
Mon, 25 Feb 2019 19:20:07 +0000 (20:20 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 25 Feb 2019 19:20:07 +0000 (11:20 -0800)
Reorder the `zfs create` error messages in order to return the most
specific one first.  If none of them apply then an expanded version of
the invalid name message is used.

Reviewed by: Tom Caputi <tcaputi@datto.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Signed-off-by: Damian Wojsław <damian@wojslaw.pl>
Closes #8155
Closes #8352

lib/libzfs/libzfs_dataset.c

index be86e5692b0df923608381506a851d3f932cc72d..0537b631e5c09a42c35994d632bb1c158f3e3576 100644 (file)
@@ -108,6 +108,43 @@ zfs_validate_name(libzfs_handle_t *hdl, const char *path, int type,
        namecheck_err_t why;
        char what;
 
+       if (!(type & ZFS_TYPE_SNAPSHOT) && strchr(path, '@') != NULL) {
+               if (hdl != NULL)
+                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+                           "snapshot delimiter '@' is not expected here"));
+               return (0);
+       }
+
+       if (type == ZFS_TYPE_SNAPSHOT && strchr(path, '@') == NULL) {
+               if (hdl != NULL)
+                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+                           "missing '@' delimiter in snapshot name, "
+                           "did you mean to use -r?"));
+               return (0);
+       }
+
+       if (!(type & ZFS_TYPE_BOOKMARK) && strchr(path, '#') != NULL) {
+               if (hdl != NULL)
+                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+                           "bookmark delimiter '#' is not expected here"));
+               return (0);
+       }
+
+       if (type == ZFS_TYPE_BOOKMARK && strchr(path, '#') == NULL) {
+               if (hdl != NULL)
+                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+                           "missing '#' delimiter in bookmark name, "
+                           "did you mean to use -r?"));
+               return (0);
+       }
+
+       if (modifying && strchr(path, '%') != NULL) {
+               if (hdl != NULL)
+                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+                           "invalid character %c in name"), '%');
+               return (0);
+       }
+
        if (entity_namecheck(path, &why, &what) != 0) {
                if (hdl != NULL) {
                        switch (why) {
@@ -123,7 +160,8 @@ zfs_validate_name(libzfs_handle_t *hdl, const char *path, int type,
 
                        case NAME_ERR_EMPTY_COMPONENT:
                                zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
-                                   "empty component in name"));
+                                   "empty component or misplaced '@'"
+                                   " or '#' delimiter in name"));
                                break;
 
                        case NAME_ERR_TRAILING_SLASH:
@@ -168,43 +206,6 @@ zfs_validate_name(libzfs_handle_t *hdl, const char *path, int type,
                return (0);
        }
 
-       if (!(type & ZFS_TYPE_SNAPSHOT) && strchr(path, '@') != NULL) {
-               if (hdl != NULL)
-                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
-                           "snapshot delimiter '@' is not expected here"));
-               return (0);
-       }
-
-       if (type == ZFS_TYPE_SNAPSHOT && strchr(path, '@') == NULL) {
-               if (hdl != NULL)
-                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
-                           "missing '@' delimiter in snapshot name, "
-                           "did you mean to use -r?"));
-               return (0);
-       }
-
-       if (!(type & ZFS_TYPE_BOOKMARK) && strchr(path, '#') != NULL) {
-               if (hdl != NULL)
-                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
-                           "bookmark delimiter '#' is not expected here"));
-               return (0);
-       }
-
-       if (type == ZFS_TYPE_BOOKMARK && strchr(path, '#') == NULL) {
-               if (hdl != NULL)
-                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
-                           "missing '#' delimiter in bookmark name, "
-                           "did you mean to use -r?"));
-               return (0);
-       }
-
-       if (modifying && strchr(path, '%') != NULL) {
-               if (hdl != NULL)
-                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
-                           "invalid character %c in name"), '%');
-               return (0);
-       }
-
        return (-1);
 }