static int lfs_setstripe(int argc, char **argv);
static int lfs_find(int argc, char **argv);
static int lfs_getstripe(int argc, char **argv);
+static int lfs_getdirstripe(int argc, char **argv);
+static int lfs_setdirstripe(int argc, char **argv);
+static int lfs_rmentry(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_hsm_release(int argc, char **argv);
static int lfs_hsm_remove(int argc, char **argv);
static int lfs_hsm_cancel(int argc, char **argv);
-
+static int lfs_swap_layouts(int argc, char **argv);
/* all avaialable commands */
command_t cmdlist[] = {
" [--pool|-p] [--stripe-size|-S] [--directory|-d]\n"
" [--mdt-index|-M] [--recursive|-r] [--raw|-R]\n"
" <directory|filename> ..."},
+ {"setdirstripe", lfs_setdirstripe, 0,
+ "To create a remote directory on a specified MDT.\n"
+ "usage: setdirstripe <--index|-i mdt_index> <dir>\n"
+ "\tmdt_index: MDT index of first stripe\n"},
+ {"getdirstripe", lfs_getdirstripe, 0,
+ "To list the striping info for a given directory\n"
+ "or recursively for all directories in a directory tree.\n"
+ "usage: getdirstripe [--obd|-O <uuid>] [--quiet|-q] [--verbose|-v]\n"
+ " [--count|-c ] [--index|-i ] [--raw|-R]\n"
+ " [--recursive | -r] <dir> ..."},
+ {"mkdir", lfs_setdirstripe, 0,
+ "To create a remote directory on a specified MDT. And this can only\n"
+ "be done on MDT0 by administrator.\n"
+ "usage: mkdir <--index|-i mdt_index> <dir>\n"
+ "\tmdt_index: MDT index of the remote directory.\n"},
+ {"rm_entry", lfs_rmentry, 0,
+ "To remove the name entry of the remote directory. Note: This\n"
+ "command will only delete the name entry, i.e. the remote directory\n"
+ "will become inaccessable after this command. This can only be done\n"
+ "by the administrator\n"
+ "usage: rm_entry <dir>\n"},
{"pool_list", lfs_poollist, 0,
"List pools or pool OSTs\n"
"usage: pool_list <fsname>[.<pool>] | <pathname>\n"},
{"hsm_cancel", lfs_hsm_cancel, 0,
"Cancel requests related to specified files.\n"
"usage: hsm_cancel [--filelist FILELIST] [--data DATA] <file> ..."},
+ {"swap_layouts", lfs_swap_layouts, 0, "Swap layouts between 2 files.\n"
+ "usage: swap_layouts <path1> <path2>"},
{"help", Parser_help, 0, "help"},
{"exit", Parser_quit, 0, "quit"},
{"quit", Parser_quit, 0, "quit"},
return ret;
}
-static int lfs_getstripe(int argc, char **argv)
+static int lfs_getstripe_internal(int argc, char **argv,
+ struct find_param *param)
{
struct option long_opts[] = {
#if LUSTRE_VERSION >= OBD_OCD_VERSION(2,9,50,0)
{0, 0, 0, 0}
};
int c, rc;
- struct find_param param = { 0 };
- param.maxdepth = 1;
- optind = 0;
- while ((c = getopt_long(argc, argv, "cdghiMoO:pqrRsSv",
- long_opts, NULL)) != -1) {
- switch (c) {
- case 'O':
- if (param.obduuid) {
- fprintf(stderr,
- "error: %s: only one obduuid allowed",
- argv[0]);
- return CMD_HELP;
- }
- param.obduuid = (struct obd_uuid *)optarg;
- break;
- case 'q':
- param.quiet++;
- break;
- case 'd':
- param.maxdepth = 0;
- break;
- case 'r':
- param.recursive = 1;
- break;
- case 'v':
- param.verbose = VERBOSE_ALL | VERBOSE_DETAIL;
- break;
- case 'c':
+ param->maxdepth = 1;
+ optind = 0;
+ while ((c = getopt_long(argc, argv, "cdghiMoO:pqrRsSv",
+ long_opts, NULL)) != -1) {
+ switch (c) {
+ case 'O':
+ if (param->obduuid) {
+ fprintf(stderr,
+ "error: %s: only one obduuid allowed",
+ argv[0]);
+ return CMD_HELP;
+ }
+ param->obduuid = (struct obd_uuid *)optarg;
+ break;
+ case 'q':
+ param->quiet++;
+ break;
+ case 'd':
+ param->maxdepth = 0;
+ break;
+ case 'r':
+ param->recursive = 1;
+ break;
+ case 'v':
+ param->verbose = VERBOSE_ALL | VERBOSE_DETAIL;
+ break;
+ case 'c':
#if LUSTRE_VERSION >= OBD_OCD_VERSION(2,9,50,0)
#warning "remove deprecated --count option"
#elif LUSTRE_VERSION >= OBD_OCD_VERSION(2,6,50,0)
- if (strcmp(argv[optind - 1], "--count") == 0)
- fprintf(stderr, "warning: '--count' deprecated,"
- " use '--stripe-count' instead\n");
+ if (strcmp(argv[optind - 1], "--count") == 0)
+ fprintf(stderr, "warning: '--count' deprecated,"
+ " use '--stripe-count' instead\n");
#endif
- if (!(param.verbose & VERBOSE_DETAIL)) {
- param.verbose |= VERBOSE_COUNT;
- param.maxdepth = 0;
- }
- break;
- case 's':
+ if (!(param->verbose & VERBOSE_DETAIL)) {
+ param->verbose |= VERBOSE_COUNT;
+ param->maxdepth = 0;
+ }
+ break;
+ case 's':
#if LUSTRE_VERSION >= OBD_OCD_VERSION(2,9,50,0)
#warning "remove deprecated --size option"
#elif LUSTRE_VERSION >= OBD_OCD_VERSION(2,6,50,0)
- fprintf(stderr, "warning: '--size|-s' deprecated, "
- "use '--stripe-size|-S' instead\n");
+ fprintf(stderr, "warning: '--size|-s' deprecated, "
+ "use '--stripe-size|-S' instead\n");
#endif
- case 'S':
- if (!(param.verbose & VERBOSE_DETAIL)) {
- param.verbose |= VERBOSE_SIZE;
- param.maxdepth = 0;
- }
- break;
- case 'o':
+ case 'S':
+ if (!(param->verbose & VERBOSE_DETAIL)) {
+ param->verbose |= VERBOSE_SIZE;
+ param->maxdepth = 0;
+ }
+ break;
+ case 'o':
#if LUSTRE_VERSION >= OBD_OCD_VERSION(2,4,50,0)
- fprintf(stderr, "warning: '--offset|-o' deprecated, "
- "use '--stripe-index|-i' instead\n");
+ fprintf(stderr, "warning: '--offset|-o' deprecated, "
+ "use '--stripe-index|-i' instead\n");
#else
- if (strcmp(argv[optind - 1], "--offset") == 0)
- /* need --stripe-index established first */
- fprintf(stderr, "warning: '--offset' deprecated"
- ", use '--index' instead\n");
+ if (strcmp(argv[optind - 1], "--offset") == 0)
+ /* need --stripe-index established first */
+ fprintf(stderr, "warning: '--offset' deprecated"
+ ", use '--index' instead\n");
#endif
- case 'i':
+ case 'i':
#if LUSTRE_VERSION >= OBD_OCD_VERSION(2,9,50,0)
#warning "remove deprecated --offset and --index options"
#elif LUSTRE_VERSION >= OBD_OCD_VERSION(2,6,50,0)
- if (strcmp(argv[optind - 1], "--index") == 0)
- fprintf(stderr, "warning: '--index' deprecated"
- ", use '--stripe-index' instead\n");
+ if (strcmp(argv[optind - 1], "--index") == 0)
+ fprintf(stderr, "warning: '--index' deprecated"
+ ", use '--stripe-index' instead\n");
#endif
- if (!(param.verbose & VERBOSE_DETAIL)) {
- param.verbose |= VERBOSE_OFFSET;
- param.maxdepth = 0;
- }
- break;
- case 'p':
- if (!(param.verbose & VERBOSE_DETAIL)) {
- param.verbose |= VERBOSE_POOL;
- param.maxdepth = 0;
- }
- break;
- case 'g':
- if (!(param.verbose & VERBOSE_DETAIL)) {
- param.verbose |= VERBOSE_GENERATION;
- param.maxdepth = 0;
- }
- break;
- case 'M':
- if (!(param.verbose & VERBOSE_DETAIL))
- param.maxdepth = 0;
- param.verbose |= VERBOSE_MDTINDEX;
- break;
- case 'R':
- param.raw = 1;
- break;
- default:
- return CMD_HELP;
- }
- }
+ if (!(param->verbose & VERBOSE_DETAIL)) {
+ param->verbose |= VERBOSE_OFFSET;
+ param->maxdepth = 0;
+ }
+ break;
+ case 'p':
+ if (!(param->verbose & VERBOSE_DETAIL)) {
+ param->verbose |= VERBOSE_POOL;
+ param->maxdepth = 0;
+ }
+ break;
+ case 'g':
+ if (!(param->verbose & VERBOSE_DETAIL)) {
+ param->verbose |= VERBOSE_GENERATION;
+ param->maxdepth = 0;
+ }
+ break;
+ case 'M':
+ if (!(param->verbose & VERBOSE_DETAIL))
+ param->maxdepth = 0;
+ param->verbose |= VERBOSE_MDTINDEX;
+ break;
+ case 'R':
+ param->raw = 1;
+ break;
+ default:
+ return CMD_HELP;
+ }
+ }
- if (optind >= argc)
- return CMD_HELP;
+ if (optind >= argc)
+ return CMD_HELP;
- if (param.recursive)
- param.maxdepth = -1;
+ if (param->recursive)
+ param->maxdepth = -1;
- if (!param.verbose)
- param.verbose = VERBOSE_ALL;
- if (param.quiet)
- param.verbose = VERBOSE_OBJID;
+ if (!param->verbose)
+ param->verbose = VERBOSE_ALL;
+ if (param->quiet)
+ param->verbose = VERBOSE_OBJID;
- do {
- rc = llapi_getstripe(argv[optind], ¶m);
- } while (++optind < argc && !rc);
+ do {
+ rc = llapi_getstripe(argv[optind], param);
+ } while (++optind < argc && !rc);
- if (rc)
- fprintf(stderr, "error: %s failed for %s.\n",
- argv[0], argv[optind - 1]);
- return rc;
+ if (rc)
+ fprintf(stderr, "error: %s failed for %s.\n",
+ argv[0], argv[optind - 1]);
+ return rc;
}
static int lfs_tgts(int argc, char **argv)
return rc;
}
+static int lfs_getstripe(int argc, char **argv)
+{
+ struct find_param param = { 0 };
+ return lfs_getstripe_internal(argc, argv, ¶m);
+}
+
+/* functions */
+static int lfs_getdirstripe(int argc, char **argv)
+{
+ struct find_param param = { 0 };
+
+ param.get_lmv = 1;
+ return lfs_getstripe_internal(argc, argv, ¶m);
+}
+
+/* functions */
+static int lfs_setdirstripe(int argc, char **argv)
+{
+ char *dname;
+ int result;
+ int st_offset, st_count;
+ char *end;
+ int c;
+ char *stripe_off_arg = NULL;
+ int flags = 0;
+
+ struct option long_opts[] = {
+ {"index", required_argument, 0, 'i'},
+ {0, 0, 0, 0}
+ };
+
+ st_offset = -1;
+ st_count = 1;
+ optind = 0;
+ while ((c = getopt_long(argc, argv, "i:o",
+ long_opts, NULL)) >= 0) {
+ switch (c) {
+ case 0:
+ /* Long options. */
+ break;
+ case 'i':
+ stripe_off_arg = optarg;
+ break;
+ default:
+ fprintf(stderr, "error: %s: option '%s' "
+ "unrecognized\n",
+ argv[0], argv[optind - 1]);
+ return CMD_HELP;
+ }
+ }
+
+ if (optind == argc) {
+ fprintf(stderr, "error: %s: missing dirname\n",
+ argv[0]);
+ return CMD_HELP;
+ }
+
+ dname = argv[optind];
+ if (stripe_off_arg == NULL) {
+ fprintf(stderr, "error: %s: missing stripe_off.\n",
+ argv[0]);
+ return CMD_HELP;
+ }
+ /* get the stripe offset */
+ st_offset = strtoul(stripe_off_arg, &end, 0);
+ if (*end != '\0') {
+ fprintf(stderr, "error: %s: bad stripe offset '%s'\n",
+ argv[0], stripe_off_arg);
+ return CMD_HELP;
+ }
+ do {
+ result = llapi_dir_create_pool(dname, flags, st_offset,
+ st_count, 0, NULL);
+ if (result) {
+ fprintf(stderr, "error: %s: create stripe dir '%s' "
+ "failed\n", argv[0], dname);
+ break;
+ }
+ dname = argv[++optind];
+ } while (dname != NULL);
+
+ return result;
+}
+
+/* functions */
+static int lfs_rmentry(int argc, char **argv)
+{
+ char *dname;
+ int index;
+ int result = 0;
+
+ if (argc <= 1) {
+ fprintf(stderr, "error: %s: missing dirname\n",
+ argv[0]);
+ return CMD_HELP;
+ }
+
+ index = 1;
+ dname = argv[index];
+ while (dname != NULL) {
+ result = llapi_direntry_remove(dname);
+ if (result) {
+ fprintf(stderr, "error: %s: remove dir entry '%s' "
+ "failed\n", argv[0], dname);
+ break;
+ }
+ dname = argv[++index];
+ }
+ return result;
+}
+
static int lfs_osts(int argc, char **argv)
{
return lfs_tgts(argc, argv);
if (rc) {
fprintf(stderr, "can't get hsm state for %s: %s\n",
path, strerror(errno = -rc));
- return rc;
+ return rc;
}
/* Display path name and status flags */
rc = lstat(file, &st);
if (rc) {
- fprintf(stderr, "Cannot stat %s: %s\n", file, strerror(-errno));
+ fprintf(stderr, "Cannot stat %s: %s\n", file, strerror(errno));
return -errno;
}
/* A request should be ... */
return lfs_hsm_request(argc, argv, HUA_CANCEL);
}
+static int lfs_swap_layouts(int argc, char **argv)
+{
+ if (argc != 3)
+ return CMD_HELP;
+
+ return llapi_swap_layouts(argv[1], argv[2]);
+}
+
int main(int argc, char **argv)
{
int rc;