X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Flhsmtool_posix.c;h=28e3c493ed7230b3a61e67b4fb51c9c51a27bc34;hb=8d1639b5cf1edbc885876956dcd6189173c00955;hp=a8d7db40e90071197e661462a5f7421078047669;hpb=b964cd1c61858a090c812b31a2b3a2f9f94765fb;p=fs%2Flustre-release.git diff --git a/lustre/utils/lhsmtool_posix.c b/lustre/utils/lhsmtool_posix.c index a8d7db40..28e3c49 100644 --- a/lustre/utils/lhsmtool_posix.c +++ b/lustre/utils/lhsmtool_posix.c @@ -23,7 +23,7 @@ * (C) Copyright 2012 Commissariat a l'energie atomique et aux energies * alternatives * - * Copyright (c) 2013, 2015, Intel Corporation. + * Copyright (c) 2013, 2016, Intel Corporation. */ /* HSM copytool program for POSIX filesystem-based HSM's. * @@ -37,9 +37,12 @@ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif +#include +#include #include #include #include +#include #include #include #include @@ -47,12 +50,14 @@ #include #include #include +#include #include #include #include #include + #include -#include +#include #include /* Progress reporting period */ @@ -205,35 +210,46 @@ static void usage(const char *name, int rc) static int ct_parseopts(int argc, char * const *argv) { struct option long_opts[] = { - {"abort-on-error", no_argument, &opt.o_abort_on_error, 1}, - {"abort_on_error", no_argument, &opt.o_abort_on_error, 1}, - {"archive", required_argument, NULL, 'A'}, - {"bandwidth", required_argument, NULL, 'b'}, - {"chunk-size", required_argument, NULL, 'c'}, - {"chunk_size", required_argument, NULL, 'c'}, - {"daemon", no_argument, &opt.o_daemonize, 1}, - {"event-fifo", required_argument, NULL, 'f'}, - {"event_fifo", required_argument, NULL, 'f'}, - {"dry-run", no_argument, &opt.o_dry_run, 1}, - {"help", no_argument, NULL, 'h'}, - {"hsm-root", required_argument, NULL, 'p'}, - {"hsm_root", required_argument, NULL, 'p'}, - {"import", no_argument, NULL, 'i'}, - {"max-sequence", no_argument, NULL, 'M'}, - {"max_sequence", no_argument, NULL, 'M'}, - {"no-attr", no_argument, &opt.o_copy_attrs, 0}, - {"no_attr", no_argument, &opt.o_copy_attrs, 0}, - {"no-shadow", no_argument, &opt.o_shadow_tree, 0}, - {"no_shadow", no_argument, &opt.o_shadow_tree, 0}, - {"no-xattr", no_argument, &opt.o_copy_xattrs, 0}, - {"no_xattr", no_argument, &opt.o_copy_xattrs, 0}, - {"quiet", no_argument, NULL, 'q'}, - {"rebind", no_argument, NULL, 'r'}, - {"update-interval", required_argument, NULL, 'u'}, - {"update_interval", required_argument, NULL, 'u'}, - {"verbose", no_argument, NULL, 'v'}, - {0, 0, 0, 0} - }; + { .val = 1, .name = "abort-on-error", + .flag = &opt.o_abort_on_error, .has_arg = no_argument }, + { .val = 1, .name = "abort_on_error", + .flag = &opt.o_abort_on_error, .has_arg = no_argument }, + { .val = 'A', .name = "archive", .has_arg = required_argument }, + { .val = 'b', .name = "bandwidth", .has_arg = required_argument }, + { .val = 'c', .name = "chunk-size", .has_arg = required_argument }, + { .val = 'c', .name = "chunk_size", .has_arg = required_argument }, + { .val = 1, .name = "daemon", .has_arg = no_argument, + .flag = &opt.o_daemonize }, + { .val = 'f', .name = "event-fifo", .has_arg = required_argument }, + { .val = 'f', .name = "event_fifo", .has_arg = required_argument }, + { .val = 1, .name = "dry-run", .has_arg = no_argument, + .flag = &opt.o_dry_run }, + { .val = 'h', .name = "help", .has_arg = no_argument }, + { .val = 'i', .name = "import", .has_arg = no_argument }, + { .val = 'M', .name = "max-sequence", .has_arg = no_argument }, + { .val = 'M', .name = "max_sequence", .has_arg = no_argument }, + { .val = 0, .name = "no-attr", .has_arg = no_argument, + .flag = &opt.o_copy_attrs }, + { .val = 0, .name = "no_attr", .has_arg = no_argument, + .flag = &opt.o_copy_attrs }, + { .val = 0, .name = "no-shadow", .has_arg = no_argument, + .flag = &opt.o_shadow_tree }, + { .val = 0, .name = "no_shadow", .has_arg = no_argument, + .flag = &opt.o_shadow_tree }, + { .val = 0, .name = "no-xattr", .has_arg = no_argument, + .flag = &opt.o_copy_xattrs }, + { .val = 0, .name = "no_xattr", .has_arg = no_argument, + .flag = &opt.o_copy_xattrs }, + { .val = 'p', .name = "hsm-root", .has_arg = required_argument }, + { .val = 'p', .name = "hsm_root", .has_arg = required_argument }, + { .val = 'q', .name = "quiet", .has_arg = no_argument }, + { .val = 'r', .name = "rebind", .has_arg = no_argument }, + { .val = 'u', .name = "update-interval", + .has_arg = required_argument }, + { .val = 'u', .name = "update_interval", + .has_arg = required_argument }, + { .val = 'v', .name = "verbose", .has_arg = no_argument }, + { .name = NULL } }; int c, rc; unsigned long long value; unsigned long long unit; @@ -542,8 +558,9 @@ static int ct_copy_data(struct hsm_copyaction_private *hcp, const char *src, if (hai->hai_extent.offset > (__u64)src_st.st_size) { rc = -EINVAL; - CT_ERROR(rc, "Trying to start reading past end ("LPU64" > " - "%jd) of '%s' source file", hai->hai_extent.offset, + CT_ERROR(rc, "Trying to start reading past end (%ju > " + "%jd) of '%s' source file", + (uintmax_t)hai->hai_extent.offset, (intmax_t)src_st.st_size, src); return rc; } @@ -585,8 +602,8 @@ static int ct_copy_data(struct hsm_copyaction_private *hcp, const char *src, goto out; } - CT_TRACE("start copy of "LPU64" bytes from '%s' to '%s'", - length, src, dst); + CT_TRACE("start copy of %ju bytes from '%s' to '%s'", + (uintmax_t)length, src, dst); while (write_total < length) { ssize_t rsize; @@ -659,7 +676,7 @@ static int ct_copy_data(struct hsm_copyaction_private *hcp, const char *src, now = time(NULL); if (now >= last_report_time + opt.o_report_int) { last_report_time = now; - CT_TRACE("%%"LPU64" ", 100 * write_total / length); + CT_TRACE("%%%ju ", (uintmax_t)(100 * write_total / length)); /* only give the length of the write since the last * progress report */ he.length = offset - he.offset; @@ -700,8 +717,8 @@ out: if (buf != NULL) free(buf); - CT_TRACE("copied "LPU64" bytes in %f seconds", - length, ct_now() - start_ct_now); + CT_TRACE("copied %ju bytes in %f seconds", + (uintmax_t)length, ct_now() - start_ct_now); return rc; } @@ -777,14 +794,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, @@ -835,8 +852,8 @@ static int ct_fini(struct hsm_copyaction_private **phcp, int rc; CT_TRACE("Action completed, notifying coordinator " - "cookie="LPX64", FID="DFID", hp_flags=%d err=%d", - hai->hai_cookie, PFID(&hai->hai_fid), + "cookie=%#jx, FID="DFID", hp_flags=%d err=%d", + (uintmax_t)hai->hai_cookie, PFID(&hai->hai_fid), hp_flags, -ct_rc); ct_path_lustre(lstr, sizeof(lstr), opt.o_mnt, &hai->hai_fid); @@ -854,8 +871,8 @@ static int ct_fini(struct hsm_copyaction_private **phcp, rc = llapi_hsm_action_end(phcp, &hai->hai_extent, hp_flags, abs(ct_rc)); if (rc == -ECANCELED) CT_ERROR(rc, "completed action on '%s' has been canceled: " - "cookie="LPX64", FID="DFID, lstr, hai->hai_cookie, - PFID(&hai->hai_fid)); + "cookie=%#jx, FID="DFID, lstr, + (uintmax_t)hai->hai_cookie, PFID(&hai->hai_fid)); else if (rc < 0) CT_ERROR(rc, "llapi_hsm_action_end() on '%s' failed", lstr); else @@ -1276,9 +1293,9 @@ static int ct_process_item(struct hsm_action_item *hai, const long hal_flags) int linkno = 0; sprintf(fid, DFID, PFID(&hai->hai_fid)); - CT_TRACE("'%s' action %s reclen %d, cookie="LPX64, + CT_TRACE("'%s' action %s reclen %d, cookie=%#jx", fid, hsm_copytool_action2name(hai->hai_action), - hai->hai_len, hai->hai_cookie); + hai->hai_len, (uintmax_t)hai->hai_cookie); rc = llapi_fid2path(opt.o_mnt, fid, path, sizeof(path), &recno, &linkno); if (rc < 0) @@ -1379,7 +1396,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; @@ -1437,7 +1454,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; @@ -1461,9 +1478,9 @@ static int ct_import_fid(const lustre_fid *import_fid) static int ct_import_recurse(const char *relpath) { DIR *dir; - struct dirent ent, *cookie = NULL; + struct dirent *ent; char *srcpath, *newpath; - lustre_fid import_fid; + struct lu_fid import_fid; int rc; if (relpath == NULL) @@ -1498,31 +1515,20 @@ static int ct_import_recurse(const char *relpath) } free(srcpath); - while (1) { - rc = readdir_r(dir, &ent, &cookie); - if (rc != 0) { - rc = -errno; - CT_ERROR(rc, "cannot readdir_r '%s'", relpath); - err_major++; - goto out; - } else if ((rc == 0) && (cookie == NULL)) { - /* end of directory */ - break; - } - - if (!strcmp(ent.d_name, ".") || - !strcmp(ent.d_name, "..")) + while ((ent = readdir(dir)) != NULL) { + if (!strcmp(ent->d_name, ".") || + !strcmp(ent->d_name, "..")) continue; /* New relative path */ - newpath = path_concat(relpath, ent.d_name); + newpath = path_concat(relpath, ent->d_name); if (newpath == NULL) { err_major++; rc = -ENOMEM; goto out; } - if (ent.d_type == DT_DIR) { + if (ent->d_type == DT_DIR) { rc = ct_import_recurse(newpath); } else { char src[PATH_MAX]; @@ -1557,7 +1563,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]; @@ -1585,7 +1592,7 @@ static int ct_rebind_one(const lustre_fid *old_fid, const lustre_fid *new_fid) 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); } @@ -1625,8 +1632,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)) @@ -1666,8 +1673,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)) { @@ -1699,7 +1706,7 @@ static int ct_dir_level_max(const char *dirpath, __u16 *sub_seqmax) DIR *dir; int rc; __u16 sub_seq; - struct dirent ent, *cookie = NULL; + struct dirent *ent; *sub_seqmax = 0; @@ -1710,26 +1717,29 @@ static int ct_dir_level_max(const char *dirpath, __u16 *sub_seqmax) return rc; } - while ((rc = readdir_r(dir, &ent, &cookie)) == 0) { - if (cookie == NULL) + do { + errno = 0; + ent = readdir(dir); + if (ent == NULL) { /* end of directory. * rc is 0 and seqmax contains the max value. */ + rc = -errno; + if (rc) + CT_ERROR(rc, "cannot readdir '%s'", dirpath); goto out; + } - if (!strcmp(ent.d_name, ".") || !strcmp(ent.d_name, "..")) + if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) continue; - if (sscanf(ent.d_name, "%hx", &sub_seq) != 1) { + if (sscanf(ent->d_name, "%hx", &sub_seq) != 1) { CT_TRACE("'%s' has an unexpected dirname format, " - "skip entry", ent.d_name); + "skip entry", ent->d_name); continue; } if (sub_seq > *sub_seqmax) *sub_seqmax = sub_seq; - } - rc = -errno; - CT_ERROR(rc, "cannot readdir_r '%s'", dirpath); - + } while (1); out: closedir(dir); return rc; @@ -1761,7 +1771,7 @@ static int ct_max_sequence(void) path[sizeof(path) - 1] = '\0'; } - printf("max_sequence: "LPX64"\n", seq); + printf("max_sequence: %#jx\n", (uintmax_t)seq); return 0; } @@ -1784,7 +1794,8 @@ static void handler(int signal) /* Daemon waits for messages from the kernel; run it in the background. */ static int ct_run(void) { - int rc; + struct sigaction cleanup_sigaction; + int rc; if (opt.o_daemonize) { rc = daemon(1, 1); @@ -1814,14 +1825,17 @@ static int ct_run(void) return rc; } - signal(SIGINT, handler); - signal(SIGTERM, handler); + memset(&cleanup_sigaction, 0, sizeof(cleanup_sigaction)); + cleanup_sigaction.sa_handler = handler; + sigemptyset(&cleanup_sigaction.sa_mask); + sigaction(SIGINT, &cleanup_sigaction, NULL); + sigaction(SIGTERM, &cleanup_sigaction, NULL); while (1) { - struct hsm_action_list *hal; - struct hsm_action_item *hai; - int msgsize; - int i = 0; + struct hsm_action_list *hal; + struct hsm_action_item *hai; + int msgsize; + int i = 0; CT_TRACE("waiting for message from kernel");