X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Flfs.c;h=64d5f8875c8ef6c14cc0f804d681313cfe44bee8;hp=44f2653bb56f8ceed2ba61b214fa3eab172f3297;hb=7e0208da21f9358d96feebce5124f8587778c318;hpb=8befc64e5aabe9b9bdca49f51830f25b3f747019 diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 44f2653..64d5f88 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -77,10 +77,7 @@ #include #include #include - -#ifndef ARRAY_SIZE -# define ARRAY_SIZE(a) ((sizeof(a)) / (sizeof((a)[0]))) -#endif /* !ARRAY_SIZE */ +#include "lstddef.h" /* all functions */ static int lfs_find(int argc, char **argv); @@ -150,6 +147,7 @@ enum setstripe_origin { SO_MIRROR_SPLIT, SO_MIRROR_DELETE, }; + static int lfs_setstripe_internal(int argc, char **argv, enum setstripe_origin opc); @@ -157,22 +155,27 @@ static inline int lfs_setstripe(int argc, char **argv) { return lfs_setstripe_internal(argc, argv, SO_SETSTRIPE); } + static inline int lfs_setstripe_migrate(int argc, char **argv) { return lfs_setstripe_internal(argc, argv, SO_MIGRATE); } + static inline int lfs_mirror_create(int argc, char **argv) { return lfs_setstripe_internal(argc, argv, SO_MIRROR_CREATE); } + static inline int lfs_mirror_extend(int argc, char **argv) { return lfs_setstripe_internal(argc, argv, SO_MIRROR_EXTEND); } + static inline int lfs_mirror_split(int argc, char **argv) { return lfs_setstripe_internal(argc, argv, SO_MIRROR_SPLIT); } + static inline int lfs_mirror_delete(int argc, char **argv) { return lfs_setstripe_internal(argc, argv, SO_MIRROR_DELETE); @@ -185,6 +188,7 @@ static inline int lfs_mirror_delete(int argc, char **argv) " [--overstripe-count|-C ]\n" \ " [--stripe-index|-i ]\n" \ " [--stripe-size|-S ]\n" \ + " [--extension-size|--ext-size|-z]\n" \ " [--layout|-L ]\n" \ " [--mirror_count|-N[mirror_count]]\n" \ " [--ost|-o ]\n" \ @@ -201,6 +205,10 @@ static inline int lfs_mirror_delete(int argc, char **argv) "\tstripe_size: Number of bytes on each OST (0=fs default)\n" \ "\t Can be specified with K, M or G (for KB, MB, GB\n" \ "\t respectively)\n" \ + "\textension_size:\n" \ + "\t Number of bytes the previous component is extended\n" \ + "\t each time. Can be specified with K, M, G (for KB,\n" \ + "\t MB, GB respectively)\n" \ "\tpool_name: Name of OST pool to use (default none)\n" \ "\tlayout: stripe pattern type: raid0, mdt (default raid0)\n"\ "\tost_indices: List of OST indices, can be repeated multiple times\n"\ @@ -298,8 +306,10 @@ command_t mirror_cmdlist[] = { "[SETSTRIPE_OPTIONS] ... ...\n" MIRROR_CREATE_HELP }, { .pc_name = "delete", .pc_func = lfs_mirror_delete, - .pc_help = "delete a mirror from a file.\n" - "usage: lfs mirror delete {--comp-id|-I |-p } ...\n" + .pc_help = "Delete a mirror from a file.\n" + "usage: lfs mirror delete {--mirror-id |\n" + "\t --component-id|--comp-id|-I |\n" + "\t -p } ...\n" }, { .pc_name = "extend", .pc_func = lfs_mirror_extend, .pc_help = "Extend a mirrored file.\n" @@ -310,7 +320,7 @@ command_t mirror_cmdlist[] = { { .pc_name = "split", .pc_func = lfs_mirror_split, .pc_help = "Split a mirrored file.\n" "usage: lfs mirror split <--mirror-id |\n" - "\t <--component-id|-I |-p > [--destroy|-d]\n" + "\t --component-id|-I |-p > [--destroy|-d]\n" "\t [-f ] ...\n" "\tmirror_id: The numerical unique identifier for a mirror. It\n" "\t can be fetched by lfs getstripe command.\n" @@ -429,8 +439,8 @@ command_t cmdlist[] = { " [!] --mirror-id=[+-]]\n" " ..."}, {"setdirstripe", lfs_setdirstripe, 0, - "To create a striped directory on a specified MDT. This can only\n" - "be done on MDT0 with the right of administrator.\n" + "Create striped directory on specified MDT, same as mkdir.\n" + "May be restricted to root or group users, depending on settings.\n" "usage: setdirstripe [OPTION] \n" SETDIRSTRIPE_USAGE}, {"getdirstripe", lfs_getdirstripe, 0, @@ -441,8 +451,7 @@ command_t cmdlist[] = { " [--recursive|-r] [--yaml|-y]\n" " [--verbose|-v] [--default|-D] ..."}, {"mkdir", lfs_setdirstripe, 0, - "To create a striped directory on a specified MDT. This can only\n" - "be done on MDT0 with the right of administrator.\n" + "Create striped directory on specified MDT, same as setdirstripe.\n" "usage: mkdir [OPTION] \n" SETDIRSTRIPE_USAGE}, {"rm_entry", lfs_rmentry, 0, @@ -458,14 +467,16 @@ command_t cmdlist[] = { "find files matching given attributes recursively in directory tree.\n" "usage: find ...\n" " [[!] --atime|-A [+-]N[smhdwy]] [[!] --ctime|-C [+-]N[smhdwy]]\n" - " [[!] --mtime|-M [+-]N[smhdwy]] [[!] --blocks|-b N]\n" - " [[!] --newer[XY] ]\n" + " [[!] --mtime|-M [+-]N[smhdwy]]\n" + " [[!] --btime|--Btime|-B [+-]N[smhdwy]]\n" + " [[!] --newer[XY] ] [[!] --blocks|-b N]\n" " [--maxdepth|-D N] [[!] --mdt-index|--mdt|-m ]\n" " [[!] --name|-n ] [[!] --ost|-O ]\n" " [--print|-P] [--print0|-0] [[!] --size|-s [+-]N[bkMGTPE]]\n" " [[!] --stripe-count|-c [+-]]\n" " [[!] --stripe-index|-i ]\n" " [[!] --stripe-size|-S [+-]N[kMGT]] [[!] --type|-t ]\n" + " [[!] --extension-size|--ext-size|-z [+-]N[kMGT]]\n" " [[!] --gid|-g|--group|-G |]\n" " [[!] --uid|-u|--user|-U |] [[!] --pool ]\n" " [[!] --projid ]\n" @@ -481,9 +492,9 @@ command_t cmdlist[] = { " [[!] --mdt-count|-T [+-]]\n" " [[!] --mdt-hash|-H \n" " [[!] --mdt-index|-m ]\n" - "\t !: used before an option indicates 'NOT' requested attribute\n" - "\t -: used before a value indicates less than requested value\n" - "\t +: used before a value indicates more than requested value\n" + "\t !: used before an option indicates 'NOT' requested attribute\n" + "\t -: used before a value indicates less than requested value\n" + "\t +: used before a value indicates more than requested value\n" "\thashtype: hash type of the striped directory.\n" "\t fnv_1a_64 FNV-1a hash algorithm\n" "\t all_char sum of characters % MDT_COUNT\n"}, @@ -509,10 +520,10 @@ command_t cmdlist[] = { " -b -B \n" " -i -I \n" " setquota <-u|--user|-g|--group|-p|--projid> ||||\n" - " [--block-softlimit ]\n" - " [--block-hardlimit ]\n" - " [--inode-softlimit ]\n" - " [--inode-hardlimit ] \n" + " [--block-softlimit ]\n" + " [--block-hardlimit ]\n" + " [--inode-softlimit ]\n" + " [--inode-hardlimit ] \n" " setquota [-t] <-u|--user|-g|--group|-p|--projid>\n" " [--block-grace 'notify'|]\n" " [--inode-grace 'notify'|] \n" @@ -526,9 +537,9 @@ command_t cmdlist[] = { " [--inode-hardlimit ] \n" " setquota <-u|-g|-p> ||||\n" " <-d|--default>\n" - " -b can be used instead of --block-softlimit/--block-grace\n" - " -B can be used instead of --block-hardlimit\n" - " -i can be used instead of --inode-softlimit/--inode-grace\n" + " -b can be used instead of --block-softlimit/--block-grace\n" + " -B can be used instead of --block-hardlimit\n" + " -i can be used instead of --inode-softlimit/--inode-grace\n" " -I can be used instead of --inode-hardlimit\n" " -d can be used instead of --default\n\n" "Note: The total quota space will be split into many qunits and\n" @@ -560,16 +571,16 @@ command_t cmdlist[] = { " clear the project inherit flag and ID on the file or directory\n" }, #endif - {"flushctx", lfs_flushctx, 0, "Flush security context for current user.\n" - "usage: flushctx [-k] [mountpoint...]"}, - {"changelog", lfs_changelog, 0, - "Show the metadata changes on an MDT." - "\nusage: changelog [startrec [endrec]]"}, - {"changelog_clear", lfs_changelog_clear, 0, - "Indicate that old changelog records up to are no longer of " - "interest to consumer , allowing the system to free up space.\n" - "An of 0 means all records.\n" - "usage: changelog_clear "}, + {"flushctx", lfs_flushctx, 0, "Flush security context for current user.\n" + "usage: flushctx [-k] [mountpoint...]"}, + {"changelog", lfs_changelog, 0, + "Show the metadata changes on an MDT." + "\nusage: changelog [startrec [endrec]]"}, + {"changelog_clear", lfs_changelog_clear, 0, + "Indicate that old changelog records up to are no longer of " + "interest to consumer , allowing the system to free up space.\n" + "An of 0 means all records.\n" + "usage: changelog_clear "}, {"fid2path", lfs_fid2path, 0, "Resolve the full path(s) for given FID(s). For a specific hardlink " "specify link number .\n" @@ -628,9 +639,9 @@ command_t cmdlist[] = { " it's the MDT index of first stripe\n" "\tmdt_count: number of MDTs to stripe a directory over\n" "\tmdt_hash: hash type of the striped directory. mdt types:\n" - " crush CRUSH hash algorithm (default)\n" - " fnv_1a_64 FNV-1a hash algorithm\n" - " all_char sum of characters % MDT_COUNT\n" + " all_char (type 1)sum of characters % MDT_COUNT\n" + " fnv_1a_64 (type 2)FNV-1a hash algorithm (default)\n" + " crush (type 3)CRUSH hash algorithm\n" "\n" "migrate file objects from one OST " "layout\nto another (may be not safe with concurent writes).\n" @@ -709,11 +720,16 @@ command_t cmdlist[] = { { 0, 0, 0, NULL } }; - static int check_hashtype(const char *hashtype) { + int type_num = atoi(hashtype); int i; + /* numeric hash type */ + if (hashtype && strlen(hashtype) == 1 && + (type_num > 0 && type_num < LMV_HASH_TYPE_MAX)) + return type_num; + /* string hash type */ for (i = LMV_HASH_TYPE_ALL_CHARS; i < LMV_HASH_TYPE_MAX; i++) if (strcmp(hashtype, mdt_hash_name[i]) == 0) return i; @@ -726,7 +742,7 @@ static uint32_t check_foreign_type_name(const char *foreign_type_name) uint32_t i; for (i = 0; i < LU_FOREIGN_TYPE_UNKNOWN; i++) { - if (lu_foreign_types[i].lft_name == NULL) + if (!lu_foreign_types[i].lft_name) break; if (strcmp(foreign_type_name, lu_foreign_types[i].lft_name) == 0) @@ -765,7 +781,7 @@ migrate_open_files(const char *name, __u64 migration_flags, struct stat st; struct stat stv; - if (param == NULL && layout == NULL) { + if (!param && !layout) { error_loc = "layout information"; return -EINVAL; } @@ -778,8 +794,8 @@ migrate_open_files(const char *name, __u64 migration_flags, strncpy(parent, name, sizeof(parent)); ptr = strrchr(parent, '/'); - if (ptr == NULL) { - if (getcwd(parent, sizeof(parent)) == NULL) { + if (!ptr) { + if (!getcwd(parent, sizeof(parent))) { error_loc = "getcwd"; return -errno; } @@ -791,7 +807,8 @@ migrate_open_files(const char *name, __u64 migration_flags, /* open file, direct io */ /* even if the file is only read, WR mode is nedeed to allow - * layout swap on fd */ + * layout swap on fd + */ rflags = O_RDWR; if (!(migration_flags & MIGRATION_NONDIRECT)) rflags |= O_DIRECT; @@ -835,11 +852,14 @@ migrate_open_files(const char *name, __u64 migration_flags, goto out; } - /* In case the MDT does not support creation of volatile files - * we should try to unlink it. */ + /* + * In case the MDT does not support creation of volatile files + * we should try to unlink it. + */ (void)unlink(volatile_file); - /* Not-owner (root?) special case. + /* + * Not-owner (root?) special case. * Need to set owner/group of volatile file like original. * This will allow to pass related check during layout_swap. */ @@ -893,7 +913,7 @@ static int migrate_copy_data(int fd_src, int fd_dst, int (*check_file)(int)) int rc; layout = llapi_layout_get_by_fd(fd_src, 0); - if (layout != NULL) { + if (layout) { uint64_t stripe_size; rc = llapi_layout_stripe_size_get(layout, &stripe_size); @@ -909,8 +929,10 @@ static int migrate_copy_data(int fd_src, int fd_dst, int (*check_file)(int)) return -rc; while (1) { - /* read new data only if we have written all - * previously read data */ + /* + * read new data only if we have written all + * previously read data + */ if (wpos == rpos) { if (check_file) { rc = check_file(fd_src); @@ -982,9 +1004,11 @@ static int migrate_block(int fd, int fdv) gid = random(); while (gid == 0); - /* The grouplock blocks all concurrent accesses to the file. + /* + * The grouplock blocks all concurrent accesses to the file. * It has to be taken after llapi_get_data_version as it would - * block it too. */ + * block it too. + */ rc = llapi_group_lock(fd, gid); if (rc < 0) { error_loc = "cannot get group lock"; @@ -1004,11 +1028,13 @@ static int migrate_block(int fd, int fdv) goto out_unlock; } - /* swap layouts + /* + * swap layouts * for a migration we need to check data version on file did * not change. * - * Pass in gid=0 since we already own grouplock. */ + * Pass in gid=0 since we already own grouplock. + */ rc = llapi_fswap_layouts_grouplock(fd, fdv, dv1, 0, 0, SWAP_LAYOUTS_CHECK_DV1); if (rc == -EAGAIN) { @@ -1105,9 +1131,9 @@ static int lfs_component_set(char *fname, int comp_id, if (neg_flags) { if (neg_flags & LCME_FL_STALE) { - fprintf(stderr, "%s: cannot clear 'stale' flags from " - "component. Please use lfs-mirror-resync(1) " - "instead\n", progname); + fprintf(stderr, + "%s: cannot clear 'stale' flags from component. Please use lfs-mirror-resync(1) instead\n", + progname); return -EINVAL; } @@ -1172,7 +1198,7 @@ static int lfs_component_add(char *fname, struct llapi_layout *layout) { int rc; - if (layout == NULL) + if (!layout) return -EINVAL; rc = llapi_layout_file_comp_add(fname, layout); @@ -1188,7 +1214,7 @@ static int lfs_component_create(char *fname, int open_flags, mode_t open_mode, struct stat st; int fd; - if (layout == NULL) + if (!layout) return -EINVAL; fd = lstat(fname, &st); @@ -1238,7 +1264,8 @@ static int lfs_migrate(char *name, __u64 migration_flags, goto out; } - /* if file has DoM layout already then migration is possible to + /* + * if file has DoM layout already then migration is possible to * the new layout with the same DoM component via swap layout, * if new layout used bigger DOM size, then mirroring is used */ @@ -1251,10 +1278,12 @@ static int lfs_migrate(char *name, __u64 migration_flags, } if (!(migration_flags & MIGRATION_NONBLOCK)) { - /* Blocking mode (forced if servers do not support file lease). + /* + * Blocking mode (forced if servers do not support file lease). * It is also the default mode, since we cannot distinguish * between a broken lease and a server that does not support - * atomic swap/close (LU-6785) */ + * atomic swap/close (LU-6785) + */ rc = migrate_block(fd, fdv); goto out; } @@ -1271,9 +1300,11 @@ static int lfs_migrate(char *name, __u64 migration_flags, goto out; } - /* Atomically put lease, swap layouts and close. + /* + * Atomically put lease, swap layouts and close. * for a migration we need to check data version on file did - * not change. */ + * not change. + */ rc = llapi_fswap_layouts(fd, fdv, 0, 0, SWAP_LAYOUTS_CLOSE); if (rc < 0) { error_loc = "cannot swap layout"; @@ -1300,7 +1331,7 @@ static int comp_str2flags(char *string, __u32 *flags, __u32 *neg_flags) { char *name; - if (string == NULL) + if (!string) return -EINVAL; *flags = 0; @@ -1342,7 +1373,7 @@ static int comp_str2flags(char *string, __u32 *flags, __u32 *neg_flags) static int mirror_str2state(char *string, __u16 *state, __u16 *neg_state) { - if (string == NULL) + if (!string) return -EINVAL; *state = 0; @@ -1381,6 +1412,7 @@ struct mirror_args { struct llapi_layout *m_layout; const char *m_file; struct mirror_args *m_next; + bool m_inherit; }; /** @@ -1416,7 +1448,7 @@ static int mirror_create_sanity_check(const char *fname, bool has_m_file = false; bool has_m_layout = false; - if (list == NULL) + if (!list) return -EINVAL; if (fname) { @@ -1440,14 +1472,14 @@ static int mirror_create_sanity_check(const char *fname, } } - while (list != NULL) { - if (list->m_file != NULL) { + while (list) { + if (list->m_file) { has_m_file = true; llapi_layout_free(list->m_layout); list->m_layout = llapi_layout_get_by_path(list->m_file, 0); - if (list->m_layout == NULL) { + if (!list->m_layout) { fprintf(stderr, "error: %s: file '%s' has no layout\n", progname, list->m_file); @@ -1455,7 +1487,7 @@ static int mirror_create_sanity_check(const char *fname, } } else { has_m_layout = true; - if (list->m_layout == NULL) { + if (!list->m_layout) { fprintf(stderr, "error: %s: no mirror layout\n", progname); return -EINVAL; @@ -1523,7 +1555,7 @@ static int mirror_create(char *fname, struct mirror_args *mirror_list) return rc; cur_mirror = mirror_list; - while (cur_mirror != NULL) { + while (cur_mirror) { rc = llapi_layout_comp_iterate(cur_mirror->m_layout, mirror_set_flags, &cur_mirror->m_flags); @@ -1538,8 +1570,8 @@ static int mirror_create(char *fname, struct mirror_args *mirror_list) rc = llapi_layout_merge(&layout, cur_mirror->m_layout); if (rc) { rc = -errno; - fprintf(stderr, "error: %s: " - "merge layout failed: %s\n", + fprintf(stderr, + "error: %s: merge layout failed: %s\n", progname, strerror(errno)); goto error; } @@ -1548,7 +1580,7 @@ static int mirror_create(char *fname, struct mirror_args *mirror_list) cur_mirror = cur_mirror->m_next; } - if (layout == NULL) { + if (!layout) { fprintf(stderr, "error: %s: layout is NULL\n", progname); return -EINVAL; } @@ -1602,8 +1634,10 @@ static ssize_t mirror_file_compare(int fd, int fdv) if (bytes_read != read(fdv, buf + buflen, buflen)) break; - /* XXX: should compute the checksum on each buffer and then - * compare checksum to avoid cache collision */ + /* + * XXX: should compute the checksum on each buffer and then + * compare checksum to avoid cache collision + */ if (memcmp(buf, buf + buflen, bytes_read)) break; @@ -1686,7 +1720,6 @@ static int mirror_extend_file(const char *fname, const char *victim_file, if (rc < 0) { error_loc = "cannot get data version"; goto out; - } /* Make sure we keep original atime/mtime values */ @@ -1732,14 +1765,36 @@ out: return rc; } -static int mirror_extend_layout(char *name, struct llapi_layout *layout) +static int mirror_extend_layout(char *name, struct llapi_layout *m_layout, + bool inherit) { + struct llapi_layout *f_layout = NULL; struct ll_ioc_lease *data = NULL; int fd = -1; int fdv = -1; - int rc; + int rc = 0; - rc = migrate_open_files(name, 0, NULL, layout, &fd, &fdv); + if (inherit) { + f_layout = llapi_layout_get_by_path(name, 0); + if (!f_layout) { + fprintf(stderr, "%s: cannot get layout\n", progname); + goto out; + } + rc = llapi_layout_get_last_init_comp(f_layout); + if (rc) { + fprintf(stderr, "%s: cannot get the last init comp\n", + progname); + goto out; + } + rc = llapi_layout_mirror_inherit(f_layout, m_layout); + if (rc) { + fprintf(stderr, + "%s: cannot inherit from the last init comp\n", + progname); + goto out; + } + } + rc = migrate_open_files(name, 0, NULL, m_layout, &fd, &fdv); if (rc < 0) goto out; @@ -1799,7 +1854,7 @@ static int mirror_extend(char *fname, struct mirror_args *mirror_list, return rc; while (mirror_list) { - if (mirror_list->m_file != NULL) { + if (mirror_list->m_file) { rc = mirror_extend_file(fname, mirror_list->m_file, mirror_flags); } else { @@ -1807,7 +1862,8 @@ static int mirror_extend(char *fname, struct mirror_args *mirror_list, while (mirror_count > 0) { rc = mirror_extend_layout(fname, - mirror_list->m_layout); + mirror_list->m_layout, + mirror_list->m_inherit); if (rc) break; @@ -1857,6 +1913,7 @@ struct pool_to_id_cbdata { const char *pool; __u32 id; }; + static int find_comp_id_by_pool(struct llapi_layout *layout, void *cbdata) { char buf[LOV_MAXPOOLNAME + 1]; @@ -1954,6 +2011,7 @@ static int mirror_split(const char *fname, __u32 id, const char *pool, char *ptr; struct ll_ioc_lease *data; uint16_t mirror_count; + __u32 mirror_id; int mdt_index; int fd, fdv; int rc; @@ -1992,22 +2050,35 @@ static int mirror_split(const char *fname, __u32 id, const char *pool, rc = llapi_layout_comp_iterate(layout, find_comp_id_by_pool, &data); - id = data.id; + mirror_id = data.id; } else if (mflags & MF_COMP_ID) { rc = llapi_layout_comp_iterate(layout, find_comp_id, &id); - id = mirror_id_of(id); + mirror_id = mirror_id_of(id); } else { rc = llapi_layout_comp_iterate(layout, find_mirror_id, &id); + mirror_id = id; } if (rc < 0) { fprintf(stderr, "error %s: failed to iterate layout of '%s'\n", progname, fname); goto free_layout; } else if (rc == LLAPI_LAYOUT_ITER_CONT) { - fprintf(stderr, - "error %s: file '%s' does not contain mirror with id %u\n", - progname, fname, id); - goto free_layout; + if (mflags & MF_COMP_POOL) { + fprintf(stderr, + "error %s: file '%s' does not contain mirror with pool '%s'\n", + progname, fname, pool); + goto free_layout; + } else if (mflags & MF_COMP_ID) { + fprintf(stderr, + "error %s: file '%s' does not contain mirror with comp-id %u\n", + progname, fname, id); + goto free_layout; + } else { + fprintf(stderr, + "error %s: file '%s' does not contain mirror with id %u\n", + progname, fname, id); + goto free_layout; + } } fd = open(fname, O_RDWR); @@ -2027,8 +2098,8 @@ static int mirror_split(const char *fname, __u32 id, const char *pool, } strncpy(parent, fname, sizeof(parent)); ptr = strrchr(parent, '/'); - if (ptr == NULL) { - if (getcwd(parent, sizeof(parent)) == NULL) { + if (!ptr) { + if (!getcwd(parent, sizeof(parent))) { fprintf(stderr, "error %s: getcwd failed: %s\n", progname, strerror(errno)); rc = -errno; @@ -2047,10 +2118,10 @@ static int mirror_split(const char *fname, __u32 id, const char *pool, goto close_fd; } - if (victim_file == NULL) { + if (!victim_file) { /* use a temp file to store the splitted layout */ if (mflags & MF_DESTROY) { - if (last_non_stale_mirror(id, layout)) { + if (last_non_stale_mirror(mirror_id, layout)) { rc = -EUCLEAN; fprintf(stderr, "%s: cannot destroy the last non-stale mirror of file '%s'\n", @@ -2062,7 +2133,7 @@ static int mirror_split(const char *fname, __u32 id, const char *pool, O_LOV_DELAY_CREATE); } else { snprintf(victim, sizeof(victim), "%s.mirror~%u", - fname, id); + fname, mirror_id); fdv = open(victim, flags, S_IRUSR | S_IWUSR); } } else { @@ -2097,7 +2168,7 @@ static int mirror_split(const char *fname, __u32 id, const char *pool, data->lil_flags = LL_LEASE_LAYOUT_SPLIT; data->lil_count = 2; data->lil_ids[0] = fdv; - data->lil_ids[1] = id; + data->lil_ids[1] = mirror_id; rc = llapi_lease_set(fd, data); if (rc <= 0) { if (rc == 0) /* lost lease lock */ @@ -2211,7 +2282,7 @@ static int parse_targets(__u32 *tgts, int size, int offset, char *arg, bool overstriped = false; bool end_of_loop; - if (arg == NULL) + if (!arg) return -EINVAL; end_of_loop = false; @@ -2271,7 +2342,7 @@ static int parse_targets(__u32 *tgts, int size, int offset, char *arg, offset = nr; rc = 0; } - if (!end_of_loop && ptr != NULL) + if (!end_of_loop && ptr) *ptr = ','; if (!overstriped && pattern) @@ -2369,9 +2440,9 @@ static int comp_args_to_layout(struct llapi_layout **composite, int i = 0, rc; new_comp: - if (layout == NULL) { + if (!layout) { layout = llapi_layout_alloc(); - if (layout == NULL) { + if (!layout) { fprintf(stderr, "Alloc llapi_layout failed. %s\n", strerror(errno)); errno = ENOMEM; @@ -2382,8 +2453,10 @@ new_comp: } else { uint64_t start; - /* Get current component extent, current component - * must be the tail component. */ + /* + * Get current component extent, current component + * must be the tail component. + */ rc = llapi_layout_comp_extent_get(layout, &start, &prev_end); if (rc) { fprintf(stderr, "Get comp extent failed. %s\n", @@ -2391,13 +2464,12 @@ new_comp: return rc; } - if (lsa->lsa_first_comp) + if (lsa->lsa_first_comp) { prev_end = 0; - - if (lsa->lsa_first_comp) rc = llapi_layout_add_first_comp(layout); - else + } else { rc = llapi_layout_comp_add(layout); + } if (rc) { fprintf(stderr, "Add component failed. %s\n", strerror(errno)); @@ -2415,8 +2487,10 @@ new_comp: if (set_extent) { uint64_t comp_end = lsa->lsa_comp_end; - /* The extendable component is 0-length, so it can be removed - * if there is insufficient space to extend it. */ + /* + * The extendable component is 0-length, so it can be removed + * if there is insufficient space to extend it. + */ if (lsa->lsa_extension_comp) comp_end = prev_end; @@ -2433,39 +2507,41 @@ new_comp: /* Data-on-MDT component setting */ if (lsa->lsa_pattern == LLAPI_LAYOUT_MDT) { - /* In case of Data-on-MDT patterns the only extra option - * applicable is stripe size option. */ + /* + * In case of Data-on-MDT patterns the only extra option + * applicable is stripe size option. + */ if (lsa->lsa_stripe_count != LLAPI_LAYOUT_DEFAULT) { - fprintf(stderr, "Option 'stripe-count' can't be " - "specified with Data-on-MDT component: %lld\n", + fprintf(stderr, + "Option 'stripe-count' can't be specified with Data-on-MDT component: %lld\n", lsa->lsa_stripe_count); errno = EINVAL; return -1; } if (lsa->lsa_stripe_size != LLAPI_LAYOUT_DEFAULT) { - fprintf(stderr, "Option 'stripe-size' can't be " - "specified with Data-on-MDT component: %llu\n", + fprintf(stderr, + "Option 'stripe-size' can't be specified with Data-on-MDT component: %llu\n", lsa->lsa_stripe_size); errno = EINVAL; return -1; } if (lsa->lsa_nr_tgts != 0) { - fprintf(stderr, "Option 'ost-list' can't be specified " - "with Data-on-MDT component: '%i'\n", + fprintf(stderr, + "Option 'ost-list' can't be specified with Data-on-MDT component: '%i'\n", lsa->lsa_nr_tgts); errno = EINVAL; return -1; } if (lsa->lsa_stripe_off != LLAPI_LAYOUT_DEFAULT) { - fprintf(stderr, "Option 'stripe-offset' can't be " - "specified with Data-on-MDT component: %lld\n", + fprintf(stderr, + "Option 'stripe-offset' can't be specified with Data-on-MDT component: %lld\n", lsa->lsa_stripe_off); errno = EINVAL; return -1; } if (lsa->lsa_pool_name != 0) { - fprintf(stderr, "Option 'pool' can't be specified " - "with Data-on-MDT component: '%s'\n", + fprintf(stderr, + "Option 'pool' can't be specified with Data-on-MDT component: '%s'\n", lsa->lsa_pool_name); errno = EINVAL; return -1; @@ -2511,7 +2587,7 @@ new_comp: return rc; } - if (lsa->lsa_pool_name != NULL) { + if (lsa->lsa_pool_name) { rc = llapi_layout_pool_name_set(layout, lsa->lsa_pool_name); if (rc) { fprintf(stderr, "Set pool name: %s failed. %s\n", @@ -2588,26 +2664,78 @@ static int build_component(struct llapi_layout **layout, return rc; } +static int build_prev_component(struct llapi_layout **layout, + struct lfs_setstripe_args *prev, + struct lfs_setstripe_args *lsa, + bool set_extent) +{ + int extension = lsa->lsa_comp_flags & LCME_FL_EXTENSION; + int rc; + + if (prev->lsa_stripe_size) { + if (extension) { + prev->lsa_comp_end = lsa->lsa_comp_end; + prev->lsa_extension_size = lsa->lsa_extension_size; + prev->lsa_extension_comp = true; + } + + rc = build_component(layout, prev, true); + if (rc) + return rc; + } + + /* + * Copy lsa to previous lsa; + * if this is an extension component, make the previous invalid; + */ + if (extension) + prev->lsa_stripe_size = 0; + else + *prev = *lsa; + + return 0; +} + static int build_layout_from_yaml_node(struct cYAML *node, struct llapi_layout **layout, struct lfs_setstripe_args *lsa, - __u32 *osts) + struct lfs_setstripe_args *prevp) { + struct lfs_setstripe_args prev = { 0 }; + __u32 *osts = lsa->lsa_tgts; char *string; int rc = 0; + if (!prevp) + prevp = &prev; + while (node) { + string = node->cy_string; + if (node->cy_type == CYAML_TYPE_OBJECT) { /* go deep to sub blocks */ + if (string && !strncmp(string, "component", 9) && + strncmp(string, "component0", 10) && + strncmp(string, "components", 10)) { + rc = build_prev_component(layout, prevp, lsa, + true); + if (rc) + return rc; + + /* initialize lsa. */ + setstripe_args_init(lsa); + lsa->lsa_first_comp = false; + lsa->lsa_tgts = osts; + } + rc = build_layout_from_yaml_node(node->cy_child, layout, - lsa, osts); + lsa, prevp); if (rc) return rc; } else { - if (node->cy_string == NULL) + if (!node->cy_string) return -EINVAL; - string = node->cy_string; /* skip leading lmm_ if present, to simplify parsing */ if (strncmp(string, "lmm_", 4) == 0) string += 4; @@ -2632,7 +2760,8 @@ static int build_layout_from_yaml_node(struct cYAML *node, &lsa->lsa_comp_neg_flags); if (rc) return rc; - /* Only template flags have meaning in + /* + * Only template flags have meaning in * the layout for a new file */ lsa->lsa_comp_flags &= LCME_TEMPLATE_FLAGS; @@ -2641,18 +2770,8 @@ static int build_layout_from_yaml_node(struct cYAML *node, if (!strcmp(string, "lcm_mirror_count")) { lsa->lsa_mirror_count = node->cy_valueint; } else if (!strcmp(string, "lcme_extent.e_start")) { - if (node->cy_valueint != 0 || *layout != NULL) { - rc = build_component(layout, lsa, true); - if (rc) - return rc; - } - if (node->cy_valueint == 0) lsa->lsa_first_comp = true; - - /* initialize lsa */ - setstripe_args_init(lsa); - lsa->lsa_tgts = osts; } else if (!strcmp(string, "lcme_extent.e_end")) { if (node->cy_valueint == -1) lsa->lsa_comp_end = LUSTRE_EOF; @@ -2662,6 +2781,9 @@ static int build_layout_from_yaml_node(struct cYAML *node, lsa->lsa_stripe_count = node->cy_valueint; } else if (!strcmp(string, "stripe_size")) { lsa->lsa_stripe_size = node->cy_valueint; + } else if (!strcmp(string, "extension_size")) { + lsa->lsa_extension_size = node->cy_valueint; + lsa->lsa_extension_comp = true; } else if (!strcmp(string, "stripe_offset")) { lsa->lsa_stripe_off = node->cy_valueint; } else if (!strcmp(string, "l_ost_idx")) { @@ -2673,6 +2795,15 @@ static int build_layout_from_yaml_node(struct cYAML *node, node = node->cy_next; } + if (prevp == &prev) { + rc = build_prev_component(layout, prevp, lsa, true); + if (rc) + return rc; + + if (!(lsa->lsa_comp_flags & LCME_FL_EXTENSION)) + rc = build_component(layout, lsa, *layout != NULL); + } + return rc; } @@ -2700,13 +2831,11 @@ static int lfs_comp_create_from_yaml(char *template, setstripe_args_init(lsa); lsa->lsa_tgts = osts; - rc = build_layout_from_yaml_node(tree, layout, lsa, osts); + rc = build_layout_from_yaml_node(tree, layout, lsa, NULL); if (rc) { fprintf(stderr, "%s: cannot build layout from YAML file %s.\n", progname, template); goto err; - } else { - rc = build_component(layout, lsa, *layout != NULL); } /* clean clean lsa */ setstripe_args_init(lsa); @@ -2740,18 +2869,22 @@ static int layout_extend_comp(struct llapi_layout *layout, rc = llapi_layout_comp_use(layout, LLAPI_LAYOUT_COMP_USE_NEXT); if (rc < 0) { - fprintf(stderr, "%s setstripe: cannot move component cursor: " - "%s\n", progname, strerror(errno)); + fprintf(stderr, + "%s setstripe: cannot move component cursor: %s\n", + progname, strerror(errno)); return rc; } - /* Even if the @size will not be used below, this will fail if + /* + * Even if the @size will not be used below, this will fail if * this is not a SEL component - a good confirmation we are - * working on right components. */ + * working on right components. + */ rc = llapi_layout_extension_size_get(layout, &size); if (rc < 0) { - fprintf(stderr, "%s setstripe: cannot get component ext size: " - "%s\n", progname, strerror(errno)); + fprintf(stderr, + "%s setstripe: cannot get component ext size: %s\n", + progname, strerror(errno)); return rc; } @@ -2772,8 +2905,9 @@ static int layout_extend_comp(struct llapi_layout *layout, rc = llapi_layout_comp_use(layout, LLAPI_LAYOUT_COMP_USE_PREV); if (rc < 0) { - fprintf(stderr, "%s setstripe: cannot move component cursor: " - "%s\n", progname, strerror(errno)); + fprintf(stderr, + "%s setstripe: cannot move component cursor: %s\n", + progname, strerror(errno)); return rc; } @@ -2805,38 +2939,44 @@ static int layout_adjust_first_extent(char *fname, struct llapi_layout *layout, uint64_t end; int rc, ret = 0; - if (layout == NULL) + if (!layout || !(comp_add || llapi_layout_is_composite(layout))) return 0; errno = 0; while (comp_add) { head = llapi_layout_get_by_path(fname, 0); - if (head == NULL) { + if (!head) { fprintf(stderr, - "%s setstripe: cannot read layout from '%s': " - "%s\n", progname, fname, strerror(errno)); + "%s setstripe: cannot read layout from '%s': %s\n", + progname, fname, strerror(errno)); return -EINVAL; } else if (errno == ENODATA) { - /* file without LOVEA, this component-add will be turned - * into a component-create. */ + /* + * file without LOVEA, this component-add will be turned + * into a component-create. + */ llapi_layout_free(head); ret = -ENODATA; - /* the new layout will be added to an empty one, it - * still needs to be adjusted below */ + /* + * the new layout will be added to an empty one, it + * still needs to be adjusted below + */ comp_add = 0; break; } else if (!llapi_layout_is_composite(head)) { - fprintf(stderr, "%s setstripe: '%s' not a composite " - "file\n", progname, fname); + fprintf(stderr, + "%s setstripe: '%s' not a composite file\n", + progname, fname); llapi_layout_free(head); return -EINVAL; } rc = llapi_layout_comp_extent_get(head, &start, &prev_end); if (rc) { - fprintf(stderr, "%s setstripe: cannot get prev " - "extent: %s\n", progname, strerror(errno)); + fprintf(stderr, + "%s setstripe: cannot get prev extent: %s\n", + progname, strerror(errno)); llapi_layout_free(head); return rc; } @@ -2869,16 +3009,16 @@ static int layout_adjust_first_extent(char *fname, struct llapi_layout *layout, } if (start > prev_end || end < prev_end) { - fprintf(stderr, "%s setstripe: first extent [%lu, %lu) not " - "adjacent with extent end %lu\n", + fprintf(stderr, + "%s setstripe: first extent [%lu, %lu) not adjacent with extent end %lu\n", progname, start, end, prev_end); return -EINVAL; } rc = llapi_layout_comp_extent_set(layout, prev_end, end); if (rc) { - fprintf(stderr, "%s setstripe: cannot set component extent " - "[%lu, %lu): %s\n", + fprintf(stderr, + "%s setstripe: cannot set component extent [%lu, %lu): %s\n", progname, prev_end, end, strerror(errno)); return rc; } @@ -2890,10 +3030,10 @@ static int mirror_adjust_first_extents(struct mirror_args *list) { int rc = 0; - if (list == NULL) + if (!list) return 0; - while (list != NULL) { + while (list) { rc = layout_adjust_first_extent(NULL, list->m_layout, false); if (rc) break; @@ -2922,8 +3062,10 @@ static struct mirror_args *lfs_mirror_alloc(void) while (1) { mirror = calloc(1, sizeof(*mirror)); - if (mirror != NULL) + if (mirror) { + mirror->m_inherit = false; break; + } sleep(1); } @@ -2943,7 +3085,7 @@ static struct mirror_args *lfs_mirror_alloc(void) */ static void lfs_mirror_free(struct mirror_args *mirror) { - if (mirror->m_layout != NULL) + if (mirror->m_layout) llapi_layout_free(mirror->m_layout); free(mirror); } @@ -2960,7 +3102,7 @@ static void lfs_mirror_list_free(struct mirror_args *mirror_list) { struct mirror_args *next_mirror = NULL; - while (mirror_list != NULL) { + while (mirror_list) { next_mirror = mirror_list->m_next; lfs_mirror_free(mirror_list); mirror_list = next_mirror; @@ -3039,6 +3181,7 @@ static int lfs_setstripe_internal(int argc, char **argv, /* find { .val = 'A', .name = "atime", .has_arg = required_argument }*/ /* --block is only valid in migrate mode */ { .val = 'b', .name = "block", .has_arg = no_argument }, +/* find { .val = 'B', .name = "btime", .has_arg = required_argument }*/ { .val = LFS_COMP_ADD_OPT, .name = "comp-add", .has_arg = no_argument }, { .val = LFS_COMP_ADD_OPT, @@ -3155,7 +3298,8 @@ static int lfs_setstripe_internal(int argc, char **argv, if (result != 0) goto usage_error; if (mirror_mode && lsa.lsa_comp_neg_flags) { - fprintf(stderr, "%s: inverted flags are not supported\n", + fprintf(stderr, + "%s: inverted flags are not supported\n", progname); goto usage_error; } @@ -3191,7 +3335,8 @@ static int lfs_setstripe_internal(int argc, char **argv, } if (!mirror_mode || !last_mirror) { - fprintf(stderr, "error: %s: --flags must be specified with --mirror-count|-N option\n", + fprintf(stderr, + "error: %s: --flags must be specified with --mirror-count|-N option\n", progname); goto usage_error; } @@ -3202,7 +3347,8 @@ static int lfs_setstripe_internal(int argc, char **argv, goto usage_error; if (neg_flags) { - fprintf(stderr, "%s: inverted flags are not supported\n", + fprintf(stderr, + "%s: inverted flags are not supported\n", progname); result = -EINVAL; goto usage_error; @@ -3217,7 +3363,7 @@ static int lfs_setstripe_internal(int argc, char **argv, break; } case LFS_LAYOUT_FOREIGN_OPT: - if (optarg != NULL) { + if (optarg) { /* check pure numeric */ type = strtoul(optarg, &end, 0); if (*end) { @@ -3236,7 +3382,7 @@ static int lfs_setstripe_internal(int argc, char **argv, break; case LFS_MODE_OPT: mode_opt = optarg; - if (mode_opt != NULL) { + if (mode_opt) { mode = strtoul(mode_opt, &end, 8); if (*end != '\0') { fprintf(stderr, @@ -3297,8 +3443,7 @@ static int lfs_setstripe_internal(int argc, char **argv, case 'D': if (!migrate_mode) { fprintf(stderr, - "%s %s: -D|--non-direct is valid " - "only for migrate command\n", + "%s %s: -D|--non-direct is valid only for migrate command\n", progname, argv[0]); goto usage_error; } @@ -3332,7 +3477,8 @@ static int lfs_setstripe_internal(int argc, char **argv, break; case 'H': if (!migrate_mode) { - fprintf(stderr, "--mdt-hash is valid only for migrate command\n"); + fprintf(stderr, + "--mdt-hash is valid only for migrate command\n"); return CMD_HELP; } @@ -3373,7 +3519,7 @@ static int lfs_setstripe_internal(int argc, char **argv, goto usage_error; } if (opc == SO_MIRROR_EXTEND) { - if (last_mirror == NULL) { + if (!last_mirror) { fprintf(stderr, "error: %s: '-N' must exist in front of '%s'\n", progname, argv[optopt + 1]); @@ -3383,7 +3529,7 @@ static int lfs_setstripe_internal(int argc, char **argv, last_mirror->m_count = 1; } else { /* mirror split */ - if (mirror_list == NULL) + if (!mirror_list) mirror_list = lfs_mirror_alloc(); mirror_list->m_file = optarg; } @@ -3392,24 +3538,24 @@ static int lfs_setstripe_internal(int argc, char **argv, case 'L': if (strcmp(argv[optind - 1], "mdt") == 0) { /* Can be only the first component */ - if (layout != NULL) { + if (layout) { result = -EINVAL; - fprintf(stderr, "error: 'mdt' layout " - "can be only the first one\n"); + fprintf(stderr, + "error: 'mdt' layout can be only the first one\n"); goto error; } if (lsa.lsa_comp_end > (1ULL << 30)) { /* 1Gb */ result = -EFBIG; - fprintf(stderr, "error: 'mdt' layout " - "size is too big\n"); + fprintf(stderr, + "error: 'mdt' layout size is too big\n"); goto error; } lsa.lsa_pattern = LLAPI_LAYOUT_MDT; } else if (strcmp(argv[optind - 1], "raid0") != 0) { result = -EINVAL; - fprintf(stderr, "error: layout '%s' is " - "unknown, supported layouts are: " - "'mdt', 'raid0'\n", argv[optind]); + fprintf(stderr, + "error: layout '%s' is unknown, supported layouts are: 'mdt', 'raid0'\n", + argv[optind]); goto error; } break; @@ -3450,7 +3596,7 @@ static int lfs_setstripe_internal(int argc, char **argv, mirror_mode = true; } mirror_count = 1; - if (optarg != NULL) { + if (optarg) { mirror_count = strtoul(optarg, &end, 0); if (*end != '\0' || mirror_count == 0) { fprintf(stderr, @@ -3464,11 +3610,13 @@ static int lfs_setstripe_internal(int argc, char **argv, new_mirror = lfs_mirror_alloc(); new_mirror->m_count = mirror_count; - if (mirror_list == NULL) + if (!mirror_list) mirror_list = new_mirror; - if (last_mirror != NULL) { + if (last_mirror) { /* wrap up last mirror */ + if (!setstripe_args_specified(&lsa)) + last_mirror->m_inherit = true; if (lsa.lsa_comp_end == 0) lsa.lsa_comp_end = LUSTRE_EOF; @@ -3489,8 +3637,8 @@ static int lfs_setstripe_internal(int argc, char **argv, case 'o': #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) if (strcmp(argv[optind - 1], "--ost-list") == 0) - fprintf(stderr, "warning: '--ost-list' is " - "deprecated, use '--ost' instead\n"); + fprintf(stderr, + "warning: '--ost-list' is deprecated, use '--ost' instead\n"); #endif if (lsa.lsa_pattern == LLAPI_LAYOUT_MDT) { fprintf(stderr, @@ -3498,7 +3646,8 @@ static int lfs_setstripe_internal(int argc, char **argv, progname, argv[0]); goto usage_error; } - /* -o allows overstriping, and must note it because + /* + * -o allows overstriping, and must note it because * parse_targets is shared with MDT striping, which * does not allow duplicates */ @@ -3519,7 +3668,7 @@ static int lfs_setstripe_internal(int argc, char **argv, lsa.lsa_stripe_off = tgts[0]; break; case 'p': - if (optarg == NULL) + if (!optarg) goto usage_error; lsa.lsa_pool_name = optarg; @@ -3589,7 +3738,8 @@ static int lfs_setstripe_internal(int argc, char **argv, from_copy = true; if (xattr && !foreign_mode) { - /* only print a warning as this is harmless and will be ignored + /* + * only print a warning as this is harmless and will be ignored */ fprintf(stderr, "%s %s: xattr has been specified for non-foreign layout\n", @@ -3620,6 +3770,8 @@ static int lfs_setstripe_internal(int argc, char **argv, } if (mirror_mode) { + if (!setstripe_args_specified(&lsa)) + last_mirror->m_inherit = true; if (lsa.lsa_comp_end == 0) lsa.lsa_comp_end = LUSTRE_EOF; } @@ -3651,7 +3803,8 @@ static int lfs_setstripe_internal(int argc, char **argv, } if (comp_set && !comp_id) { - fprintf(stderr, "%s %s: --component-set doesn't have component-id set\n", + fprintf(stderr, + "%s %s: --component-set doesn't have component-id set\n", progname, argv[0]); goto usage_error; } @@ -3698,15 +3851,15 @@ static int lfs_setstripe_internal(int argc, char **argv, } if (mirror_mode) { - fprintf(stderr, "error: %s: can't use --component-add " - "or --component-del for mirror operation\n", + fprintf(stderr, + "error: %s: can't use --component-add or --component-del for mirror operation\n", progname); goto usage_error; } } if (comp_add) { - if (layout == NULL) { + if (!layout) { fprintf(stderr, "%s %s: option -E must be specified with --component-add\n", progname, argv[0]); @@ -3714,21 +3867,6 @@ static int lfs_setstripe_internal(int argc, char **argv, } } - if (layout != NULL || mirror_list != NULL) { - if (mirror_list) - result = mirror_adjust_first_extents(mirror_list); - else - result = layout_adjust_first_extent(fname, layout, - comp_add); - if (result == -ENODATA) - comp_add = 0; - else if (result != 0) { - fprintf(stderr, "error: %s: invalid layout\n", - progname); - goto error; - } - } - if (from_yaml && from_copy) { fprintf(stderr, "%s: can't specify --yaml and --copy together\n", @@ -3738,8 +3876,8 @@ static int lfs_setstripe_internal(int argc, char **argv, if ((from_yaml || from_copy) && (setstripe_args_specified(&lsa) || layout != NULL)) { - fprintf(stderr, "error: %s: can't specify --yaml or --copy with" - " -c, -S, -i, -o, -p or -E options.\n", + fprintf(stderr, + "error: %s: can't specify --yaml or --copy with -c, -S, -i, -o, -p or -E options.\n", argv[0]); goto error; } @@ -3815,11 +3953,11 @@ static int lfs_setstripe_internal(int argc, char **argv, migrate_mdt_param.fp_lmv_md = lmu; migrate_mdt_param.fp_migrate = 1; - } else if (layout == NULL) { + } else if (!layout) { /* initialize stripe parameters */ param = calloc(1, offsetof(typeof(*param), lsp_osts[lsa.lsa_nr_tgts])); - if (param == NULL) { + if (!param) { fprintf(stderr, "%s %s: cannot allocate memory for parameters: %s\n", progname, argv[0], strerror(ENOMEM)); @@ -3874,19 +4012,34 @@ static int lfs_setstripe_internal(int argc, char **argv, result = lfs_comp_create_from_yaml(template, &layout, &lsa, tgts); if (result) { - fprintf(stderr, "error: %s: can't create composite " - "layout from template file %s\n", + fprintf(stderr, + "error: %s: can't create composite layout from template file %s\n", argv[0], template); goto error; } } + if (layout != NULL || mirror_list != NULL) { + if (mirror_list) + result = mirror_adjust_first_extents(mirror_list); + else + result = layout_adjust_first_extent(fname, layout, + comp_add); + if (result == -ENODATA) + comp_add = 0; + else if (result != 0) { + fprintf(stderr, "error: %s: invalid layout\n", + progname); + goto error; + } + } + for (fname = argv[optind]; fname != NULL; fname = argv[++optind]) { if (from_copy) { layout = llapi_layout_get_by_path(template ?: fname, 0); - if (layout == NULL) { - fprintf(stderr, "%s: can't create composite " - "layout from file %s.\n", + if (!layout) { + fprintf(stderr, + "%s: can't create composite layout from file %s.\n", progname, template ?: fname); goto error; } @@ -3929,7 +4082,7 @@ static int lfs_setstripe_internal(int argc, char **argv, mirror_flags, has_m_file ? mirror_list->m_file : NULL); - } else if (layout != NULL) { + } else if (layout) { result = lfs_component_create(fname, O_CREAT | O_WRONLY, mode, layout); if (result >= 0) { @@ -3960,7 +4113,7 @@ static int lfs_setstripe_internal(int argc, char **argv, } } - if (mode_opt != NULL) + if (mode_opt) umask(previous_umask); free(param); @@ -3978,26 +4131,27 @@ error: static int lfs_poollist(int argc, char **argv) { - if (argc != 2) - return CMD_HELP; + if (argc != 2) + return CMD_HELP; - return llapi_poollist(argv[1]); + return llapi_poollist(argv[1]); } +#define FP_DEFAULT_TIME_MARGIN (24 * 60 * 60) static time_t set_time(struct find_param *param, time_t *time, time_t *set, char *str) { long long t = 0; - int res = 0; + int sign = 0; char *endptr = "AD"; char *timebuf; if (str[0] == '+') - res = 1; + sign = 1; else if (str[0] == '-') - res = -1; + sign = -1; - if (res) + if (sign) str++; for (timebuf = str; *endptr && *(endptr + 1); timebuf = endptr + 1) { @@ -4009,9 +4163,12 @@ static time_t set_time(struct find_param *param, time_t *time, time_t *set, unit *= 52; /* 52 weeks + 1 day below */ case 'w': /* fallthrough */ unit *= 7; + if (param->fp_time_margin == FP_DEFAULT_TIME_MARGIN) + param->fp_time_margin *= (1 + unit / 52); + unit += (*endptr == 'y'); /* +1 day for 365 days/year */ case '\0': /* days are default unit if none used */ case 'd': /* fallthrough */ - unit = (unit + (*endptr == 'y')) * 24; + unit *= 24; case 'h': /* fallthrough */ unit *= 60; case 'm': /* fallthrough */ @@ -4033,7 +4190,7 @@ static time_t set_time(struct find_param *param, time_t *time, time_t *set, t += val * unit; } if (*time < t) { - if (res != 0) + if (sign != 0) str--; fprintf(stderr, "%s find: bad time '%s': too large\n", progname, str); @@ -4042,7 +4199,23 @@ static time_t set_time(struct find_param *param, time_t *time, time_t *set, *set = *time - t; - return res; + return sign; +} + +static int str2quotaid(__u32 *id, const char *arg) +{ + unsigned long int projid_tmp = 0; + char *endptr = NULL; + + projid_tmp = strtoul(arg, &endptr, 10); + if (*endptr != '\0') + return -EINVAL; + if (projid_tmp > UINT32_MAX || + (projid_tmp == ULONG_MAX && (errno == ERANGE))) + return -ERANGE; + + *id = projid_tmp; + return 0; } static int name2uid(unsigned int *id, const char *name) @@ -4050,7 +4223,7 @@ static int name2uid(unsigned int *id, const char *name) struct passwd *passwd; passwd = getpwnam(name); - if (passwd == NULL) + if (!passwd) return -ENOENT; *id = passwd->pw_uid; @@ -4062,7 +4235,7 @@ static int name2gid(unsigned int *id, const char *name) struct group *group; group = getgrnam(name); - if (group == NULL) + if (!group) return -ENOENT; *id = group->gr_gid; @@ -4079,7 +4252,7 @@ static int uid2name(char **name, unsigned int id) struct passwd *passwd; passwd = getpwuid(id); - if (passwd == NULL) + if (!passwd) return -ENOENT; *name = passwd->pw_name; @@ -4091,7 +4264,7 @@ static inline int gid2name(char **name, unsigned int id) struct group *group; group = getgrgid(id); - if (group == NULL) + if (!group) return -ENOENT; *name = group->gr_name; @@ -4105,7 +4278,7 @@ static int name2layout(__u32 *layout, char *name) *layout = 0; for (ptr = name; ; ptr = NULL) { layout_name = strtok(ptr, ","); - if (layout_name == NULL) + if (!layout_name) break; if (strcmp(layout_name, "released") == 0) *layout |= LOV_PATTERN_F_RELEASED; @@ -4129,11 +4302,13 @@ static int lfs_find(int argc, char **argv) struct find_param param = { .fp_max_depth = -1, .fp_quiet = 1, - .fp_time_margin = 24 * 60 * 60, + .fp_time_margin = FP_DEFAULT_TIME_MARGIN, }; - struct option long_opts[] = { + struct option long_opts[] = { { .val = 'A', .name = "atime", .has_arg = required_argument }, { .val = 'b', .name = "blocks", .has_arg = required_argument }, + { .val = 'B', .name = "btime", .has_arg = required_argument }, + { .val = 'B', .name = "Btime", .has_arg = required_argument }, { .val = LFS_COMP_COUNT_OPT, .name = "comp-count", .has_arg = required_argument }, { .val = LFS_COMP_COUNT_OPT, @@ -4162,23 +4337,49 @@ static int lfs_find(int argc, char **argv) { .val = LFS_NEWERXY_OPT, .name = "newerac", .has_arg = required_argument}, { .val = LFS_NEWERXY_OPT, + .name = "newerab", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, .name = "newerma", .has_arg = required_argument}, { .val = LFS_NEWERXY_OPT, .name = "newermm", .has_arg = required_argument}, { .val = LFS_NEWERXY_OPT, .name = "newermc", .has_arg = required_argument}, { .val = LFS_NEWERXY_OPT, + .name = "newermb", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, .name = "newerca", .has_arg = required_argument}, { .val = LFS_NEWERXY_OPT, .name = "newercm", .has_arg = required_argument}, { .val = LFS_NEWERXY_OPT, .name = "newercc", .has_arg = required_argument}, { .val = LFS_NEWERXY_OPT, + .name = "newercb", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, + .name = "newerba", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, + .name = "newerbm", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, + .name = "newerbc", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, + .name = "newerbb", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, + .name = "newerBa", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, + .name = "newerBm", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, + .name = "newerBc", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, + .name = "newerBB", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, .name = "newerat", .has_arg = required_argument}, { .val = LFS_NEWERXY_OPT, .name = "newermt", .has_arg = required_argument}, { .val = LFS_NEWERXY_OPT, .name = "newerct", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, + .name = "newerbt", .has_arg = required_argument}, + { .val = LFS_NEWERXY_OPT, + .name = "newerBt", .has_arg = required_argument}, { .val = 'c', .name = "stripe-count", .has_arg = required_argument }, { .val = 'c', .name = "stripe_count", .has_arg = required_argument }, { .val = 'C', .name = "ctime", .has_arg = required_argument }, @@ -4244,46 +4445,55 @@ static int lfs_find(int argc, char **argv) /* when getopt_long_only() hits '!' it returns 1, puts "!" in optarg */ while ((c = getopt_long_only(argc, argv, - "-0A:b:c:C:D:E:g:G:H:i:L:m:M:n:N:O:Ppqrs:S:t:T:u:U:vz:", - long_opts, &optidx)) >= 0) { - xtime = NULL; - xsign = NULL; - if (neg_opt) - --neg_opt; - /* '!' is part of option */ - /* when getopt_long_only() finds a string which is not - * an option nor a known option argument it returns 1 - * in that case if we already have found pathstart and pathend - * (i.e. we have the list of pathnames), - * the only supported value is "!" - */ - isoption = (c != 1) || (strcmp(optarg, "!") == 0); - if (!isoption && pathend != -1) { - fprintf(stderr, "err: %s: filename|dirname must either " - "precede options or follow options\n", - argv[0]); - ret = CMD_HELP; - goto err; - } - if (!isoption && pathstart == -1) - pathstart = optind - 1; - if (isoption && pathstart != -1 && pathend == -1) - pathend = optind - 2; - switch (c) { - case 0: - /* Long options. */ - break; - case 1: - /* unknown; opt is "!" or path component, - * checking done above. - */ - if (strcmp(optarg, "!") == 0) - neg_opt = 2; - break; + "-0A:b:B:c:C:D:E:g:G:H:i:L:m:M:n:N:O:Ppqrs:S:t:T:u:U:vz:", + long_opts, &optidx)) >= 0) { + xtime = NULL; + xsign = NULL; + if (neg_opt) + --neg_opt; + /* '!' is part of option */ + /* + * when getopt_long_only() finds a string which is not + * an option nor a known option argument it returns 1 + * in that case if we already have found pathstart and pathend + * (i.e. we have the list of pathnames), + * the only supported value is "!" + */ + isoption = (c != 1) || (strcmp(optarg, "!") == 0); + if (!isoption && pathend != -1) { + fprintf(stderr, + "err: %s: filename|dirname must either precede options or follow options\n", + argv[0]); + ret = CMD_HELP; + goto err; + } + if (!isoption && pathstart == -1) + pathstart = optind - 1; + if (isoption && pathstart != -1 && pathend == -1) + pathend = optind - 2; + switch (c) { + case 0: + /* Long options. */ + break; + case 1: + /* + * unknown; opt is "!" or path component, + * checking done above. + */ + if (strcmp(optarg, "!") == 0) + neg_opt = 2; + break; case 'A': xtime = ¶m.fp_atime; xsign = ¶m.fp_asign; param.fp_exclude_atime = !!neg_opt; + /* no break, this falls through to 'B' for btime */ + case 'B': + if (c == 'B') { + xtime = ¶m.fp_btime; + xsign = ¶m.fp_bsign; + param.fp_exclude_btime = !!neg_opt; + } /* no break, this falls through to 'C' for ctime */ case 'C': if (c == 'C') { @@ -4337,8 +4547,9 @@ static int lfs_find(int argc, char **argv) param.fp_comp_count = strtoul(optarg, &endptr, 0); if (*endptr != '\0') { - fprintf(stderr, "error: bad component count " - "'%s'\n", optarg); + fprintf(stderr, + "error: bad component count '%s'\n", + optarg); goto err; } param.fp_check_comp_count = 1; @@ -4348,13 +4559,15 @@ static int lfs_find(int argc, char **argv) rc = comp_str2flags(optarg, ¶m.fp_comp_flags, ¶m.fp_comp_neg_flags); if (rc) { - fprintf(stderr, "error: bad component flags " - "'%s'\n", optarg); + fprintf(stderr, + "error: bad component flags '%s'\n", + optarg); goto err; } param.fp_check_comp_flags = 1; if (neg_opt) { __u32 flags = param.fp_comp_neg_flags; + param.fp_comp_neg_flags = param.fp_comp_flags; param.fp_comp_flags = flags; } @@ -4371,8 +4584,9 @@ static int lfs_find(int argc, char **argv) rc = llapi_parse_size(optarg, ¶m.fp_comp_start, ¶m.fp_comp_start_units, 0); if (rc) { - fprintf(stderr, "error: bad component start " - "'%s'\n", optarg); + fprintf(stderr, + "error: bad component start '%s'\n", + optarg); goto err; } param.fp_check_comp_start = 1; @@ -4390,30 +4604,32 @@ static int lfs_find(int argc, char **argv) param.fp_check_mirror_state = 1; if (neg_opt) { __u16 state = param.fp_mirror_neg_state; + param.fp_mirror_neg_state = param.fp_mirror_state; param.fp_mirror_state = state; } break; - case 'c': - if (optarg[0] == '+') { + case 'c': + if (optarg[0] == '+') { param.fp_stripe_count_sign = -1; - optarg++; - } else if (optarg[0] == '-') { + optarg++; + } else if (optarg[0] == '-') { param.fp_stripe_count_sign = 1; - optarg++; - } + optarg++; + } param.fp_stripe_count = strtoul(optarg, &endptr, 0); - if (*endptr != '\0') { - fprintf(stderr,"error: bad stripe_count '%s'\n", - optarg); - ret = -1; - goto err; - } + if (*endptr != '\0') { + fprintf(stderr, + "error: bad stripe_count '%s'\n", + optarg); + ret = -1; + goto err; + } param.fp_check_stripe_count = 1; param.fp_exclude_stripe_count = !!neg_opt; - break; + break; case 'D': param.fp_max_depth = strtol(optarg, 0, 0); break; @@ -4436,8 +4652,9 @@ static int lfs_find(int argc, char **argv) ¶m.fp_comp_end_units, 0); } if (rc) { - fprintf(stderr, "error: bad component end " - "'%s'\n", optarg); + fprintf(stderr, + "error: bad component end '%s'\n", + optarg); goto err; } param.fp_check_comp_end = 1; @@ -4447,7 +4664,7 @@ static int lfs_find(int argc, char **argv) /* all types by default */ uint32_t type = LU_FOREIGN_TYPE_UNKNOWN; - if (optarg != NULL) { + if (optarg) { /* check pure numeric */ type = strtoul(optarg, &endptr, 0); if (*endptr) { @@ -4528,6 +4745,24 @@ static int lfs_find(int argc, char **argv) } ref = mktime(&tm); + } else if (y == 'b' || y == 'B') { + lstatx_t stx; + + rc = llapi_get_lum_file(optarg, NULL, &stx, + NULL, 0); + if (rc || !(stx.stx_mask & STATX_BTIME)) { + if (!(stx.stx_mask & STATX_BTIME)) + ret = -EOPNOTSUPP; + else + ret = -errno; + fprintf(stderr, + "%s: get btime failed '%s': %s\n", + progname, optarg, + strerror(-ret)); + goto err; + } + + ref = stx.stx_btime.tv_sec; } else { struct stat statbuf; @@ -4569,6 +4804,10 @@ static int lfs_find(int argc, char **argv) case 'c': xidx = NEWERXY_CTIME; break; + case 'b': + case 'B': + xidx = NEWERXY_BTIME; + break; default: fprintf(stderr, "%s: invalid X argument: '%c'\n", @@ -4595,17 +4834,17 @@ static int lfs_find(int argc, char **argv) case 'G': rc = name2gid(¶m.fp_gid, optarg); if (rc) { - param.fp_gid = strtoul(optarg, &endptr, 10); - if (*endptr != '\0') { - fprintf(stderr, "Group/GID: %s cannot " - "be found.\n", optarg); - ret = -1; - goto err; - } - } + if (str2quotaid(¶m.fp_gid, optarg)) { + fprintf(stderr, + "Group/GID: %s cannot be found.\n", + optarg); + ret = -1; + goto err; + } + } param.fp_exclude_gid = !!neg_opt; param.fp_check_gid = 1; - break; + break; case 'H': param.fp_hash_type = check_hashtype(optarg); if (param.fp_hash_type == 0) { @@ -4631,21 +4870,21 @@ static int lfs_find(int argc, char **argv) case 'U': rc = name2uid(¶m.fp_uid, optarg); if (rc) { - param.fp_uid = strtoul(optarg, &endptr, 10); - if (*endptr != '\0') { - fprintf(stderr, "User/UID: %s cannot " - "be found.\n", optarg); - ret = -1; - goto err; - } - } + if (str2quotaid(¶m.fp_uid, optarg)) { + fprintf(stderr, + "User/UID: %s cannot be found.\n", + optarg); + ret = -1; + goto err; + } + } param.fp_exclude_uid = !!neg_opt; param.fp_check_uid = 1; - break; - case 'n': + break; + case 'n': param.fp_pattern = (char *)optarg; param.fp_exclude_pattern = !!neg_opt; - break; + break; case 'N': if (optarg[0] == '+') { param.fp_mirror_count_sign = -1; @@ -4665,56 +4904,57 @@ static int lfs_find(int argc, char **argv) param.fp_check_mirror_count = 1; param.fp_exclude_mirror_count = !!neg_opt; break; - case 'm': - case 'i': - case 'O': { - char *buf, *token, *next, *p; - int len = 1; - void *tmp; - - buf = strdup(optarg); - if (buf == NULL) { - ret = -ENOMEM; - goto err; - } + case 'm': + case 'i': + case 'O': { + char *buf, *token, *next, *p; + int len = 1; + void *tmp; + + buf = strdup(optarg); + if (!buf) { + ret = -ENOMEM; + goto err; + } param.fp_exclude_obd = !!neg_opt; - token = buf; - while (token && *token) { - token = strchr(token, ','); - if (token) { - len++; - token++; - } - } - if (c == 'm') { + token = buf; + while (token && *token) { + token = strchr(token, ','); + if (token) { + len++; + token++; + } + } + if (c == 'm') { param.fp_exclude_mdt = !!neg_opt; param.fp_num_alloc_mdts += len; tmp = realloc(param.fp_mdt_uuid, param.fp_num_alloc_mdts * sizeof(*param.fp_mdt_uuid)); - if (tmp == NULL) { + if (!tmp) { ret = -ENOMEM; goto err_free; } param.fp_mdt_uuid = tmp; - } else { + } else { param.fp_exclude_obd = !!neg_opt; param.fp_num_alloc_obds += len; tmp = realloc(param.fp_obd_uuid, param.fp_num_alloc_obds * sizeof(*param.fp_obd_uuid)); - if (tmp == NULL) { + if (!tmp) { ret = -ENOMEM; goto err_free; } param.fp_obd_uuid = tmp; - } - for (token = buf; token && *token; token = next) { + } + for (token = buf; token && *token; token = next) { struct obd_uuid *puuid; + if (c == 'm') { puuid = ¶m.fp_mdt_uuid[param.fp_num_mdts++]; @@ -4722,12 +4962,12 @@ static int lfs_find(int argc, char **argv) puuid = ¶m.fp_obd_uuid[param.fp_num_obds++]; } - p = strchr(token, ','); - next = 0; - if (p) { - *p = 0; - next = p+1; - } + p = strchr(token, ','); + next = 0; + if (p) { + *p = 0; + next = p+1; + } if (strlen(token) > sizeof(puuid->uuid) - 1) { ret = -E2BIG; @@ -4775,10 +5015,9 @@ err_free: case LFS_PROJID_OPT: rc = name2projid(¶m.fp_projid, optarg); if (rc) { - param.fp_projid = strtoul(optarg, &endptr, 10); - if (*endptr != '\0') { + if (str2quotaid(¶m.fp_projid, optarg)) { fprintf(stderr, - "Invalid project ID: %s", + "Invalid project ID: %s\n", optarg); ret = -1; goto err; @@ -4931,7 +5170,7 @@ err: if (param.fp_mdt_uuid && param.fp_num_alloc_mdts) free(param.fp_mdt_uuid); - return ret; + return ret; } static int lfs_getstripe_internal(int argc, char **argv, @@ -4940,6 +5179,8 @@ static int lfs_getstripe_internal(int argc, char **argv, struct option long_opts[] = { /* find { .val = 'A', .name = "atime", .has_arg = required_argument }*/ /* find { .val = 'b', .name = "blocks", .has_arg = required_argument }*/ +/* find { .val = 'B', .name = "btime", .has_arg = required_argument }*/ +/* find { .val = 'B', .name = "Btime", .has_arg = required_argument }*/ { .val = LFS_COMP_COUNT_OPT, .name = "comp-count", .has_arg = no_argument }, { .val = LFS_COMP_COUNT_OPT, @@ -5039,13 +5280,13 @@ static int lfs_getstripe_internal(int argc, char **argv, param->fp_max_depth = 0; break; case LFS_COMP_FLAGS_OPT: - if (optarg != NULL) { + if (optarg) { rc = comp_str2flags(optarg, ¶m->fp_comp_flags, ¶m->fp_comp_neg_flags); if (rc != 0) { - fprintf(stderr, "error: %s bad " - "component flags '%s'.\n", + fprintf(stderr, + "error: %s bad component flags '%s'.\n", argv[0], optarg); return CMD_HELP; } @@ -5056,7 +5297,7 @@ static int lfs_getstripe_internal(int argc, char **argv, } break; case LFS_COMP_START_OPT: - if (optarg != NULL) { + if (optarg) { tmp = optarg; if (tmp[0] == '+') { param->fp_comp_start_sign = -1; @@ -5069,13 +5310,12 @@ static int lfs_getstripe_internal(int argc, char **argv, ¶m->fp_comp_start, ¶m->fp_comp_start_units, 0); if (rc != 0) { - fprintf(stderr, "error: %s bad " - "component start '%s'.\n", + fprintf(stderr, + "error: %s bad component start '%s'.\n", argv[0], tmp); return CMD_HELP; - } else { - param->fp_check_comp_start = 1; } + param->fp_check_comp_start = 1; } else { param->fp_verbose |= VERBOSE_COMP_START; param->fp_max_depth = 0; @@ -5140,7 +5380,7 @@ static int lfs_getstripe_internal(int argc, char **argv, param->fp_get_default_lmv = 1; break; case 'E': - if (optarg != NULL) { + if (optarg) { tmp = optarg; if (tmp[0] == '+') { param->fp_comp_end_sign = -1; @@ -5160,8 +5400,8 @@ static int lfs_getstripe_internal(int argc, char **argv, ¶m->fp_comp_end_units, 0); } if (rc != 0) { - fprintf(stderr, "error: %s bad " - "component end '%s'.\n", + fprintf(stderr, + "error: %s bad component end '%s'.\n", argv[0], tmp); return CMD_HELP; } @@ -5190,17 +5430,16 @@ static int lfs_getstripe_internal(int argc, char **argv, } break; case 'I': - if (optarg != NULL) { + if (optarg) { param->fp_comp_id = strtoul(optarg, &end, 0); if (*end != '\0' || param->fp_comp_id == 0 || param->fp_comp_id > LCME_ID_MAX) { - fprintf(stderr, "error: %s bad " - "component id '%s'\n", + fprintf(stderr, + "error: %s bad component id '%s'\n", argv[0], optarg); return CMD_HELP; - } else { - param->fp_check_comp_id = 1; } + param->fp_check_comp_id = 1; } else { param->fp_max_depth = 0; param->fp_verbose |= VERBOSE_COMP_ID; @@ -5214,8 +5453,8 @@ static int lfs_getstripe_internal(int argc, char **argv, break; #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) case 'M': - fprintf(stderr, "warning: '-M' deprecated" - ", use '--mdt-index' or '-m' instead\n"); + fprintf(stderr, + "warning: '-M' deprecated, use '--mdt-index' or '-m' instead\n"); #endif case 'm': if (!(param->fp_verbose & VERBOSE_DETAIL)) @@ -5309,40 +5548,40 @@ static int lfs_getstripe_internal(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; - int index = 0, rc=0; + char mntdir[PATH_MAX] = {'\0'}, path[PATH_MAX] = {'\0'}; + struct find_param param; + int index = 0, rc = 0; - if (argc > 2) - return CMD_HELP; + if (argc > 2) + return CMD_HELP; - if (argc == 2 && !realpath(argv[1], path)) { - rc = -errno; - fprintf(stderr, "error: invalid path '%s': %s\n", - argv[1], strerror(-rc)); - return rc; - } + if (argc == 2 && !realpath(argv[1], path)) { + rc = -errno; + fprintf(stderr, "error: invalid path '%s': %s\n", + argv[1], strerror(-rc)); + return rc; + } - while (!llapi_search_mounts(path, index++, mntdir, NULL)) { - /* Check if we have a mount point */ - if (mntdir[0] == '\0') - continue; + while (!llapi_search_mounts(path, index++, mntdir, NULL)) { + /* Check if we have a mount point */ + if (mntdir[0] == '\0') + continue; - memset(¶m, 0, sizeof(param)); - if (!strcmp(argv[0], "mdts")) + memset(¶m, 0, sizeof(param)); + if (!strcmp(argv[0], "mdts")) param.fp_get_lmv = 1; - rc = llapi_ostlist(mntdir, ¶m); - if (rc) { - fprintf(stderr, "error: %s: failed on %s\n", - argv[0], mntdir); - } - if (path[0] != '\0') - break; - memset(mntdir, 0, PATH_MAX); - } + rc = llapi_ostlist(mntdir, ¶m); + if (rc) { + fprintf(stderr, "error: %s: failed on %s\n", + argv[0], mntdir); + } + if (path[0] != '\0') + break; + memset(mntdir, 0, PATH_MAX); + } - return rc; + return rc; } static int lfs_getstripe(int argc, char **argv) @@ -5374,8 +5613,7 @@ static int lfs_getdirstripe(int argc, char **argv) param.fp_get_lmv = 1; while ((c = getopt_long(argc, argv, - "cDHimO:rtTvy", long_opts, NULL)) != -1) - { + "cDHimO:rtTvy", long_opts, NULL)) != -1) { switch (c) { case 'c': case 'T': @@ -5390,8 +5628,8 @@ static int lfs_getdirstripe(int argc, char **argv) break; #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) case 't': - fprintf(stderr, "warning: '-t' deprecated, " - "use '--mdt-hash' or '-H' instead\n"); + fprintf(stderr, + "warning: '-t' deprecated, use '--mdt-hash' or '-H' instead\n"); #endif case 'H': param.fp_verbose |= VERBOSE_HASH_TYPE; @@ -5482,7 +5720,8 @@ static inline int obd_statfs_ratio(const struct obd_statfs *st, bool inodes) return (ratio - (int)ratio) > 0 ? (int)(ratio + 1) : (int)ratio; } -/* This is to identify various problem states for "lfs df" if .osn_err = true, +/* + * This is to identify various problem states for "lfs df" if .osn_err = true, * so only show flags reflecting those states by default. Informational states * are only shown with "-v" and use lower-case names to distinguish them. * UNUSED[12] were for "EROFS = 30" until 1.6 but are now available for use. @@ -5492,15 +5731,15 @@ static struct obd_statfs_state_names { const char osn_name; bool osn_err; } oss_names[] = { - { .osn_state = OS_STATE_DEGRADED, .osn_name = 'D', .osn_err = true }, - { .osn_state = OS_STATE_READONLY, .osn_name = 'R', .osn_err = true }, - { .osn_state = OS_STATE_NOPRECREATE, .osn_name = 'N', .osn_err = true }, - { .osn_state = OS_STATE_UNUSED1, .osn_name = '?', .osn_err = true }, - { .osn_state = OS_STATE_UNUSED2, .osn_name = '?', .osn_err = true }, - { .osn_state = OS_STATE_ENOSPC, .osn_name = 'S', .osn_err = true }, - { .osn_state = OS_STATE_ENOINO, .osn_name = 'I', .osn_err = true }, - { .osn_state = OS_STATE_SUM, .osn_name = 'a', /* aggregate */ }, - { .osn_state = OS_STATE_NONROT, .osn_name = 'f', /* flash */ }, + { .osn_state = OS_STATFS_DEGRADED, .osn_name = 'D', .osn_err = true }, + { .osn_state = OS_STATFS_READONLY, .osn_name = 'R', .osn_err = true }, + { .osn_state = OS_STATFS_NOPRECREATE,.osn_name = 'N', .osn_err = true }, + { .osn_state = OS_STATFS_UNUSED1, .osn_name = '?', .osn_err = true }, + { .osn_state = OS_STATFS_UNUSED2, .osn_name = '?', .osn_err = true }, + { .osn_state = OS_STATFS_ENOSPC, .osn_name = 'S', .osn_err = true }, + { .osn_state = OS_STATFS_ENOINO, .osn_name = 'I', .osn_err = true }, + { .osn_state = OS_STATFS_SUM, .osn_name = 'a', /* aggregate */ }, + { .osn_state = OS_STATFS_NONROT, .osn_name = 'f', /* flash */ }, }; static int showdf(char *mntdir, struct obd_statfs *stat, @@ -5638,7 +5877,7 @@ static int mntdf(char *mntdir, char *fsname, char *pool, enum mntdf_flags flags, if (pool) { poolname = strchr(pool, '.'); - if (poolname != NULL) { + if (poolname) { if (strncmp(fsname, pool, strlen(fsname))) { fprintf(stderr, "filesystem name incorrect\n"); return -ENODEV; @@ -5692,7 +5931,8 @@ static int mntdf(char *mntdir, char *fsname, char *pool, enum mntdf_flags flags, rc = rc2; } - /* If we have OSTs then don't report MDT block counts. + /* + * If we have OSTs then don't report MDT block counts. * For MDT-only filesystems the expectation is that all * layouts have a DoM component. For filesystems with * OSTs, files are not necessarily going to store data @@ -5711,11 +5951,13 @@ static int mntdf(char *mntdir, char *fsname, char *pool, enum mntdf_flags flags, obd_uuid2str(&uuid_buf)) != 1) continue; - /* the llapi_obd_statfs() call may have returned with + /* + * the llapi_obd_fstatfs() call may have returned with * an error, but if it filled in uuid_buf we will at * lease use that to print out a message for that OBD. * If we didn't get anything in the uuid_buf, then fill - * it in so that we can print an error message. */ + * it in so that we can print an error message. + */ if (uuid_buf.uuid[0] == '\0') snprintf(uuid_buf.uuid, sizeof(uuid_buf.uuid), "%s%04x", tp->st_name, index); @@ -5750,7 +5992,8 @@ static int mntdf(char *mntdir, char *fsname, char *pool, enum mntdf_flags flags, close(fd); - /* If we have _some_ OSTs, but don't have as many free objects on the + /* + * If we have _some_ OSTs, but don't have as many free objects on the * OST as inodes on the MDTs, reduce the reported number of inodes * to compensate, so that the "inodes in use" number is correct. * This should be kept in sync with ll_statfs_internal(). @@ -5843,7 +6086,7 @@ static int lfs_setdirstripe(int argc, char **argv) default_stripe = true; break; case LFS_LAYOUT_FOREIGN_OPT: - if (optarg != NULL) { + if (optarg) { /* check pure numeric */ type = strtoul(optarg, &end, 0); if (*end) { @@ -5871,8 +6114,8 @@ static int lfs_setdirstripe(int argc, char **argv) break; #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) case 't': - fprintf(stderr, "warning: '--hash-type' and '-t' " - "deprecated, use '--mdt-hash' or '-H' instead\n"); + fprintf(stderr, + "warning: '--hash-type' and '-t' deprecated, use '--mdt-hash' or '-H' instead\n"); #endif case 'H': lsa.lsa_pattern = check_hashtype(optarg); @@ -5909,8 +6152,8 @@ static int lfs_setdirstripe(int argc, char **argv) break; #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 15, 53, 0) case 'm': - fprintf(stderr, "warning: '-m' is deprecated, " - "use '--mode' or '-o' instead\n"); + fprintf(stderr, + "warning: '-m' is deprecated, use '--mode' or '-o' instead\n"); #endif case 'o': mode_opt = optarg; @@ -5932,7 +6175,8 @@ static int lfs_setdirstripe(int argc, char **argv) } if (xattr && !foreign_mode) { - /* only print a warning as this is armless and will be + /* + * only print a warning as this is armless and will be * ignored */ fprintf(stderr, @@ -5970,7 +6214,7 @@ static int lfs_setdirstripe(int argc, char **argv) return CMD_HELP; } - if (mode_opt != NULL) { + if (mode_opt) { mode = strtoul(mode_opt, &end, 8); if (*end != '\0') { fprintf(stderr, @@ -6007,13 +6251,18 @@ static int lfs_setdirstripe(int argc, char **argv) param = calloc(1, offsetof(typeof(*param), lsp_tgts[lsa.lsa_stripe_count != LLAPI_LAYOUT_DEFAULT ? lsa.lsa_stripe_count : lsa.lsa_nr_tgts])); - if (param == NULL) { + if (!param) { fprintf(stderr, "%s %s: cannot allocate memory for parameters: %s\n", progname, argv[0], strerror(ENOMEM)); return CMD_HELP; } + /* if "lfs setdirstripe -D -i -1" is used, assume 1-stripe directory */ + if (default_stripe && lsa.lsa_stripe_off == -1 && + (lsa.lsa_stripe_count == LLAPI_LAYOUT_DEFAULT || + lsa.lsa_stripe_count == 0)) + lsa.lsa_stripe_count = 1; if (lsa.lsa_stripe_count != LLAPI_LAYOUT_DEFAULT) param->lsp_stripe_count = lsa.lsa_stripe_count; if (lsa.lsa_stripe_off == LLAPI_LAYOUT_DEFAULT) @@ -6061,7 +6310,7 @@ static int lfs_setdirstripe(int argc, char **argv) progname, dname, strerror(-result)); } while (!result && (dname = argv[++optind])); - if (mode_opt != NULL) + if (mode_opt) umask(previous_mode); free(param); @@ -6083,11 +6332,12 @@ static int lfs_rmentry(int argc, char **argv) index = 1; dname = argv[index]; - while (dname != NULL) { + while (dname) { result = llapi_direntry_remove(dname); if (result) { - fprintf(stderr, "error: %s: remove dir entry '%s' " - "failed\n", argv[0], dname); + fprintf(stderr, + "error: %s: remove dir entry '%s' failed\n", + argv[0], dname); break; } dname = argv[++index]; @@ -6115,8 +6365,8 @@ static int lfs_mv(int argc, char **argv) switch (c) { #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) case 'M': - fprintf(stderr, "warning: '-M' deprecated" - ", use '--mdt-index' or '-m' instead\n"); + fprintf(stderr, + "warning: '-M' deprecated, use '--mdt-index' or '-m' instead\n"); #endif case 'm': lmu.lum_stripe_offset = strtoul(optarg, &end, 0); @@ -6162,12 +6412,12 @@ static int lfs_mv(int argc, char **argv) static int lfs_osts(int argc, char **argv) { - return lfs_tgts(argc, argv); + return lfs_tgts(argc, argv); } static int lfs_mdts(int argc, char **argv) { - return lfs_tgts(argc, argv); + return lfs_tgts(argc, argv); } static int lfs_df(int argc, char **argv) @@ -6237,7 +6487,8 @@ static int print_instance(const char *mntdir, char *buf, size_t buflen, if (opt_fsname == opt_instance) { /* both true or both false */ rc = llapi_getname(mntdir, buf, buflen); } else if (opt_fsname) { - /* llapi_search_mounts() fills @buf with fsname, but that is not + /* + * llapi_search_mounts() fills @buf with fsname, but that is not * called if explicit paths are specified on the command-line */ if (buf[0] == '\0') @@ -6354,7 +6605,7 @@ static int lfs_check(int argc, char **argv) return CMD_HELP; } - rc = llapi_search_mounts(NULL, 0, mntdir, NULL); + rc = llapi_search_mounts(NULL, 0, mntdir, NULL); if (rc < 0 || mntdir[0] == '\0') { fprintf(stderr, "%s check: cannot find mounted Lustre filesystem: %s\n", @@ -6368,22 +6619,12 @@ static int lfs_check(int argc, char **argv) progname, argv[1], strerror(-rc)); return rc; - } #ifdef HAVE_SYS_QUOTA_H -#define ARG2INT(nr, str, msg) \ -do { \ - char *endp; \ - nr = strtol(str, &endp, 0); \ - if (*endp != '\0') { \ - fprintf(stderr, "%s: bad %s '%s'\n", \ - progname, msg, str); \ - return CMD_HELP; \ - } \ -} while (0) - -#define ADD_OVERFLOW(a,b) ((a + b) < a) ? (a = ULONG_MAX) : (a = a + b) +#define ADD_OVERFLOW(a, b) \ + ((((a) + (b)) < (a)) ? \ + ((a) = ULONG_MAX) : ((a) = (a) + (b))) /* Convert format time string "XXwXXdXXhXXmXXs" into seconds value * returns the value or ULONG_MAX on integer overflow or incorrect format @@ -6392,54 +6633,58 @@ do { \ * 2. specifiers may be encountered multiple times (2s3s is 5 seconds) * 3. empty integer value is interpreted as 0 */ -static unsigned long str2sec(const char* timestr) +static unsigned long str2sec(const char *timestr) { - const char spec[] = "smhdw"; - const unsigned long mult[] = {1, 60, 60*60, 24*60*60, 7*24*60*60}; - unsigned long val = 0; - char *tail; + const char spec[] = "smhdw"; + const unsigned long mult[] = {1, 60, 60*60, 24*60*60, 7*24*60*60}; + unsigned long val = 0; + char *tail; - if (strpbrk(timestr, spec) == NULL) { - /* no specifiers inside the time string, - should treat it as an integer value */ - val = strtoul(timestr, &tail, 10); - return *tail ? ULONG_MAX : val; - } + if (strpbrk(timestr, spec) == NULL) { + /* + * no specifiers inside the time string, + * should treat it as an integer value + */ + val = strtoul(timestr, &tail, 10); + return *tail ? ULONG_MAX : val; + } - /* format string is XXwXXdXXhXXmXXs */ - while (*timestr) { - unsigned long v; - int ind; - char* ptr; + /* format string is XXwXXdXXhXXmXXs */ + while (*timestr) { + unsigned long v; + int ind; + char *ptr; - v = strtoul(timestr, &tail, 10); - if (v == ULONG_MAX || *tail == '\0') - /* value too large (ULONG_MAX or more) - or missing specifier */ - goto error; + v = strtoul(timestr, &tail, 10); + if (v == ULONG_MAX || *tail == '\0') + /* + * value too large (ULONG_MAX or more) + * or missing specifier + */ + goto error; - ptr = strchr(spec, *tail); - if (ptr == NULL) - /* unknown specifier */ - goto error; + ptr = strchr(spec, *tail); + if (!ptr) + /* unknown specifier */ + goto error; - ind = ptr - spec; + ind = ptr - spec; - /* check if product will overflow the type */ - if (!(v < ULONG_MAX / mult[ind])) - goto error; + /* check if product will overflow the type */ + if (!(v < ULONG_MAX / mult[ind])) + goto error; - ADD_OVERFLOW(val, mult[ind] * v); - if (val == ULONG_MAX) - goto error; + ADD_OVERFLOW(val, mult[ind] * v); + if (val == ULONG_MAX) + goto error; - timestr = tail + 1; - } + timestr = tail + 1; + } - return val; + return val; error: - return ULONG_MAX; + return ULONG_MAX; } #define ARG2ULL(nr, str, def_units) \ @@ -6458,37 +6703,47 @@ do { \ static inline int has_times_option(int argc, char **argv) { - int i; + int i; - for (i = 1; i < argc; i++) - if (!strcmp(argv[i], "-t")) - return 1; + for (i = 1; i < argc; i++) + if (!strcmp(argv[i], "-t")) + return 1; - return 0; + return 0; +} + +static inline int lfs_verify_poolarg(char *pool) +{ + if (strnlen(optarg, LOV_MAXPOOLNAME + 1) > LOV_MAXPOOLNAME) { + fprintf(stderr, + "Pool name '%.*s' is longer than %d\n", + LOV_MAXPOOLNAME, pool, LOV_MAXPOOLNAME); + return 1; + } + return 0; } -int lfs_setquota_times(int argc, char **argv) +int lfs_setquota_times(int argc, char **argv, struct if_quotactl *qctl) { - int c, rc; - struct if_quotactl qctl; - char *mnt, *obd_type = (char *)qctl.obd_type; - struct obd_dqblk *dqb = &qctl.qc_dqblk; - struct obd_dqinfo *dqi = &qctl.qc_dqinfo; - struct option long_opts[] = { + int c, rc; + char *mnt, *obd_type = (char *)qctl->obd_type; + struct obd_dqblk *dqb = &qctl->qc_dqblk; + struct obd_dqinfo *dqi = &qctl->qc_dqinfo; + struct option long_opts[] = { { .val = 'b', .name = "block-grace", .has_arg = required_argument }, { .val = 'g', .name = "group", .has_arg = no_argument }, { .val = 'i', .name = "inode-grace", .has_arg = required_argument }, { .val = 'p', .name = "projid", .has_arg = no_argument }, { .val = 't', .name = "times", .has_arg = no_argument }, { .val = 'u', .name = "user", .has_arg = no_argument }, + { .val = 'o', .name = "pool", .has_arg = required_argument }, { .name = NULL } }; int qtype; - memset(&qctl, 0, sizeof(qctl)); - qctl.qc_cmd = LUSTRE_Q_SETINFO; - qctl.qc_type = ALLQUOTA; + qctl->qc_cmd = LUSTRE_Q_SETINFO; + qctl->qc_type = ALLQUOTA; - while ((c = getopt_long(argc, argv, "b:gi:ptu", + while ((c = getopt_long(argc, argv, "b:gi:ptuo:", long_opts, NULL)) != -1) { switch (c) { case 'u': @@ -6500,12 +6755,12 @@ int lfs_setquota_times(int argc, char **argv) case 'p': qtype = PRJQUOTA; quota_type: - if (qctl.qc_type != ALLQUOTA) { - fprintf(stderr, "error: -u/g/p can't be used " - "more than once\n"); + if (qctl->qc_type != ALLQUOTA) { + fprintf(stderr, + "error: -u/g/p can't be used more than once\n"); return CMD_HELP; } - qctl.qc_type = qtype; + qctl->qc_type = qtype; break; case 'b': if (strncmp(optarg, NOTIFY_GRACE, @@ -6514,8 +6769,9 @@ quota_type: } else { dqi->dqi_bgrace = str2sec(optarg); if (dqi->dqi_bgrace >= NOTIFY_GRACE_TIME) { - fprintf(stderr, "error: bad " - "block-grace: %s\n", optarg); + fprintf(stderr, + "error: bad block-grace: %s\n", + optarg); return CMD_HELP; } } @@ -6528,8 +6784,9 @@ quota_type: } else { dqi->dqi_igrace = str2sec(optarg); if (dqi->dqi_igrace >= NOTIFY_GRACE_TIME) { - fprintf(stderr, "error: bad " - "inode-grace: %s\n", optarg); + fprintf(stderr, + "error: bad inode-grace: %s\n", + optarg); return CMD_HELP; } } @@ -6537,33 +6794,41 @@ quota_type: break; case 't': /* Yes, of course! */ break; + case 'o': + if (lfs_verify_poolarg(optarg)) + return -1; + fprintf(stdout, + "Trying to set grace for pool %s\n", optarg); + strncpy(qctl->qc_poolname, optarg, LOV_MAXPOOLNAME); + qctl->qc_cmd = LUSTRE_Q_SETINFOPOOL; + break; /* getopt prints error message for us when opterr != 0 */ default: return CMD_HELP; } } - if (qctl.qc_type == ALLQUOTA) { + if (qctl->qc_type == ALLQUOTA) { fprintf(stderr, "error: neither -u, -g nor -p specified\n"); - return CMD_HELP; - } + return CMD_HELP; + } - if (optind != argc - 1) { - fprintf(stderr, "error: unexpected parameters encountered\n"); - return CMD_HELP; - } + if (optind != argc - 1) { + fprintf(stderr, "error: unexpected parameters encountered\n"); + return CMD_HELP; + } - mnt = argv[optind]; - rc = llapi_quotactl(mnt, &qctl); - if (rc) { - if (*obd_type) - fprintf(stderr, "%s %s ", obd_type, - obd_uuid2str(&qctl.obd_uuid)); - fprintf(stderr, "setquota failed: %s\n", strerror(-rc)); - return rc; - } + mnt = argv[optind]; + rc = llapi_quotactl(mnt, qctl); + if (rc) { + if (*obd_type) + fprintf(stderr, "%s %s ", obd_type, + obd_uuid2str(&qctl->obd_uuid)); + fprintf(stderr, "setquota failed: %s\n", strerror(-rc)); + return rc; + } - return 0; + return 0; } #define BSLIMIT (1 << 0) @@ -6574,9 +6839,9 @@ quota_type: int lfs_setquota(int argc, char **argv) { int c, rc = 0; - struct if_quotactl qctl; - char *mnt, *obd_type = (char *)qctl.obd_type; - struct obd_dqblk *dqb = &qctl.qc_dqblk; + struct if_quotactl *qctl; + char *mnt, *obd_type; + struct obd_dqblk *dqb; struct option long_opts[] = { { .val = 'b', .name = "block-softlimit", .has_arg = required_argument }, @@ -6593,79 +6858,92 @@ int lfs_setquota(int argc, char **argv) { .val = 'P', .name = "default-prj", .has_arg = no_argument }, { .val = 'u', .name = "user", .has_arg = required_argument }, { .val = 'U', .name = "default-usr", .has_arg = no_argument }, + { .val = 'o', .name = "pool", .has_arg = required_argument }, { .name = NULL } }; - unsigned limit_mask = 0; - char *endptr; + unsigned int limit_mask = 0; bool use_default = false; - int qtype; + int qtype, qctl_len; + + qctl_len = sizeof(*qctl) + LOV_MAXPOOLNAME + 1; + qctl = malloc(qctl_len); + if (!qctl) + return -ENOMEM; + + memset(qctl, 0, qctl_len); + obd_type = (char *)qctl->obd_type; + dqb = &qctl->qc_dqblk; - if (has_times_option(argc, argv)) - return lfs_setquota_times(argc, argv); + if (has_times_option(argc, argv)) { + rc = lfs_setquota_times(argc, argv, qctl); + goto out; + } - memset(&qctl, 0, sizeof(qctl)); - qctl.qc_cmd = LUSTRE_Q_SETQUOTA; - qctl.qc_type = ALLQUOTA; /* ALLQUOTA makes no sense for setquota, - * so it can be used as a marker that qc_type - * isn't reinitialized from command line */ + qctl->qc_cmd = LUSTRE_Q_SETQUOTA; + qctl->qc_type = ALLQUOTA; /* ALLQUOTA makes no sense for setquota, + * so it can be used as a marker that qc_type + * isn't reinitialized from command line + */ - while ((c = getopt_long(argc, argv, "b:B:dg:Gi:I:p:Pu:U", + while ((c = getopt_long(argc, argv, "b:B:dg:Gi:I:p:Pu:Uo:", long_opts, NULL)) != -1) { switch (c) { case 'U': - qctl.qc_cmd = LUSTRE_Q_SETDEFAULT; + qctl->qc_cmd = LUSTRE_Q_SETDEFAULT; qtype = USRQUOTA; - qctl.qc_id = 0; + qctl->qc_id = 0; goto quota_type_def; case 'u': qtype = USRQUOTA; - rc = name2uid(&qctl.qc_id, optarg); + rc = name2uid(&qctl->qc_id, optarg); goto quota_type; case 'G': - qctl.qc_cmd = LUSTRE_Q_SETDEFAULT; + qctl->qc_cmd = LUSTRE_Q_SETDEFAULT; qtype = GRPQUOTA; - qctl.qc_id = 0; + qctl->qc_id = 0; goto quota_type_def; - case 'g': + case 'g': qtype = GRPQUOTA; - rc = name2gid(&qctl.qc_id, optarg); + rc = name2gid(&qctl->qc_id, optarg); goto quota_type; case 'P': - qctl.qc_cmd = LUSTRE_Q_SETDEFAULT; + qctl->qc_cmd = LUSTRE_Q_SETDEFAULT; qtype = PRJQUOTA; - qctl.qc_id = 0; + qctl->qc_id = 0; goto quota_type_def; case 'p': qtype = PRJQUOTA; - rc = name2projid(&qctl.qc_id, optarg); + rc = name2projid(&qctl->qc_id, optarg); quota_type: if (rc) { - qctl.qc_id = strtoul(optarg, &endptr, 10); - if (*endptr != '\0') { - fprintf(stderr, "%s setquota: invalid" - " id '%s'\n", progname, optarg); - return -1; + if (str2quotaid(&qctl->qc_id, optarg)) { + fprintf(stderr, + "%s setquota: invalid id '%s'\n", + progname, optarg); + rc = -1; + goto out; } } - if (qctl.qc_id == 0) { - fprintf(stderr, "%s setquota: can't set quota" - " for root usr/group/project.\n", + if (qctl->qc_id == 0) { + fprintf(stderr, + "%s setquota: can't set quota for root usr/group/project.\n", progname); - return -1; + rc = -1; + goto out; } quota_type_def: - if (qctl.qc_type != ALLQUOTA) { + if (qctl->qc_type != ALLQUOTA) { fprintf(stderr, - "%s setquota: only one of -u, -U, -g," - " -G, -p or -P may be specified\n", + "%s setquota: only one of -u, -U, -g, -G, -p or -P may be specified\n", progname); - return CMD_HELP; + rc = CMD_HELP; + goto out; } - qctl.qc_type = qtype; + qctl->qc_type = qtype; break; case 'd': - qctl.qc_cmd = LUSTRE_Q_SETDEFAULT; + qctl->qc_cmd = LUSTRE_Q_SETDEFAULT; use_default = true; break; case 'b': @@ -6675,8 +6953,7 @@ quota_type_def: if (dqb->dqb_bsoftlimit && dqb->dqb_bsoftlimit <= 1024) /* <= 1M? */ fprintf(stderr, - "%s setquota: warning: block softlimit '%llu' smaller than minimum qunit size\n" - "See '%s help setquota' or Lustre manual for details\n", + "%s setquota: warning: block softlimit '%llu' smaller than minimum qunit size\nSee '%s help setquota' or Lustre manual for details\n", progname, (unsigned long long)dqb->dqb_bsoftlimit, progname); @@ -6700,8 +6977,7 @@ quota_type_def: if (dqb->dqb_isoftlimit && dqb->dqb_isoftlimit <= 1024) /* <= 1K inodes? */ fprintf(stderr, - "%s setquota: warning: inode softlimit '%llu' smaller than minimum qunit size\n" - "See '%s help setquota' or Lustre manual for details\n", + "%s setquota: warning: inode softlimit '%llu' smaller than minimum qunit size\nSee '%s help setquota' or Lustre manual for details\n", progname, (unsigned long long)dqb->dqb_isoftlimit, progname); @@ -6712,58 +6988,71 @@ quota_type_def: if (dqb->dqb_ihardlimit && dqb->dqb_ihardlimit <= 1024) /* <= 1K inodes? */ fprintf(stderr, - "%s setquota: warning: inode hardlimit '%llu' smaller than minimum qunit size\n" - "See '%s help setquota' or Lustre manual for details\n", + "%s setquota: warning: inode hardlimit '%llu' smaller than minimum qunit size\nSee '%s help setquota' or Lustre manual for details\n", progname, (unsigned long long)dqb->dqb_ihardlimit, progname); break; + case 'o': + if (lfs_verify_poolarg(optarg)) { + rc = -1; + goto out; + } + fprintf(stdout, + "Trying to set quota for pool %s\n", optarg); + strncpy(qctl->qc_poolname, optarg, LOV_MAXPOOLNAME); + qctl->qc_cmd = LUSTRE_Q_SETQUOTAPOOL; + break; default: fprintf(stderr, "%s setquota: unrecognized option '%s'\n", progname, argv[optind - 1]); - return CMD_HELP; + rc = CMD_HELP; + goto out; } } - if (qctl.qc_type == ALLQUOTA) { + if (qctl->qc_type == ALLQUOTA) { fprintf(stderr, "%s setquota: either -u or -g must be specified\n", progname); - return CMD_HELP; + rc = CMD_HELP; + goto out; } if (!use_default && limit_mask == 0) { fprintf(stderr, "%s setquota: at least one limit must be specified\n", progname); - return CMD_HELP; + rc = CMD_HELP; + goto out; } if (use_default && limit_mask != 0) { fprintf(stderr, - "%s setquota: limits should not be specified when" - " using default quota\n", + "%s setquota: limits should not be specified when using default quota\n", progname); - return CMD_HELP; + rc = CMD_HELP; + goto out; } - if (use_default && qctl.qc_id == 0) { + if (use_default && qctl->qc_id == 0) { fprintf(stderr, - "%s setquota: can not set default quota for root" - " user/group/project\n", + "%s setquota: can not set default quota for root user/group/project\n", progname); - return CMD_HELP; + rc = CMD_HELP; + goto out; } if (optind != argc - 1) { fprintf(stderr, "%s setquota: filesystem not specified or unexpected argument '%s'\n", progname, argv[optind]); - return CMD_HELP; + rc = CMD_HELP; + goto out; } - mnt = argv[optind]; + mnt = argv[optind]; if (use_default) { dqb->dqb_bhardlimit = 0; @@ -6777,12 +7066,12 @@ quota_type_def: (!(limit_mask & IHLIMIT) ^ !(limit_mask & ISLIMIT))) { /* sigh, we can't just set blimits/ilimits */ struct if_quotactl tmp_qctl = {.qc_cmd = LUSTRE_Q_GETQUOTA, - .qc_type = qctl.qc_type, - .qc_id = qctl.qc_id}; + .qc_type = qctl->qc_type, + .qc_id = qctl->qc_id}; rc = llapi_quotactl(mnt, &tmp_qctl); if (rc < 0) - return rc; + goto out; if (!(limit_mask & BHLIMIT)) dqb->dqb_bhardlimit = tmp_qctl.qc_dqblk.dqb_bhardlimit; @@ -6808,17 +7097,17 @@ quota_type_def: dqb->dqb_valid |= (limit_mask & (BHLIMIT | BSLIMIT)) ? QIF_BLIMITS : 0; dqb->dqb_valid |= (limit_mask & (IHLIMIT | ISLIMIT)) ? QIF_ILIMITS : 0; - rc = llapi_quotactl(mnt, &qctl); + rc = llapi_quotactl(mnt, qctl); if (rc) { if (*obd_type) fprintf(stderr, "%s setquota: cannot quotactl '%s' '%s': %s", progname, obd_type, - obd_uuid2str(&qctl.obd_uuid), strerror(-rc)); - return rc; + obd_uuid2str(&qctl->obd_uuid), strerror(-rc)); } - - return 0; +out: + free(qctl); + return rc; } /* Converts seconds value into format string @@ -6828,7 +7117,7 @@ quota_type_def: * 2. zero fields are not filled (except for p. 3): 5d1s * 3. zero seconds value is presented as "0s" */ -static char * __sec2str(time_t seconds, char *buf) +static char *__sec2str(time_t seconds, char *buf) { const char spec[] = "smhdw"; const unsigned long mult[] = {1, 60, 60*60, 24*60*60, 7*24*60*60}; @@ -6851,30 +7140,29 @@ static char * __sec2str(time_t seconds, char *buf) static void sec2str(time_t seconds, char *buf, int rc) { - char *tail = buf; + char *tail = buf; - if (rc) - *tail++ = '['; + if (rc) + *tail++ = '['; - tail = __sec2str(seconds, tail); + tail = __sec2str(seconds, tail); - if (rc && tail - buf < 39) { - *tail++ = ']'; - *tail++ = 0; - } + if (rc && tail - buf < 39) { + *tail++ = ']'; + *tail++ = 0; + } } static void diff2str(time_t seconds, char *buf, time_t now) { - - buf[0] = 0; - if (!seconds) - return; - if (seconds <= now) { - strcpy(buf, "none"); - return; - } - __sec2str(seconds - now, buf); + buf[0] = 0; + if (!seconds) + return; + if (seconds <= now) { + strcpy(buf, "none"); + return; + } + __sec2str(seconds - now, buf); } static void print_quota_title(char *name, struct if_quotactl *qctl, @@ -6927,6 +7215,7 @@ static void print_quota(char *mnt, struct if_quotactl *qctl, int type, time(&now); if (qctl->qc_cmd == LUSTRE_Q_GETQUOTA || qctl->qc_cmd == Q_GETOQUOTA || + qctl->qc_cmd == LUSTRE_Q_GETQUOTAPOOL || qctl->qc_cmd == LUSTRE_Q_GETDEFAULT) { int bover = 0, iover = 0; struct obd_dqblk *dqb = &qctl->qc_dqblk; @@ -6936,26 +7225,23 @@ static void print_quota(char *mnt, struct if_quotactl *qctl, int type, if (dqb->dqb_bhardlimit && lustre_stoqb(dqb->dqb_curspace) >= dqb->dqb_bhardlimit) { - bover = 1; - } else if (dqb->dqb_bsoftlimit && dqb->dqb_btime) { - if (dqb->dqb_btime > now) { - bover = 2; - } else { - bover = 3; - } - } - - if (dqb->dqb_ihardlimit && - dqb->dqb_curinodes >= dqb->dqb_ihardlimit) { - iover = 1; - } else if (dqb->dqb_isoftlimit && dqb->dqb_itime) { - if (dqb->dqb_itime > now) { + bover = 1; + } else if (dqb->dqb_bsoftlimit && dqb->dqb_btime) { + if (dqb->dqb_btime > now) + bover = 2; + else + bover = 3; + } + + if (dqb->dqb_ihardlimit && + dqb->dqb_curinodes >= dqb->dqb_ihardlimit) { + iover = 1; + } else if (dqb->dqb_isoftlimit && dqb->dqb_itime) { + if (dqb->dqb_itime > now) iover = 2; - } else { + else iover = 3; - } - } - + } if (strlen(mnt) > 15) printf("%s\n%15s", mnt, ""); @@ -6994,7 +7280,6 @@ static void print_quota(char *mnt, struct if_quotactl *qctl, int type, numbuf[0], bover ? '*' : ' ', numbuf[1], numbuf[2], bover > 1 ? timebuf : "-"); - if (iover) diff2str(dqb->dqb_itime, timebuf, now); else if (show_default) @@ -7024,7 +7309,7 @@ static void print_quota(char *mnt, struct if_quotactl *qctl, int type, else printf(" %7s %7s %7s %7s", "-", "-", "-", "-"); printf("\n"); - } else if (qctl->qc_cmd == LUSTRE_Q_GETINFO || + } else if (qctl->qc_cmd == LUSTRE_Q_GETINFO || LUSTRE_Q_GETINFOPOOL || qctl->qc_cmd == Q_GETOINFO) { char bgtimebuf[40]; char igtimebuf[40]; @@ -7043,35 +7328,94 @@ static void print_quota(char *mnt, struct if_quotactl *qctl, int type, } } +static int tgt_name2index(const char *tgtname, unsigned int *idx) +{ + char *dash, *endp; + + /* format is "lustre-OST0001" */ + dash = memchr(tgtname, '-', LUSTRE_MAXFSNAME + 1); + if (!dash) { + fprintf(stderr, "wrong tgtname format '%s'\n", tgtname); + return -EINVAL; + } + dash += 4; + + *idx = strtoul(dash, &endp, 16); + if (*idx > 0xffff) { + fprintf(stderr, "wrong index %s\n", tgtname); + return -ERANGE; + } + + return 0; +} + static int print_obd_quota(char *mnt, struct if_quotactl *qctl, int is_mdt, bool h, __u64 *total) { - int rc = 0, rc1 = 0, count = 0; - __u32 valid = qctl->qc_valid; + int rc = 0, rc1 = 0, count = 0, i = 0; + char **list = NULL, *buffer = NULL; + __u32 valid = qctl->qc_valid; + + if (qctl->qc_cmd == LUSTRE_Q_GETQUOTAPOOL && is_mdt) + return 0; + + /* Is it correct for the case OST0000, OST0002, OST0003 - + * we will ask OST0001 that is absent and won't ask OST0003? */ + rc = llapi_get_obd_count(mnt, &count, is_mdt); + if (rc) { + fprintf(stderr, "can not get %s count: %s\n", + is_mdt ? "mdt" : "ost", strerror(-rc)); + return rc; + } + + if (qctl->qc_cmd == LUSTRE_Q_GETQUOTAPOOL) { + char fname[PATH_MAX]; + char fsname[LUSTRE_MAXFSNAME + 1]; + int bufsize = sizeof(struct obd_uuid) * count; + + rc = llapi_search_fsname(mnt, fsname); + if (rc) { + fprintf(stderr, "cannot get fsname for mountpoint %s\n", + mnt); + goto out; + } + buffer = malloc(bufsize + sizeof(*list) * count); + if (!buffer) + return -ENOMEM; + list = (char **)(buffer + bufsize); + snprintf(fname, PATH_MAX, "%s.%s", fsname, qctl->qc_poolname); + count = llapi_get_poolmembers(fname, list, count, + buffer, bufsize); + if (count <= 0) + goto out; + } + + for (i = 0; i < count; i++) { + if (qctl->qc_cmd == LUSTRE_Q_GETQUOTAPOOL) { + unsigned int index; - rc = llapi_get_obd_count(mnt, &count, is_mdt); - if (rc) { - fprintf(stderr, "can not get %s count: %s\n", - is_mdt ? "mdt": "ost", strerror(-rc)); - return rc; - } + if (tgt_name2index(list[i], &index)) + continue; + qctl->qc_idx = index; + } else { + qctl->qc_idx = i; + } - for (qctl->qc_idx = 0; qctl->qc_idx < count; qctl->qc_idx++) { - qctl->qc_valid = is_mdt ? QC_MDTIDX : QC_OSTIDX; - rc = llapi_quotactl(mnt, qctl); - if (rc) { + qctl->qc_valid = is_mdt ? QC_MDTIDX : QC_OSTIDX; + rc = llapi_quotactl(mnt, qctl); + if (rc) { /* It is remote client case. */ if (rc == -EOPNOTSUPP) { - rc = 0; - goto out; - } + rc = 0; + goto out; + } - if (!rc1) - rc1 = rc; - fprintf(stderr, "quotactl %s%d failed.\n", - is_mdt ? "mdt": "ost", qctl->qc_idx); - continue; - } + if (!rc1) + rc1 = rc; + fprintf(stderr, "quotactl %s%d failed.\n", + is_mdt ? "mdt" : "ost", qctl->qc_idx); + continue; + } print_quota(obd_uuid2str(&qctl->obd_uuid), qctl, qctl->qc_valid, 0, h, false); @@ -7079,6 +7423,8 @@ static int print_obd_quota(char *mnt, struct if_quotactl *qctl, int is_mdt, qctl->qc_dqblk.dqb_bhardlimit; } out: + if (buffer) + free(buffer); qctl->qc_valid = valid; return rc ? : rc1; } @@ -7137,6 +7483,7 @@ static int get_print_quota(char *mnt, char *name, struct if_quotactl *qctl, } if ((qctl->qc_cmd == LUSTRE_Q_GETQUOTA || + qctl->qc_cmd == LUSTRE_Q_GETQUOTAPOOL || qctl->qc_cmd == LUSTRE_Q_GETDEFAULT) && !quiet) print_quota_title(name, qctl, human_readable, show_default); @@ -7146,14 +7493,16 @@ static int get_print_quota(char *mnt, char *name, struct if_quotactl *qctl, if (qctl->qc_valid != QC_GENERAL) mnt = ""; - inacc = (qctl->qc_cmd == LUSTRE_Q_GETQUOTA) && + inacc = (qctl->qc_cmd == LUSTRE_Q_GETQUOTA || + qctl->qc_cmd == LUSTRE_Q_GETQUOTAPOOL) && ((qctl->qc_dqblk.dqb_valid & (QIF_LIMITS|QIF_USAGE)) != (QIF_LIMITS|QIF_USAGE)); print_quota(mnt, qctl, QC_GENERAL, rc1, human_readable, show_default); if (!show_default && verbose && - qctl->qc_valid == QC_GENERAL && qctl->qc_cmd != LUSTRE_Q_GETINFO) { + qctl->qc_valid == QC_GENERAL && qctl->qc_cmd != LUSTRE_Q_GETINFO && + qctl->qc_cmd != LUSTRE_Q_GETINFOPOOL) { char strbuf[STRBUF_LEN]; rc2 = print_obd_quota(mnt, qctl, 1, human_readable, @@ -7162,9 +7511,8 @@ static int get_print_quota(char *mnt, char *name, struct if_quotactl *qctl, &total_balloc); kbytes2str(total_balloc, strbuf, sizeof(strbuf), human_readable); - printf("Total allocated inode limit: %ju, total " - "allocated block limit: %s\n", (uintmax_t)total_ialloc, - strbuf); + printf("Total allocated inode limit: %ju, total allocated block limit: %s\n", + (uintmax_t)total_ialloc, strbuf); } if (use_default_for_blk) @@ -7176,9 +7524,7 @@ static int get_print_quota(char *mnt, char *name, struct if_quotactl *qctl, *qtype_name(qctl->qc_type), qctl->qc_id); if (rc1 || rc2 || rc3 || inacc) - printf("Some errors happened when getting quota info. " - "Some devices may be not working or deactivated. " - "The data in \"[]\" is inaccurate.\n"); + printf("Some errors happened when getting quota info. Some devices may be not working or deactivated. The data in \"[]\" is inaccurate.\n"); out: if (rc1) return rc1; @@ -7246,7 +7592,13 @@ static int lfs_project(int argc, char **argv) phc.recursive = true; break; case 'p': - phc.projid = strtoul(optarg, NULL, 0); + if (str2quotaid(&phc.projid, optarg)) { + fprintf(stderr, + "Invalid project ID: %s\n", + optarg); + return CMD_HELP; + } + phc.assign_projid = true; break; @@ -7350,17 +7702,27 @@ static int lfs_quota(int argc, char **argv) { int c; char *mnt, *name = NULL; - struct if_quotactl qctl = { .qc_cmd = LUSTRE_Q_GETQUOTA, - .qc_type = ALLQUOTA }; - char *obd_uuid = (char *)qctl.obd_uuid.uuid; + struct if_quotactl *qctl; + char *obd_uuid; int rc = 0, rc1 = 0, verbose = 0, quiet = 0; - char *endptr; __u32 valid = QC_GENERAL, idx = 0; bool human_readable = false; bool show_default = false; int qtype; + struct option long_opts[] = { + { .val = 1, .name = "pool", .has_arg = required_argument }, + { .name = NULL } }; - while ((c = getopt(argc, argv, "gGi:I:o:pPqtuUvh")) != -1) { + qctl = calloc(1, sizeof(*qctl) + LOV_MAXPOOLNAME + 1); + if (!qctl) + return -ENOMEM; + + qctl->qc_cmd = LUSTRE_Q_GETQUOTA; + qctl->qc_type = ALLQUOTA; + obd_uuid = (char *)qctl->obd_uuid.uuid; + + while ((c = getopt_long(argc, argv, "gGi:I:o:pPqtuUvh", + long_opts, NULL)) != -1) { switch (c) { case 'U': show_default = true; @@ -7377,158 +7739,177 @@ static int lfs_quota(int argc, char **argv) case 'p': qtype = PRJQUOTA; quota_type: - if (qctl.qc_type != ALLQUOTA) { + if (qctl->qc_type != ALLQUOTA) { fprintf(stderr, "%s quota: only one of -u, -g, or -p may be specified\n", progname); - return CMD_HELP; + rc = CMD_HELP; + goto out; } - qctl.qc_type = qtype; + qctl->qc_type = qtype; + break; + case 't': + qctl->qc_cmd = LUSTRE_Q_GETINFO; + break; + case 'o': + valid = qctl->qc_valid = QC_UUID; + snprintf(obd_uuid, sizeof(*obd_uuid), "%s", optarg); break; - case 't': - qctl.qc_cmd = LUSTRE_Q_GETINFO; - break; - case 'o': - valid = qctl.qc_valid = QC_UUID; - snprintf(obd_uuid, sizeof(qctl.obd_uuid), "%s", optarg); - break; case 'i': - valid = qctl.qc_valid = QC_MDTIDX; - idx = qctl.qc_idx = atoi(optarg); + valid = qctl->qc_valid = QC_MDTIDX; + idx = qctl->qc_idx = atoi(optarg); if (idx == 0 && *optarg != '0') { fprintf(stderr, "%s quota: invalid MDT index '%s'\n", progname, optarg); - return CMD_HELP; + rc = CMD_HELP; + goto out; } break; case 'I': - valid = qctl.qc_valid = QC_OSTIDX; - idx = qctl.qc_idx = atoi(optarg); + valid = qctl->qc_valid = QC_OSTIDX; + idx = qctl->qc_idx = atoi(optarg); if (idx == 0 && *optarg != '0') { fprintf(stderr, "%s quota: invalid OST index '%s'\n", progname, optarg); - return CMD_HELP; + rc = CMD_HELP; + goto out; } break; - case 'v': - verbose = 1; - break; - case 'q': - quiet = 1; - break; + case 'v': + verbose = 1; + break; + case 'q': + quiet = 1; + break; case 'h': human_readable = true; break; + case 1: + if (lfs_verify_poolarg(optarg)) { + rc = -1; + goto out; + } + strncpy(qctl->qc_poolname, optarg, LOV_MAXPOOLNAME); + qctl->qc_cmd = qctl->qc_cmd == LUSTRE_Q_GETINFO ? + LUSTRE_Q_GETINFOPOOL : + LUSTRE_Q_GETQUOTAPOOL; + break; default: fprintf(stderr, "%s quota: unrecognized option '%s'\n", progname, argv[optind - 1]); - return CMD_HELP; + rc = CMD_HELP; + goto out; } } - /* current uid/gid info for "lfs quota /path/to/lustre/mount" */ - if (qctl.qc_cmd == LUSTRE_Q_GETQUOTA && qctl.qc_type == ALLQUOTA && - optind == argc - 1 && !show_default) { - - qctl.qc_cmd = LUSTRE_Q_GETQUOTA; - qctl.qc_idx = idx; + /* current uid/gid info for "lfs quota /path/to/lustre/mount" */ + if ((qctl->qc_cmd == LUSTRE_Q_GETQUOTA || + qctl->qc_cmd == LUSTRE_Q_GETQUOTAPOOL) && + qctl->qc_type == ALLQUOTA && + optind == argc - 1 && !show_default) { + qctl->qc_idx = idx; for (qtype = USRQUOTA; qtype <= GRPQUOTA; qtype++) { - qctl.qc_type = qtype; - qctl.qc_valid = valid; + qctl->qc_type = qtype; + qctl->qc_valid = valid; if (qtype == USRQUOTA) { - qctl.qc_id = geteuid(); - rc = uid2name(&name, qctl.qc_id); + qctl->qc_id = geteuid(); + rc = uid2name(&name, qctl->qc_id); } else { - qctl.qc_id = getegid(); - rc = gid2name(&name, qctl.qc_id); - memset(&qctl.qc_dqblk, 0, - sizeof(qctl.qc_dqblk)); + qctl->qc_id = getegid(); + rc = gid2name(&name, qctl->qc_id); + memset(&qctl->qc_dqblk, 0, + sizeof(qctl->qc_dqblk)); } if (rc) name = ""; mnt = argv[optind]; - rc1 = get_print_quota(mnt, name, &qctl, verbose, quiet, + rc1 = get_print_quota(mnt, name, qctl, verbose, quiet, human_readable, show_default); if (rc1 && !rc) rc = rc1; } - return rc; + goto out; /* lfs quota -u username /path/to/lustre/mount */ - } else if (qctl.qc_cmd == LUSTRE_Q_GETQUOTA) { + } else if (qctl->qc_cmd == LUSTRE_Q_GETQUOTA || + qctl->qc_cmd == LUSTRE_Q_GETQUOTAPOOL) { /* options should be followed by u/g-name and mntpoint */ if ((!show_default && optind + 2 != argc) || (show_default && optind + 1 != argc) || - qctl.qc_type == ALLQUOTA) { + qctl->qc_type == ALLQUOTA) { fprintf(stderr, "%s quota: name and mount point must be specified\n", progname); - return CMD_HELP; + rc = CMD_HELP; + goto out; } if (!show_default) { name = argv[optind++]; - switch (qctl.qc_type) { + switch (qctl->qc_type) { case USRQUOTA: - rc = name2uid(&qctl.qc_id, name); + rc = name2uid(&qctl->qc_id, name); break; case GRPQUOTA: - rc = name2gid(&qctl.qc_id, name); + rc = name2gid(&qctl->qc_id, name); break; case PRJQUOTA: - rc = name2projid(&qctl.qc_id, name); + rc = name2projid(&qctl->qc_id, name); break; default: rc = -ENOTSUP; break; } } else { - qctl.qc_valid = QC_GENERAL; - qctl.qc_cmd = LUSTRE_Q_GETDEFAULT; - qctl.qc_id = 0; + qctl->qc_valid = QC_GENERAL; + qctl->qc_cmd = LUSTRE_Q_GETDEFAULT; + qctl->qc_id = 0; } if (rc) { - qctl.qc_id = strtoul(name, &endptr, 10); - if (*endptr != '\0') { + if (str2quotaid(&qctl->qc_id, name)) { fprintf(stderr, "%s quota: invalid id '%s'\n", progname, name); - return CMD_HELP; + rc = CMD_HELP; + goto out; } } - } else if (optind + 1 != argc || qctl.qc_type == ALLQUOTA) { + } else if (optind + 1 != argc || qctl->qc_type == ALLQUOTA) { fprintf(stderr, "%s quota: missing quota info argument(s)\n", progname); - return CMD_HELP; + rc = CMD_HELP; + goto out; } mnt = argv[optind]; - rc = get_print_quota(mnt, name, &qctl, verbose, quiet, + rc = get_print_quota(mnt, name, qctl, verbose, quiet, human_readable, show_default); +out: + free(qctl); return rc; } #endif /* HAVE_SYS_QUOTA_H! */ static int flushctx_ioctl(char *mp) { - int fd, rc; + int fd, rc; - fd = open(mp, O_RDONLY); - if (fd == -1) { - fprintf(stderr, "flushctx: error open %s: %s\n", - mp, strerror(errno)); - return -1; - } + fd = open(mp, O_RDONLY); + if (fd == -1) { + fprintf(stderr, "flushctx: error open %s: %s\n", + mp, strerror(errno)); + return -1; + } - rc = ioctl(fd, LL_IOC_FLUSHCTX); - if (rc == -1) - fprintf(stderr, "flushctx: error ioctl %s: %s\n", - mp, strerror(errno)); + rc = ioctl(fd, LL_IOC_FLUSHCTX); + if (rc == -1) + fprintf(stderr, "flushctx: error ioctl %s: %s\n", + mp, strerror(errno)); - close(fd); - return rc; + close(fd); + return rc; } static int lfs_flushctx(int argc, char **argv) @@ -7538,24 +7919,28 @@ static int lfs_flushctx(int argc, char **argv) int index = 0; int rc = 0; - while ((c = getopt(argc, argv, "k")) != -1) { - switch (c) { - case 'k': - kdestroy = 1; - break; - default: - fprintf(stderr, "error: %s: option '-%c' " - "unrecognized\n", argv[0], c); - return CMD_HELP; - } - } - - if (kdestroy) { - if ((rc = system("kdestroy > /dev/null")) != 0) { - rc = WEXITSTATUS(rc); - fprintf(stderr, "error destroying tickets: %d, continuing\n", rc); - } - } + while ((c = getopt(argc, argv, "k")) != -1) { + switch (c) { + case 'k': + kdestroy = 1; + break; + default: + fprintf(stderr, + "error: %s: option '-%c' unrecognized\n", + argv[0], c); + return CMD_HELP; + } + } + + if (kdestroy) { + rc = system("kdestroy > /dev/null"); + if (rc) { + rc = WEXITSTATUS(rc); + fprintf(stderr, + "error destroying tickets: %d, continuing\n", + rc); + } + } if (optind >= argc) { /* flush for all mounted lustre fs. */ @@ -7569,14 +7954,14 @@ static int lfs_flushctx(int argc, char **argv) mntdir[0] = '\0'; /* avoid matching in next loop */ } - } else { - /* flush fs as specified */ - while (optind < argc) { - if (flushctx_ioctl(argv[optind++])) - rc = -1; - } - } - return rc; + } else { + /* flush fs as specified */ + while (optind < argc) { + if (flushctx_ioctl(argv[optind++])) + rc = -1; + } + } + return rc; } static int lfs_changelog(int argc, char **argv) @@ -7593,28 +7978,28 @@ static int lfs_changelog(int argc, char **argv) while ((rc = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { - switch (rc) { - case 'f': - follow++; - break; - default: + switch (rc) { + case 'f': + follow++; + break; + default: fprintf(stderr, "%s changelog: unrecognized option '%s'\n", progname, argv[optind - 1]); - return CMD_HELP; - } - } + return CMD_HELP; + } + } if (optind >= argc) { fprintf(stderr, "%s changelog: mdtname must be specified\n", progname); return CMD_HELP; } - mdd = argv[optind++]; - if (argc > optind) - startrec = strtoll(argv[optind++], NULL, 10); - if (argc > optind) - endrec = strtoll(argv[optind++], NULL, 10); + mdd = argv[optind++]; + if (argc > optind) + startrec = strtoll(argv[optind++], NULL, 10); + if (argc > optind) + endrec = strtoll(argv[optind++], NULL, 10); rc = llapi_changelog_start(&changelog_priv, CHANGELOG_FLAG_BLOCK | @@ -7714,7 +8099,6 @@ static int lfs_changelog(int argc, char **argv) if (strcmp(mode, "---") != 0) printf(" m=%s", mode); - } if (ef->cr_extra_flags & CLFE_XATTR) { @@ -7790,8 +8174,9 @@ static int lfs_fid2path(int argc, char **argv) { .val = 'l', .name = "link", .has_arg = required_argument }, { .val = 'r', .name = "rec", .has_arg = required_argument }, { .name = NULL } }; - char short_opts[] = "cl:r:"; - char *device, *fid, *path; + char short_opts[] = "cl:r:"; + char mntdir[PATH_MAX]; + char *device, *fid, *path, *rootpath; long long recno = -1; int linkno = -1; int lnktmp; @@ -7840,7 +8225,7 @@ static int lfs_fid2path(int argc, char **argv) device = argv[optind++]; path = calloc(1, PATH_MAX); - if (path == NULL) { + if (!path) { rc = -errno; fprintf(stderr, "%s fid2path: cannot allocate memory for path: %s\n", @@ -7849,6 +8234,18 @@ static int lfs_fid2path(int argc, char **argv) } rc = 0; + /* in case that device is not the mountpoint */ + if (device[0] == '/') { + rc = llapi_search_mounts(device, 0, mntdir, NULL); + if (rc == 0) { + rootpath = mntdir; + } else { + fprintf(stderr, + "%s fid2path: %s has no mountpoint: %s\n", + progname, device, strerror(-rc)); + goto out; + } + } while (optind < argc) { fid = argv[optind++]; @@ -7857,12 +8254,14 @@ static int lfs_fid2path(int argc, char **argv) int oldtmp = lnktmp; long long rectmp = recno; int rc2; + rc2 = llapi_fid2path(device, fid, path, PATH_MAX, &rectmp, &lnktmp); if (rc2 < 0) { fprintf(stderr, - "%s fid2path: cannot find '%s': %s\n", - progname, fid, strerror(errno = -rc2)); + "%s fid2path: cannot find %s %s: %s\n", + progname, device, fid, + strerror(errno = -rc2)); if (rc == 0) rc = rc2; break; @@ -7871,8 +8270,8 @@ static int lfs_fid2path(int argc, char **argv) if (printcur) fprintf(stdout, "%lld ", rectmp); if (device[0] == '/') { - fprintf(stdout, "%s", device); - if (device[strlen(device) - 1] != '/') + fprintf(stdout, "%s", rootpath); + if (rootpath[strlen(rootpath) - 1] != '/') fprintf(stdout, "/"); } else if (path[0] == '\0') { fprintf(stdout, "/"); @@ -7887,7 +8286,7 @@ static int lfs_fid2path(int argc, char **argv) break; } } - +out: free(path); return rc; } @@ -7922,13 +8321,14 @@ static int lfs_path2fid(int argc, char **argv) fprintf(stderr, "%s path2fid: FILE... must be specified\n", progname); return CMD_HELP; - } - else if (optind < argc - 1) + } else if (optind < argc - 1) { sep = ": "; + } rc = 0; for (path = argv + optind; *path != NULL; path++) { int err = 0; + if (!show_parents) { err = llapi_path2fid(*path, &fid); if (!err) @@ -8015,7 +8415,7 @@ static int lfs_rmfid(int argc, char **argv) nr = argc - optind; fa = malloc(offsetof(struct fid_array, fa_fids[nr + 1])); - if (fa == NULL) + if (!fa) return -ENOMEM; fa->fa_nr = 0; @@ -8231,7 +8631,6 @@ static int lfs_hsm_change_flags(int argc, char **argv, int mode) return CMD_HELP; while (optind < argc) { - path = argv[optind]; /* If mode == 0, this means we apply the mask. */ @@ -8334,7 +8733,8 @@ static int lfs_hsm_prepare_file(const char *file, struct lu_fid *fid, fprintf(stderr, "Cannot stat %s: %s\n", file, strerror(errno)); return -errno; } - /* Checking for regular file as archiving as posix copytool + /* + * Checking for regular file as archiving as posix copytool * rejects archiving files other than regular files */ if (!S_ISREG(st.st_mode)) { @@ -8343,8 +8743,9 @@ static int lfs_hsm_prepare_file(const char *file, struct lu_fid *fid, } /* A request should be ... */ if (*last_dev != st.st_dev && *last_dev != 0) { - fprintf(stderr, "All files should be " - "on the same filesystem: %s\n", file); + fprintf(stderr, + "All files should be on the same filesystem: %s\n", + file); return -EINVAL; } *last_dev = st.st_dev; @@ -8382,7 +8783,7 @@ static int fill_hur_item(struct hsm_user_request *hur, unsigned int idx, hui->hui_extent.length = -1; - if (mntpath != NULL) { + if (mntpath) { rc = llapi_fid_parse(fname, &hui->hui_fid, NULL); if (rc) fprintf(stderr, "hsm: '%s' is not a valid FID\n", @@ -8405,23 +8806,23 @@ static int lfs_hsm_request(int argc, char **argv, int action) { .val = 'l', .name = "filelist", .has_arg = required_argument }, { .val = 'm', .name = "mntpath", .has_arg = required_argument }, { .name = NULL } }; - dev_t last_dev = 0; - char short_opts[] = "l:D:a:m:"; - struct hsm_user_request *hur, *oldhur; - int c, i; - size_t len; - int nbfile; - char *line = NULL; - char *filelist = NULL; - char fullpath[PATH_MAX]; - char *opaque = NULL; - int opaque_len = 0; - int archive_id = 0; - FILE *fp; - int nbfile_alloc = 0; - char *some_file = NULL; - char *mntpath = NULL; - int rc; + dev_t last_dev = 0; + char short_opts[] = "l:D:a:m:"; + struct hsm_user_request *hur, *oldhur; + int c, i; + size_t len; + int nbfile; + char *line = NULL; + char *filelist = NULL; + char fullpath[PATH_MAX]; + char *opaque = NULL; + int opaque_len = 0; + int archive_id = 0; + FILE *fp; + int nbfile_alloc = 0; + char *some_file = NULL; + char *mntpath = NULL; + int rc; if (argc < 2) return CMD_HELP; @@ -8439,14 +8840,13 @@ static int lfs_hsm_request(int argc, char **argv, int action) if (action != HUA_ARCHIVE && action != HUA_REMOVE) { fprintf(stderr, - "error: -a is supported only " - "when archiving or removing\n"); + "error: -a is supported only when archiving or removing\n"); return CMD_HELP; } archive_id = atoi(optarg); break; case 'm': - if (some_file == NULL) { + if (!some_file) { mntpath = optarg; some_file = strdup(optarg); } @@ -8463,16 +8863,18 @@ static int lfs_hsm_request(int argc, char **argv, int action) /* All remaining args are files, so we have at least nbfile */ nbfile = argc - optind; - if ((nbfile == 0) && (filelist == NULL)) + if ((nbfile == 0) && (!filelist)) return CMD_HELP; - if (opaque != NULL) + if (opaque) opaque_len = strlen(opaque); - /* Alloc the request structure with enough place to store all files - * from command line. */ + /* + * Alloc the request structure with enough place to store all files + * from command line. + */ hur = llapi_hsm_user_request_alloc(nbfile, opaque_len); - if (hur == NULL) { + if (!hur) { fprintf(stderr, "Cannot create the request: %s\n", strerror(errno)); return errno; @@ -8497,9 +8899,9 @@ static int lfs_hsm_request(int argc, char **argv, int action) /* from here stop using nb_file, use hur->hur_request.hr_itemcount */ /* If a filelist was specified, read the filelist from it. */ - if (filelist != NULL) { + if (filelist) { fp = fopen(filelist, "r"); - if (fp == NULL) { + if (!fp) { fprintf(stderr, "Cannot read the file list %s: %s\n", filelist, strerror(errno)); rc = -errno; @@ -8507,8 +8909,10 @@ static int lfs_hsm_request(int argc, char **argv, int action) } while ((rc = getline(&line, &len, fp)) != -1) { - /* If allocated buffer was too small, get something - * larger */ + /* + * If allocated buffer was too small, get something + * larger + */ if (nbfile_alloc <= hur->hur_request.hr_itemcount) { ssize_t size; @@ -8516,9 +8920,9 @@ static int lfs_hsm_request(int argc, char **argv, int action) oldhur = hur; hur = llapi_hsm_user_request_alloc(nbfile_alloc, opaque_len); - if (hur == NULL) { - fprintf(stderr, "hsm: cannot allocate " - "the request: %s\n", + if (!hur) { + fprintf(stderr, + "hsm: cannot allocate the request: %s\n", strerror(errno)); hur = oldhur; rc = -errno; @@ -8527,10 +8931,10 @@ static int lfs_hsm_request(int argc, char **argv, int action) } size = hur_len(oldhur); if (size < 0) { - fprintf(stderr, "hsm: cannot allocate " - "%u files + %u bytes data\n", - oldhur->hur_request.hr_itemcount, - oldhur->hur_request.hr_data_len); + fprintf(stderr, + "hsm: cannot allocate %u files + %u bytes data\n", + oldhur->hur_request.hr_itemcount, + oldhur->hur_request.hr_data_len); free(hur); hur = oldhur; rc = -E2BIG; @@ -8552,7 +8956,7 @@ static int lfs_hsm_request(int argc, char **argv, int action) goto out_free; } - if (some_file == NULL) { + if (!some_file) { some_file = line; line = NULL; } @@ -8564,7 +8968,7 @@ static int lfs_hsm_request(int argc, char **argv, int action) /* If a --data was used, add it to the request */ hur->hur_request.hr_data_len = opaque_len; - if (opaque != NULL) + if (opaque) memcpy(hur_data(hur), opaque, opaque_len); /* Send the HSM request */ @@ -8685,8 +9089,9 @@ static int lfs_ladvise(int argc, char **argv) case 'a': advice_type = lfs_get_ladvice(optarg); if (advice_type == LU_LADVISE_INVALID) { - fprintf(stderr, "%s: invalid advice type " - "'%s'\n", argv[0], optarg); + fprintf(stderr, + "%s: invalid advice type '%s'\n", + argv[0], optarg); fprintf(stderr, "Valid types:"); for (advice_type = 0; @@ -8723,8 +9128,9 @@ static int lfs_ladvise(int argc, char **argv) rc = llapi_parse_size(optarg, &start, &size_units, 0); if (rc) { - fprintf(stderr, "%s: bad start offset " - "'%s'\n", argv[0], optarg); + fprintf(stderr, + "%s: bad start offset '%s'\n", + argv[0], optarg); return CMD_HELP; } break; @@ -8741,8 +9147,8 @@ static int lfs_ladvise(int argc, char **argv) case 'm': mode = lfs_get_mode(optarg); if (mode < 0) { - fprintf(stderr, "%s: bad mode '%s', valid " - "modes are READ or WRITE\n", + fprintf(stderr, + "%s: bad mode '%s', valid modes are READ or WRITE\n", argv[0], optarg); return CMD_HELP; } @@ -8770,9 +9176,9 @@ static int lfs_ladvise(int argc, char **argv) } if (advice_type == LU_LADVISE_LOCKNOEXPAND) { - fprintf(stderr, "%s: Lock no expand advice is a per file " - "descriptor advice, so when called from lfs, " - "it does nothing.\n", argv[0]); + fprintf(stderr, + "%s: Lock no expand advice is a per file descriptor advice, so when called from lfs, it does nothing.\n", + argv[0]); return CMD_HELP; } @@ -8837,9 +9243,9 @@ static int lfs_ladvise(int argc, char **argv) rc2 = llapi_ladvise(fd, flags, 1, &advice); close(fd); if (rc2 < 0) { - fprintf(stderr, "%s: cannot give advice '%s' to file " - "'%s': %s\n", argv[0], - ladvise_names[advice_type], + fprintf(stderr, + "%s: cannot give advice '%s' to file '%s': %s\n", + argv[0], ladvise_names[advice_type], path, strerror(errno)); goto next; @@ -8887,8 +9293,9 @@ static int lfs_heat_get(int argc, char **argv) rc2 = llapi_heat_get(fd, heat); close(fd); if (rc2 < 0) { - fprintf(stderr, "%s: cannot get heat of file '%s'" - ": %s\n", argv[0], path, strerror(errno)); + fprintf(stderr, + "%s: cannot get heat of file '%s': %s\n", + argv[0], path, strerror(errno)); goto next; } @@ -8963,8 +9370,9 @@ static int lfs_heat_set(int argc, char **argv) rc2 = llapi_heat_set(fd, flags); close(fd); if (rc2 < 0) { - fprintf(stderr, "%s: cannot setflags heat of file '%s'" - ": %s\n", argv[0], path, strerror(errno)); + fprintf(stderr, + "%s: cannot setflags heat of file '%s': %s\n", + argv[0], path, strerror(errno)); goto next; } next: @@ -8974,7 +9382,8 @@ next: return rc; } -/** The input string contains a comma delimited list of component ids and +/** + * The input string contains a comma delimited list of component ids and * ranges, for example "1,2-4,7". */ static int parse_mirror_ids(__u16 *ids, int size, char *arg) @@ -8984,7 +9393,7 @@ static int parse_mirror_ids(__u16 *ids, int size, char *arg) int nr = 0; int rc; - if (arg == NULL) + if (!arg) return -EINVAL; while (!end_of_loop) { @@ -9036,7 +9445,7 @@ static int parse_mirror_ids(__u16 *ids, int size, char *arg) arg = ++ptr; rc = 0; } - if (!end_of_loop && ptr != NULL) + if (!end_of_loop && ptr) *ptr = ','; return rc < 0 ? rc : nr; @@ -9147,7 +9556,7 @@ int verify_mirror_ids(const char *fname, __u16 *mirror_ids, int ids_nr) } layout = llapi_layout_get_by_fd(fd, 0); - if (layout == NULL) { + if (!layout) { fprintf(stderr, "%s: '%s' llapi_layout_get_by_fd failed: %s.\n", progname, fname, strerror(errno)); rc = -errno; @@ -9245,7 +9654,7 @@ int lfs_mirror_resync_file(const char *fname, struct ll_ioc_lease *ioc, } layout = llapi_layout_get_by_fd(fd, 0); - if (layout == NULL) { + if (!layout) { fprintf(stderr, "%s: '%s' llapi_layout_get_by_fd failed: %s.\n", progname, fname, strerror(errno)); rc = -errno; @@ -9392,7 +9801,6 @@ static inline int lfs_mirror_resync(int argc, char **argv) argv[0]); rc = CMD_HELP; goto error; - } if (ids_nr > 0) { @@ -9403,7 +9811,7 @@ static inline int lfs_mirror_resync(int argc, char **argv) /* set the lease on the file */ ioc = calloc(sizeof(*ioc) + sizeof(__u32) * 4096, 1); - if (ioc == NULL) { + if (!ioc) { fprintf(stderr, "%s: cannot alloc id array for ioc: %s.\n", argv[0], strerror(errno)); rc = -errno; @@ -9430,7 +9838,7 @@ static inline int verify_mirror_id_by_fd(int fd, __u16 mirror_id) int rc; layout = llapi_layout_get_by_fd(fd, 0); - if (layout == NULL) { + if (!layout) { fprintf(stderr, "could not get layout.\n"); return -EINVAL; } @@ -9834,7 +10242,7 @@ static inline int get_other_mirror_ids(int fd, __u16 *ids, __u16 exclude_id) int rc; layout = llapi_layout_get_by_fd(fd, 0); - if (layout == NULL) { + if (!layout) { fprintf(stderr, "could not get layout\n"); return -EINVAL; } @@ -9980,7 +10388,7 @@ static inline int lfs_mirror_copy(int argc, char **argv) } ioc = calloc(sizeof(*ioc) + sizeof(__u32) * 4096, 1); - if (ioc == NULL) { + if (!ioc) { fprintf(stderr, "%s %s: cannot alloc comp id array for ioc: %s\n", progname, argv[0], strerror(errno)); @@ -9990,7 +10398,7 @@ static inline int lfs_mirror_copy(int argc, char **argv) /* get stale component info */ layout = llapi_layout_get_by_fd(fd, 0); - if (layout == NULL) { + if (!layout) { fprintf(stderr, "%s %s: failed to get layout of '%s': %s\n", progname, argv[0], fname, strerror(errno)); rc = -errno; @@ -10067,6 +10475,7 @@ close_fd: return rc; } + /** * struct verify_chunk - Mirror chunk to be verified. * @chunk: [start, end) of the chunk. @@ -10293,7 +10702,7 @@ int lfs_mirror_prepare_chunk(struct llapi_layout *layout, goto error; } - next: +next: rc = llapi_layout_comp_use(layout, LLAPI_LAYOUT_COMP_USE_NEXT); if (rc < 0) { @@ -10501,7 +10910,7 @@ int lfs_mirror_verify_file(const char *fname, __u16 *mirror_ids, int ids_nr, } layout = llapi_layout_get_by_fd(fd, 0); - if (layout == NULL) { + if (!layout) { fprintf(stderr, "%s: '%s' llapi_layout_get_by_fd failed: %s.\n", progname, fname, strerror(errno)); rc = -errno; @@ -10680,7 +11089,6 @@ static inline int lfs_mirror_verify(int argc, char **argv) progname); rc = CMD_HELP; goto error; - } if (ids_nr > 0) { @@ -10858,8 +11266,9 @@ static int lfs_pcc_attach(int argc, char **argv) case 'i': archive_id = strtoul(optarg, &end, 0); if (*end != '\0' || archive_id == 0) { - fprintf(stderr, "error: %s: bad archive ID " - "'%s'\n", argv[0], optarg); + fprintf(stderr, + "error: %s: bad archive ID '%s'\n", + argv[0], optarg); return CMD_HELP; } break; @@ -10887,7 +11296,7 @@ static int lfs_pcc_attach(int argc, char **argv) int rc2; path = argv[optind++]; - if (realpath(path, fullpath) == NULL) { + if (!realpath(path, fullpath)) { fprintf(stderr, "%s: could not find path '%s': %s\n", argv[0], path, strerror(errno)); if (rc == 0) @@ -10897,9 +11306,9 @@ static int lfs_pcc_attach(int argc, char **argv) rc2 = llapi_pcc_attach(fullpath, archive_id, type); if (rc2 < 0) { - fprintf(stderr, "%s: cannot attach '%s' to PCC " - "with archive ID '%u': %s\n", argv[0], - path, archive_id, strerror(-rc2)); + fprintf(stderr, + "%s: cannot attach '%s' to PCC with archive ID '%u': %s\n", + argv[0], path, archive_id, strerror(-rc2)); if (rc == 0) rc = rc2; } @@ -10929,8 +11338,9 @@ static int lfs_pcc_attach_fid(int argc, char **argv) case 'i': archive_id = strtoul(optarg, &end, 0); if (*end != '\0') { - fprintf(stderr, "error: %s: bad archive ID " - "'%s'\n", argv[0], optarg); + fprintf(stderr, + "error: %s: bad archive ID '%s'\n", + argv[0], optarg); return CMD_HELP; } break; @@ -10951,7 +11361,7 @@ static int lfs_pcc_attach_fid(int argc, char **argv) return CMD_HELP; } - if (mntpath == NULL) { + if (!mntpath) { fprintf(stderr, "%s: must specify Lustre mount point\n", argv[0]); return CMD_HELP; @@ -10970,9 +11380,10 @@ static int lfs_pcc_attach_fid(int argc, char **argv) rc2 = llapi_pcc_attach_fid_str(mntpath, fidstr, archive_id, type); if (rc2 < 0) { - fprintf(stderr, "%s: cannot attach '%s' on '%s' to PCC " - "with archive ID '%u': %s\n", argv[0], - fidstr, mntpath, archive_id, strerror(rc2)); + fprintf(stderr, + "%s: cannot attach '%s' on '%s' to PCC with archive ID '%u': %s\n", + argv[0], fidstr, mntpath, archive_id, + strerror(rc2)); } if (rc == 0 && rc2 < 0) rc = rc2; @@ -11012,7 +11423,7 @@ static int lfs_pcc_detach(int argc, char **argv) int rc2; path = argv[optind++]; - if (realpath(path, fullpath) == NULL) { + if (!realpath(path, fullpath)) { fprintf(stderr, "%s: could not find path '%s': %s\n", argv[0], path, strerror(errno)); if (rc == 0) @@ -11023,8 +11434,9 @@ static int lfs_pcc_detach(int argc, char **argv) rc2 = llapi_pcc_detach_file(fullpath, detach_opt); if (rc2 < 0) { rc2 = -errno; - fprintf(stderr, "%s: cannot detach '%s' from PCC: " - "%s\n", argv[0], path, strerror(errno)); + fprintf(stderr, + "%s: cannot detach '%s' from PCC: %s\n", + argv[0], path, strerror(errno)); if (rc == 0) rc = rc2; } @@ -11069,9 +11481,9 @@ static int lfs_pcc_detach_fid(int argc, char **argv) rc2 = llapi_pcc_detach_fid_str(mntpath, fid, detach_opt); if (rc2 < 0) { - fprintf(stderr, "%s: cannot detach '%s' on '%s' " - "from PCC: %s\n", argv[0], fid, mntpath, - strerror(-rc2)); + fprintf(stderr, + "%s: cannot detach '%s' on '%s' from PCC: %s\n", + argv[0], fid, mntpath, strerror(-rc2)); if (rc == 0) rc = rc2; } @@ -11098,7 +11510,7 @@ static int lfs_pcc_state(int argc, char **argv) int rc2; path = argv[optind++]; - if (realpath(path, fullpath) == NULL) { + if (!realpath(path, fullpath)) { fprintf(stderr, "%s: could not find path '%s': %s\n", argv[0], path, strerror(errno)); if (rc == 0) @@ -11110,8 +11522,9 @@ static int lfs_pcc_state(int argc, char **argv) if (rc2 < 0) { if (rc == 0) rc = rc2; - fprintf(stderr, "%s: cannot get PCC state of '%s': " - "%s\n", argv[0], path, strerror(-rc2)); + fprintf(stderr, + "%s: cannot get PCC state of '%s': %s\n", + argv[0], path, strerror(-rc2)); continue; }