" [--stripe-count|-c <stripe_count>]\n" \
" [--stripe-index|-i <start_ost_idx>]\n" \
" [--stripe-size|-S <stripe_size>]\n" \
- " [--layout|-L <pattern>]\n" \
+ " [--layout|-L <pattern>]\n" \
" [--pool|-p <pool_name>]\n" \
" [--ost|-o <ost_indices>]\n" \
- " [--yaml|-y <yaml_template_file>]\n"
+ " [--yaml|-y <yaml_template_file>]\n" \
+ " [--copy=<lustre_src>]\n"
#define SSM_HELP_COMMON \
"\tstripe_count: Number of OSTs to stripe over (0=fs default, -1 all)\n" \
"\t stripe_size.\n" \
"\tyaml_template_file:\n" \
"\t YAML layout template file, can't be used with -c,\n" \
- "\t -i, -S, -p, -o, or -E arguments.\n"
+ "\t -i, -S, -p, -o, or -E arguments.\n" \
+ "\tlustre_src: Lustre file/dir whose layout info is used to set\n" \
+ "\t another lustre file or directory, can't used with\n" \
+ "\t -c, -i, -S, -p, -o, or -E arguments.\n"
#define MIRROR_CREATE_HELP \
"\tmirror_count: Number of mirrors to be created with the upcoming\n" \
"To totally delete the default striping from an existing directory:\n"
"usage: setstripe -d <directory>\n"
" or\n"
+ "To create a mirrored file or set s default mirror layout on a directory:\n"
+ "usage: setstripe -N[mirror_count] [STRIPE_OPTIONS] <directory|filename>\n"
+ " or\n"
"To delete the last component(s) from an existing composite file\n"
"(note that this will also delete any data in those components):\n"
"usage: setstripe --component-del [--component-id|-I <comp_id>]\n"
"find files matching given attributes recursively in directory tree.\n"
"usage: find <directory|filename> ...\n"
" [[!] --atime|-A [+-]N] [[!] --ctime|-C [+-]N]\n"
- " [[!] --mtime|-M [+-]N] [--maxdepth|-D N]\n"
+ " [[!] --mtime|-M [+-]N] [--maxdepth|-D N] [[!] --blocks|-b N]\n"
" [[!] --mdt-index|--mdt|-m <uuid|index,...>]\n"
" [[!] --name|-n <pattern>] [[!] --ost|-O <uuid|index,...>]\n"
" [--print|-P] [--print0|-0] [[!] --size|-s [+-]N[bkMGTPE]]\n"
" setquota [-t] <-u|--user|-g|--group|-p|--projid>\n"
" [--block-grace <block-grace>]\n"
" [--inode-grace <inode-grace>] <filesystem>\n"
+ " setquota <-U|-G|-P>\n"
+ " -b <block-softlimit> -B <block-hardlimit>\n"
+ " -i <inode-softlimit> -I <inode-hardlimit> <filesystem>\n"
+ " setquota <-U|--default-usr|-G|--default-grp|-P|--default-prj>\n"
+ " [--block-softlimit <block-softlimit>]\n"
+ " [--block-hardlimit <block-hardlimit>]\n"
+ " [--inode-softlimit <inode-softlimit>]\n"
+ " [--inode-hardlimit <inode-hardlimit>] <filesystem>\n"
+ " setquota <-u|-g|-p> <uname>|<uid>|<gname>|<gid>|<projid>\n"
+ " <-d|--default>\n"
" -b can be used instead of --block-softlimit/--block-grace\n"
" -B can be used instead of --block-hardlimit\n"
" -i can be used instead of --inode-softlimit/--inode-grace\n"
- " -I can be used instead of --inode-hardlimit\n\n"
+ " -I can be used instead of --inode-hardlimit\n"
+ " -d can be used instead of --default\n\n"
"Note: The total quota space will be split into many qunits and\n"
" balanced over all server targets, the minimal qunit size is\n"
" 1M bytes for block space and 1K inodes for inode space.\n\n"
+ " The maximum quota grace time is 2^48 - 1 seconds.\n\n"
" Quota space rebalancing process will stop when this mininum\n"
" value is reached. As a result, quota exceeded can be returned\n"
" while many targets still have 1MB or 1K inodes of spare\n"
"usage: quota [-q] [-v] [-h] [-o <obd_uuid>|-i <mdt_idx>|-I "
"<ost_idx>]\n"
" [<-u|-g|-p> <uname>|<uid>|<gname>|<gid>|<projid>] <filesystem>\n"
- " quota [-o <obd_uuid>|-i <mdt_idx>|-I <ost_idx>] -t <-u|-g|-p> <filesystem>"},
+ " quota [-o <obd_uuid>|-i <mdt_idx>|-I <ost_idx>] -t <-u|-g|-p> <filesystem>\n"
+ " quota [-q] [-v] [h] <-U|-G|-P> <filesystem>"},
{"project", lfs_project, 0,
"Change or list project attribute for specified file or directory.\n"
"usage: project [-d|-r] <file|directory...>\n"
goto error;
}
- rc = lfs_component_create(fname, O_CREAT | O_WRONLY, 0644,
+ rc = lfs_component_create(fname, O_CREAT | O_WRONLY, 0666,
layout);
if (rc >= 0) {
close(rc);
fprintf(stderr, "error %s: file name of '%s' too long\n",
progname, fname);
rc = -ERANGE;
- goto free_layout;
+ goto close_fd;
}
strncpy(parent, fname, sizeof(parent));
ptr = strrchr(parent, '/');
fprintf(stderr, "error %s: getcwd failed: %s\n",
progname, strerror(errno));
rc = -errno;
- goto free_layout;
+ goto close_fd;
}
} else {
if (ptr == parent)
if (rc < 0) {
fprintf(stderr, "%s: cannot get MDT index of '%s'\n",
progname, fname);
- goto free_layout;
+ goto close_fd;
}
if (victim_file == NULL) {
LFS_MIRROR_FLAGS_OPT,
LFS_MIRROR_ID_OPT,
LFS_MIRROR_STATE_OPT,
+ LFS_LAYOUT_COPY,
};
/* functions */
__u16 mirror_id = 0;
char cmd[PATH_MAX];
bool from_yaml = false;
+ bool from_copy = false;
char *template = NULL;
struct option long_opts[] = {
.name = "flags", .has_arg = required_argument},
{ .val = LFS_MIRROR_ID_OPT,
.name = "mirror-id", .has_arg = required_argument},
+ { .val = LFS_LAYOUT_COPY,
+ .name = "copy", .has_arg = required_argument},
{ .val = 'c', .name = "stripe-count", .has_arg = required_argument},
{ .val = 'c', .name = "stripe_count", .has_arg = required_argument},
/* find { .val = 'C', .name = "ctime", .has_arg = required_argument }*/
}
break;
}
+ case LFS_LAYOUT_COPY:
+ from_copy = true;
+ template = optarg;
+ break;
case 'b':
if (!migrate_mode) {
fprintf(stderr,
goto error;
}
- if (from_yaml && (setstripe_args_specified(&lsa) || layout != NULL)) {
+ if (from_yaml && from_copy) {
+ fprintf(stderr,
+ "%s: can't specify --yaml and --copy together\n",
+ progname);
+ goto error;
+ }
+
+ if ((from_yaml || from_copy) &&
+ (setstripe_args_specified(&lsa) || layout != NULL)) {
fprintf(stderr, "error: %s: can't specify --yaml with "
"-c, -S, -i, -o, -p or -E options.\n",
argv[0]);
argv[0], template);
goto error;
}
+ } else if (from_copy) {
+ layout = llapi_layout_get_by_path(template, 0);
+ if (layout == NULL) {
+ fprintf(stderr,
+ "%s: can't create composite layout from file %s.\n",
+ progname, template);
+ goto error;
+ }
}
for (fname = argv[optind]; fname != NULL; fname = argv[++optind]) {
NULL);
} else if (layout != NULL) {
result = lfs_component_create(fname, O_CREAT | O_WRONLY,
- 0644, layout);
+ 0666, layout);
if (result >= 0) {
close(result);
result = 0;
} else {
result = llapi_file_open_param(fname,
O_CREAT | O_WRONLY,
- 0644, param);
+ 0666, param);
if (result >= 0) {
close(result);
result = 0;
static int set_time(time_t *time, time_t *set, char *str)
{
- time_t t;
- int res = 0;
-
- if (str[0] == '+')
- res = 1;
- else if (str[0] == '-')
- res = -1;
-
- if (res)
- str++;
-
- t = strtol(str, NULL, 0);
- if (*time < t * 24 * 60 * 60) {
- if (res)
- str--;
- fprintf(stderr, "Wrong time '%s' is specified.\n", str);
- return INT_MAX;
- }
+ time_t t;
+ int res = 0;
+ char *endptr;
+
+ if (str[0] == '+')
+ res = 1;
+ else if (str[0] == '-')
+ res = -1;
+
+ if (res)
+ str++;
+
+ t = strtol(str, &endptr, 0);
+ if (*endptr != '\0') {
+ fprintf(stderr,
+ "%s find: bad time '%s': %s\n",
+ progname, str, strerror(EINVAL));
+ return INT_MAX;
+ }
+ if (*time < t * 24 * 60 * 60) {
+ if (res != 0)
+ str--;
+ fprintf(stderr,
+ "%s find: bad time '%s': too large\n",
+ progname, str);
+ return INT_MAX;
+ }
- *set = *time - t * 24 * 60 * 60;
- return res;
+ *set = *time - t * 24 * 60 * 60;
+ return res;
}
+
static int name2uid(unsigned int *id, const char *name)
{
struct passwd *passwd;
};
struct option long_opts[] = {
{ .val = 'A', .name = "atime", .has_arg = required_argument },
+ { .val = 'b', .name = "blocks", .has_arg = required_argument },
{ .val = LFS_COMP_COUNT_OPT,
.name = "comp-count", .has_arg = required_argument },
{ .val = LFS_COMP_COUNT_OPT,
/* when getopt_long_only() hits '!' it returns 1, puts "!" in optarg */
while ((c = getopt_long_only(argc, argv,
- "-0A:c:C:D:E:g:G:H:i:L:m:M:n:N:O:Ppqrs:S:t:T:u:U:v",
+ "-0A:b:c:C:D:E:g:G:H:i:L:m:M:n:N:O:Ppqrs:S:t:T:u:U:v",
long_opts, NULL)) >= 0) {
xtime = NULL;
xsign = NULL;
if (rc)
*xsign = rc;
break;
+ case 'b':
+ if (optarg[0] == '+') {
+ param.fp_blocks_sign = -1;
+ optarg++;
+ } else if (optarg[0] == '-') {
+ param.fp_blocks_sign = 1;
+ optarg++;
+ }
+
+ param.fp_blocks_units = 1024;
+ ret = llapi_parse_size(optarg, ¶m.fp_blocks,
+ ¶m.fp_blocks_units, 0);
+ if (ret) {
+ fprintf(stderr, "error: bad blocks '%s'\n",
+ optarg);
+ goto err;
+ }
+ param.fp_check_blocks = 1;
+ param.fp_exclude_blocks = !!neg_opt;
+ break;
case LFS_COMP_COUNT_OPT:
if (optarg[0] == '+') {
param.fp_comp_count_sign = -1;
{
struct option long_opts[] = {
/* find { .val = 'A', .name = "atime", .has_arg = required_argument }*/
+/* find { .val = 'b', .name = "blocks", .has_arg = required_argument }*/
{ .val = LFS_COMP_COUNT_OPT,
.name = "comp-count", .has_arg = no_argument },
{ .val = LFS_COMP_COUNT_OPT,
case 'm':
param.fp_mdt_index = strtoul(optarg, &end, 0);
if (*end != '\0') {
- fprintf(stderr, "%s: invalid MDT index'%s'\n",
- argv[0], optarg);
+ fprintf(stderr, "%s mv: bad MDT index '%s'\n",
+ progname, optarg);
return CMD_HELP;
}
break;
param.fp_verbose = VERBOSE_DETAIL;
break;
default:
- fprintf(stderr, "error: %s: unrecognized option '%s'\n",
- argv[0], argv[optind - 1]);
+ fprintf(stderr, "%s mv: unrecognized option '%s'\n",
+ progname, argv[optind - 1]);
return CMD_HELP;
}
}
if (param.fp_mdt_index == -1) {
- fprintf(stderr, "%s: MDT index must be specified\n", argv[0]);
+ fprintf(stderr, "%s mv: MDT index must be specified\n",
+ progname);
return CMD_HELP;
}
if (optind >= argc) {
- fprintf(stderr, "%s: missing operand path\n", argv[0]);
+ fprintf(stderr, "%s mv: DIR must be specified\n", progname);
return CMD_HELP;
}
param.fp_migrate = 1;
rc = llapi_migrate_mdt(argv[optind], ¶m);
if (rc != 0)
- fprintf(stderr, "%s: cannot migrate '%s' to MDT%04x: %s\n",
- argv[0], argv[optind], param.fp_mdt_index,
+ fprintf(stderr, "%s mv: cannot migrate '%s' to MDT%04x: %s\n",
+ progname, argv[optind], param.fp_mdt_index,
strerror(-rc));
return rc;
}
return CMD_HELP;
}
+ if ((dqb->dqb_valid | QIF_BTIME && dqi->dqi_bgrace >= UINT_MAX) ||
+ (dqb->dqb_valid | QIF_ITIME && dqi->dqi_igrace >= UINT_MAX)) {
+ fprintf(stderr, "error: grace time is too large\n");
+ return CMD_HELP;
+ }
+
mnt = argv[optind];
rc = llapi_quotactl(mnt, &qctl);
if (rc) {
int lfs_setquota(int argc, char **argv)
{
- int c, rc;
- struct if_quotactl qctl;
- char *mnt, *obd_type = (char *)qctl.obd_type;
- struct obd_dqblk *dqb = &qctl.qc_dqblk;
- struct option long_opts[] = {
+ int c, rc = 0;
+ struct if_quotactl qctl;
+ char *mnt, *obd_type = (char *)qctl.obd_type;
+ struct obd_dqblk *dqb = &qctl.qc_dqblk;
+ struct option long_opts[] = {
{ .val = 'b', .name = "block-softlimit",
.has_arg = required_argument },
{ .val = 'B', .name = "block-hardlimit",
.has_arg = required_argument },
+ { .val = 'd', .name = "default", .has_arg = no_argument },
{ .val = 'g', .name = "group", .has_arg = required_argument },
+ { .val = 'G', .name = "default-grp", .has_arg = no_argument },
{ .val = 'i', .name = "inode-softlimit",
.has_arg = required_argument },
{ .val = 'I', .name = "inode-hardlimit",
.has_arg = required_argument },
{ .val = 'p', .name = "projid", .has_arg = required_argument },
+ { .val = 'P', .name = "default-prj", .has_arg = no_argument },
{ .val = 'u', .name = "user", .has_arg = required_argument },
+ { .val = 'U', .name = "default-usr", .has_arg = no_argument },
{ .name = NULL } };
- unsigned limit_mask = 0;
- char *endptr;
+ unsigned limit_mask = 0;
+ char *endptr;
+ bool use_default = false;
int qtype;
if (has_times_option(argc, argv))
* 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:",
+ while ((c = getopt_long(argc, argv, "b:B:dg:Gi:I:p:Pu:U",
long_opts, NULL)) != -1) {
switch (c) {
+ case 'U':
+ qctl.qc_cmd = LUSTRE_Q_SETDEFAULT;
+ qtype = USRQUOTA;
+ qctl.qc_id = 0;
+ goto quota_type_def;
case 'u':
qtype = USRQUOTA;
rc = name2uid(&qctl.qc_id, optarg);
goto quota_type;
+ case 'G':
+ qctl.qc_cmd = LUSTRE_Q_SETDEFAULT;
+ qtype = GRPQUOTA;
+ qctl.qc_id = 0;
+ goto quota_type_def;
case 'g':
qtype = GRPQUOTA;
rc = name2gid(&qctl.qc_id, optarg);
goto quota_type;
+ case 'P':
+ qctl.qc_cmd = LUSTRE_Q_SETDEFAULT;
+ qtype = PRJQUOTA;
+ qctl.qc_id = 0;
+ goto quota_type_def;
case 'p':
qtype = PRJQUOTA;
rc = name2projid(&qctl.qc_id, optarg);
quota_type:
- if (qctl.qc_type != ALLQUOTA) {
- fprintf(stderr,
- "%s setquota: only one of -u, -g or -p may be specified\n",
- progname);
- return CMD_HELP;
- }
- qctl.qc_type = qtype;
if (rc) {
qctl.qc_id = strtoul(optarg, &endptr, 10);
if (*endptr != '\0') {
- fprintf(stderr,
- "%s setquota: invalid id '%s'\n",
- progname, optarg);
+ fprintf(stderr, "%s setquota: invalid"
+ " id '%s'\n", progname, optarg);
return -1;
}
}
+
+ if (qctl.qc_id == 0) {
+ fprintf(stderr, "%s setquota: can't set quota"
+ " for root usr/group/project.\n",
+ progname);
+ return -1;
+ }
+
+quota_type_def:
+ if (qctl.qc_type != ALLQUOTA) {
+ fprintf(stderr,
+ "%s setquota: only one of -u, -U, -g,"
+ " -G, -p or -P may be specified\n",
+ progname);
+ return CMD_HELP;
+ }
+ qctl.qc_type = qtype;
+ break;
+ case 'd':
+ qctl.qc_cmd = LUSTRE_Q_SETDEFAULT;
+ use_default = true;
break;
case 'b':
ARG2ULL(dqb->dqb_bsoftlimit, optarg, 1024);
return CMD_HELP;
}
- if (limit_mask == 0) {
+ if (!use_default && limit_mask == 0) {
fprintf(stderr,
"%s setquota: at least one limit must be specified\n",
progname);
return CMD_HELP;
}
+ if (use_default && limit_mask != 0) {
+ fprintf(stderr,
+ "%s setquota: limits should not be specified when"
+ " using default quota\n",
+ progname);
+ return CMD_HELP;
+ }
+
+ if (use_default && qctl.qc_id == 0) {
+ fprintf(stderr,
+ "%s setquota: can not set default quota for root"
+ " user/group/project\n",
+ progname);
+ return CMD_HELP;
+ }
+
if (optind != argc - 1) {
fprintf(stderr,
"%s setquota: filesystem not specified or unexpected argument '%s'\n",
mnt = argv[optind];
- if ((!(limit_mask & BHLIMIT) ^ !(limit_mask & BSLIMIT)) ||
- (!(limit_mask & IHLIMIT) ^ !(limit_mask & ISLIMIT))) {
- /* sigh, we can't just set blimits/ilimits */
- struct if_quotactl tmp_qctl = {.qc_cmd = LUSTRE_Q_GETQUOTA,
- .qc_type = qctl.qc_type,
- .qc_id = qctl.qc_id};
-
- rc = llapi_quotactl(mnt, &tmp_qctl);
+ if (use_default) {
+ dqb->dqb_bhardlimit = 0;
+ dqb->dqb_bsoftlimit = 0;
+ dqb->dqb_ihardlimit = 0;
+ dqb->dqb_isoftlimit = 0;
+ dqb->dqb_itime = 0;
+ dqb->dqb_btime = 0;
+ dqb->dqb_valid |= QIF_LIMITS | QIF_TIMES;
+ } else if ((!(limit_mask & BHLIMIT) ^ !(limit_mask & BSLIMIT)) ||
+ (!(limit_mask & IHLIMIT) ^ !(limit_mask & ISLIMIT))) {
+ /* sigh, we can't just set blimits/ilimits */
+ struct if_quotactl tmp_qctl = {.qc_cmd = LUSTRE_Q_GETQUOTA,
+ .qc_type = qctl.qc_type,
+ .qc_id = qctl.qc_id};
+
+ rc = llapi_quotactl(mnt, &tmp_qctl);
if (rc < 0)
return rc;
- if (!(limit_mask & BHLIMIT))
- dqb->dqb_bhardlimit = tmp_qctl.qc_dqblk.dqb_bhardlimit;
- if (!(limit_mask & BSLIMIT))
- dqb->dqb_bsoftlimit = tmp_qctl.qc_dqblk.dqb_bsoftlimit;
- if (!(limit_mask & IHLIMIT))
- dqb->dqb_ihardlimit = tmp_qctl.qc_dqblk.dqb_ihardlimit;
- if (!(limit_mask & ISLIMIT))
- dqb->dqb_isoftlimit = tmp_qctl.qc_dqblk.dqb_isoftlimit;
-
- /* Keep grace times if we have got no softlimit arguments */
- if ((limit_mask & BHLIMIT) && !(limit_mask & BSLIMIT)) {
- dqb->dqb_valid |= QIF_BTIME;
- dqb->dqb_btime = tmp_qctl.qc_dqblk.dqb_btime;
- }
+ if (!(limit_mask & BHLIMIT))
+ dqb->dqb_bhardlimit = tmp_qctl.qc_dqblk.dqb_bhardlimit;
+ if (!(limit_mask & BSLIMIT))
+ dqb->dqb_bsoftlimit = tmp_qctl.qc_dqblk.dqb_bsoftlimit;
+ if (!(limit_mask & IHLIMIT))
+ dqb->dqb_ihardlimit = tmp_qctl.qc_dqblk.dqb_ihardlimit;
+ if (!(limit_mask & ISLIMIT))
+ dqb->dqb_isoftlimit = tmp_qctl.qc_dqblk.dqb_isoftlimit;
+
+ /* Keep grace times if we have got no softlimit arguments */
+ if ((limit_mask & BHLIMIT) && !(limit_mask & BSLIMIT)) {
+ dqb->dqb_valid |= QIF_BTIME;
+ dqb->dqb_btime = tmp_qctl.qc_dqblk.dqb_btime;
+ }
- if ((limit_mask & IHLIMIT) && !(limit_mask & ISLIMIT)) {
- dqb->dqb_valid |= QIF_ITIME;
- dqb->dqb_itime = tmp_qctl.qc_dqblk.dqb_itime;
- }
- }
+ if ((limit_mask & IHLIMIT) && !(limit_mask & ISLIMIT)) {
+ dqb->dqb_valid |= QIF_ITIME;
+ dqb->dqb_itime = tmp_qctl.qc_dqblk.dqb_itime;
+ }
+ }
- dqb->dqb_valid |= (limit_mask & (BHLIMIT | BSLIMIT)) ? QIF_BLIMITS : 0;
- dqb->dqb_valid |= (limit_mask & (IHLIMIT | ISLIMIT)) ? QIF_ILIMITS : 0;
+ dqb->dqb_valid |= (limit_mask & (BHLIMIT | BSLIMIT)) ? QIF_BLIMITS : 0;
+ dqb->dqb_valid |= (limit_mask & (IHLIMIT | ISLIMIT)) ? QIF_ILIMITS : 0;
- rc = llapi_quotactl(mnt, &qctl);
+ rc = llapi_quotactl(mnt, &qctl);
if (rc) {
if (*obd_type)
fprintf(stderr,
}
static void print_quota_title(char *name, struct if_quotactl *qctl,
- bool human_readable)
+ bool human_readable, bool show_default)
{
- printf("Disk quotas for %s %s (%cid %u):\n",
- qtype_name(qctl->qc_type), name,
- *qtype_name(qctl->qc_type), qctl->qc_id);
- printf("%15s%8s %7s%8s%8s%8s %7s%8s%8s\n",
- "Filesystem", human_readable ? "used" : "kbytes",
- "quota", "limit", "grace",
- "files", "quota", "limit", "grace");
+ if (show_default) {
+ printf("Disk default %s quota:\n", qtype_name(qctl->qc_type));
+ printf("%15s %8s%8s%8s %8s%8s%8s\n",
+ "Filesystem", "bquota", "blimit", "bgrace",
+ "iquota", "ilimit", "igrace");
+ } else {
+ printf("Disk quotas for %s %s (%cid %u):\n",
+ qtype_name(qctl->qc_type), name,
+ *qtype_name(qctl->qc_type), qctl->qc_id);
+ printf("%15s%8s %7s%8s%8s%8s %7s%8s%8s\n",
+ "Filesystem", human_readable ? "used" : "kbytes",
+ "quota", "limit", "grace",
+ "files", "quota", "limit", "grace");
+ }
}
static void kbytes2str(__u64 num, char *buf, int buflen, bool h)
#define STRBUF_LEN 32
static void print_quota(char *mnt, struct if_quotactl *qctl, int type,
- int rc, bool h)
+ int rc, bool h, bool show_default)
{
- time_t now;
+ time_t now;
- time(&now);
+ time(&now);
- if (qctl->qc_cmd == LUSTRE_Q_GETQUOTA || qctl->qc_cmd == Q_GETOQUOTA) {
+ if (qctl->qc_cmd == LUSTRE_Q_GETQUOTA || qctl->qc_cmd == Q_GETOQUOTA ||
+ qctl->qc_cmd == LUSTRE_Q_GETDEFAULT) {
int bover = 0, iover = 0;
struct obd_dqblk *dqb = &qctl->qc_dqblk;
char numbuf[3][STRBUF_LEN];
char timebuf[40];
char strbuf[STRBUF_LEN];
- if (dqb->dqb_bhardlimit &&
+ if (dqb->dqb_bhardlimit &&
lustre_stoqb(dqb->dqb_curspace) >= dqb->dqb_bhardlimit) {
bover = 1;
} else if (dqb->dqb_bsoftlimit && dqb->dqb_btime) {
if (bover)
diff2str(dqb->dqb_btime, timebuf, now);
+ else if (show_default)
+ snprintf(timebuf, sizeof(timebuf), "%llu",
+ dqb->dqb_btime);
kbytes2str(lustre_stoqb(dqb->dqb_curspace),
strbuf, sizeof(strbuf), h);
sprintf(numbuf[2], (dqb->dqb_valid & QIF_BLIMITS) ?
"%s" : "[%s]", strbuf);
- printf(" %7s%c %6s %7s %7s",
- numbuf[0], bover ? '*' : ' ', numbuf[1],
- numbuf[2], bover > 1 ? timebuf : "-");
+ if (show_default)
+ printf(" %6s %7s %7s", numbuf[1], numbuf[2], timebuf);
+ else
+ printf(" %7s%c %6s %7s %7s",
+ numbuf[0], bover ? '*' : ' ', numbuf[1],
+ numbuf[2], bover > 1 ? timebuf : "-");
+
if (iover)
diff2str(dqb->dqb_itime, timebuf, now);
+ else if (show_default)
+ snprintf(timebuf, sizeof(timebuf), "%llu",
+ dqb->dqb_itime);
- sprintf(numbuf[0], (dqb->dqb_valid & QIF_INODES) ?
- "%ju" : "[%ju]", (uintmax_t)dqb->dqb_curinodes);
+ snprintf(numbuf[0], sizeof(numbuf),
+ (dqb->dqb_valid & QIF_INODES) ? "%ju" : "[%ju]",
+ (uintmax_t)dqb->dqb_curinodes);
if (type == QC_GENERAL)
sprintf(numbuf[1], (dqb->dqb_valid & QIF_ILIMITS) ?
sprintf(numbuf[2], (dqb->dqb_valid & QIF_ILIMITS) ?
"%ju" : "[%ju]", (uintmax_t)dqb->dqb_ihardlimit);
- if (type != QC_OSTIDX)
+ if (show_default)
+ printf(" %6s %7s %7s", numbuf[1], numbuf[2], timebuf);
+ else if (type != QC_OSTIDX)
printf(" %7s%c %6s %7s %7s",
numbuf[0], iover ? '*' : ' ', numbuf[1],
numbuf[2], iover > 1 ? timebuf : "-");
}
print_quota(obd_uuid2str(&qctl->obd_uuid), qctl,
- qctl->qc_valid, 0, h);
+ qctl->qc_valid, 0, h, false);
*total += is_mdt ? qctl->qc_dqblk.dqb_ihardlimit :
qctl->qc_dqblk.dqb_bhardlimit;
}
}
static int get_print_quota(char *mnt, char *name, struct if_quotactl *qctl,
- int verbose, int quiet, bool human_readable)
+ int verbose, int quiet, bool human_readable,
+ bool show_default)
{
int rc1 = 0, rc2 = 0, rc3 = 0;
char *obd_type = (char *)qctl->obd_type;
char *obd_uuid = (char *)qctl->obd_uuid.uuid;
__u64 total_ialloc = 0, total_balloc = 0;
+ bool use_default_for_blk = false;
+ bool use_default_for_file = false;
int inacc;
rc1 = llapi_quotactl(mnt, qctl);
}
}
- if (qctl->qc_cmd == LUSTRE_Q_GETQUOTA && !quiet)
- print_quota_title(name, qctl, human_readable);
+ if (!show_default && qctl->qc_id == 0) {
+ qctl->qc_dqblk.dqb_bhardlimit = 0;
+ qctl->qc_dqblk.dqb_bsoftlimit = 0;
+ qctl->qc_dqblk.dqb_ihardlimit = 0;
+ qctl->qc_dqblk.dqb_isoftlimit = 0;
+ qctl->qc_dqblk.dqb_btime = 0;
+ qctl->qc_dqblk.dqb_itime = 0;
+ qctl->qc_dqblk.dqb_valid |= QIF_LIMITS | QIF_TIMES;
+ }
+
+ if (qctl->qc_dqblk.dqb_valid & QIF_BTIME &&
+ LQUOTA_FLAG(qctl->qc_dqblk.dqb_btime) & LQUOTA_FLAG_DEFAULT) {
+ use_default_for_blk = true;
+ qctl->qc_dqblk.dqb_btime &= LQUOTA_GRACE_MASK;
+ }
+
+ if (qctl->qc_dqblk.dqb_valid & QIF_ITIME &&
+ LQUOTA_FLAG(qctl->qc_dqblk.dqb_itime) & LQUOTA_FLAG_DEFAULT) {
+ use_default_for_file = true;
+ qctl->qc_dqblk.dqb_itime &= LQUOTA_GRACE_MASK;
+ }
+
+ if ((qctl->qc_cmd == LUSTRE_Q_GETQUOTA ||
+ qctl->qc_cmd == LUSTRE_Q_GETDEFAULT) && !quiet)
+ print_quota_title(name, qctl, human_readable, show_default);
if (rc1 && *obd_type)
fprintf(stderr, "%s %s ", obd_type, obd_uuid);
((qctl->qc_dqblk.dqb_valid & (QIF_LIMITS|QIF_USAGE)) !=
(QIF_LIMITS|QIF_USAGE));
- print_quota(mnt, qctl, QC_GENERAL, rc1, human_readable);
+ print_quota(mnt, qctl, QC_GENERAL, rc1, human_readable, show_default);
- if (qctl->qc_valid == QC_GENERAL && qctl->qc_cmd != LUSTRE_Q_GETINFO &&
- verbose) {
+ if (!show_default && verbose &&
+ qctl->qc_valid == QC_GENERAL && qctl->qc_cmd != LUSTRE_Q_GETINFO) {
char strbuf[STRBUF_LEN];
rc2 = print_obd_quota(mnt, qctl, 1, human_readable,
strbuf);
}
+ if (use_default_for_blk)
+ printf("%cid %u is using default block quota setting\n",
+ *qtype_name(qctl->qc_type), qctl->qc_id);
+
+ if (use_default_for_file)
+ printf("%cid %u is using default file quota setting\n",
+ *qtype_name(qctl->qc_type), qctl->qc_id);
+
if (rc1 || rc2 || rc3 || inacc)
printf("Some errors happened when getting quota info. "
"Some devices may be not working or deactivated. "
char *endptr;
__u32 valid = QC_GENERAL, idx = 0;
bool human_readable = false;
+ bool show_default = false;
int qtype;
- while ((c = getopt(argc, argv, "gi:I:o:pqtuvh")) != -1) {
+ while ((c = getopt(argc, argv, "gGi:I:o:pPqtuUvh")) != -1) {
switch (c) {
+ case 'U':
+ show_default = true;
case 'u':
qtype = USRQUOTA;
goto quota_type;
+ case 'G':
+ show_default = true;
case 'g':
qtype = GRPQUOTA;
goto quota_type;
+ case 'P':
+ show_default = true;
case 'p':
qtype = PRJQUOTA;
quota_type:
/* current uid/gid info for "lfs quota /path/to/lustre/mount" */
if (qctl.qc_cmd == LUSTRE_Q_GETQUOTA && qctl.qc_type == ALLQUOTA &&
- optind == argc - 1) {
+ optind == argc - 1 && !show_default) {
qctl.qc_cmd = LUSTRE_Q_GETQUOTA;
qctl.qc_valid = valid;
name = "<unknown>";
mnt = argv[optind];
rc1 = get_print_quota(mnt, name, &qctl, verbose, quiet,
- human_readable);
+ human_readable, show_default);
if (rc1 && !rc)
rc = rc1;
}
+ return rc;
/* lfs quota -u username /path/to/lustre/mount */
} else if (qctl.qc_cmd == LUSTRE_Q_GETQUOTA) {
/* options should be followed by u/g-name and mntpoint */
- if (optind + 2 != argc || qctl.qc_type == ALLQUOTA) {
+ if ((!show_default && optind + 2 != argc) ||
+ (show_default && optind + 1 != argc) ||
+ qctl.qc_type == ALLQUOTA) {
fprintf(stderr,
"%s quota: name and mount point must be specified\n",
progname);
return CMD_HELP;
}
- name = argv[optind++];
- switch (qctl.qc_type) {
- case USRQUOTA:
- rc = name2uid(&qctl.qc_id, name);
- break;
- case GRPQUOTA:
- rc = name2gid(&qctl.qc_id, name);
- break;
- case PRJQUOTA:
- rc = name2projid(&qctl.qc_id, name);
- break;
- default:
- rc = -ENOTSUP;
- break;
+ if (!show_default) {
+ name = argv[optind++];
+ switch (qctl.qc_type) {
+ case USRQUOTA:
+ rc = name2uid(&qctl.qc_id, name);
+ break;
+ case GRPQUOTA:
+ rc = name2gid(&qctl.qc_id, name);
+ break;
+ case PRJQUOTA:
+ rc = name2projid(&qctl.qc_id, name);
+ break;
+ default:
+ rc = -ENOTSUP;
+ break;
+ }
+ } else {
+ qctl.qc_valid = QC_GENERAL;
+ qctl.qc_cmd = LUSTRE_Q_GETDEFAULT;
+ qctl.qc_id = 0;
}
+
if (rc) {
qctl.qc_id = strtoul(name, &endptr, 10);
if (*endptr != '\0') {
return CMD_HELP;
}
}
- mnt = argv[optind];
- rc = get_print_quota(mnt, name, &qctl, verbose, quiet,
- human_readable);
} else if (optind + 1 != argc || qctl.qc_type == ALLQUOTA) {
fprintf(stderr, "%s quota: missing quota info argument(s)\n",
progname);
return CMD_HELP;
}
+ mnt = argv[optind];
+ rc = get_print_quota(mnt, name, &qctl, verbose, quiet,
+ human_readable, show_default);
return rc;
}
#endif /* HAVE_SYS_QUOTA_H! */
case 'f':
follow++;
break;
- case '?':
- return CMD_HELP;
default:
- fprintf(stderr, "error: %s: option '%s' unrecognized\n",
- argv[0], argv[optind - 1]);
+ fprintf(stderr,
+ "%s changelog: unrecognized option '%s'\n",
+ progname, argv[optind - 1]);
return CMD_HELP;
}
}
- if (optind >= argc)
- return CMD_HELP;
+ if (optind >= argc) {
+ fprintf(stderr, "%s changelog: mdtname must be specified\n",
+ progname);
+ return CMD_HELP;
+ }
mdd = argv[optind++];
if (argc > optind)
(follow ? CHANGELOG_FLAG_FOLLOW : 0),
mdd, startrec);
if (rc < 0) {
- fprintf(stderr, "Can't start changelog: %s\n",
- strerror(errno = -rc));
+ fprintf(stderr, "%s changelog: cannot start changelog: %s\n",
+ progname, strerror(errno = -rc));
return rc;
}
CHANGELOG_EXTRA_FLAG_OMODE |
CHANGELOG_EXTRA_FLAG_XATTR);
if (rc < 0) {
- fprintf(stderr, "Can't set xflags for changelog: %s\n",
- strerror(errno = -rc));
+ fprintf(stderr,
+ "%s changelog: cannot set xflags for changelog: %s\n",
+ progname, strerror(errno = -rc));
return rc;
}
if (omd->cr_openflags & MDS_FMODE_EXEC) {
mode[2] = 'x';
} else {
- if (omd->cr_openflags & FMODE_READ)
+ if (omd->cr_openflags & MDS_FMODE_READ)
mode[0] = 'r';
if (omd->cr_openflags &
- (FMODE_WRITE |
+ (MDS_FMODE_WRITE |
MDS_OPEN_TRUNC |
MDS_OPEN_APPEND))
mode[1] = 'w';
printf("\n");
llapi_changelog_free(&rec);
- }
+ }
- llapi_changelog_fini(&changelog_priv);
+ llapi_changelog_fini(&changelog_priv);
- if (rc < 0)
- fprintf(stderr, "Changelog: %s\n", strerror(errno = -rc));
+ if (rc < 0)
+ fprintf(stderr, "%s changelog: cannot access changelog: %s\n",
+ progname, strerror(errno = -rc));
- return (rc == 1 ? 0 : rc);
+ return (rc == 1 ? 0 : rc);
}
static int lfs_changelog_clear(int argc, char **argv)
int lnktmp;
int printcur = 0;
int rc = 0;
+ char *endptr = NULL;
while ((rc = getopt_long(argc, argv, short_opts,
long_opts, NULL)) != -1) {
- switch (rc) {
- case 'c':
- printcur++;
- break;
- case 'l':
- linkno = strtol(optarg, NULL, 10);
- break;
- case 'r':
- recno = strtoll(optarg, NULL, 10);
- break;
- case '?':
- return CMD_HELP;
- default:
- fprintf(stderr, "error: %s: option '%s' unrecognized\n",
- argv[0], argv[optind - 1]);
- return CMD_HELP;
- }
- }
+ switch (rc) {
+ case 'c':
+ printcur++;
+ break;
+ case 'l':
+ linkno = strtol(optarg, &endptr, 10);
+ if (*endptr != '\0') {
+ fprintf(stderr,
+ "%s fid2path: invalid linkno '%s'\n",
+ progname, optarg);
+ return CMD_HELP;
+ }
+ break;
+ case 'r':
+ recno = strtoll(optarg, &endptr, 10);
+ if (*endptr != '\0') {
+ fprintf(stderr,
+ "%s fid2path: invalid recno '%s'\n",
+ progname, optarg);
+ return CMD_HELP;
+ }
+ break;
+ default:
+ fprintf(stderr,
+ "%s fid2path: unrecognized option '%s'\n",
+ progname, argv[optind - 1]);
+ return CMD_HELP;
+ }
+ }
- if (argc < 3)
+ if (argc < 3) {
+ fprintf(stderr,
+ "%s fid2path: <fsname|rootpath> and <fid>... must be specified\n",
+ progname);
return CMD_HELP;
+ }
device = argv[optind++];
path = calloc(1, PATH_MAX);
if (path == NULL) {
- fprintf(stderr, "error: Not enough memory\n");
- return -errno;
+ rc = -errno;
+ fprintf(stderr,
+ "%s fid2path: cannot allocate memory for path: %s\n",
+ progname, strerror(-rc));
+ return rc;
}
rc = 0;
rc2 = llapi_fid2path(device, fid, path, PATH_MAX,
&rectmp, &lnktmp);
if (rc2 < 0) {
- fprintf(stderr, "%s: error on FID %s: %s\n",
- argv[0], fid, strerror(errno = -rc2));
+ fprintf(stderr,
+ "%s fid2path: cannot find '%s': %s\n",
+ progname, fid, strerror(errno = -rc2));
if (rc == 0)
rc = rc2;
break;
show_parents = true;
break;
default:
- fprintf(stderr, "error: %s: option '%s' unrecognized\n",
- argv[0], argv[optind - 1]);
+ fprintf(stderr,
+ "%s path2fid: unrecognized option '%s'\n",
+ progname, argv[optind - 1]);
return CMD_HELP;
}
}
- if (optind > argc - 1)
+ if (optind > argc - 1) {
+ fprintf(stderr, "%s path2fid: FILE... must be specified\n",
+ progname);
return CMD_HELP;
+ }
else if (optind < argc - 1)
sep = ": ";
}
if (err) {
- fprintf(stderr, "%s: can't get %sfid for %s: %s\n",
- argv[0], show_parents ? "parent " : "", *path,
+ fprintf(stderr,
+ "%s path2fid: cannot get %sfid for '%s': %s\n",
+ progname, show_parents ? "parent " : "", *path,
strerror(-err));
if (rc == 0) {
rc = err;
int c;
int data_version_flags = LL_DV_RD_FLUSH; /* Read by default */
- if (argc < 2)
+ if (argc < 2) {
+ fprintf(stderr, "%s data_version: FILE must be specified\n",
+ progname);
return CMD_HELP;
+ }
while ((c = getopt(argc, argv, "nrw")) != -1) {
switch (c) {
data_version_flags |= LL_DV_WR_FLUSH;
break;
default:
+ fprintf(stderr,
+ "%s data_version: unrecognized option '%s'\n",
+ progname, argv[optind - 1]);
return CMD_HELP;
}
}
- if (optind == argc)
+ if (optind == argc) {
+ fprintf(stderr, "%s data_version: FILE must be specified\n",
+ progname);
return CMD_HELP;
+ }
path = argv[optind];
fd = open(path, O_RDONLY);
- if (fd < 0)
- err(errno, "cannot open file %s", path);
+ if (fd < 0) {
+ rc = -errno;
+ fprintf(stderr, "%s data_version: cannot open file '%s': %s\n",
+ progname, path, strerror(-rc));
+ return rc;
+ }
rc = llapi_get_data_version(fd, &data_version, data_version_flags);
if (rc < 0)
- err(errno, "cannot get version for %s", path);
+ fprintf(stderr,
+ "%s data_version: cannot get version for '%s': %s\n",
+ progname, path, strerror(-rc));
else
printf("%ju" "\n", (uintmax_t)data_version);