* (C) Copyright 2012 Commissariat a l'energie atomique et aux energies
* alternatives
*
- * Copyright (c) 2013, 2014, Intel Corporation.
+ * Copyright (c) 2013, 2016, Intel Corporation.
*/
/* HSM copytool program for POSIX filesystem-based HSM's.
*
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
+#include <ctype.h>
+#include <fcntl.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
+#include <string.h>
#include <dirent.h>
#include <errno.h>
#include <getopt.h>
#include <pthread.h>
#include <time.h>
+#include <unistd.h>
#include <utime.h>
+#include <signal.h>
#include <sys/time.h>
#include <sys/xattr.h>
#include <sys/syscall.h>
#include <sys/types.h>
+
+#include <libcfs/util/string.h>
#include <lustre/lustre_idl.h>
#include <lustre/lustreapi.h>
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;
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();
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;
}
}
/* 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);
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;
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
" '%s'->'%s' failed", src, dst);
goto out;
}
+ he.offset = offset;
}
rc = 0;
}
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;
}
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);
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
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)
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;
path[sizeof(path) - 1] = '\0';
}
- printf("max_sequence: "LPX64"\n", seq);
+ printf("max_sequence: %#jx\n", (uintmax_t)seq);
return 0;
}
/* 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);
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");