Whamcloud - gitweb
LU-5170 utils: Continue on error when multiple files requested 63/30663/16
authorVitaliy Kuznetsov <vkuznetsov@ddn.com>
Fri, 3 Mar 2023 13:17:52 +0000 (16:17 +0300)
committerOleg Drokin <green@whamcloud.com>
Mon, 13 Mar 2023 06:05:59 +0000 (06:05 +0000)
For lfs commands that accept multiple file arguments, processing
continues even if any of the files generates an error, instead
of immediately aborting. This follows the Unix convention of
attempting to process all requested files. Any relevant error
messages are reported as they are encountered.

Signed-off-by: Steve Guminski <stephenx.guminski@intel.com>
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Vitaliy Kuznetsov <vkuznetsov@ddn.com>
Change-Id: I1bcfc18d17c76505796b8e367224d01f48731d9f
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/30663
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: jsimmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/utils/lfs.c
lustre/utils/liblustreapi.c

index 071285c..208037b 100644 (file)
@@ -6027,7 +6027,7 @@ static int lfs_getstripe_internal(int argc, char **argv,
        { .val = 'z',   .name = "extension-size", .has_arg = no_argument },
        { .val = 'z',   .name = "ext-size",     .has_arg = no_argument },
        { .name = NULL } };
-       int c, rc;
+       int c, rc = 0;
        int neg_opt = 0;
        int pathstart = -1, pathend = -1;
        int isoption;
@@ -6351,12 +6351,18 @@ static int lfs_getstripe_internal(int argc, char **argv,
                param->fp_verbose = VERBOSE_OBJID;
 
        do {
-               rc = llapi_getstripe(argv[pathstart], param);
-       } while (++pathstart < pathend && !rc);
+               int rc2;
+
+               rc2 = llapi_getstripe(argv[pathstart], param);
+               if (rc2) {
+                       fprintf(stderr, "%s: %s for '%s' failed: %s\n",
+                               progname, argv[0], argv[optind - 1],
+                               strerror(-rc2));
+                       if (!rc)
+                               rc = rc2;
+               }
+       } while (++pathstart < pathend);
 
-       if (rc)
-               fprintf(stderr, "error: %s failed for %s.\n",
-                       argv[0], argv[optind - 1]);
        return rc;
 }
 
@@ -6426,7 +6432,7 @@ static int lfs_getdirstripe(int argc, char **argv)
        { .val = LFS_INHERIT_RR_OPT,
                        .name = "max-inherit-rr", .has_arg = no_argument },
        { .name = NULL } };
-       int c, rc;
+       int c, rc = 0;
 
        param.fp_get_lmv = 1;
 
@@ -6497,12 +6503,18 @@ static int lfs_getdirstripe(int argc, char **argv)
                param.fp_verbose = VERBOSE_DEFAULT;
 
        do {
-               rc = llapi_getstripe(argv[optind], &param);
-       } while (++optind < argc && !rc);
+               int rc2;
+
+               rc2 = llapi_getstripe(argv[optind], &param);
+               if (rc2) {
+                       fprintf(stderr, "%s: %s for '%s' failed: %s\n",
+                               progname, argv[0], argv[optind],
+                               strerror(-rc2));
+                       if (!rc)
+                               rc = rc2;
+               }
+       } while (++optind < argc);
 
-       if (rc)
-               fprintf(stderr, "error: %s failed for %s.\n",
-                       argv[0], argv[optind - 1]);
        return rc;
 }
 
@@ -7270,12 +7282,11 @@ static int lfs_setdirstripe(int argc, char **argv)
        return result;
 }
 
-/* functions */
 static int lfs_rmentry(int argc, char **argv)
 {
        char *dname;
-       int   index;
-       int   result = 0;
+       int index;
+       int result = 0;
 
        if (argc <= 1) {
                fprintf(stderr, "error: %s: missing dirname\n",
@@ -7286,12 +7297,15 @@ static int lfs_rmentry(int argc, char **argv)
        index = 1;
        dname = argv[index];
        while (dname) {
-               result = llapi_direntry_remove(dname);
-               if (result) {
+               int rc2;
+
+               rc2 = llapi_direntry_remove(dname);
+               if (rc2) {
                        fprintf(stderr,
-                               "error: %s: remove dir entry '%s' failed\n",
-                               argv[0], dname);
-                       break;
+                               "%s %s: remove dir entry '%s' failed: %s\n",
+                               progname, argv[0], dname, strerror(-rc2));
+                       if (!result)
+                               result = rc2;
                }
                dname = argv[++index];
        }
@@ -7654,15 +7668,16 @@ static int lfs_check(int argc, char **argv)
        rc = llapi_search_mounts(path, 0, mntdir, NULL);
        if (rc < 0 || mntdir[0] == '\0') {
                fprintf(stderr,
-                       "%s check: cannot find mounted Lustre filesystem: %s\n",
-                       progname, (rc < 0) ? strerror(-rc) : strerror(ENODEV));
+                       "%s %s: cannot find mounted Lustre filesystem: %s\n",
+                       progname, argv[0],
+                       (rc < 0) ? strerror(-rc) : strerror(ENODEV));
                return rc;
        }
 
        rc = llapi_target_check(num_types, obd_types, path);
        if (rc)
-               fprintf(stderr, "%s check: cannot check target '%s': %s\n",
-                       progname, argv[1], strerror(-rc));
+               fprintf(stderr, "%s %s: cannot check target '%s': %s\n",
+                       progname, argv[0], argv[1], strerror(-rc));
 
        return rc;
 }
@@ -9967,7 +9982,7 @@ static int lfs_data_version(int argc, char **argv)
 
 static int lfs_hsm_state(int argc, char **argv)
 {
-       int rc;
+       int rc = 0;
        int i = 1;
        char *path;
        struct hsm_user_state hus;
@@ -9976,13 +9991,17 @@ static int lfs_hsm_state(int argc, char **argv)
                return CMD_HELP;
 
        do {
+               int rc2;
                path = argv[i];
 
-               rc = llapi_hsm_state_get(path, &hus);
-               if (rc) {
-                       fprintf(stderr, "can't get hsm state for %s: %s\n",
-                               path, strerror(errno = -rc));
-                       return rc;
+               rc2 = llapi_hsm_state_get(path, &hus);
+               if (rc2) {
+                       fprintf(stderr,
+                               "%s %s: get HSM state for '%s' failed: %s\n",
+                               progname, argv[0], path, strerror(-rc2));
+                       if (!rc)
+                               rc = rc2;
+                       continue;
                }
 
                /* Display path name and status flags */
@@ -10010,7 +10029,7 @@ static int lfs_hsm_state(int argc, char **argv)
 
        } while (++i < argc);
 
-       return 0;
+       return rc;
 }
 
 #define LFS_HSM_SET   0
@@ -10035,7 +10054,7 @@ static int lfs_hsm_change_flags(int argc, char **argv, int mode)
        { .val = 'r',   .name = "norelease",    .has_arg = no_argument },
        { .name = NULL } };
        __u64 mask = 0;
-       int c, rc;
+       int c, rc = 0;
        char *path;
        __u32 archive_id = 0;
        char *end = NULL;
@@ -10088,46 +10107,54 @@ static int lfs_hsm_change_flags(int argc, char **argv, int mode)
                return CMD_HELP;
 
        while (optind < argc) {
+               int rc2;
                path = argv[optind];
 
                /* If mode == 0, this means we apply the mask. */
                if (mode == LFS_HSM_SET)
-                       rc = llapi_hsm_state_set(path, mask, 0, archive_id);
+                       rc2 = llapi_hsm_state_set(path, mask, 0, archive_id);
                else
-                       rc = llapi_hsm_state_set(path, 0, mask, 0);
+                       rc2 = llapi_hsm_state_set(path, 0, mask, 0);
 
-               if (rc != 0) {
-                       fprintf(stderr, "Can't change hsm flags for %s: %s\n",
-                               path, strerror(errno = -rc));
-                       return rc;
+               if (rc2) {
+                       fprintf(stderr,
+                               "%s %s: change hsm flags for '%s' failed: %s\n",
+                               progname, argv[0], path, strerror(-rc2));
+                       if (!rc)
+                               rc = rc2;
                }
                optind++;
        }
 
-       return 0;
+       return rc;
 }
 
 static int lfs_hsm_action(int argc, char **argv)
 {
-       int                              rc;
-       int                              i = 1;
-       char                            *path;
-       struct hsm_current_action        hca;
-       struct hsm_extent                he;
-       enum hsm_user_action             hua;
-       enum hsm_progress_states         hps;
+       struct hsm_current_action hca;
+       struct hsm_extent he;
+       enum hsm_user_action hua;
+       enum hsm_progress_states hps;
+       int rc = 0;
+       int i = 1;
+       char *path;
 
        if (argc < 2)
                return CMD_HELP;
 
        do {
+               int rc2;
                path = argv[i];
 
-               rc = llapi_hsm_current_action(path, &hca);
-               if (rc) {
-                       fprintf(stderr, "can't get hsm action for %s: %s\n",
-                               path, strerror(errno = -rc));
-                       return rc;
+               rc2 = llapi_hsm_current_action(path, &hca);
+               if (rc2) {
+                       fprintf(stderr,
+                               "%s %s: get hsm action for '%s' failed: %s\n",
+                               progname, argv[0], path, strerror(-rc2));
+
+                       if (!rc)
+                               rc = rc2;
+                       continue;
                }
                he = hca.hca_location;
                hua = hca.hca_action;
@@ -10157,7 +10184,7 @@ static int lfs_hsm_action(int argc, char **argv)
 
        } while (++i < argc);
 
-       return 0;
+       return rc;
 }
 
 static int lfs_hsm_set(int argc, char **argv)
@@ -10677,10 +10704,12 @@ static int lfs_ladvise(int argc, char **argv)
 
                fd = open(path, O_RDONLY);
                if (fd < 0) {
-                       fprintf(stderr, "%s: cannot open file '%s': %s\n",
-                               argv[0], path, strerror(errno));
                        rc2 = -errno;
-                       goto next;
+                       fprintf(stderr, "%s: cannot open file '%s': %s\n",
+                               argv[0], path, strerror(-rc2));
+                       if (!rc)
+                               rc = rc2;
+                       continue;
                }
 
                advice.lla_start = start;
@@ -10703,13 +10732,12 @@ static int lfs_ladvise(int argc, char **argv)
                                argv[0], ladvise_names[advice_type],
                                path, strerror(errno));
 
-                       goto next;
+                       if (!rc)
+                               rc = rc2;
+                       continue;
                }
-
-next:
-               if (rc == 0 && rc2 < 0)
-                       rc = rc2;
        }
+
        return rc;
 }
 
@@ -11608,8 +11636,8 @@ static inline int lfs_mirror_write(int argc, char **argv)
                rc = check_same_file(fd, inputfile);
                if (rc == 0) {
                        fprintf(stderr,
-                       "%s %s: input file cannot be the mirrored file\n",
-                               progname, argv[0]);
+                       "%s %s: input file cannot be the mirrored file '%s'\n",
+                               progname, argv[0], fname);
                        goto close_fd;
                }
                if (rc < 0)
@@ -11706,7 +11734,7 @@ static inline int lfs_mirror_write(int argc, char **argv)
                        rc = -EBUSY;
                fprintf(stderr,
                        "%s %s: release lease lock of '%s' failed: %s\n",
-                       progname, argv[0], fname, strerror(errno));
+                       progname, argv[0], fname, strerror(-rc));
                goto free_buf;
        }
 
index d1d0f54..a79fcb0 100644 (file)
@@ -243,7 +243,18 @@ llapi_log_callback_t llapi_info_callback_set(llapi_log_callback_t cb)
 }
 
 /**
- * size_units is to be initialized (or zeroed) by caller.
+ * Convert a size string (with optional suffix) into binary value.
+ *
+ * \param optarg [in]          string containing numeric value with optional
+ *                             KMGTPE suffix to specify the unit size.
+ *                             The \a string may be a decimal value.
+ * \param size [out]           pointer to integer numeric value to be returned
+ * \param size_units [in]      units of \a string if dimensionless.  Must be
+ *                             initialized by caller. If zero, units = bytes.
+ * \param bytes_spec [in]      if suffix 'b' means bytes or 512-byte sectors.
+ *
+ * \retval 0                   success
+ * \retval -EINVAL             negative or too large size, or unknown suffix
  */
 int llapi_parse_size(const char *optarg, unsigned long long *size,
                     unsigned long long *size_units, int bytes_spec)
@@ -253,7 +264,7 @@ int llapi_parse_size(const char *optarg, unsigned long long *size,
        unsigned long long frac = 0, frac_d = 1;
 
        if (strncmp(optarg, "-", 1) == 0)
-               return -1;
+               return -EINVAL;
 
        if (*size_units == 0)
                *size_units = 1;
@@ -303,7 +314,7 @@ int llapi_parse_size(const char *optarg, unsigned long long *size,
                           (*size & (~0ULL << (64 - 60))) == 0) {
                        *size_units = 1ULL << 60;
                } else {
-                       return -1;
+                       return -EINVAL;
                }
        }
        *size = *size * *size_units + frac * *size_units / frac_d;
@@ -6528,4 +6539,3 @@ int llapi_file_flush(int fd)
 
        return llapi_get_data_version(fd, &dv, LL_DV_WR_FLUSH);
 }
-