#include <libcfs/libcfs.h>
#include <libcfs/libcfsutil.h>
-#include <lnet/lnetctl.h>
#include <lustre/lustreapi.h>
#include <lustre_ver.h>
-#include "obdctl.h"
/* all functions */
static int lfs_setstripe(int argc, char **argv);
" [--layout|-L]\n"
" <directory|filename> ..."},
{"setdirstripe", lfs_setdirstripe, 0,
- "To create a remote directory on a specified MDT.\n"
+ "To create a striped directory on a specified MDT. This can only\n"
+ "be done on MDT0 with the right of administrator.\n"
"usage: setdirstripe <--count|-c stripe_count>\n"
- "[--index|-i mdt_index] [--hash-type|-t hash_type]\n"
- "[--default_stripe|-D ] <dir>\n"
+ " [--index|-i mdt_index] [--hash-type|-t hash_type]\n"
+ " [--default_stripe|-D ] [--mode|-m mode] <dir>\n"
"\tstripe_count: stripe count of the striped directory\n"
"\tmdt_index: MDT index of first stripe\n"
- "\thash_type: hash type of the striped directory\n"
- "\tdefault_stripe: set default dirstripe of the directory\n"},
+ "\thash_type: hash type of the striped directory. Hash types:\n"
+ " fnv_1a_64 FNV-1a hash algorithm (default)\n"
+ " all_char sum of characters % MDT_COUNT (not recommended)\n"
+ "\tdefault_stripe: set default dirstripe of the directory\n"
+ "\tmode: the mode of the directory\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"
" [--count|-c ] [--index|-i ] [--raw|-R]\n"
" [--recursive | -r] [ --default_stripe | -D ] <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"},
+ "To create a striped directory on a specified MDT. This can only\n"
+ "be done on MDT0 with the right of administrator.\n"
+ "usage: mkdir <--count|-c stripe_count>\n"
+ " [--index|-i mdt_index] [--hash-type|-t hash_type]\n"
+ " [--default_stripe|-D ] [--mode|-m mode] <dir>\n"
+ "\tstripe_count: stripe count of the striped directory\n"
+ "\tmdt_index: MDT index of first stripe\n"
+ "\thash_type: hash type of the striped directory. Hash types:\n"
+ " fnv_1a_64 FNV-1a hash algorithm (default)\n"
+ " all_char sum of characters % MDT_COUNT (not recommended)\n"
+ "\tdefault_stripe: set default dirstripe of the directory\n"
+ "\tmode: the mode of the 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"
{"help", Parser_help, 0, "help"},
{"exit", Parser_quit, 0, "quit"},
{"quit", Parser_quit, 0, "quit"},
+ {"--version", Parser_version, 0,
+ "output build version of the utility and exit"},
{ 0, 0, 0, NULL }
};
__u64 migration_flags)
{
int fd, fdv;
- char volatile_file[PATH_MAX];
+ char volatile_file[PATH_MAX +
+ LUSTRE_VOLATILE_HDR_LEN + 4];
char parent[PATH_MAX];
char *ptr;
int rc;
else
*ptr = '\0';
}
- sprintf(volatile_file, "%s/%s::", parent, LUSTRE_VOLATILE_HDR);
+ rc = snprintf(volatile_file, sizeof(volatile_file), "%s/%s::", parent,
+ LUSTRE_VOLATILE_HDR);
+ if (rc >= sizeof(volatile_file)) {
+ rc = -E2BIG;
+ goto free;
+ }
/* create, open a volatile file, use caching (ie no directio) */
/* exclusive create is not needed because volatile files cannot
#define FIND_POOL_OPT 3
static int lfs_find(int argc, char **argv)
{
- int c, ret;
+ int c, rc;
+ int ret = 0;
time_t t;
struct find_param param = {
.fp_max_depth = -1,
xsign = ¶m.fp_msign;
param.fp_exclude_mtime = !!neg_opt;
}
- ret = set_time(&t, xtime, optarg);
- if (ret == INT_MAX) {
- ret = -1;
- goto err;
- }
- if (ret)
- *xsign = ret;
- break;
+ rc = set_time(&t, xtime, optarg);
+ if (rc == INT_MAX) {
+ ret = -1;
+ goto err;
+ }
+ if (rc)
+ *xsign = rc;
+ break;
case 'c':
if (optarg[0] == '+') {
param.stripecount_sign = -1;
break;
case 'g':
case 'G':
- ret = name2id(¶m.fp_gid, optarg, GROUP);
- if (ret) {
+ rc = name2id(¶m.fp_gid, optarg, GROUP);
+ if (rc) {
param.fp_gid = strtoul(optarg, &endptr, 10);
if (*endptr != '\0') {
fprintf(stderr, "Group/GID: %s cannot "
break;
case 'u':
case 'U':
- ret = name2id(¶m.fp_uid, optarg, USER);
- if (ret) {
+ rc = name2id(¶m.fp_uid, optarg, USER);
+ if (rc) {
param.fp_uid = strtoul(optarg, &endptr, 10);
if (*endptr != '\0') {
fprintf(stderr, "User/UID: %s cannot "
tmp = realloc(param.mdtuuid,
param.num_alloc_mdts *
sizeof(*param.mdtuuid));
- if (tmp == NULL)
- GOTO(err_free, ret = -ENOMEM);
+ if (tmp == NULL) {
+ ret = -ENOMEM;
+ goto err_free;
+ }
+
param.mdtuuid = tmp;
} else {
param.exclude_obd = !!neg_opt;
tmp = realloc(param.obduuid,
param.num_alloc_obds *
sizeof(*param.obduuid));
- if (tmp == NULL)
- GOTO(err_free, ret = -ENOMEM);
+ if (tmp == NULL) {
+ ret = -ENOMEM;
+ goto err_free;
+ }
+
param.obduuid = tmp;
}
for (token = buf; token && *token; token = next) {
*p = 0;
next = p+1;
}
- if (strlen(token) > sizeof(puuid->uuid)-1)
- GOTO(err_free, ret = -E2BIG);
+
+ if (strlen(token) > sizeof(puuid->uuid) - 1) {
+ ret = -E2BIG;
+ goto err_free;
+ }
+
strncpy(puuid->uuid, token,
sizeof(puuid->uuid));
}
pathend = argc;
}
- do {
- ret = llapi_find(argv[pathstart], ¶m);
- } while (++pathstart < pathend && !ret);
+ do {
+ rc = llapi_find(argv[pathstart], ¶m);
+ if (rc != 0 && ret == 0)
+ ret = rc;
+ } while (++pathstart < pathend);
if (ret)
fprintf(stderr, "error: %s failed for %s.\n",
char *stripe_offset_opt = NULL;
char *stripe_count_opt = NULL;
char *stripe_hash_opt = NULL;
+ char *mode_opt = NULL;
int default_stripe = 0;
+ mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO;
+ mode_t previous_mode = 0;
struct option long_opts[] = {
{"count", required_argument, 0, 'c'},
{"index", required_argument, 0, 'i'},
+ {"mode", required_argument, 0, 'm'},
{"hash-type", required_argument, 0, 't'},
- {"default_stripe", required_argument, 0, 'D'},
+ {"default_stripe", no_argument, 0, 'D'},
{0, 0, 0, 0}
};
optind = 0;
- while ((c = getopt_long(argc, argv, "c:Di:t:", long_opts, NULL)) >= 0) {
+ while ((c = getopt_long(argc, argv, "c:Di:m:t:", long_opts,
+ NULL)) >= 0) {
switch (c) {
case 0:
/* Long options. */
case 'i':
stripe_offset_opt = optarg;
break;
+ case 'm':
+ mode_opt = optarg;
+ break;
case 't':
stripe_hash_opt = optarg;
break;
}
}
+ if (mode_opt != NULL) {
+ mode = strtoul(mode_opt, &end, 8);
+ if (*end != '\0') {
+ fprintf(stderr, "error: %s: bad mode '%s'\n",
+ argv[0], mode_opt);
+ return CMD_HELP;
+ }
+ previous_mode = umask(0);
+ }
+
if (stripe_hash_opt == NULL ||
strcmp(stripe_hash_opt, LMV_HASH_NAME_FNV_1A_64) == 0) {
hash_type = LMV_HASH_TYPE_FNV_1A_64;
stripe_offset, stripe_count,
hash_type, NULL);
} else {
- result = llapi_dir_create_pool(dname, 0, stripe_offset,
+ result = llapi_dir_create_pool(dname, mode,
+ stripe_offset,
stripe_count, hash_type,
NULL);
}
dname = argv[++optind];
} while (dname != NULL);
+ if (mode_opt != NULL)
+ umask(previous_mode);
+
return result;
}
double ratio = 0;
char *suffix = "KMGTPEZY";
/* Note if we have >2^64 bytes/fs these buffers will need to be grown */
- char tbuf[20], ubuf[20], abuf[20], rbuf[20];
+ char tbuf[3 * sizeof(__u64)];
+ char ubuf[3 * sizeof(__u64)];
+ char abuf[3 * sizeof(__u64)];
+ char rbuf[3 * sizeof(__u64)];
if (!uuid || !stat)
return -EINVAL;
return rc;
}
- rc = llapi_target_iterate(num_types, obd_types,
- mntdir, llapi_ping_target);
-
+ rc = llapi_target_check(num_types, obd_types, mntdir);
if (rc)
fprintf(stderr, "error: %s: %s status failed\n",
argv[0],argv[1]);
break;
case 'o':
valid = qctl.qc_valid = QC_UUID;
- strncpy(obd_uuid, optarg, sizeof(qctl.obd_uuid));
+ strlcpy(obd_uuid, optarg, sizeof(qctl.obd_uuid));
break;
case 'i':
valid = qctl.qc_valid = QC_MDTIDX;
static int lfs_flushctx(int argc, char **argv)
{
- int kdestroy = 0, c;
- FILE *proc = NULL;
- char procline[PATH_MAX], *line;
- int rc = 0;
+ int kdestroy = 0, c;
+ char mntdir[PATH_MAX] = {'\0'};
+ int index = 0;
+ int rc = 0;
optind = 0;
while ((c = getopt(argc, argv, "k")) != -1) {
}
if (kdestroy) {
- int rc;
if ((rc = system("kdestroy > /dev/null")) != 0) {
rc = WEXITSTATUS(rc);
fprintf(stderr, "error destroying tickets: %d, continuing\n", rc);
}
}
- if (optind >= argc) {
- /* flush for all mounted lustre fs. */
- proc = fopen("/proc/mounts", "r");
- if (!proc) {
- fprintf(stderr, "error: %s: can't open /proc/mounts\n",
- argv[0]);
- return -1;
- }
-
- while ((line = fgets(procline, PATH_MAX, proc)) != NULL) {
- char dev[PATH_MAX];
- char mp[PATH_MAX];
- char fs[PATH_MAX];
+ if (optind >= argc) {
+ /* flush for all mounted lustre fs. */
+ while (!llapi_search_mounts(NULL, index++, mntdir, NULL)) {
+ /* Check if we have a mount point */
+ if (mntdir[0] == '\0')
+ continue;
- if (sscanf(line, "%s %s %s", dev, mp, fs) != 3) {
- fprintf(stderr, "%s: unexpected format in "
- "/proc/mounts\n",
- argv[0]);
+ if (flushctx_ioctl(mntdir))
rc = -1;
- goto out;
- }
-
- if (strcmp(fs, "lustre") != 0)
- continue;
- /* we use '@' to determine it's a client. are there
- * any other better way?
- */
- if (strchr(dev, '@') == NULL)
- continue;
- if (flushctx_ioctl(mp))
- rc = -1;
- }
+ mntdir[0] = '\0'; /* avoid matching in next loop */
+ }
} else {
/* flush fs as specified */
while (optind < argc) {
rc = -1;
}
}
-
-out:
- if (proc != NULL)
- fclose(proc);
return rc;
}
device = argv[optind++];
path = calloc(1, PATH_MAX);
+ if (path == NULL) {
+ fprintf(stderr, "error: Not enough memory\n");
+ return -errno;
+ }
rc = 0;
while (optind < argc) {
/* If allocated buffer was too small, gets something
* bigger */
if (nbfile_alloc <= hur->hur_request.hr_itemcount) {
+ ssize_t size;
nbfile_alloc = nbfile_alloc * 2 + 1;
oldhur = hur;
hur = llapi_hsm_user_request_alloc(nbfile_alloc,
fclose(fp);
goto out_free;
}
- memcpy(hur, oldhur, hur_len(oldhur));
+ size = hur_len(oldhur);
+ if (size < 0) {
+ fprintf(stderr, "Cannot allocate "
+ "the requested size\n");
+ hur = oldhur;
+ rc = -E2BIG;
+ fclose(fp);
+ goto out_free;
+ }
+ memcpy(hur, oldhur, size);
free(oldhur);
}
setlinebuf(stdout);
- ptl_initialize(argc, argv);
- if (obd_initialize(argc, argv) < 0)
- exit(2);
-
- Parser_init("lfs > ", cmdlist);
+ Parser_init("lfs > ", cmdlist);
if (argc > 1) {
rc = Parser_execarg(argc - 1, argv + 1, cmdlist);
rc = Parser_commands();
}
- obd_finalize(argc, argv);
return rc < 0 ? -rc : rc;
}