#include <libcfs/util/parser.h>
#include <lustre/lustreapi.h>
#include <lustre_ver.h>
-#include <lustre_param.h>
+#include <linux/lustre_param.h>
#ifndef ARRAY_SIZE
# define ARRAY_SIZE(a) ((sizeof(a)) / (sizeof((a)[0])))
#define SETDIRSTRIPE_USAGE \
" [--mdt-count|-c stripe_count>\n" \
" [--mdt-index|-i mdt_index]\n" \
- " [--mdt-hash|-t mdt_hash]\n" \
+ " [--mdt-hash|-H mdt_hash]\n" \
" [--default|-D] [--mode|-m mode] <dir>\n" \
"\tstripe_count: stripe count of the striped directory\n" \
"\tmdt_index: MDT index of first stripe\n" \
" <filename>\n"
"\tcomp_id: Unique component ID\n"
"\tcomp_flags: 'init' indicating all instantiated components\n"
+ "\t '^init' indicating all uninstantiated components\n"
"\t-I and -F can't be specified at the same time\n"
" or\n"
"To add component(s) to an existing composite file:\n"
"usage: getstripe [--ost|-O <uuid>] [--quiet|-q] [--verbose|-v]\n"
" [--stripe-count|-c] [--stripe-index|-i]\n"
" [--pool|-p] [--stripe-size|-S] [--directory|-d]\n"
- " [--mdt|-m] [--recursive|-r] [--raw|-R]\n"
+ " [--mdt|-m] [--recursive|-r] [--raw|-R] [--yaml|-y]\n"
" [--layout|-L] [--fid|-F] [--generation|-g]\n"
- " [--component-id|-I [comp_id]]\n"
- " [--component-flags [comp_flags]]\n"
- " [--component-count [comp_count]]\n"
- " [--component-start [comp_start]]\n"
- " [--component-end|-E [comp_end]]\n"
+ " [--component-id[=comp_id]|-I[comp_id]]\n"
+ " [--component-flags[=comp_flags]]\n"
+ " [--component-count]\n"
+ " [--component-start[=[+-]comp_start]]\n"
+ " [--component-end[=[+-]comp_end]|-E[[+-]comp_end]]\n"
" <directory|filename> ..."},
{"setdirstripe", lfs_setdirstripe, 0,
"To create a striped directory on a specified MDT. This can only\n"
"or recursively for all directories in a directory tree.\n"
"usage: getdirstripe [--obd|-O <uuid>] [--mdt-count|-c]\n"
" [--mdt-index|-i] [--mdt-hash|-t]\n"
- " [--recursive|-r] [--default|-D] <dir> ..."},
+ " [--recursive|-r] [--yaml|-y]\n"
+ " [--default|-D] <dir> ..."},
{"mkdir", lfs_setdirstripe, 0,
"To create a striped directory on a specified MDT. This can only\n"
"be done on MDT0 with the right of administrator.\n"
" [[!] --stripe-size|-S [+-]N[kMGT]] [[!] --type|-t <filetype>]\n"
" [[!] --gid|-g|--group|-G <gid>|<gname>]\n"
" [[!] --uid|-u|--user|-U <uid>|<uname>] [[!] --pool <pool>]\n"
+ " [[!] --projid <projid>]\n"
" [[!] --layout|-L released,raid0]\n"
" [[!] --component-count [+-]<comp_cnt>]\n"
" [[!] --component-start [+-]N[kMGTPE]]\n"
" [[!] --component-end|-E [+-]N[kMGTPE]]\n"
" [[!] --component-flags <comp_flags>]\n"
+ " [[!] --mdt-count|-T [+-]<stripes>]\n"
+ " [[!] --mdt-hash|-H <hashtype>\n"
"\t !: used before an option indicates 'NOT' requested attribute\n"
- "\t -: used before a value indicates 'AT MOST' requested value\n"
- "\t +: used before a value indicates 'AT LEAST' requested value\n"},
+ "\t -: used before a value indicates less than requested value\n"
+ "\t +: used before a value indicates more than requested value\n"
+ "\tmdt-hash: hash type of the striped directory.\n"
+ "\t fnv_1a_64 FNV-1a hash algorithm\n"
+ "\t all_char sum of characters % MDT_COUNT\n"},
{"check", lfs_check, 0,
"Display the status of MDS or OSTs (as specified in the command)\n"
"or all the servers (MDS and OSTs).\n"
"usage: setquota <-u|-g|-p> <uname>|<uid>|<gname>|<gid>|<projid>\n"
" -b <block-softlimit> -B <block-hardlimit>\n"
" -i <inode-softlimit> -I <inode-hardlimit> <filesystem>\n"
- " setquota <-u|--user|-g|--group|-p|--project> <uname>|<uid>|<gname>|<gid>|<projid>\n"
+ " setquota <-u|--user|-g|--group|-p|--projid> <uname>|<uid>|<gname>|<gid>|<projid>\n"
" [--block-softlimit <block-softlimit>]\n"
" [--block-hardlimit <block-hardlimit>]\n"
" [--inode-softlimit <inode-softlimit>]\n"
" [--inode-hardlimit <inode-hardlimit>] <filesystem>\n"
- " setquota [-t] <-u|--user|-g|--group|-p|--project>\n"
+ " setquota [-t] <-u|--user|-g|--group|-p|--projid>\n"
" [--block-grace <block-grace>]\n"
" [--inode-grace <inode-grace>] <filesystem>\n"
" -b can be used instead of --block-softlimit/--block-grace\n"
"usage: ladvise [--advice|-a ADVICE] [--start|-s START[kMGT]]\n"
" [--background|-b]\n"
" {[--end|-e END[kMGT]] | [--length|-l LENGTH[kMGT]]}\n"
- " <file> ..."},
+ " <file> ...\n"},
{"help", Parser_help, 0, "help"},
{"exit", Parser_quit, 0, "quit"},
{"quit", Parser_quit, 0, "quit"},
#define MIGRATION_NONBLOCK 1
+static int check_hashtype(const char *hashtype)
+{
+ int i;
+
+ for (i = LMV_HASH_TYPE_ALL_CHARS; i < LMV_HASH_TYPE_MAX; i++)
+ if (strcmp(hashtype, mdt_hash_name[i]) == 0)
+ return i;
+
+ return 0;
+}
+
/**
* Internal helper for migrate_copy_data(). Check lease and report error if
* need be.
fprintf(stderr, "Invalid component flags %#x\n", flags);
return -EINVAL;
}
- comp_id = LCME_ID_NONE | flags;
} else if (comp_id > LCME_ID_MAX) {
fprintf(stderr, "Invalid component id %u\n", comp_id);
return -EINVAL;
}
- rc = llapi_layout_file_comp_del(fname, comp_id);
+ rc = llapi_layout_file_comp_del(fname, comp_id, flags);
if (rc)
fprintf(stderr, "Delete component %#x from %s failed. %s\n",
comp_id, fname, strerror(errno));
return -EINVAL;
fd = lstat(fname, &st);
- if (fd == 0 && S_ISDIR(st.st_mode)) {
+ if (fd == 0 && S_ISDIR(st.st_mode))
open_flags = O_DIRECTORY | O_RDONLY;
- fd = llapi_layout_file_open(fname, open_flags, open_mode,
- layout);
- } else {
- fd = llapi_layout_file_create(fname, open_flags, open_mode,
- layout);
- }
+ fd = llapi_layout_file_open(fname, open_flags, open_mode, layout);
if (fd < 0)
fprintf(stderr, "%s %s failed. %s\n",
S_ISDIR(st.st_mode) ?
static int verify_pool_name(char *prog_name, char *pool_name)
{
- char *ptr;
- int rc;
+ char *ptr;
if (pool_name == NULL)
return 0;
ptr = strchr(pool_name, '.');
- if (ptr == NULL) {
- ptr = pool_name;
- } else {
- if (ptr == pool_name) {
- fprintf(stderr, "error: %s: fsname is empty "
- "in pool name '%s'\n",
- prog_name, pool_name);
- return -EINVAL;
- }
- ++ptr;
- }
-
- rc = lustre_is_poolname_valid(ptr, 1, LOV_MAXPOOLNAME);
- if (rc == -1) {
- fprintf(stderr, "error: %s: poolname '%s' is empty\n",
+ if (ptr != NULL && ptr == pool_name) {
+ fprintf(stderr, "error: %s: fsname is empty in pool name '%s'\n",
prog_name, pool_name);
return -EINVAL;
- } else if (rc == -2) {
- fprintf(stderr, "error: %s: pool name '%s' is too long "
- "(max is %d characters)\n",
- prog_name, pool_name, LOV_MAXPOOLNAME);
- return -EINVAL;
- } else if (rc > 0) {
- fprintf(stderr, "error: %s: char '%c' not allowed in "
- "pool name '%s'\n",
- prog_name, rc, pool_name);
- return -EINVAL;
}
- return rc;
+
+ return 0;
}
struct lfs_setstripe_args {
- __u64 lsa_comp_end;
+ unsigned long long lsa_comp_end;
unsigned long long lsa_stripe_size;
int lsa_stripe_count;
int lsa_stripe_off;
if (layout == NULL)
return -EINVAL;
+ errno = 0;
head = llapi_layout_get_by_path(fname, 0);
if (head == NULL) {
fprintf(stderr, "Read layout from %s failed. %s\n",
fname, strerror(errno));
return -EINVAL;
+ } else if (errno == ENODATA) {
+ /* file without LOVEA, this component-add will be turned
+ * into a component-create. */
+ llapi_layout_free(head);
+ return -ENODATA;
+ } else {
+ /* Current component of 'head' should be tail of component
+ * list by default, but we do an extra move cursor operation
+ * here to test if the layout is non-composite. */
+ rc = llapi_layout_comp_use(head, LLAPI_LAYOUT_COMP_USE_LAST);
+ if (rc < 0) {
+ fprintf(stderr, "'%s' isn't a composite file?\n",
+ fname);
+ llapi_layout_free(head);
+ return rc;
+ }
}
- /* Current component of 'head' should be tail of component list. */
rc = llapi_layout_comp_extent_get(head, &start, &prev_end);
if (rc) {
fprintf(stderr, "Get prev extent failed. %s\n",
llapi_layout_free(head);
/* Make sure we use the first component of the layout to be added. */
- rc = llapi_layout_comp_move(layout, LLAPI_LAYOUT_COMP_POS_FIRST);
+ rc = llapi_layout_comp_use(layout, LLAPI_LAYOUT_COMP_USE_FIRST);
if (rc < 0) {
fprintf(stderr, "Move component cursor failed. %s\n",
strerror(errno));
return 0;
}
-static int comp_name2flags(__u32 *flags, char *name)
+static inline bool comp_flags_is_neg(__u32 flags)
{
- char *ptr;
+ return flags & LCME_FL_NEG;
+}
+
+static inline void comp_flags_set_neg(__u32 *flags)
+{
+ *flags |= LCME_FL_NEG;
+}
+
+static inline void comp_flags_clear_neg(__u32 *flags)
+{
+ *flags &= ~LCME_FL_NEG;
+}
+
+static int comp_str2flags(__u32 *flags, char *string)
+{
+ char *name;
+ __u32 neg_flags = 0;
- if (name == NULL)
+ if (string == NULL)
return -EINVAL;
*flags = 0;
- for (ptr = name; ; ptr = NULL) {
- char *flg = strtok(ptr, ",");
- if (flg == NULL)
- break;
- if (strcmp(flg, "init") == 0)
- *flags |= LCME_FL_INIT;
- else
+ for (name = strtok(string, ","); name; name = strtok(NULL, ",")) {
+ bool found = false;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(comp_flags_table); i++) {
+ __u32 comp_flag = comp_flags_table[i].cfn_flag;
+ const char *comp_name = comp_flags_table[i].cfn_name;
+
+ if (strcmp(name, comp_name) == 0) {
+ *flags |= comp_flag;
+ found = true;
+ } else if (strncmp(name, "^", 1) == 0 &&
+ strcmp(name + 1, comp_name) == 0) {
+ neg_flags |= comp_flag;
+ found = true;
+ }
+ }
+ if (!found) {
+ llapi_printf(LLAPI_MSG_ERROR, "Component flag "
+ "'%s' is not supported.\n", name);
return -EINVAL;
+ }
+ }
+
+ if (*flags == 0 && neg_flags == 0)
+ return -EINVAL;
+ /* don't support mixed flags for now */
+ if (*flags && neg_flags)
+ return -EINVAL;
+
+ if (neg_flags) {
+ *flags = neg_flags;
+ comp_flags_set_neg(flags);
}
- return (*flags == 0) ? -EINVAL : 0;
+
+ return 0;
+}
+
+static inline bool arg_is_eof(char *arg)
+{
+ return !strncmp(arg, "-1", strlen("-1")) ||
+ !strncmp(arg, "EOF", strlen("EOF")) ||
+ !strncmp(arg, "eof", strlen("eof"));
}
enum {
LFS_COMP_FLAGS_OPT,
LFS_COMP_DEL_OPT,
LFS_COMP_SET_OPT,
- LFS_COMP_ADD_OPT
+ LFS_COMP_ADD_OPT,
+ LFS_PROJID_OPT,
};
/* functions */
__u32 comp_id = 0;
struct llapi_layout *layout = NULL;
- struct option long_opts[] = {
+ struct option long_opts[] = {
/* --block is only valid in migrate mode */
- {"block", no_argument, 0, 'b'},
- {"component-add", no_argument, 0, LFS_COMP_ADD_OPT},
- {"component-del", no_argument, 0, LFS_COMP_DEL_OPT},
- {"component-flags", required_argument, 0, LFS_COMP_FLAGS_OPT},
- {"component-set", no_argument, 0, LFS_COMP_SET_OPT},
+ { .val = 'b', .name = "block", .has_arg = no_argument},
+ { .val = LFS_COMP_ADD_OPT,
+ .name = "comp-add", .has_arg = no_argument},
+ { .val = LFS_COMP_ADD_OPT,
+ .name = "component-add",
+ .has_arg = no_argument},
+ { .val = LFS_COMP_DEL_OPT,
+ .name = "comp-del", .has_arg = no_argument},
+ { .val = LFS_COMP_DEL_OPT,
+ .name = "component-del",
+ .has_arg = no_argument},
+ { .val = LFS_COMP_FLAGS_OPT,
+ .name = "comp-flags", .has_arg = required_argument},
+ { .val = LFS_COMP_FLAGS_OPT,
+ .name = "component-flags",
+ .has_arg = required_argument},
+ { .val = LFS_COMP_SET_OPT,
+ .name = "comp-set", .has_arg = no_argument},
+ { .val = LFS_COMP_SET_OPT,
+ .name = "component-set",
+ .has_arg = no_argument},
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0)
- /* This formerly implied "stripe-count", but was explicitly
- * made "stripe-count" for consistency with other options,
- * and to separate it from "mdt-count" when DNE arrives. */
- {"count", required_argument, 0, 'c'},
+ /* This formerly implied "stripe-count", but was explicitly
+ * made "stripe-count" for consistency with other options,
+ * and to separate it from "mdt-count" when DNE arrives. */
+ { .val = 'c', .name = "count", .has_arg = required_argument },
#endif
- {"stripe-count", required_argument, 0, 'c'},
- {"stripe_count", required_argument, 0, 'c'},
- {"delete", no_argument, 0, 'd'},
- {"component-end", required_argument, 0, 'E'},
+ { .val = 'c', .name = "stripe-count", .has_arg = required_argument},
+ { .val = 'c', .name = "stripe_count", .has_arg = required_argument},
+ { .val = 'd', .name = "delete", .has_arg = no_argument},
+ { .val = 'E', .name = "comp-end", .has_arg = required_argument},
+ { .val = 'E', .name = "component-end",
+ .has_arg = required_argument},
+ /* dirstripe {"mdt-hash", required_argument, 0, 'H'}, */
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0)
- /* This formerly implied "stripe-index", but was explicitly
- * made "stripe-index" for consistency with other options,
- * and to separate it from "mdt-index" when DNE arrives. */
- {"index", required_argument, 0, 'i'},
+ /* This formerly implied "stripe-index", but was explicitly
+ * made "stripe-index" for consistency with other options,
+ * and to separate it from "mdt-index" when DNE arrives. */
+ { .val = 'i', .name = "index", .has_arg = required_argument },
#endif
- {"stripe-index", required_argument, 0, 'i'},
- {"stripe_index", required_argument, 0, 'i'},
- {"component-id", required_argument, 0, 'I'},
- {"mdt", required_argument, 0, 'm'},
- {"mdt-index", required_argument, 0, 'm'},
- {"mdt_index", required_argument, 0, 'm'},
- /* --non-block is only valid in migrate mode */
- {"non-block", no_argument, 0, 'n'},
- {"ost", required_argument, 0, 'o'},
+ { .val = 'i', .name = "stripe-index", .has_arg = required_argument},
+ { .val = 'i', .name = "stripe_index", .has_arg = required_argument},
+ { .val = 'I', .name = "comp-id", .has_arg = required_argument},
+ { .val = 'I', .name = "component-id", .has_arg = required_argument},
+ { .val = 'm', .name = "mdt", .has_arg = required_argument},
+ { .val = 'm', .name = "mdt-index", .has_arg = required_argument},
+ { .val = 'm', .name = "mdt_index", .has_arg = required_argument},
+ /* --non-block is only valid in migrate mode */
+ { .val = 'n', .name = "non-block", .has_arg = no_argument},
+ { .val = 'o', .name = "ost", .has_arg = required_argument},
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
- {"ost-list", required_argument, 0, 'o'},
- {"ost_list", required_argument, 0, 'o'},
+ { .val = 'o', .name = "ost-list", .has_arg = required_argument },
+ { .val = 'o', .name = "ost_list", .has_arg = required_argument },
#endif
- {"pool", required_argument, 0, 'p'},
+ { .val = 'p', .name = "pool", .has_arg = required_argument },
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0)
- /* This formerly implied "--stripe-size", but was confusing
- * with "lfs find --size|-s", which means "file size", so use
- * the consistent "--stripe-size|-S" for all commands. */
- {"size", required_argument, 0, 's'},
+ /* This formerly implied "--stripe-size", but was confusing
+ * with "lfs find --size|-s", which means "file size", so use
+ * the consistent "--stripe-size|-S" for all commands. */
+ { .val = 's', .name = "size", .has_arg = required_argument },
#endif
- {"stripe-size", required_argument, 0, 'S'},
- {"stripe_size", required_argument, 0, 'S'},
- /* --verbose is only valid in migrate mode */
- {"verbose", no_argument, 0, 'v'},
- {0, 0, 0, 0}
- };
+ { .val = 'S', .name = "stripe-size", .has_arg = required_argument },
+ { .val = 'S', .name = "stripe_size", .has_arg = required_argument },
+ /* dirstripe {"mdt-count", required_argument, 0, 'T'}, */
+ /* --verbose is only valid in migrate mode */
+ { .val = 'v', .name = "verbose", .has_arg = no_argument },
+ { .val = LFS_COMP_ADD_OPT,
+ .name = "component-add",
+ .has_arg = no_argument },
+ { .val = LFS_COMP_DEL_OPT,
+ .name = "component-del",
+ .has_arg = no_argument },
+ { .val = LFS_COMP_FLAGS_OPT,
+ .name = "component-flags",
+ .has_arg = required_argument },
+ { .val = LFS_COMP_SET_OPT,
+ .name = "component-set",
+ .has_arg = no_argument },
+ { .name = NULL } };
setstripe_args_init(&lsa);
comp_del = 1;
break;
case LFS_COMP_FLAGS_OPT:
- result = comp_name2flags(&lsa.lsa_comp_flags, optarg);
+ result = comp_str2flags(&lsa.lsa_comp_flags, optarg);
if (result != 0) {
fprintf(stderr, "error: %s: bad comp flags "
"'%s'\n", argv[0], optarg);
setstripe_args_init(&lsa);
}
- if (!strncmp(optarg, "-1", strlen("-1")) ||
- !strncmp(optarg, "EOF", strlen("EOF")) ||
- !strncmp(optarg, "eof", strlen("eof"))) {
+ if (arg_is_eof(optarg)) {
lsa.lsa_comp_end = LUSTRE_EOF;
} else {
result = llapi_parse_size(optarg,
break;
case 'I':
comp_id = strtoul(optarg, &end, 0);
- if (*end != '\0' || comp_id == 0) {
+ if (*end != '\0' || comp_id == 0 ||
+ comp_id > LCME_ID_MAX) {
fprintf(stderr, "error: %s: bad comp ID "
"'%s'\n", argv[0], optarg);
goto error;
goto error;
}
+ if (comp_add || comp_del) {
+ struct stat st;
+
+ result = lstat(fname, &st);
+ if (result == 0 && S_ISDIR(st.st_mode)) {
+ fprintf(stderr, "error: %s: can't use --component-add "
+ "or --component-del for directory.\n",
+ argv[0]);
+ goto error;
+ }
+ }
+
if (comp_add) {
if (layout == NULL) {
fprintf(stderr, "error: %s: -E option must be present"
goto error;
}
result = adjust_first_extent(fname, layout);
- if (result != 0)
+ if (result == -ENODATA)
+ comp_add = 0;
+ else if (result != 0)
goto error;
}
goto error;
}
- /* support --component-id option for migrate later. */
- if (migrate_mode && comp_id != 0) {
- fprintf(stderr, "error: %s: -I isn't supported yet.\n",
- argv[0]);
+ if (!comp_del && !comp_set && comp_id != 0) {
+ fprintf(stderr, "error: %s: -I can only be used with "
+ "--component-del.\n", argv[0]);
goto error;
}
};
struct option long_opts[] = {
{"atime", required_argument, 0, 'A'},
+ {"comp-count", required_argument, 0, LFS_COMP_COUNT_OPT},
{"component-count", required_argument, 0, LFS_COMP_COUNT_OPT},
+ {"comp-flags", required_argument, 0, LFS_COMP_FLAGS_OPT},
{"component-flags", required_argument, 0, LFS_COMP_FLAGS_OPT},
+ {"comp-start", required_argument, 0, LFS_COMP_START_OPT},
{"component-start", required_argument, 0, LFS_COMP_START_OPT},
{"stripe-count", required_argument, 0, 'c'},
{"stripe_count", required_argument, 0, 'c'},
{"ctime", required_argument, 0, 'C'},
{"maxdepth", required_argument, 0, 'D'},
+ {"comp-end", required_argument, 0, 'E'},
{"component-end", required_argument, 0, 'E'},
{"gid", required_argument, 0, 'g'},
{"group", required_argument, 0, 'G'},
+ {"mdt-hash", required_argument, 0, 'H'},
{"stripe-index", required_argument, 0, 'i'},
{"stripe_index", required_argument, 0, 'i'},
/*{"component-id", required_argument, 0, 'I'},*/
{"obd", required_argument, 0, 'O'},
{"ost", required_argument, 0, 'O'},
/* no short option for pool, p/P already used */
- {"pool", required_argument, 0, LFS_POOL_OPT},
- {"print0", no_argument, 0, 'p'},
- {"print", no_argument, 0, 'P'},
+ {"pool", required_argument, 0, LFS_POOL_OPT},
+ {"print0", no_argument, 0, 'p'},
+ {"print", no_argument, 0, 'P'},
+ {"projid", required_argument, 0, LFS_PROJID_OPT},
{"size", required_argument, 0, 's'},
{"stripe-size", required_argument, 0, 'S'},
{"stripe_size", required_argument, 0, 'S'},
{"type", required_argument, 0, 't'},
+ {"mdt-count", required_argument, 0, 'T'},
{"uid", required_argument, 0, 'u'},
{"user", required_argument, 0, 'U'},
{0, 0, 0, 0}
/* when getopt_long_only() hits '!' it returns 1, puts "!" in optarg */
while ((c = getopt_long_only(argc, argv,
- "-A:c:C:D:E:g:G:i:L:m:M:n:O:Ppqrs:S:t:u:U:v",
- long_opts, NULL)) >= 0) {
+ "-A:c:C:D:E:g:G:H:i:L:m:M:n:O:Ppqrs:S:t:T:u:U:v",
+ long_opts, NULL)) >= 0) {
xtime = NULL;
xsign = NULL;
if (neg_opt)
param.fp_exclude_comp_count = !!neg_opt;
break;
case LFS_COMP_FLAGS_OPT:
- rc = comp_name2flags(¶m.fp_comp_flags, optarg);
- if (rc) {
+ rc = comp_str2flags(¶m.fp_comp_flags, optarg);
+ if (rc || comp_flags_is_neg(param.fp_comp_flags)) {
fprintf(stderr, "error: bad component flags "
"'%s'\n", optarg);
goto err;
optarg++;
}
- rc = llapi_parse_size(optarg, ¶m.fp_comp_end,
- ¶m.fp_comp_end_units, 0);
+ if (arg_is_eof(optarg)) {
+ param.fp_comp_end = LUSTRE_EOF;
+ param.fp_comp_end_units = 1;
+ rc = 0;
+ } else {
+ rc = llapi_parse_size(optarg,
+ ¶m.fp_comp_end,
+ ¶m.fp_comp_end_units, 0);
+ }
if (rc) {
fprintf(stderr, "error: bad component end "
"'%s'\n", optarg);
param.fp_exclude_gid = !!neg_opt;
param.fp_check_gid = 1;
break;
+ case 'H':
+ param.fp_hash_type = check_hashtype(optarg);
+ if (param.fp_hash_type == 0) {
+ fprintf(stderr, "error: bad hash_type '%s'\n",
+ optarg);
+ ret = -1;
+ goto err;
+ }
+ param.fp_check_hash_type = 1;
+ param.fp_exclude_hash_type = !!neg_opt;
+ break;
case 'L':
ret = name2layout(¶m.fp_layout, optarg);
if (ret)
strncpy(puuid->uuid, token,
sizeof(puuid->uuid));
- }
+ }
err_free:
- if (buf)
- free(buf);
- break;
- }
- case 'p':
+ if (buf)
+ free(buf);
+ break;
+ }
+ case 'p':
param.fp_zero_end = 1;
- break;
- case 'P':
- break;
+ break;
+ case 'P':
+ break;
+ case LFS_PROJID_OPT:
+ rc = name2projid(¶m.fp_projid, optarg);
+ if (rc) {
+ param.fp_projid = strtoul(optarg, &endptr, 10);
+ if (*endptr != '\0') {
+ fprintf(stderr,
+ "Invalid project ID: %s",
+ optarg);
+ ret = -1;
+ goto err;
+ }
+ }
+ param.fp_exclude_projid = !!neg_opt;
+ param.fp_check_projid = 1;
+ break;
case 's':
if (optarg[0] == '+') {
param.fp_size_sign = -1;
goto err;
};
break;
+ case 'T':
+ if (optarg[0] == '+') {
+ param.fp_mdt_count_sign = -1;
+ optarg++;
+ } else if (optarg[0] == '-') {
+ param.fp_mdt_count_sign = 1;
+ optarg++;
+ }
+
+ param.fp_mdt_count = strtoul(optarg, &endptr, 0);
+ if (*endptr != '\0') {
+ fprintf(stderr, "error: bad mdt_count '%s'\n",
+ optarg);
+ ret = -1;
+ goto err;
+ }
+ param.fp_check_mdt_count = 1;
+ param.fp_exclude_mdt_count = !!neg_opt;
+ break;
default:
ret = CMD_HELP;
goto err;
struct find_param *param)
{
struct option long_opts[] = {
+ {"comp-count", no_argument, 0, LFS_COMP_COUNT_OPT},
{"component-count", no_argument, 0, LFS_COMP_COUNT_OPT},
- {"component-flags", required_argument, 0, LFS_COMP_FLAGS_OPT},
- {"component-start", required_argument, 0, LFS_COMP_START_OPT},
+ {"comp-flags", optional_argument, 0, LFS_COMP_FLAGS_OPT},
+ {"component-flags", optional_argument, 0, LFS_COMP_FLAGS_OPT},
+ {"comp-start", optional_argument, 0, LFS_COMP_START_OPT},
+ {"component-start", optional_argument, 0, LFS_COMP_START_OPT},
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0)
/* This formerly implied "stripe-count", but was explicitly
* made "stripe-count" for consistency with other options,
{"stripe_count", no_argument, 0, 'c'},
{"directory", no_argument, 0, 'd'},
{"default", no_argument, 0, 'D'},
- {"component-end", required_argument, 0, 'E'},
+ {"comp-end", optional_argument, 0, 'E'},
+ {"component-end", optional_argument, 0, 'E'},
{"fid", no_argument, 0, 'F'},
{"generation", no_argument, 0, 'g'},
+ /* dirstripe {"mdt-hash", required_argument, 0, 'H'}, */
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0)
/* This formerly implied "stripe-index", but was explicitly
* made "stripe-index" for consistency with other options,
#endif
{"stripe-index", no_argument, 0, 'i'},
{"stripe_index", no_argument, 0, 'i'},
- {"component-id", required_argument, 0, 'I'},
+ {"comp-id", optional_argument, 0, 'I'},
+ {"component-id", optional_argument, 0, 'I'},
{"layout", no_argument, 0, 'L'},
{"mdt", no_argument, 0, 'm'},
{"mdt-index", no_argument, 0, 'm'},
#endif
{"stripe-size", no_argument, 0, 'S'},
{"stripe_size", no_argument, 0, 'S'},
+ /* dirstripe {"mdt-count", required_argument, 0, 'T'}, */
{"verbose", no_argument, 0, 'v'},
+ {"yaml", no_argument, 0, 'y'},
{0, 0, 0, 0}
};
int c, rc;
char *end, *tmp;
- while ((c = getopt_long(argc, argv, "cdDE:FghiI:LmMoO:pqrRsSv",
+ while ((c = getopt_long(argc, argv, "cdDE::FghiI::LmMoO:pqrRsSvy",
long_opts, NULL)) != -1) {
switch (c) {
- case 'O':
- if (param->fp_obd_uuid) {
- fprintf(stderr,
- "error: %s: only one obduuid allowed",
- argv[0]);
- return CMD_HELP;
+ case 'c':
+ if (strcmp(argv[optind - 1], "--count") == 0)
+ fprintf(stderr, "warning: '--count' deprecated,"
+ " use '--stripe-count' instead\n");
+ if (!(param->fp_verbose & VERBOSE_DETAIL)) {
+ param->fp_verbose |= VERBOSE_COUNT;
+ param->fp_max_depth = 0;
}
- param->fp_obd_uuid = (struct obd_uuid *)optarg;
- break;
- case 'q':
- param->fp_quiet++;
break;
case LFS_COMP_COUNT_OPT:
param->fp_verbose |= VERBOSE_COMP_COUNT;
break;
case LFS_COMP_FLAGS_OPT:
if (optarg != NULL) {
- rc = comp_name2flags(¶m->fp_comp_flags,
- optarg);
+ __u32 *flags = ¶m->fp_comp_flags;
+ rc = comp_str2flags(flags, optarg);
if (rc != 0) {
- param->fp_verbose |=
- VERBOSE_COMP_FLAGS;
- param->fp_max_depth = 0;
- optind--;
+ fprintf(stderr, "error: %s bad "
+ "component flags '%s'.\n",
+ argv[0], optarg);
+ return CMD_HELP;
} else {
param->fp_check_comp_flags = 1;
+ param->fp_exclude_comp_flags =
+ comp_flags_is_neg(*flags);
+ comp_flags_clear_neg(flags);
}
} else {
param->fp_verbose |= VERBOSE_COMP_FLAGS;
if (optarg != NULL) {
tmp = optarg;
if (tmp[0] == '+') {
- param->fp_comp_start_sign = 1;
+ param->fp_comp_start_sign = -1;
tmp++;
} else if (tmp[0] == '-') {
- param->fp_comp_start_sign = -1;
+ param->fp_comp_start_sign = 1;
tmp++;
}
rc = llapi_parse_size(tmp,
¶m->fp_comp_start,
¶m->fp_comp_start_units, 0);
if (rc != 0) {
- param->fp_verbose |= VERBOSE_COMP_START;
- param->fp_max_depth = 0;
- optind--;
+ fprintf(stderr, "error: %s bad "
+ "component start '%s'.\n",
+ argv[0], tmp);
+ return CMD_HELP;
} else {
param->fp_check_comp_start = 1;
}
if (optarg != NULL) {
tmp = optarg;
if (tmp[0] == '+') {
- param->fp_comp_end_sign = 1;
+ param->fp_comp_end_sign = -1;
tmp++;
} else if (tmp[0] == '-') {
- param->fp_comp_end_sign = -1;
+ param->fp_comp_end_sign = 1;
tmp++;
}
- rc = llapi_parse_size(tmp,
+
+ if (arg_is_eof(tmp)) {
+ param->fp_comp_end = LUSTRE_EOF;
+ param->fp_comp_end_units = 1;
+ rc = 0;
+ } else {
+ rc = llapi_parse_size(tmp,
¶m->fp_comp_end,
¶m->fp_comp_end_units, 0);
+ }
if (rc != 0) {
- param->fp_verbose |= VERBOSE_COMP_END;
- param->fp_max_depth = 0;
- optind--;
- } else {
- param->fp_check_comp_end = 1;
+ fprintf(stderr, "error: %s bad "
+ "component end '%s'.\n",
+ argv[0], tmp);
+ return CMD_HELP;
}
+ param->fp_check_comp_end = 1;
} else {
param->fp_verbose |= VERBOSE_COMP_END;
param->fp_max_depth = 0;
param->fp_max_depth = 0;
}
break;
- case 'r':
- param->fp_recursive = 1;
- break;
- case 'v':
- param->fp_verbose = VERBOSE_DEFAULT | VERBOSE_DETAIL;
- break;
- case 'c':
-#if LUSTRE_VERSION_CODE >= OBD_OCD_VERSION(2, 6, 53, 0)
- if (strcmp(argv[optind - 1], "--count") == 0)
- fprintf(stderr, "warning: '--count' deprecated,"
- " use '--stripe-count' instead\n");
-#endif
- if (!(param->fp_verbose & VERBOSE_DETAIL)) {
- param->fp_verbose |= VERBOSE_COUNT;
- param->fp_max_depth = 0;
- }
- break;
-#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0)
- case 's':
-#if LUSTRE_VERSION_CODE >= OBD_OCD_VERSION(2, 6, 53, 0)
- fprintf(stderr, "warning: '--size|-s' deprecated, "
- "use '--stripe-size|-S' instead\n");
-#endif
-#endif /* LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0) */
- case 'S':
+ case 'g':
if (!(param->fp_verbose & VERBOSE_DETAIL)) {
- param->fp_verbose |= VERBOSE_SIZE;
+ param->fp_verbose |= VERBOSE_GENERATION;
param->fp_max_depth = 0;
}
break;
case 'I':
if (optarg != NULL) {
param->fp_comp_id = strtoul(optarg, &end, 0);
- if (*end != '\0') {
- param->fp_verbose |= VERBOSE_COMP_ID;
- param->fp_max_depth = 0;
- optind--;
+ if (*end != '\0' || param->fp_comp_id == 0 ||
+ param->fp_comp_id > LCME_ID_MAX) {
+ fprintf(stderr, "error: %s bad "
+ "component id '%s'\n",
+ argv[0], optarg);
+ return CMD_HELP;
} else {
param->fp_check_comp_id = 1;
}
param->fp_verbose |= VERBOSE_COMP_ID;
}
break;
- case 'p':
- if (!(param->fp_verbose & VERBOSE_DETAIL)) {
- param->fp_verbose |= VERBOSE_POOL;
- param->fp_max_depth = 0;
- }
- break;
- case 'g':
- if (!(param->fp_verbose & VERBOSE_DETAIL)) {
- param->fp_verbose |= VERBOSE_GENERATION;
- param->fp_max_depth = 0;
- }
- break;
case 'L':
if (!(param->fp_verbose & VERBOSE_DETAIL)) {
param->fp_verbose |= VERBOSE_LAYOUT;
param->fp_max_depth = 0;
param->fp_verbose |= VERBOSE_MDTINDEX;
break;
+ case 'O':
+ if (param->fp_obd_uuid) {
+ fprintf(stderr,
+ "error: %s: only one obduuid allowed",
+ argv[0]);
+ return CMD_HELP;
+ }
+ param->fp_obd_uuid = (struct obd_uuid *)optarg;
+ break;
+ case 'p':
+ if (!(param->fp_verbose & VERBOSE_DETAIL)) {
+ param->fp_verbose |= VERBOSE_POOL;
+ param->fp_max_depth = 0;
+ }
+ break;
+ case 'q':
+ param->fp_quiet++;
+ break;
+ case 'r':
+ param->fp_recursive = 1;
+ break;
case 'R':
param->fp_raw = 1;
break;
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0)
+ case 's':
+ fprintf(stderr, "warning: '--size|-s' deprecated, "
+ "use '--stripe-size|-S' instead\n");
+#endif /* LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0) */
+ case 'S':
+ if (!(param->fp_verbose & VERBOSE_DETAIL)) {
+ param->fp_verbose |= VERBOSE_SIZE;
+ param->fp_max_depth = 0;
+ }
+ break;
+ case 'v':
+ param->fp_verbose = VERBOSE_DEFAULT | VERBOSE_DETAIL;
+ break;
+ case 'y':
+ param->fp_yaml = 1;
+ break;
default:
return CMD_HELP;
}
{
struct find_param param = { 0 };
struct option long_opts[] = {
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
{"mdt-count", no_argument, 0, 'c'},
+#endif
+ {"mdt-hash", no_argument, 0, 'H'},
{"mdt-index", no_argument, 0, 'i'},
{"recursive", no_argument, 0, 'r'},
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
{"mdt-hash", no_argument, 0, 't'},
+#endif
{"default", no_argument, 0, 'D'},
{"obd", required_argument, 0, 'O'},
+ {"mdt-count", no_argument, 0, 'T'},
+ {"yaml", no_argument, 0, 'y'},
{0, 0, 0, 0}
};
int c, rc;
param.fp_get_lmv = 1;
- while ((c = getopt_long(argc, argv, "cirtDO:", long_opts, NULL)) != -1)
+ while ((c = getopt_long(argc, argv,
+ "cDHiO:rtTy", long_opts, NULL)) != -1)
{
switch (c) {
case 'O':
}
param.fp_obd_uuid = (struct obd_uuid *)optarg;
break;
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
case 'c':
+#if LUSTRE_VERSION_CODE >= OBD_OCD_VERSION(2, 10, 50, 0)
+ fprintf(stderr, "warning: '-c' deprecated"
+ ", use '-T' instead\n");
+#endif
+#endif
+ case 'T':
param.fp_verbose |= VERBOSE_COUNT;
break;
case 'i':
param.fp_verbose |= VERBOSE_OFFSET;
break;
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
case 't':
+#endif
+ case 'H':
param.fp_verbose |= VERBOSE_HASH_TYPE;
break;
case 'D':
case 'r':
param.fp_recursive = 1;
break;
+ case 'y':
+ param.fp_yaml = 1;
+ break;
default:
return CMD_HELP;
}
{"mode", required_argument, 0, 'm'},
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
{"hash-type", required_argument, 0, 't'},
-#endif
{"mdt-hash", required_argument, 0, 't'},
+#endif
+ {"mdt-hash", required_argument, 0, 'H'},
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
{"default_stripe", no_argument, 0, 'D'},
#endif
{0, 0, 0, 0}
};
- while ((c = getopt_long(argc, argv, "c:dDi:m:t:", long_opts,
+ while ((c = getopt_long(argc, argv, "c:dDi:H:m:t:", long_opts,
NULL)) >= 0) {
switch (c) {
case 0:
case 'm':
mode_opt = optarg;
break;
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
case 't':
+#endif
+ case 'H':
#if LUSTRE_VERSION_CODE >= OBD_OCD_VERSION(2, 11, 53, 0)
if (strcmp(argv[optind - 1], "--hash-type") == 0)
fprintf(stderr, "warning: '--hash-type' "
if (stripe_hash_opt == NULL) {
hash_type = LMV_HASH_TYPE_FNV_1A_64;
} else {
- int i;
-
- for (i = LMV_HASH_TYPE_ALL_CHARS; i < LMV_HASH_TYPE_MAX; i++)
- if (strcmp(stripe_hash_opt, mdt_hash_name[i]) == 0)
- break;
-
- if (i == LMV_HASH_TYPE_MAX) {
+ hash_type = check_hashtype(stripe_hash_opt);
+ if (hash_type == 0) {
fprintf(stderr,
"error: %s: bad stripe hash type '%s'\n",
argv[0], stripe_hash_opt);
return CMD_HELP;
}
-
- hash_type = i;
}
/* get the stripe count */
{"block-grace", required_argument, 0, 'b'},
{"group", no_argument, 0, 'g'},
{"inode-grace", required_argument, 0, 'i'},
- {"project", no_argument, 0, 'p'},
+ {"projid", no_argument, 0, 'p'},
{"times", no_argument, 0, 't'},
{"user", no_argument, 0, 'u'},
{0, 0, 0, 0}
{"inode-softlimit", required_argument, 0, 'i'},
{"inode-hardlimit", required_argument, 0, 'I'},
{"user", required_argument, 0, 'u'},
- {"project", required_argument, 0, 'p'},
+ {"projid", required_argument, 0, 'p'},
{0, 0, 0, 0}
};
unsigned limit_mask = 0;
memset(&qctl, 0, sizeof(qctl));
qctl.qc_cmd = LUSTRE_Q_SETQUOTA;
qctl.qc_type = ALLQUOTA; /* ALLQUOTA makes no sense for setquota,
- * so it can be used as a marker that qc_type
- * isn't reinitialized from command line */
+ * so it can be used as a marker that qc_type
+ * isn't reinitialized from command line */
while ((c = getopt_long(argc, argv, "b:B:g:i:I:p:u:",
long_opts, NULL)) != -1) {
- switch (c) {
- case 'u':
+ switch (c) {
+ case 'u':
qtype = USRQUOTA;
rc = name2uid(&qctl.qc_id, optarg);
goto quota_type;
if (rc) {
qctl.qc_id = strtoul(name, &endptr, 10);
if (*endptr != '\0') {
- fprintf(stderr, "error: can't find id for name "
- "%s\n", name);
+ fprintf(stderr, "error: can't find id for name: %s\n",
+ name);
return CMD_HELP;
}
}
return CMD_HELP;
}
- mnt = argv[optind];
-
- rc1 = llapi_quotactl(mnt, &qctl);
+ mnt = argv[optind];
+ rc1 = llapi_quotactl(mnt, &qctl);
if (rc1 < 0) {
switch (rc1) {
case -ESRCH:
return rc;
}
- while ((rc = llapi_changelog_recv(changelog_priv, &rec)) == 0) {
- time_t secs;
- struct tm ts;
+ while ((rc = llapi_changelog_recv(changelog_priv, &rec)) == 0) {
+ time_t secs;
+ struct tm ts;
- if (endrec && rec->cr_index > endrec) {
- llapi_changelog_free(&rec);
- break;
- }
- if (rec->cr_index < startrec) {
- llapi_changelog_free(&rec);
- continue;
- }
+ if (endrec && rec->cr_index > endrec) {
+ llapi_changelog_free(&rec);
+ break;
+ }
+ if (rec->cr_index < startrec) {
+ llapi_changelog_free(&rec);
+ continue;
+ }
secs = rec->cr_time >> 30;
gmtime_r(&secs, &ts);
- printf("%ju %02d%-5s %02d:%02d:%02d.%06d %04d.%02d.%02d "
- "0x%x t="DFID, (uintmax_t) rec->cr_index, rec->cr_type,
+ printf("%ju %02d%-5s %02d:%02d:%02d.%09d %04d.%02d.%02d "
+ "0x%x t="DFID, (uintmax_t)rec->cr_index, rec->cr_type,
changelog_type2str(rec->cr_type),
ts.tm_hour, ts.tm_min, ts.tm_sec,
- (int)(rec->cr_time & ((1<<30) - 1)),
+ (int)(rec->cr_time & ((1 << 30) - 1)),
ts.tm_year + 1900, ts.tm_mon + 1, ts.tm_mday,
rec->cr_flags & CLF_FLAGMASK, PFID(&rec->cr_tfid));