" [--overstripe-count|-C <stripe_count>]\n" \
" [--stripe-index|-i <start_ost_idx>]\n" \
" [--stripe-size|-S <stripe_size>]\n" \
- " [--compress|-Z <type>[:<level>]\n" \
- " [--compress-chunk=<size>]\n" \
+ " [--compress|-Z <compr_type>[:<compr_level>]\n"\
+ " [--compress-type=<compress_type>\n" \
+ " [--compress-level=<compress_level>\n" \
+ " [--compress-chunk=<chunk_size>]\n" \
" [--extension-size|--ext-size|-z]\n" \
" [--layout|-L <pattern>]\n" \
" [--mirror-count|-N[mirror_count]]\n" \
" [--extension-size|--ext-size|-z]\n"
" [--component-start[=[+-]comp_start]]\n"
" [--component-end[=[+-]comp_end]|-E[[+-]comp_end]]\n"
+ " [--compress|--compr|-Z]\n"
" [--compress-type|--compr-type]\n"
" [--compress-level|--compr-level]\n"
" [--compress-chunk|--compr-chunk]\n"
" [[!] --component-start [+-]N[kMGTPE]]\n"
" [[!] --component-end|-E [+-]N[kMGTPE]]\n"
" [[!] --component-flags {init,stale,prefer,offline,nosync,extension}]\n"
- " [[!] --compress-type=<compress-type>\n"
- " [[!] --compress-level=[+-]<compress-level>\n"
+ " [[!] --compress|--compr|-Z <compr_type>[:[+-]<compr_level>]\n"
+ " [[!] --compress-type=<compress_type>\n"
+ " [[!] --compress-level=[+-]<compress_level>\n"
+ " [[!] --compress-chunk=[+-]<chunk_size>[kM]\n"
" [[!] --extension-size|--ext-size|-z [+-]N[kMGT]]\n"
" [[!] --foreign[=<foreign_type>]]\n"
" [[!] --gid|-g|--group|-G <gid>|<gname>]\n"
.has_arg = no_argument},
{ .val = LFS_COMP_NO_VERIFY_OPT,
.name = "no-verify", .has_arg = no_argument},
+ { .val = LFS_COMPRESS_TYPE_OPT,
+ .name = "compress-type", .has_arg = required_argument},
+ { .val = LFS_COMPRESS_TYPE_OPT,
+ .name = "compr-type", .has_arg = required_argument},
+ { .val = LFS_COMPRESS_LEVEL_OPT,
+ .name = "compress-level", .has_arg = required_argument},
+ { .val = LFS_COMPRESS_LEVEL_OPT,
+ .name = "compr-level", .has_arg = required_argument},
+ { .val = LFS_COMPRESS_CHUNK_OPT,
+ .name = "compress-chunk", .has_arg = required_argument},
+ { .val = LFS_COMPRESS_CHUNK_OPT,
+ .name = "compr-chunk", .has_arg = required_argument},
{ .val = LFS_LAYOUT_FLAGS_OPT,
.name = "flags", .has_arg = required_argument},
{ .val = LFS_LAYOUT_FOREIGN_OPT,
{ .val = LFS_STATS_INTERVAL_OPT,
.name = "stats-interval",
.has_arg = required_argument},
- { .val = LFS_COMPRESS_CHUNK_OPT,
- .name = "compress-chunk", .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 = "mdt-count", .has_arg = required_argument},
lsa.lsa_extension_comp = true;
break;
+ case LFS_COMPRESS_TYPE_OPT:
case 'Z':
if (layout == NULL && mirror_list == NULL &&
lsa.lsa_comp_end == 0)
result = llapi_parse_compress_type(optarg,
&lsa.lsa_compr_type,
- &lsa.lsa_compr_lvl);
+ &lsa.lsa_compr_lvl,
+ NULL);
if (result) {
fprintf(stderr,
"%s %s: invalid compression type/level '%s'\n",
goto usage_error;
}
break;
+ case LFS_COMPRESS_LEVEL_OPT:
+ lsa.lsa_compr_lvl = strtoul(optarg, &end, 0);
+ if (*end != '\0' ||
+ lsa.lsa_compr_lvl > COMPR_LEVEL_MAX) {
+ fprintf(stderr,
+ "%s %s: invalid compression level '%s'\n",
+ progname, argv[0], optarg);
+ goto usage_error;
+ }
+ break;
case LFS_COMPRESS_CHUNK_OPT: {
unsigned long long chunk_size;
size_units = 1024; /* default in KiB */
result = llapi_parse_size(optarg, &chunk_size,
&size_units, 1);
- if (result) {
+ if (result ||
+ chunk_size > 1ULL << COMPR_CHUNK_MAX_BITS) {
fprintf(stderr,
- "%s %s: invalid compress chunk size '%s'\n",
+ "%s %s: invalid compression chunk size '%s'\n",
progname, argv[0], optarg);
goto usage_error;
}
lsa.lsa_compr_chunk_size = chunk_size;
- }
break;
+ }
default:
fprintf(stderr, "%s %s: unrecognized option '%s'\n",
progname, argv[0], argv[optind - 1]);
.name = "component-start",
.has_arg = required_argument },
{ .val = LFS_COMPRESS_TYPE_OPT,
- .name = "compr-type",
- .has_arg = required_argument },
+ .name = "compress-type", .has_arg = required_argument },
{ .val = LFS_COMPRESS_TYPE_OPT,
- .name = "compress-type",
- .has_arg = required_argument },
+ .name = "compr-type", .has_arg = required_argument },
{ .val = LFS_COMPRESS_LEVEL_OPT,
- .name = "compr-level",
- .has_arg = required_argument },
+ .name = "compress-level", .has_arg = required_argument },
{ .val = LFS_COMPRESS_LEVEL_OPT,
- .name = "compress-level",
- .has_arg = required_argument },
+ .name = "compr-level", .has_arg = required_argument },
{ .val = LFS_COMPRESS_CHUNK_OPT,
- .name = "compr-chunk",
- .has_arg = required_argument },
+ .name = "compress-chunk", .has_arg = required_argument },
{ .val = LFS_COMPRESS_CHUNK_OPT,
- .name = "compress-chunk",
- .has_arg = required_argument },
+ .name = "compr-chunk", .has_arg = required_argument },
{ .val = LFS_MIRROR_STATE_OPT,
.name = "mirror-state", .has_arg = required_argument },
{ .val = LFS_NEWERXY_OPT,
{ .val = 'z', .name = "extension-size",
.has_arg = required_argument },
{ .val = 'z', .name = "ext-size", .has_arg = required_argument },
+ { .val = 'Z', .name = "compress", .has_arg = required_argument },
+ { .val = 'Z', .name = "compr", .has_arg = required_argument },
{ .name = NULL } };
int optidx = 0;
int pathstart = -1;
/* when getopt_long_only() hits '!' it returns 1, puts "!" in optarg */
while ((c = getopt_long_only(argc, argv,
- "-0A:b:B:c:C:D:E:g:G:H:i:lL:m:M:n:N:O:Ppqrs:S:t:T:u:U:z:",
+ "-0A:b:B:c:C:D:E:g:G:H:i:lL:m:M:n:N:O:Ppqrs:S:t:T:u:U:z:Z:",
long_opts, &optidx)) >= 0) {
xtime = NULL;
xsign = NULL;
param.fp_check_comp_start = 1;
param.fp_exclude_comp_start = !!neg_opt;
break;
- case LFS_COMPRESS_TYPE_OPT:
- rc = llapi_parse_compress_type(optarg,
- ¶m.fp_compr_type,
- NULL);
- if (rc) {
- fprintf(stderr,
- "error: unknown compress type '%s'\n",
- optarg);
- goto err;
- }
- param.fp_check_compr_type = 1;
- param.fp_exclude_compr_type = !!neg_opt;
- break;
- case LFS_COMPRESS_LEVEL_OPT:
- if (optarg[0] == '+') {
- param.fp_compr_lvl_sign = -1;
- optarg++;
- } else if (optarg[0] == '-') {
- param.fp_compr_lvl_sign = 1;
- optarg++;
- }
- param.fp_compr_lvl = atoi(optarg);
- param.fp_check_compr_lvl = 1;
- param.fp_exclude_compr_lvl = !!neg_opt;
- break;
- case LFS_COMPRESS_CHUNK_OPT:
- if (optarg[0] == '+') {
- param.fp_compr_chunk_sign = -1;
- optarg++;
- } else if (optarg[0] == '-') {
- param.fp_compr_chunk_sign = 1;
- optarg++;
- }
- param.fp_compr_chunk = atoi(optarg);
- param.fp_check_compr_chunk = 1;
- param.fp_exclude_compr_chunk = !!neg_opt;
- break;
case LFS_MIRROR_STATE_OPT:
rc = mirror_str2state(optarg, ¶m.fp_mirror_state,
¶m.fp_mirror_neg_state);
param.fp_check_ext_size = 1;
param.fp_exclude_ext_size = !!neg_opt;
break;
+ case LFS_COMPRESS_TYPE_OPT:
+ case 'Z': {
+ char sign = '\0';
+
+ param.fp_compr_lvl = (unsigned int)-1;
+ ret = llapi_parse_compress_type(optarg,
+ ¶m.fp_compr_type,
+ (int *)¶m.fp_compr_lvl,
+ &sign);
+ if (ret) {
+ fprintf(stderr,
+ "error: unknown compress type '%s'\n",
+ optarg);
+ goto err;
+ }
+
+ param.fp_check_compr_type = 1;
+ param.fp_exclude_compr_type = !!neg_opt;
+
+ if (param.fp_compr_lvl != (unsigned int)-1) {
+ if (sign == '+') {
+ param.fp_compr_lvl_sign = -1;
+ } else if (sign == '-') {
+ param.fp_compr_lvl *= -1;
+ param.fp_compr_lvl_sign = 1;
+ }
+ param.fp_check_compr_lvl = 1;
+ param.fp_exclude_compr_lvl = !!neg_opt;
+ }
+ break;
+ }
+ case LFS_COMPRESS_LEVEL_OPT:
+ if (optarg[0] == '+') {
+ param.fp_compr_lvl_sign = -1;
+ optarg++;
+ } else if (optarg[0] == '-') {
+ param.fp_compr_lvl_sign = 1;
+ optarg++;
+ }
+ param.fp_compr_lvl = atoi(optarg);
+ if (param.fp_compr_lvl > COMPR_LEVEL_MAX) {
+ fprintf(stderr,
+ "error: bad compress level '%s'\n",
+ optarg);
+ goto err;
+ }
+ param.fp_check_compr_lvl = 1;
+ param.fp_exclude_compr_lvl = !!neg_opt;
+ break;
+ case LFS_COMPRESS_CHUNK_OPT: {
+ unsigned long long chunk_size;
+ unsigned long long size_units;
+
+ if (optarg[0] == '+') {
+ param.fp_compr_chunk_sign = -1;
+ optarg++;
+ } else if (optarg[0] == '-') {
+ param.fp_compr_chunk_sign = 1;
+ optarg++;
+ }
+
+ size_units = 1024; /* default in KiB */
+ ret = llapi_parse_size(optarg, &chunk_size,
+ &size_units, 1);
+ if (ret || chunk_size > 1ULL << COMPR_CHUNK_MAX_BITS) {
+ fprintf(stderr,
+ "error: bad compress chunk size '%s'\n",
+ optarg);
+ goto err;
+ }
+ /* find in KiB */
+ param.fp_compr_chunk = chunk_size >> 10;
+ param.fp_check_compr_chunk = 1;
+ param.fp_exclude_compr_chunk = !!neg_opt;
+ break;
+ }
default:
ret = CMD_HELP;
goto err;
.name = "comp-start", .has_arg = optional_argument },
{ .val = LFS_COMP_START_OPT,
.name = "component-start", .has_arg = optional_argument },
- { .val = LFS_MIRROR_INDEX_OPT,
- .name = "mirror-index", .has_arg = required_argument },
- { .val = LFS_MIRROR_ID_OPT,
- .name = "mirror-id", .has_arg = required_argument },
{ .val = LFS_COMPRESS_TYPE_OPT,
- .name ="compress-type", .has_arg = no_argument },
+ .name = "compress-type", .has_arg = no_argument },
{ .val = LFS_COMPRESS_TYPE_OPT,
- .name ="compr-type", .has_arg = no_argument },
+ .name = "compr-type", .has_arg = no_argument },
{ .val = LFS_COMPRESS_LEVEL_OPT,
- .name ="compress-level", .has_arg = no_argument },
+ .name = "compress-level", .has_arg = no_argument },
{ .val = LFS_COMPRESS_LEVEL_OPT,
- .name ="compr-level", .has_arg = no_argument },
+ .name = "compr-level", .has_arg = no_argument },
{ .val = LFS_COMPRESS_CHUNK_OPT,
- .name ="compress-chunk", .has_arg = no_argument },
+ .name = "compress-chunk", .has_arg = no_argument },
{ .val = LFS_COMPRESS_CHUNK_OPT,
- .name ="compr-chunk", .has_arg = no_argument },
+ .name = "compr-chunk", .has_arg = no_argument },
+ { .val = LFS_MIRROR_INDEX_OPT,
+ .name = "mirror-index", .has_arg = required_argument },
+ { .val = LFS_MIRROR_ID_OPT,
+ .name = "mirror-id", .has_arg = required_argument },
{ .val = 'c', .name = "stripe-count", .has_arg = no_argument },
{ .val = 'c', .name = "stripe_count", .has_arg = no_argument },
/* find { .val = 'C', .name = "ctime", .has_arg = required_argument }*/
{ .val = 'y', .name = "yaml", .has_arg = no_argument },
{ .val = 'z', .name = "extension-size", .has_arg = no_argument },
{ .val = 'z', .name = "ext-size", .has_arg = no_argument },
+ { .val = 'Z', .name = "compress", .has_arg = no_argument },
+ { .val = 'Z', .name = "compr", .has_arg = no_argument },
{ .name = NULL } };
int c, rc;
int neg_opt = 0;
char *end, *tmp;
while ((c = getopt_long(argc, argv,
- "-cdDE::FghiI::LmMNoO:pqrRsSvyz",
+ "-cdDE::FghiI::LmMNoO:pqrRsSvyzZ",
long_opts, NULL)) != -1) {
if (neg_opt)
--neg_opt;
param->fp_exclude_mirror_id = !!neg_opt;
break;
}
- case LFS_COMPRESS_TYPE_OPT: {
- if (!(param->fp_verbose & VERBOSE_DETAIL)) {
- param->fp_verbose |= VERBOSE_COMPRESS_TYPE;
- param->fp_max_depth = 0;
- }
- break;
- }
- case LFS_COMPRESS_LEVEL_OPT: {
- if (!(param->fp_verbose & VERBOSE_DETAIL)) {
- param->fp_verbose |= VERBOSE_COMPRESS_LEVEL;
- param->fp_max_depth = 0;
- }
- break;
- }
- case LFS_COMPRESS_CHUNK_OPT: {
- if (!(param->fp_verbose & VERBOSE_DETAIL)) {
- param->fp_verbose |= VERBOSE_COMPRESS_CHUNK;
- param->fp_max_depth = 0;
- }
- break;
- }
case 'd':
param->fp_max_depth = 0;
break;
param->fp_max_depth = 0;
}
break;
+ case 'Z':
+ if (!(param->fp_verbose & VERBOSE_DETAIL)) {
+ param->fp_verbose |= VERBOSE_COMPRESS_TYPE |
+ VERBOSE_COMPRESS_LEVEL |
+ VERBOSE_COMPRESS_CHUNK;
+ param->fp_max_depth = 0;
+ }
+ break;
+ case LFS_COMPRESS_TYPE_OPT:
+ if (!(param->fp_verbose & VERBOSE_DETAIL)) {
+ param->fp_verbose |= VERBOSE_COMPRESS_TYPE;
+ param->fp_max_depth = 0;
+ }
+ break;
+ case LFS_COMPRESS_LEVEL_OPT:
+ if (!(param->fp_verbose & VERBOSE_DETAIL)) {
+ param->fp_verbose |= VERBOSE_COMPRESS_LEVEL;
+ param->fp_max_depth = 0;
+ }
+ break;
+ case LFS_COMPRESS_CHUNK_OPT:
+ if (!(param->fp_verbose & VERBOSE_DETAIL)) {
+ param->fp_verbose |= VERBOSE_COMPRESS_CHUNK;
+ param->fp_max_depth = 0;
+ }
+ break;
default:
return CMD_HELP;
}