Whamcloud - gitweb
LU-13404 utils: fix lfs mirror duplicate file check
[fs/lustre-release.git] / lustre / utils / lfs.c
index 1eb8b1f..44f2653 100644 (file)
@@ -76,7 +76,7 @@
 #include <linux/lustre/lustre_ver.h>
 #include <linux/lustre/lustre_param.h>
 #include <linux/lnet/nidstr.h>
-#include <cyaml.h>
+#include <lnetconfig/cyaml.h>
 
 #ifndef ARRAY_SIZE
 # define ARRAY_SIZE(a) ((sizeof(a)) / (sizeof((a)[0])))
@@ -276,14 +276,14 @@ static inline int lfs_mirror_delete(int argc, char **argv)
        "\tstripe_count: stripe count of the striped directory\n"       \
        "\tmdt_index: MDT index of first stripe\n"                      \
        "\tmdt_hash:  hash type of the striped directory. mdt types:\n" \
-       "       fnv_1a_64 FNV-1a hash algorithm (default)\n"            \
+       "       crush     CRUSH hash algorithm (default)\n" \
+       "       fnv_1a_64 FNV-1a hash algorithm\n"              \
        "       all_char  sum of characters % MDT_COUNT (not recommended)\n" \
-       "       space     create subdirectories with balanced space usage\n" \
        "\tdefault_stripe: set default dirstripe of the directory\n"    \
        "\tmode: the file access permission of the directory (octal)\n" \
        "To create dir with a foreign (free format) layout :\n" \
        "setdirstripe|mkdir --foreign[=<foreign_type>] -x|-xattr <string> " \
-               "[--mode|-m mode] [--flags <hex>] <dir>\n" \
+               "[--mode|-o mode] [--flags <hex>] <dir>\n" \
        "\tmode: the mode of the directory\n" \
        "\tforeign_type: none or daos\n"
 
@@ -628,7 +628,8 @@ command_t cmdlist[] = {
         "                      it's the MDT index of first stripe\n"
         "\tmdt_count:  number of MDTs to stripe a directory over\n"
         "\tmdt_hash:   hash type of the striped directory. mdt types:\n"
-        "                      fnv_1a_64 FNV-1a hash algorithm (default)\n"
+        "                      crush     CRUSH hash algorithm (default)\n"
+        "                      fnv_1a_64 FNV-1a hash algorithm\n"
         "                      all_char  sum of characters % MDT_COUNT\n"
         "\n"
         "migrate file objects from one OST "
@@ -821,12 +822,12 @@ migrate_open_files(const char *name, __u64 migration_flags,
                }
 
                /* create, open a volatile file, use caching (ie no directio) */
-               if (param != NULL)
-                       fdv = llapi_file_open_param(volatile_file, open_flags,
-                                                   open_mode, param);
-               else
+               if (layout)
                        fdv = lfs_component_create(volatile_file, open_flags,
                                                   open_mode, layout);
+               else
+                       fdv = llapi_file_open_param(volatile_file, open_flags,
+                                                   open_mode, param);
        } while (fdv < 0 && (rc = fdv) == -EEXIST);
 
        if (rc < 0) {
@@ -3582,6 +3583,11 @@ static int lfs_setstripe_internal(int argc, char **argv,
                goto usage_error;
        }
 
+       /* lfs migrate $filename should keep the file's layout by default */
+       if (migrate_mode && !setstripe_args_specified(&lsa) && !layout &&
+           !from_yaml)
+               from_copy = true;
+
        if (xattr && !foreign_mode) {
                /* only print a warning as this is harmless and will be ignored
                 */
@@ -3732,8 +3738,8 @@ static int lfs_setstripe_internal(int argc, char **argv,
 
        if ((from_yaml || from_copy) &&
            (setstripe_args_specified(&lsa) || layout != NULL)) {
-               fprintf(stderr, "error: %s: can't specify --yaml with "
-                       "-c, -S, -i, -o, -p or -E options.\n",
+               fprintf(stderr, "error: %s: can't specify --yaml or --copy with"
+                       " -c, -S, -i, -o, -p or -E options.\n",
                        argv[0]);
                goto error;
        }
@@ -3779,7 +3785,7 @@ static int lfs_setstripe_internal(int argc, char **argv,
                if (lsa.lsa_pattern != LLAPI_LAYOUT_RAID0)
                        lmu->lum_hash_type = lsa.lsa_pattern;
                else
-                       lmu->lum_hash_type = LMV_HASH_TYPE_DEFAULT;
+                       lmu->lum_hash_type = LMV_HASH_TYPE_UNKNOWN;
                if (lsa.lsa_pool_name) {
                        strncpy(lmu->lum_pool_name, lsa.lsa_pool_name,
                                sizeof(lmu->lum_pool_name) - 1);
@@ -3873,17 +3879,19 @@ static int lfs_setstripe_internal(int argc, char **argv,
                                argv[0], template);
                        goto error;
                }
-       } else if (from_copy) {
-               layout = llapi_layout_get_by_path(template, 0);
-               if (layout == NULL) {
-                       fprintf(stderr,
-                           "%s: can't create composite layout from file %s.\n",
-                               progname, template);
-                       goto error;
-               }
        }
 
        for (fname = argv[optind]; fname != NULL; fname = argv[++optind]) {
+               if (from_copy) {
+                       layout = llapi_layout_get_by_path(template ?: fname, 0);
+                       if (layout == NULL) {
+                               fprintf(stderr, "%s: can't create composite "
+                                       "layout from file %s.\n",
+                                       progname, template ?: fname);
+                               goto error;
+                       }
+               }
+
                if (migrate_mdt_mode) {
                        result = llapi_migrate_mdt(fname, &migrate_mdt_param);
                } else if (migrate_mode) {
@@ -6015,7 +6023,7 @@ static int lfs_setdirstripe(int argc, char **argv)
        if (lsa.lsa_pattern != LLAPI_LAYOUT_RAID0)
                param->lsp_stripe_pattern = lsa.lsa_pattern;
        else
-               param->lsp_stripe_pattern = LMV_HASH_TYPE_DEFAULT;
+               param->lsp_stripe_pattern = LMV_HASH_TYPE_UNKNOWN;
        param->lsp_pool = lsa.lsa_pool_name;
        param->lsp_is_specific = false;
        if (lsa.lsa_nr_tgts > 1) {
@@ -6139,6 +6147,7 @@ static int lfs_mv(int argc, char **argv)
                return CMD_HELP;
        }
 
+       lmu.lum_hash_type = LMV_HASH_TYPE_UNKNOWN;
 
        /* initialize migrate mdt parameters */
        param.fp_lmv_md = &lmu;
@@ -6146,7 +6155,7 @@ static int lfs_mv(int argc, char **argv)
        rc = llapi_migrate_mdt(argv[optind], &param);
        if (rc != 0)
                fprintf(stderr, "%s mv: cannot migrate '%s' to MDT%04x: %s\n",
-                       progname, argv[optind], param.fp_mdt_index,
+                       progname, argv[optind], lmu.lum_stripe_offset,
                        strerror(-rc));
        return rc;
 }
@@ -9449,22 +9458,16 @@ static inline int verify_mirror_id_by_fd(int fd, __u16 mirror_id)
  * \retval     1  not the same file
  * \retval     <0 error code
  */
-static inline int check_same_file(const char *f1, const char *f2)
+static inline int check_same_file(int fd, const char *f2)
 {
        struct stat stbuf1;
        struct stat stbuf2;
 
-       if (stat(f1, &stbuf1) < 0) {
-               fprintf(stderr, "%s: cannot stat file '%s': %s\n",
-                       progname, f1, strerror(errno));
+       if (fstat(fd, &stbuf1) < 0)
                return -errno;
-       }
 
-       if (stat(f2, &stbuf2) < 0) {
-               fprintf(stderr, "%s: cannot stat file '%s': %s\n",
-                       progname, f2, strerror(errno));
-               return -errno;
-       }
+       if (stat(f2, &stbuf2) < 0)
+               return 1;
 
        if (stbuf1.st_rdev == stbuf2.st_rdev &&
            stbuf1.st_ino == stbuf2.st_ino)
@@ -9530,19 +9533,6 @@ static inline int lfs_mirror_read(int argc, char **argv)
 
        /* open mirror file */
        fname = argv[optind];
-
-       if (outfile) {
-               rc = check_same_file(fname, outfile);
-               if (rc == 0) {
-                       fprintf(stderr,
-                       "%s %s: output file cannot be the mirrored file\n",
-                               progname, argv[0]);
-                       return -EINVAL;
-               }
-               if (rc < 0)
-                       return rc;
-       }
-
        fd = open(fname, O_DIRECT | O_RDONLY);
        if (fd < 0) {
                fprintf(stderr, "%s %s: cannot open '%s': %s\n",
@@ -9559,7 +9549,7 @@ static inline int lfs_mirror_read(int argc, char **argv)
                goto close_fd;
        }
 
-       /* open output file */
+       /* open output file - O_EXCL ensures output is not the same as input */
        if (outfile) {
                outfd = open(outfile, O_EXCL | O_WRONLY | O_CREAT, 0644);
                if (outfd < 0) {
@@ -9699,19 +9689,6 @@ static inline int lfs_mirror_write(int argc, char **argv)
 
        /* open mirror file */
        fname = argv[optind];
-
-       if (inputfile) {
-               rc = check_same_file(fname, inputfile);
-               if (rc == 0) {
-                       fprintf(stderr,
-                       "%s %s: input file cannot be the mirrored file\n",
-                               progname, argv[0]);
-                       return -EINVAL;
-               }
-               if (rc < 0)
-                       return rc;
-       }
-
        fd = open(fname, O_DIRECT | O_WRONLY);
        if (fd < 0) {
                fprintf(stderr, "%s %s: cannot open '%s': %s\n",
@@ -9730,6 +9707,16 @@ static inline int lfs_mirror_write(int argc, char **argv)
 
        /* open input file */
        if (inputfile) {
+               rc = check_same_file(fd, inputfile);
+               if (rc == 0) {
+                       fprintf(stderr,
+                       "%s %s: input file cannot be the mirrored file\n",
+                               progname, argv[0]);
+                       goto close_fd;
+               }
+               if (rc < 0)
+                       goto close_fd;
+
                inputfd = open(inputfile, O_RDONLY, 0644);
                if (inputfd < 0) {
                        fprintf(stderr, "%s %s: cannot open file '%s': %s\n",