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
"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"
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, ',');
next = 0;
#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);
struct option long_opts[] = {
{"count", 0, 0, 'c'},
{"directory", 0, 0, 'd'},
+ {"generation", 0, 0, 'g'},
{"index", 0, 0, 'i'},
{"mdt", 0, 0, 'M'},
{"offset", 0, 0, 'o'},
param.maxdepth = 1;
optind = 0;
- while ((c = getopt_long(argc, argv, "cdhiMoO:pqrRsv",
+ 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;
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;
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 {