X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Flhsmtool_posix.c;h=d99fce3c87512f9fc6fac8bb902dc711a9342744;hp=0442d553b74a030b11947b3a28260b0ad998e2f7;hb=a68e117a54af82f209aed46a822f8346a3e0703f;hpb=32bd5051a518c57e35f51b7f3c7f739b5ef91b25 diff --git a/lustre/utils/lhsmtool_posix.c b/lustre/utils/lhsmtool_posix.c index 0442d55..d99fce3 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, 2014, Intel Corporation. + * Copyright (c) 2013, 2015, Intel Corporation. */ /* HSM copytool program for POSIX filesystem-based HSM's. * @@ -37,18 +37,26 @@ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif +#include +#include #include #include #include +#include #include #include #include +#include #include +#include #include +#include #include #include #include #include + +#include #include #include @@ -346,7 +354,7 @@ static int ct_parseopts(int argc, char * const *argv) CT_TRACE("action=%d src=%s dst=%s mount_point=%s", opt.o_action, opt.o_src, opt.o_dst, opt.o_mnt); - if (!opt.o_dry_run && opt.o_hsm_root == NULL) { + if (opt.o_hsm_root == NULL) { rc = -EINVAL; CT_ERROR(rc, "must specify a root directory for the backend"); return rc; @@ -516,7 +524,7 @@ static int ct_copy_data(struct hsm_copyaction_private *hcp, const char *src, struct stat dst_st; char *buf = NULL; __u64 write_total = 0; - __u64 length; + __u64 length = hai->hai_extent.length; time_t last_report_time; int rc = 0; double start_ct_now = ct_now(); @@ -539,8 +547,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; } @@ -558,8 +567,8 @@ static int ct_copy_data(struct hsm_copyaction_private *hcp, const char *src, } /* Don't read beyond a given extent */ - length = min(hai->hai_extent.length, - src_st.st_size - hai->hai_extent.offset); + if (length > src_st.st_size - hai->hai_extent.offset) + length = src_st.st_size - hai->hai_extent.offset; start_time = last_bw_print = last_report_time = time(NULL); @@ -582,8 +591,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; @@ -656,8 +665,10 @@ 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); - he.length = write_total; + 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; rc = llapi_hsm_action_progress(hcp, &he, length, 0); if (rc < 0) { /* Action has been canceled or something wrong @@ -666,6 +677,7 @@ static int ct_copy_data(struct hsm_copyaction_private *hcp, const char *src, " '%s'->'%s' failed", src, dst); goto out; } + he.offset = offset; } rc = 0; } @@ -694,8 +706,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; } @@ -829,8 +841,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); @@ -848,8 +860,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 @@ -1270,9 +1282,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) @@ -1649,7 +1661,7 @@ static int ct_rebind_list(const char *list) if (line) free(line); - /* return 0 if all rebinds were sucessful */ + /* return 0 if all rebinds were successful */ CT_TRACE("%u lines read from '%s', %u rebind successful", nl, list, ok); return ok == nl ? 0 : -1; @@ -1755,7 +1767,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; } @@ -1778,7 +1790,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); @@ -1808,14 +1821,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");