X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Flfs.c;h=1753019ef82e00fbcca61db1d826fd39ab8fd441;hp=4407f56b24a5de8f60193e46d5b865e2d122669d;hb=f530ecc221ac345ba1aac5ff1cdf6420ac7651d3;hpb=09f9fb3211cd998c87e26df5217cc4ad84e6ce0b diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 4407f56..1753019 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -185,6 +185,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 +202,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 +303,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 +317,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" @@ -457,14 +464,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" @@ -1983,6 +1992,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; @@ -2021,22 +2031,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); @@ -2079,7 +2102,7 @@ static int mirror_split(const char *fname, __u32 id, const char *pool, if (victim_file == NULL) { /* 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", @@ -2091,7 +2114,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 { @@ -2126,7 +2149,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 */ @@ -2616,26 +2639,75 @@ 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 == NULL) + 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) return -EINVAL; - string = node->cy_string; /* skip leading lmm_ if present, to simplify parsing */ if (strncmp(string, "lmm_", 4) == 0) string += 4; @@ -2669,18 +2741,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; @@ -2690,6 +2752,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")) { @@ -2701,6 +2766,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; } @@ -2728,13 +2802,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); @@ -2833,7 +2905,7 @@ static int layout_adjust_first_extent(char *fname, struct llapi_layout *layout, uint64_t end; int rc, ret = 0; - if (layout == NULL) + if (layout == NULL || !(comp_add || llapi_layout_is_composite(layout))) return 0; errno = 0; @@ -3069,6 +3141,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, @@ -3748,21 +3821,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", @@ -3915,6 +3973,21 @@ 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; + } + } + for (fname = argv[optind]; fname != NULL; fname = argv[++optind]) { if (from_copy) { layout = llapi_layout_get_by_path(template ?: fname, 0); @@ -4168,6 +4241,8 @@ static int lfs_find(int argc, char **argv) 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, @@ -4196,23 +4271,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 }, @@ -4278,8 +4379,8 @@ 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) { + "-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) @@ -4318,6 +4419,13 @@ static int lfs_find(int argc, char **argv) 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') { @@ -4562,6 +4670,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; @@ -4603,6 +4729,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", @@ -4974,6 +5104,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, @@ -5526,15 +5658,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,