static int lfs_find(int argc, char **argv);
static int lfs_getstripe(int argc, char **argv);
static int lfs_osts(int argc, char **argv);
+static int lfs_mdts(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);
"usage: find <directory|filename> ...\n"
" [[!] --atime|-A [+-]N] [[!] --mtime|-M [+-]N] [[!] --ctime|-C [+-]N]\n"
" [--maxdepth|-D N] [[!] --name|-n <pattern>] [--print0|-P]\n"
- " [--print|-p] [[!] --obd|-O <uuid[s]>] [[!] --size|-s [+-]N[bkMGTP]]\n"
- " [[!] --type|-t <filetype>] [[!] --gid|-g|--group|-G <gid>|<gname>]\n"
+ " [--print|-p] [[!] --obd|-O <uuid[s]>] [[!] --mdt|-m <uuid[s]]\n"
+ " [[!] --size|-s [+-]N[bkMGTP]] [[!] --type|-t <filetype>]\n"
+ " [[!] --gid|-g|--group|-G <gid>|<gname>]\n"
" [[!] --uid|-u|--user|-U <uid>|<uname>]\n"
" [[!] --pool <pool>]\n"
"\t !: used before an option indicates 'NOT' the requested attribute\n"
"obsolete, HEAD does not support it anymore.\n"},
{"osts", lfs_osts, 0, "list OSTs connected to client "
"[for specified path only]\n" "usage: osts [path]"},
+ {"mdts", lfs_mdts, 0, "list MDTs connected to client "
+ "[for specified path only]\n" "usage: mdts [path]"},
{"df", lfs_df, 0,
"report filesystem disk space usage or inodes usage"
"of each MDS and all OSDs or a batch belonging to a specific pool .\n"
{"gid", required_argument, 0, 'g'},
{"group", required_argument, 0, 'G'},
{"mtime", required_argument, 0, 'M'},
+ {"mdt", required_argument, 0, 'm'},
{"name", required_argument, 0, 'n'},
/* --obd is considered as a new option. */
{"obd", required_argument, 0, 'O'},
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:O:Ppqrs:t:u:U:v",
- long_opts, NULL)) >= 0) {
+ while ((c = getopt_long_only(argc, argv, "-A:C:D:g:G:M:m:n:O:"
+ "Ppqrs:t:u:U:v", long_opts, NULL)) >= 0) {
xtime = NULL;
xsign = NULL;
if (neg_opt)
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 */
param.pattern = (char *)optarg;
param.exclude_pattern = !!neg_opt;
break;
+ case 'm':
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++;
+ }
+ }
+ if (c == 'O') {
+ param.exclude_obd = !!neg_opt;
+ param.num_alloc_obds += len;
+ tmp = realloc(param.obduuid,
+ param.num_alloc_obds *
+ sizeof(*param.obduuid));
+ if (tmp == NULL)
+ GOTO(err_free, ret = -ENOMEM);
+ param.obduuid = tmp;
+ } else {
+ param.exclude_mdt = !!neg_opt;
+ param.num_alloc_mdts += len;
+ tmp = realloc(param.mdtuuid,
+ param.num_alloc_mdts *
+ sizeof(*param.mdtuuid));
+ if (tmp == NULL)
+ GOTO(err_free, ret = -ENOMEM);
+ param.mdtuuid = tmp;
}
-
for (token = buf; token && *token; token = next) {
+ char *uuid;
+ if (c == 'O')
+ uuid =
+ param.obduuid[param.num_obds++].uuid;
+ else
+ uuid =
+ param.mdtuuid[param.num_mdts++].uuid;
p = strchr(token, ',');
next = 0;
if (p) {
*p = 0;
next = p+1;
}
- strcpy((char *)¶m.obduuid[param.num_obds++].uuid,
- token);
+ strcpy((char *)uuid, token);
}
-
+err_free:
if (buf)
free(buf);
break;
#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);
+ if (param.mdtuuid && param.num_alloc_mdts)
+ free(param.mdtuuid);
+
return ret;
}
}
break;
case 'M':
+ if (!(param.verbose & VERBOSE_DETAIL))
+ param.maxdepth = 0;
param.get_mdt_index = 1;
break;
case 'R':
return rc;
}
-static int lfs_osts(int argc, char **argv)
+static int lfs_tgts(int argc, char **argv)
{
char mntdir[PATH_MAX] = {'\0'}, path[PATH_MAX] = {'\0'};
struct find_param param;
continue;
memset(¶m, 0, sizeof(param));
+ if (!strcmp(argv[0], "mdts"))
+ param.get_lmv = 1;
+
rc = llapi_ostlist(mntdir, ¶m);
if (rc) {
fprintf(stderr, "error: %s: failed on %s\n",
return rc;
}
+static int lfs_osts(int argc, char **argv)
+{
+ return lfs_tgts(argc, argv);
+}
+
+static int lfs_mdts(int argc, char **argv)
+{
+ return lfs_tgts(argc, argv);
+}
+
#define COOK(value) \
({ \
int radix = 0; \
struct obd_statfs stat_buf, sum = { .os_bsize = 1 };
struct obd_uuid uuid_buf;
char *poolname = NULL;
- struct ll_stat_type types[] = { { LL_STATFS_MDC, "MDT" },
+ struct ll_stat_type types[] = { { LL_STATFS_LMV, "MDT" },
{ LL_STATFS_LOV, "OST" },
{ 0, NULL } };
struct ll_stat_type *tp;
ishow, cooked, tp->st_name, index, rc);
if (rc == 0) {
- if (tp->st_op == LL_STATFS_MDC) {
+ if (tp->st_op == LL_STATFS_LMV) {
sum.os_ffree += stat_buf.os_ffree;
sum.os_files += stat_buf.os_files;
} else /* if (tp->st_op == LL_STATFS_LOV) */ {