static int lfs_getstripe(int argc, char **argv);
static int lfs_osts(int argc, char **argv);
static int lfs_df(int argc, char **argv);
+static int lfs_getname(int argc, char **argv);
static int lfs_check(int argc, char **argv);
static int lfs_catinfo(int argc, char **argv);
#ifdef HAVE_SYS_QUOTA_H
"usage: getstripe [--obd|-O <uuid>] [--quiet | -q] [--verbose | -v]\n"
" [--count | -c ] [--index | -i | --offset | -o]\n"
" [--size | -s ] [--pool | -p ] [--directory | -d]\n"
- " [--mdt | -M] [--recursive | -r] <directory|filename> ..."},
+ " [--mdt | -M] [--recursive | -r] [--raw | -R]\n"
+ " <directory|filename> ..."},
{"pool_list", lfs_poollist, 0,
"List pools or pool OSTs\n"
"usage: pool_list <fsname>[.<pool>] | <pathname>\n"},
"report filesystem disk space usage or inodes usage"
"of each MDS and all OSDs or a batch belonging to a specific pool .\n"
"Usage: df [-i] [-h] [--pool|-p <fsname>[.<pool>] [path]"},
+ {"getname", lfs_getname, 0, "list instances and specified mount points "
+ "[for specified path only]\n"
+ "Usage: getname [-h]|[path ...] "},
#ifdef HAVE_SYS_QUOTA_H
{"quotachown",lfs_quotachown, 0,
"Change files' owner or group on the specified filesystem.\n"
char *stripe_off_arg = NULL;
char *stripe_count_arg = NULL;
char *pool_name_arg = NULL;
- unsigned long long size_units;
+ unsigned long long size_units = 1;
struct option long_opts[] = {
- {"size", required_argument, 0, 's'},
{"count", required_argument, 0, 'c'},
+ {"delete", no_argument, 0, 'd'},
{"index", required_argument, 0, 'i'},
{"offset", required_argument, 0, 'o'},
{"pool", required_argument, 0, 'p'},
- {"delete", no_argument, 0, 'd'},
+ {"size", required_argument, 0, 's'},
{0, 0, 0, 0}
};
#endif
{
optind = 0;
- while ((c = getopt_long(argc, argv, "c:di:o:s:p:",
+ while ((c = getopt_long(argc, argv, "c:di:o:p:s:",
long_opts, NULL)) >= 0) {
switch (c) {
case 0:
int new_fashion = 1;
int c, ret;
time_t t;
- struct find_param param = { .maxdepth = -1 };
+ struct find_param param = { .maxdepth = -1, .size_units = 0 };
struct option long_opts[] = {
- /* New find options. */
{"atime", required_argument, 0, 'A'},
{"ctime", required_argument, 0, 'C'},
- {"mtime", required_argument, 0, 'M'},
{"maxdepth", required_argument, 0, 'D'},
{"gid", required_argument, 0, 'g'},
{"group", required_argument, 0, 'G'},
- {"uid", required_argument, 0, 'u'},
- {"user", required_argument, 0, 'U'},
+ {"mtime", required_argument, 0, 'M'},
{"name", required_argument, 0, 'n'},
- /* no short option for pool, p/P already used */
- {"pool", required_argument, 0, FIND_POOL_OPT},
/* --obd is considered as a new option. */
{"obd", required_argument, 0, 'O'},
{"ost", required_argument, 0, 'O'},
- {"print", no_argument, 0, 'P'},
+ /* no short option for pool, p/P already used */
+ {"pool", required_argument, 0, FIND_POOL_OPT},
{"print0", no_argument, 0, 'p'},
- /* Old find options. */
+ {"print", no_argument, 0, 'P'},
{"quiet", no_argument, 0, 'q'},
{"recursive", no_argument, 0, 'r'},
{"size", required_argument, 0, 's'},
{"type", required_argument, 0, 't'},
+ {"uid", required_argument, 0, 'u'},
+ {"user", required_argument, 0, 'U'},
{"verbose", no_argument, 0, 'v'},
{0, 0, 0, 0}
};
optind = 0;
/* when getopt_long_only() hits '!' it returns 1, puts "!" in optarg */
- while ((c = getopt_long_only(argc,argv,"-A:C:D:g:G:M:n:PpO:qrs:t:u:U:v",
+ while ((c = getopt_long_only(argc,argv,"-A:C:D:g:G:M:n:O:Ppqrs:t:u:U:v",
long_opts, NULL)) >= 0) {
xtime = NULL;
xsign = NULL;
fprintf(stderr, "err: %s: filename|dirname must either "
"precede options or follow options\n",
argv[0]);
- return CMD_HELP;
+ ret = CMD_HELP;
+ goto err;
}
if (!isoption && pathstart == -1)
pathstart = optind - 1;
}
new_fashion = 1;
ret = set_time(&t, xtime, optarg);
- if (ret == INT_MAX)
- return -1;
+ if (ret == INT_MAX) {
+ ret = -1;
+ goto err;
+ }
if (ret)
*xsign = ret;
break;
if (*endptr != '\0') {
fprintf(stderr, "Group/GID: %s cannot "
"be found.\n", optarg);
- return -1;
+ ret = -1;
+ goto err;
}
}
param.exclude_gid = !!neg_opt;
if (*endptr != '\0') {
fprintf(stderr, "User/UID: %s cannot "
"be found.\n", optarg);
- return -1;
+ ret = -1;
+ goto err;
}
}
param.exclude_uid = !!neg_opt;
"Pool name %s is too long"
" (max is %d)\n", optarg,
LOV_MAXPOOLNAME);
- return -1;
+ ret = -1;
+ goto err;
}
/* we do check for empty pool because empty pool
* is used to find V1 lov attributes */
break;
case 'O': {
char *buf, *token, *next, *p;
- int len;
+ int len = 1;
+ void *tmp;
- len = strlen((char *)optarg);
- buf = malloc(len+1);
- if (buf == NULL)
- return -ENOMEM;
- strcpy(buf, (char *)optarg);
+ buf = strdup(optarg);
+ if (buf == NULL) {
+ ret = -ENOMEM;
+ goto err;
+ }
param.exclude_obd = !!neg_opt;
- if (param.num_alloc_obds == 0) {
- param.obduuid = malloc(FIND_MAX_OSTS *
- sizeof(struct obd_uuid));
- if (param.obduuid == NULL)
- return -ENOMEM;
- param.num_alloc_obds = INIT_ALLOC_NUM_OSTS;
+ token = buf;
+ while (token && *token) {
+ token = strchr(token, ',');
+ if (token) {
+ len++;
+ token++;
+ }
+ }
+
+ param.num_alloc_obds += len;
+ tmp = realloc(param.obduuid,
+ param.num_alloc_obds *
+ sizeof(*param.obduuid));
+ if (tmp == NULL) {
+ ret = -ENOMEM;
+ free(buf);
+ goto err;
}
+ param.obduuid = tmp;
for (token = buf; token && *token; token = next) {
p = strchr(token, ',');
#endif
default: fprintf(stderr, "error: %s: bad type '%s'\n",
argv[0], optarg);
- return CMD_HELP;
+ ret = CMD_HELP;
+ goto err;
};
break;
case 's':
if (ret) {
fprintf(stderr,"error: bad size '%s'\n",
optarg);
- return ret;
+ goto err;
}
param.check_size = 1;
param.exclude_size = !!neg_opt;
param.quiet = 0;
break;
case '?':
- return CMD_HELP;
+ ret = CMD_HELP;
+ goto err;
default:
fprintf(stderr, "error: %s: option '%s' unrecognized\n",
argv[0], argv[optind - 1]);
- return CMD_HELP;
+ ret = CMD_HELP;
+ goto err;
};
}
if (pathstart == -1) {
fprintf(stderr, "error: %s: no filename|pathname\n",
argv[0]);
- return CMD_HELP;
+ ret = CMD_HELP;
+ goto err;
} else if (pathend == -1) {
/* no options */
pathend = argc;
if (ret)
fprintf(stderr, "error: %s failed for %s.\n",
argv[0], argv[optind - 1]);
-
+err:
if (param.obduuid && param.num_alloc_obds)
free(param.obduuid);
static int lfs_getstripe(int argc, char **argv)
{
struct option long_opts[] = {
- {"obd", 1, 0, 'O'},
- {"quiet", 0, 0, 'q'},
- {"recursive", 0, 0, 'r'},
{"count", 0, 0, 'c'},
- {"size", 0, 0, 's'},
+ {"directory", 0, 0, 'd'},
+ {"generation", 0, 0, 'g'},
{"index", 0, 0, 'i'},
+ {"mdt", 0, 0, 'M'},
{"offset", 0, 0, 'o'},
+ {"obd", 1, 0, 'O'},
{"pool", 0, 0, 'p'},
+ {"quiet", 0, 0, 'q'},
+ {"recursive", 0, 0, 'r'},
+ {"raw", 0, 0, 'R'},
+ {"size", 0, 0, 's'},
{"verbose", 0, 0, 'v'},
- {"directory", 0, 0, 'd'},
- {"mdt", 0, 0, 'M'},
{0, 0, 0, 0}
};
int c, rc;
param.maxdepth = 1;
optind = 0;
- while ((c = getopt_long(argc, argv, "cdhiMoO:pqrsv",
+ while ((c = getopt_long(argc, argv, "cdghiMoO:pqrRsv",
long_opts, NULL)) != -1) {
switch (c) {
case 'O':
param.maxdepth = 0;
}
break;
+ case 'g':
+ if (!(param.verbose & VERBOSE_DETAIL)) {
+ param.verbose |= VERBOSE_GENERATION;
+ param.maxdepth = 0;
+ }
+ break;
case 'M':
param.get_mdt_index = 1;
break;
+ case 'R':
+ param.raw = 1;
+ break;
case '?':
return CMD_HELP;
default:
return rc;
}
+static int lfs_getname(int argc, char **argv)
+{
+ char mntdir[PATH_MAX] = "", path[PATH_MAX] = "", fsname[PATH_MAX] = "";
+ int rc = 0, index = 0, c;
+ char buf[sizeof(struct obd_uuid)];
+
+ optind = 0;
+ while ((c = getopt(argc, argv, "h")) != -1)
+ return CMD_HELP;
+
+ if (optind == argc) { /* no paths specified, get all paths. */
+ while (!llapi_search_mounts(path, index++, mntdir, fsname)) {
+ rc = llapi_getname(mntdir, buf, sizeof(buf));
+ if (rc < 0) {
+ fprintf(stderr,
+ "cannot get name for `%s': %s\n",
+ mntdir, strerror(-rc));
+ break;
+ }
+
+ printf("%s %s\n", buf, mntdir);
+
+ path[0] = fsname[0] = mntdir[0] = 0;
+ }
+ } else { /* paths specified, only attempt to search these. */
+ for (; optind < argc; optind++) {
+ rc = llapi_getname(argv[optind], buf, sizeof(buf));
+ if (rc < 0) {
+ fprintf(stderr,
+ "cannot get name for `%s': %s\n",
+ argv[optind], strerror(-rc));
+ break;
+ }
+
+ printf("%s %s\n", buf, argv[optind]);
+ }
+ }
+ return rc;
+}
+
static int lfs_check(int argc, char **argv)
{
int rc;
memset(&qchk, 0, sizeof(qchk));
optind = 0;
- while ((c = getopt(argc, argv, "ug")) != -1) {
+ while ((c = getopt(argc, argv, "gu")) != -1) {
switch (c) {
case 'u':
check_type |= 0x01;
rc = llapi_quotacheck(mnt, check_type);
if (rc) {
- fprintf(stderr, "quotacheck failed: %s\n", strerror(errno));
+ fprintf(stderr, "quotacheck failed: %s\n", strerror(-rc));
return rc;
}
if (*obd_type)
fprintf(stderr, "%s %s ", obd_type,
obd_uuid2str(&qchk.obd_uuid));
- fprintf(stderr, "quota check failed: %s\n", strerror(errno));
+ fprintf(stderr, "quota check failed: %s\n", strerror(-rc));
return rc;
}
qctl.qc_cmd = LUSTRE_Q_QUOTAON;
qctl.qc_type = check_type;
rc = llapi_quotactl(mnt, &qctl);
- if (rc && errno != EALREADY) {
+ if (rc && rc != -EALREADY) {
if (*obd_type)
fprintf(stderr, "%s %s ", (char *)qctl.obd_type,
obd_uuid2str(&qctl.obd_uuid));
fprintf(stderr, "%s turn on quota failed: %s\n",
- argv[0], strerror(errno));
+ argv[0], strerror(-rc));
return rc;
}
qctl.qc_cmd = LUSTRE_Q_QUOTAON;
optind = 0;
- while ((c = getopt(argc, argv, "ugf")) != -1) {
+ while ((c = getopt(argc, argv, "fgu")) != -1) {
switch (c) {
case 'u':
qctl.qc_type |= 0x01;
rc = llapi_quotactl(mnt, &qctl);
if (rc) {
- if (errno == EALREADY) {
+ if (rc == -EALREADY) {
rc = 0;
- } else if (errno == ENOENT) {
+ } else if (rc == -ENOENT) {
fprintf(stderr, "error: cannot find quota database, "
"make sure you have run quotacheck\n");
} else {
fprintf(stderr, "%s %s ", obd_type,
obd_uuid2str(&qctl.obd_uuid));
fprintf(stderr, "%s failed: %s\n", argv[0],
- strerror(errno));
+ strerror(-rc));
}
}
qctl.qc_cmd = LUSTRE_Q_QUOTAOFF;
optind = 0;
- while ((c = getopt(argc, argv, "ug")) != -1) {
+ while ((c = getopt(argc, argv, "gu")) != -1) {
switch (c) {
case 'u':
qctl.qc_type |= 0x01;
rc = llapi_quotactl(mnt, &qctl);
if (rc) {
- if (errno == EALREADY) {
+ if (rc == -EALREADY) {
rc = 0;
} else {
if (*obd_type)
fprintf(stderr, "%s %s ", obd_type,
obd_uuid2str(&qctl.obd_uuid));
fprintf(stderr, "quotaoff failed: %s\n",
- strerror(errno));
+ strerror(-rc));
}
}
qctl.qc_cmd = LUSTRE_Q_INVALIDATE;
optind = 0;
- while ((c = getopt(argc, argv, "ugf")) != -1) {
+ while ((c = getopt(argc, argv, "fgu")) != -1) {
switch (c) {
case 'u':
qctl.qc_type |= 0x01;
rc = llapi_quotactl(mnt, &qctl);
if (rc) {
- fprintf(stderr, "quotainv failed: %s\n", strerror(errno));
+ fprintf(stderr, "quotainv failed: %s\n", strerror(-rc));
return rc;
}
return ULONG_MAX;
}
-#define ARG2ULL(nr, str, defscale) \
+#define ARG2ULL(nr, str, def_units) \
do { \
- unsigned long long limit, units = 0; \
+ unsigned long long limit, units = def_units; \
int rc; \
\
rc = parse_size(str, &limit, &units, 1); \
fprintf(stderr, "error: bad limit value %s\n", str); \
return CMD_HELP; \
} \
- nr = ((units == 0) ? (defscale) : 1) * limit; \
+ nr = limit; \
} while (0)
static inline int has_times_option(int argc, char **argv)
struct obd_dqblk *dqb = &qctl.qc_dqblk;
struct obd_dqinfo *dqi = &qctl.qc_dqinfo;
struct option long_opts[] = {
- {"user", no_argument, 0, 'u'},
- {"group", no_argument, 0, 'g'},
{"block-grace", required_argument, 0, 'b'},
+ {"group", no_argument, 0, 'g'},
{"inode-grace", required_argument, 0, 'i'},
{"times", no_argument, 0, 't'},
+ {"user", no_argument, 0, 'u'},
{0, 0, 0, 0}
};
qctl.qc_type = UGQUOTA;
optind = 0;
- while ((c = getopt_long(argc, argv, "b:i:gtu", long_opts, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "b:gi:tu", long_opts, NULL)) != -1) {
switch (c) {
case 'u':
case 'g':
if (*obd_type)
fprintf(stderr, "%s %s ", obd_type,
obd_uuid2str(&qctl.obd_uuid));
- fprintf(stderr, "setquota failed: %s\n", strerror(errno));
+ fprintf(stderr, "setquota failed: %s\n", strerror(-rc));
return rc;
}
char *mnt, *obd_type = (char *)qctl.obd_type;
struct obd_dqblk *dqb = &qctl.qc_dqblk;
struct option long_opts[] = {
- {"user", required_argument, 0, 'u'},
- {"group", required_argument, 0, 'g'},
{"block-softlimit", required_argument, 0, 'b'},
{"block-hardlimit", required_argument, 0, 'B'},
+ {"group", required_argument, 0, 'g'},
{"inode-softlimit", required_argument, 0, 'i'},
{"inode-hardlimit", required_argument, 0, 'I'},
+ {"user", required_argument, 0, 'u'},
{0, 0, 0, 0}
};
unsigned limit_mask = 0;
* isn't reinitialized from command line */
optind = 0;
- while ((c = getopt_long(argc, argv, "b:B:i:I:g:u:", long_opts, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "b:B:g:i:I:u:", long_opts, NULL)) != -1) {
switch (c) {
case 'u':
case 'g':
if (rc < 0) {
fprintf(stderr, "error: setquota failed while retrieving"
" current quota settings (%s)\n",
- strerror(errno));
+ strerror(-rc));
return rc;
}
if (*obd_type)
fprintf(stderr, "%s %s ", obd_type,
obd_uuid2str(&qctl.obd_uuid));
- fprintf(stderr, "setquota failed: %s\n", strerror(errno));
+ fprintf(stderr, "setquota failed: %s\n", strerror(-rc));
return rc;
}
if (dqb->dqb_bhardlimit &&
toqb(dqb->dqb_curspace) >= dqb->dqb_bhardlimit) {
bover = 1;
- } else if (dqb->dqb_bsoftlimit &&
- toqb(dqb->dqb_curspace) >= dqb->dqb_bsoftlimit) {
+ } else if (dqb->dqb_bsoftlimit && dqb->dqb_btime) {
if (dqb->dqb_btime > now) {
bover = 2;
} else {
if (dqb->dqb_ihardlimit &&
dqb->dqb_curinodes >= dqb->dqb_ihardlimit) {
iover = 1;
- } else if (dqb->dqb_isoftlimit &&
- dqb->dqb_curinodes >= dqb->dqb_isoftlimit) {
+ } else if (dqb->dqb_isoftlimit && dqb->dqb_itime) {
if (dqb->dqb_btime > now) {
iover = 2;
} else {
if (bover)
diff2str(dqb->dqb_btime, timebuf, now);
- if (rc == -1 && errno == EREMOTEIO)
+ if (rc == -EREMOTEIO)
sprintf(numbuf[0], LPU64"*",
toqb(dqb->dqb_curspace));
else
rc = llapi_get_obd_count(mnt, &count, is_mdt);
if (rc) {
fprintf(stderr, "can not get %s count: %s\n",
- is_mdt ? "mdt": "ost", strerror(errno));
+ is_mdt ? "mdt": "ost", strerror(-rc));
return rc;
}
rc = llapi_quotactl(mnt, qctl);
if (rc) {
/* It is remote client case. */
- if (errno == EOPNOTSUPP) {
+ if (-rc == EOPNOTSUPP) {
rc = 0;
goto out;
}
__u32 valid = QC_GENERAL, idx = 0;
optind = 0;
- while ((c = getopt(argc, argv, "ugto:i:I:qv")) != -1) {
+ while ((c = getopt(argc, argv, "gi:I:o:qtuv")) != -1) {
switch (c) {
case 'u':
if (qctl.qc_type != UGQUOTA) {
mnt = argv[optind];
rc1 = llapi_quotactl(mnt, &qctl);
- if (rc1 == -1) {
- switch (errno) {
- case ESRCH:
+ if (rc1 < 0) {
+ switch (rc1) {
+ case -ESRCH:
fprintf(stderr, "%s quotas are not enabled.\n",
qctl.qc_type == USRQUOTA ? "user" : "group");
goto out;
- case EPERM:
+ case -EPERM:
fprintf(stderr, "Permission denied.\n");
- case ENOENT:
+ case -ENOENT:
/* We already got a "No such file..." message. */
goto out;
default:
fprintf(stderr, "Unexpected quotactl error: %s\n",
- strerror(errno));
+ strerror(-rc1));
}
}