Whamcloud - gitweb
LU-11154 llite: use proper flags for FS_IOC_{FSSET,FSGET}XATTR
[fs/lustre-release.git] / lustre / utils / lhsmtool_posix.c
index 3bdaa42..2ad9f3f 100644 (file)
@@ -57,7 +57,7 @@
 #include <sys/types.h>
 
 #include <libcfs/util/string.h>
-#include <linux/lustre_fid.h>
+#include <linux/lustre/lustre_fid.h>
 #include <lustre/lustreapi.h>
 
 /* Progress reporting period */
@@ -88,7 +88,7 @@ struct options {
        int                      o_verbose;
        int                      o_copy_xattrs;
        int                      o_archive_cnt;
-       int                      o_archive_id[LL_HSM_MAX_ARCHIVE];
+       int                      o_archive_id[LL_HSM_MAX_ARCHIVE + 1];
        int                      o_report_int;
        unsigned long long       o_bandwidth;
        size_t                   o_chunk_size;
@@ -258,17 +258,28 @@ static int ct_parseopts(int argc, char * const *argv)
        while ((c = getopt_long(argc, argv, "A:b:c:f:hiMp:qru:v",
                                long_opts, NULL)) != -1) {
                switch (c) {
-               case 'A':
-                       if ((opt.o_archive_cnt >= LL_HSM_MAX_ARCHIVE) ||
-                           (atoi(optarg) >= LL_HSM_MAX_ARCHIVE)) {
-                               rc = -E2BIG;
+               case 'A': {
+                       char *end = NULL;
+                       int val = strtol(optarg, &end, 10);
+
+                       if (*end != '\0') {
+                               rc = -EINVAL;
+                               CT_ERROR(rc, "invalid archive-id: '%s'",
+                                        optarg);
+                               return rc;
+                       }
+
+                       if (opt.o_archive_cnt > LL_HSM_MAX_ARCHIVE ||
+                           val > LL_HSM_MAX_ARCHIVE) {
+                               rc = -EINVAL;
                                CT_ERROR(rc, "archive number must be less"
-                                        "than %zu", LL_HSM_MAX_ARCHIVE);
+                                        " than %zu", LL_HSM_MAX_ARCHIVE + 1);
                                return rc;
                        }
-                       opt.o_archive_id[opt.o_archive_cnt] = atoi(optarg);
+                       opt.o_archive_id[opt.o_archive_cnt] = val;
                        opt.o_archive_cnt++;
                        break;
+               }
                case 'b': /* -b and -c have both a number with unit as arg */
                case 'c':
                        unit = ONE_MB;
@@ -794,14 +805,14 @@ static int ct_copy_xattr(const char *src, const char *dst, int src_fd,
 }
 
 static int ct_path_lustre(char *buf, int sz, const char *mnt,
-                         const lustre_fid *fid)
+                         const struct lu_fid *fid)
 {
        return snprintf(buf, sz, "%s/%s/fid/"DFID_NOBRACE, mnt,
                        dot_lustre_name, PFID(fid));
 }
 
 static int ct_path_archive(char *buf, int sz, const char *archive_dir,
-                          const lustre_fid *fid)
+                          const struct lu_fid *fid)
 {
        return snprintf(buf, sz, "%s/%04x/%04x/%04x/%04x/%04x/%04x/"
                        DFID_NOBRACE, archive_dir,
@@ -886,7 +897,8 @@ static int ct_archive(const struct hsm_action_item *hai, const long hal_flags)
 {
        struct hsm_copyaction_private   *hcp = NULL;
        char                             src[PATH_MAX];
-       char                             dst[PATH_MAX] = "";
+       char                             dst[PATH_MAX + 4] = "";
+       char                             root[PATH_MAX] = "";
        int                              rc;
        int                              rcf = 0;
        bool                             rename_needed = false;
@@ -904,14 +916,16 @@ static int ct_archive(const struct hsm_action_item *hai, const long hal_flags)
         * destination = lustre FID
         */
        ct_path_lustre(src, sizeof(src), opt.o_mnt, &hai->hai_dfid);
-       ct_path_archive(dst, sizeof(dst), opt.o_hsm_root, &hai->hai_fid);
+       ct_path_archive(root, sizeof(root), opt.o_hsm_root, &hai->hai_fid);
        if (hai->hai_extent.length == -1) {
                /* whole file, write it to tmp location and atomically
                 * replace old archived file */
-               strlcat(dst, "_tmp", sizeof(dst));
+               snprintf(dst, sizeof(dst), "%s_tmp", root);
                /* we cannot rely on the same test because ct_copy_data()
                 * updates hai_extent.length */
                rename_needed = true;
+       } else {
+               snprintf(dst, sizeof(dst), "%s", root);
        }
 
        CT_TRACE("archiving '%s' to '%s'", src, dst);
@@ -1075,10 +1089,10 @@ static int ct_archive(const struct hsm_action_item *hai, const long hal_flags)
                                                 src);
                                        rcf = rcf ? rcf : -errno;
                                        goto fini_minor;
+                               }
                                /* unlink old symlink done */
                                CT_TRACE("remove old symlink '%s' pointing"
                                         " to '%s'", src, buf);
-                               }
                        } else {
                                /* symlink already ok */
                                CT_TRACE("symlink '%s' already pointing"
@@ -1242,7 +1256,7 @@ fini:
 static int ct_remove(const struct hsm_action_item *hai, const long hal_flags)
 {
        struct hsm_copyaction_private   *hcp = NULL;
-       char                             dst[PATH_MAX];
+       char                             dst[PATH_MAX], attr[PATH_MAX + 4];
        int                              rc;
 
        rc = ct_begin(&hcp, hai);
@@ -1266,11 +1280,11 @@ static int ct_remove(const struct hsm_action_item *hai, const long hal_flags)
                goto fini;
        }
 
-       strlcat(dst, ".lov", sizeof(dst));
-       rc = unlink(dst);
+       snprintf(attr, sizeof(attr), "%s.lov", dst);
+       rc = unlink(attr);
        if (rc < 0) {
                rc = -errno;
-               CT_ERROR(rc, "cannot unlink '%s'", dst);
+               CT_ERROR(rc, "cannot unlink '%s'", attr);
                err_minor++;
                goto fini;
        }
@@ -1396,7 +1410,7 @@ static int ct_process_item_async(const struct hsm_action_item *hai,
 static int ct_import_one(const char *src, const char *dst)
 {
        char            newarc[PATH_MAX];
-       lustre_fid      fid;
+       struct lu_fid   fid;
        struct stat     st;
        int             rc;
 
@@ -1454,7 +1468,7 @@ static char *path_concat(const char *dirname, const char *basename)
        return result;
 }
 
-static int ct_import_fid(const lustre_fid *import_fid)
+static int ct_import_fid(const struct lu_fid *import_fid)
 {
        char    fid_path[PATH_MAX];
        int     rc;
@@ -1480,7 +1494,7 @@ static int ct_import_recurse(const char *relpath)
        DIR             *dir;
        struct dirent   *ent;
        char            *srcpath, *newpath;
-       lustre_fid       import_fid;
+       struct lu_fid    import_fid;
        int              rc;
 
        if (relpath == NULL)
@@ -1563,7 +1577,8 @@ out:
        return rc;
 }
 
-static int ct_rebind_one(const lustre_fid *old_fid, const lustre_fid *new_fid)
+static int ct_rebind_one(const struct lu_fid *old_fid,
+                        const struct lu_fid *new_fid)
 {
        char    src[PATH_MAX];
        char    dst[PATH_MAX];
@@ -1575,6 +1590,9 @@ static int ct_rebind_one(const lustre_fid *old_fid, const lustre_fid *new_fid)
        ct_path_archive(dst, sizeof(dst), opt.o_hsm_root, new_fid);
 
        if (!opt.o_dry_run) {
+               char src_attr[PATH_MAX + 4];
+               char dst_attr[PATH_MAX + 4];
+
                ct_mkdir_p(dst);
                if (rename(src, dst)) {
                        rc = -errno;
@@ -1582,16 +1600,17 @@ static int ct_rebind_one(const lustre_fid *old_fid, const lustre_fid *new_fid)
                        return -errno;
                }
                /* rename lov file */
-               strlcat(src, ".lov", sizeof(src));
-               strlcat(dst, ".lov", sizeof(dst));
-               if (rename(src, dst))
-                       CT_ERROR(errno, "cannot rename '%s' to '%s'", src, dst);
+               snprintf(src_attr, sizeof(src_attr), "%s.lov", src);
+               snprintf(dst_attr, sizeof(dst_attr), "%s.lov", dst);
+               if (rename(src_attr, dst_attr))
+                       CT_ERROR(errno, "cannot rename '%s' to '%s'",
+                                src_attr, dst_attr);
 
        }
        return 0;
 }
 
-static bool fid_is_file(lustre_fid *fid)
+static bool fid_is_file(struct lu_fid *fid)
 {
        return fid_is_norm(fid) || fid_is_igif(fid);
 }
@@ -1631,8 +1650,8 @@ static int ct_rebind_list(const char *list)
 
        /* each line consists of 2 FID */
        while ((r = getline(&line, &line_size, filp)) != -1) {
-               lustre_fid      old_fid;
-               lustre_fid      new_fid;
+               struct lu_fid   old_fid;
+               struct lu_fid   new_fid;
 
                /* Ignore empty and commented out ('#...') lines. */
                if (should_ignore_line(line))
@@ -1672,8 +1691,8 @@ static int ct_rebind(void)
        int     rc;
 
        if (opt.o_dst) {
-               lustre_fid      old_fid;
-               lustre_fid      new_fid;
+               struct lu_fid old_fid;
+               struct lu_fid new_fid;
 
                if (sscanf(opt.o_src, SFID, RFID(&old_fid)) != 3 ||
                    !fid_is_file(&old_fid)) {
@@ -1751,7 +1770,7 @@ static int ct_max_sequence(void)
        __u64   seq = 0;
        __u16   subseq;
 
-       strlcpy(path, opt.o_hsm_root, sizeof(path));
+       snprintf(path, sizeof(path), "%s", opt.o_hsm_root);
        /* FID sequence is stored in top-level directory names:
         * hsm_root/16bits (high weight)/16 bits/16 bits/16 bits (low weight).
         */
@@ -1957,7 +1976,7 @@ int main(int argc, char **argv)
 {
        int     rc;
 
-       strlcpy(cmd_name, basename(argv[0]), sizeof(cmd_name));
+       snprintf(cmd_name, sizeof(cmd_name), "%s", basename(argv[0]));
        rc = ct_parseopts(argc, argv);
        if (rc < 0) {
                CT_WARN("try '%s --help' for more information", cmd_name);
@@ -1993,4 +2012,3 @@ error_cleanup:
 
        return -rc;
 }
-