#define MIGRATE_USAGE \
SSM_CMD_COMMON("migrate ") \
- " [--block|-b]\n" \
- " [--non-block|-n]\n" \
- " [--non-direct|-D]\n" \
+ " [--block|-b] [--non-block|-n]\n" \
+ " [--non-direct|-D] [--verbose|-v]\n" \
" <filename>\n" \
SSM_HELP_COMMON \
"\n" \
"\tblock: Block file access during data migration (default)\n" \
"\tnon-block: Abort migrations if concurrent access is detected\n" \
- "\tnon-direct: Do not use direct I/O to copy file contents\n" \
+ "\tnon-direct: Do not use direct I/O to copy file contents\n" \
+ "\tverbose: Print each filename as it is migrated\n" \
#define SETDIRSTRIPE_USAGE \
" [--mdt-count|-c stripe_count>\n" \
"\t fnv_1a_64 FNV-1a hash algorithm\n"
"\t all_char sum of characters % MDT_COUNT\n"},
{"check", lfs_check, 0,
- "Display the status of MDS or OSTs (as specified in the command)\n"
- "or all the servers (MDS and OSTs).\n"
- "usage: check <osts|mds|servers>"},
+ "Display the status of MGTs, MDTs or OSTs (as specified in the command)\n"
+ "or all the servers (MGTs, MDTs and OSTs).\n"
+ "usage: check <mgts|osts|mdts|all>"},
{"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 "
static const char *error_loc = "syserror";
enum {
- MIGRATION_NONBLOCK = 1 << 0,
- MIGRATION_MIRROR = 1 << 1,
- MIGRATION_NONDIRECT = 1 << 2,
+ MIGRATION_NONBLOCK = 0x0001,
+ MIGRATION_MIRROR = 0x0002,
+ MIGRATION_NONDIRECT = 0x0004,
+ MIGRATION_VERBOSE = 0x0008,
};
static int lfs_component_create(char *fname, int open_flags, mode_t open_mode,
if (rc < 0)
fprintf(stderr, "error: %s: %s: %s: %s\n",
progname, name, error_loc, strerror(-rc));
+ else if (migration_flags & MIGRATION_VERBOSE)
+ printf("%s\n", name);
+
return rc;
}
goto usage_error;
}
migrate_mdt_param.fp_verbose = VERBOSE_DETAIL;
+ migration_flags = MIGRATION_VERBOSE;
break;
case 'y':
from_yaml = true;
#define RSF "%4s"
#define RDF "%3d%%"
-static inline int obd_statfs_ratio(const struct obd_statfs *st)
+static inline int obd_statfs_ratio(const struct obd_statfs *st, bool inodes)
{
double avail, used, ratio = 0;
- avail = st->os_bavail;
- used = st->os_blocks - st->os_bfree;
+ if (inodes) {
+ avail = st->os_ffree;
+ used = st->os_files - st->os_ffree;
+ } else {
+ avail = st->os_bavail;
+ used = st->os_blocks - st->os_bfree;
+ }
if (avail + used > 0)
- ratio = used / (used + avail) * 100 + 0.5;
+ ratio = used / (used + avail) * 100;
- return (int)ratio;
+ /* Round up to match df(1) usage percentage */
+ return (ratio - (int)ratio) > 0 ? (int)(ratio + 1) : (int)ratio;
}
static int showdf(char *mntdir, struct obd_statfs *stat,
total = (stat->os_blocks * stat->os_bsize) >> shift;
}
- ratio = obd_statfs_ratio(stat);
+ ratio = obd_statfs_ratio(stat, flags & MNTDF_INODES);
if (flags & MNTDF_COOKED) {
int i;
sd_st;
const struct obd_statfs *st2 = &((const struct ll_statfs_data *)sd2)->
sd_st;
- int r1 = obd_statfs_ratio(st1);
- int r2 = obd_statfs_ratio(st2);
+ int r1 = obd_statfs_ratio(st1, false);
+ int r2 = obd_statfs_ratio(st2, false);
int64_t result = r1 - r2;
/* if both space usage are above 90, compare free inodes */
/* don't use server whose usage is above 90% */
while (nr != param->lsp_stripe_count &&
- obd_statfs_ratio(&lsb->sb_buf[nr].sd_st)
- > 90)
+ obd_statfs_ratio(&lsb->sb_buf[nr].sd_st,
+ false) > 90)
nr = MAX(param->lsp_stripe_count,
nr / 2);
static int lfs_check(int argc, char **argv)
{
- int rc;
- char mntdir[PATH_MAX] = {'\0'};
- int num_types = 1;
- char *obd_types[2];
- char obd_type1[4];
- char obd_type2[4];
+ char mntdir[PATH_MAX] = {'\0'};
+ int num_types = 1;
+ char *obd_types[3];
+ char obd_type1[4];
+ char obd_type2[4];
+ char obd_type3[4];
+ int rc;
if (argc != 2) {
fprintf(stderr, "%s check: server type must be specified\n",
return CMD_HELP;
}
- obd_types[0] = obd_type1;
- obd_types[1] = obd_type2;
-
- if (strcmp(argv[1], "osts") == 0) {
- strcpy(obd_types[0], "osc");
- } else if (strcmp(argv[1], "mds") == 0) {
- strcpy(obd_types[0], "mdc");
- } else if (strcmp(argv[1], "servers") == 0) {
- num_types = 2;
- strcpy(obd_types[0], "osc");
- strcpy(obd_types[1], "mdc");
+ obd_types[0] = obd_type1;
+ obd_types[1] = obd_type2;
+ obd_types[2] = obd_type3;
+
+ if (strcmp(argv[1], "osts") == 0) {
+ strcpy(obd_types[0], "osc");
+ } else if (strcmp(argv[1], "mdts") == 0 ||
+ strcmp(argv[1], "mds") == 0) {
+ strcpy(obd_types[0], "mdc");
+ } else if (strcmp(argv[1], "mgts") == 0) {
+ strcpy(obd_types[0], "mgc");
+ } else if (strcmp(argv[1], "all") == 0 ||
+ strcmp(argv[1], "servers") == 0) {
+ num_types = 3;
+ strcpy(obd_types[0], "osc");
+ strcpy(obd_types[1], "mdc");
+ strcpy(obd_types[2], "mgc");
} else {
fprintf(stderr, "%s check: unrecognized option '%s'\n",
progname, argv[1]);
attrs = (void *)buf;
rc = lgetxattr(path, "trusted.som", attrs, sizeof(buf));
if (rc < 0) {
- fprintf(stderr, "%s failed to get som xattr: %s\n", argv[0],
- strerror(-rc));
+ rc = -errno;
+ fprintf(stderr, "%s failed to get som xattr: %s (%d)\n",
+ argv[0], strerror(errno), errno);
return rc;
}
return CMD_HELP;
}
- return rc;
+ return 0;
}
/**