X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Flhsmtool_posix.c;h=083d4c63f0d0b58256e32443532c7886d40b7b50;hb=2ec11b04dd76ea176ba9c76f809f576a04dafc1a;hp=d3633d6cf3b5a31a916b610189cae23a2b9379ca;hpb=971b0393a6d0e45051c9875efa2c7179cbf7d4c5;p=fs%2Flustre-release.git diff --git a/lustre/utils/lhsmtool_posix.c b/lustre/utils/lhsmtool_posix.c index d3633d6..083d4c6 100644 --- a/lustre/utils/lhsmtool_posix.c +++ b/lustre/utils/lhsmtool_posix.c @@ -87,8 +87,9 @@ struct options { int o_shadow_tree; int o_verbose; int o_copy_xattrs; - int o_archive_cnt; - int o_archive_id[LL_HSM_MAX_ARCHIVE]; + int o_archive_id_used; + int o_archive_id_cnt; + int *o_archive_id; int o_report_int; unsigned long long o_bandwidth; size_t o_chunk_size; @@ -250,25 +251,70 @@ static int ct_parseopts(int argc, char * const *argv) .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; + unsigned long long value; + unsigned long long unit; + bool all_id = false; + int c, rc; + int i; optind = 0; + + opt.o_archive_id_cnt = LL_HSM_ORIGIN_MAX_ARCHIVE; + opt.o_archive_id = malloc(opt.o_archive_id_cnt * + sizeof(*opt.o_archive_id)); + if (opt.o_archive_id == NULL) + return -ENOMEM; +repeat: 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; - CT_ERROR(rc, "archive number must be less" - "than %zu", LL_HSM_MAX_ARCHIVE); + 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; } - opt.o_archive_id[opt.o_archive_cnt] = atoi(optarg); - opt.o_archive_cnt++; + /* if archiveID is zero, any archiveID is accepted */ + if (all_id == true) + goto repeat; + + if (val == 0) { + free(opt.o_archive_id); + opt.o_archive_id = NULL; + opt.o_archive_id_cnt = 0; + opt.o_archive_id_used = 0; + all_id = true; + CT_WARN("archive-id = 0 is found, any backend" + "will be served\n"); + goto repeat; + } + + /* skip the duplicated id */ + for (i = 0; i < opt.o_archive_id_used; i++) { + if (opt.o_archive_id[i] == val) + goto repeat; + } + /* extend the space */ + if (opt.o_archive_id_used >= opt.o_archive_id_cnt) { + int *tmp; + + opt.o_archive_id_cnt *= 2; + tmp = realloc(opt.o_archive_id, + sizeof(*opt.o_archive_id) * + opt.o_archive_id_cnt); + if (tmp == NULL) + return -ENOMEM; + + opt.o_archive_id = tmp; + } + + opt.o_archive_id[opt.o_archive_id_used++] = val; break; + } case 'b': /* -b and -c have both a number with unit as arg */ case 'c': unit = ONE_MB; @@ -1078,10 +1124,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" @@ -1415,7 +1461,8 @@ static int ct_import_one(const char *src, const char *dst) return 0; rc = llapi_hsm_import(dst, - opt.o_archive_cnt ? opt.o_archive_id[0] : 0, + opt.o_archive_id_used ? + opt.o_archive_id[0] : 0, &st, 0, 0, 0, 0, NULL, &fid); if (rc < 0) { CT_ERROR(rc, "cannot import '%s' from '%s'", dst, src); @@ -1825,7 +1872,7 @@ static int ct_run(void) } rc = llapi_hsm_copytool_register(&ctdata, opt.o_mnt, - opt.o_archive_cnt, + opt.o_archive_id_used, opt.o_archive_id, 0); if (rc < 0) { CT_ERROR(rc, "cannot start copytool interface"); @@ -1958,6 +2005,12 @@ static int ct_cleanup(void) } } + if (opt.o_archive_id_cnt > 0) { + free(opt.o_archive_id); + opt.o_archive_id = NULL; + opt.o_archive_id_cnt = 0; + } + return 0; } @@ -2001,4 +2054,3 @@ error_cleanup: return -rc; } -