X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=options.c;h=91049af5472e55abecf65a266aa28b2162ea1d15;hb=HEAD;hp=de935efcb671fe3cd25b4002bed64532783d1b00;hpb=d848a55ba876e42c5f3e39c09ad55f141c540ece;p=fio.git diff --git a/options.c b/options.c index de935efc..ab650bb7 100644 --- a/options.c +++ b/options.c @@ -263,21 +263,98 @@ static int fio_fdp_cmp(const void *p1, const void *p2) static int str_fdp_pli_cb(void *data, const char *input) { struct thread_data *td = cb_data_to_td(data); - char *str, *p, *v; - int i = 0; + char *str, *p, *id1; + int i = 0, ret = 0; p = str = strdup(input); strip_blank_front(&str); strip_blank_end(str); - while ((v = strsep(&str, ",")) != NULL && i < FIO_MAX_PLIS) - td->o.fdp_plis[i++] = strtoll(v, NULL, 0); + while ((id1 = strsep(&str, ",")) != NULL) { + char *str2, *id2; + unsigned int start, end; + + if (!strlen(id1)) + break; + + str2 = id1; + end = -1; + while ((id2 = strsep(&str2, "-")) != NULL) { + if (!strlen(id2)) + break; + + end = strtoull(id2, NULL, 0); + } + + start = strtoull(id1, NULL, 0); + if (end == -1) + end = start; + if (start > end) { + ret = 1; + break; + } + + while (start <= end) { + if (i >= FIO_MAX_DP_IDS) { + log_err("fio: only %d IDs supported\n", FIO_MAX_DP_IDS); + ret = 1; + break; + } + if (start > 0xFFFF) { + log_err("Placement IDs cannot exceed 0xFFFF\n"); + ret = 1; + break; + } + td->o.dp_ids[i++] = start++; + } + + if (ret) + break; + } + free(p); - qsort(td->o.fdp_plis, i, sizeof(*td->o.fdp_plis), fio_fdp_cmp); - td->o.fdp_nrpli = i; + qsort(td->o.dp_ids, i, sizeof(*td->o.dp_ids), fio_fdp_cmp); + td->o.dp_nr_ids = i; - return 0; + return ret; +} + +/* str_dp_scheme_cb() is a callback function for parsing the fdp_scheme option + This function validates the fdp_scheme filename. */ +static int str_dp_scheme_cb(void *data, const char *input) +{ + struct thread_data *td = cb_data_to_td(data); + struct stat sb; + char *filename; + int ret = 0; + + if (parse_dryrun()) + return 0; + + filename = strdup(td->o.dp_scheme_file); + strip_blank_front(&filename); + strip_blank_end(filename); + + strcpy(td->o.dp_scheme_file, filename); + + if (lstat(filename, &sb) < 0){ + ret = errno; + log_err("fio: lstat() error related to %s\n", filename); + td_verror(td, ret, "lstat"); + goto out; + } + + if (!S_ISREG(sb.st_mode)) { + ret = errno; + log_err("fio: %s is not a file\n", filename); + td_verror(td, ret, "S_ISREG"); + goto out; + } + +out: + free(filename); + return ret; } static int str_bssplit_cb(void *data, const char *input) @@ -488,7 +565,11 @@ static int ignore_error_type(struct thread_data *td, enum error_type_bit etype, if (fname[0] == 'E') { error[i] = str2error(fname); } else { - error[i] = atoi(fname); + int base = 10; + if (!strncmp(fname, "0x", 2) || + !strncmp(fname, "0X", 2)) + base = 16; + error[i] = strtol(fname, NULL, base); if (error[i] < 0) error[i] = -error[i]; } @@ -3710,36 +3791,78 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .group = FIO_OPT_G_INVALID, }, { - .name = "fdp_pli_select", - .lname = "FDP Placement ID select", + .name = "dataplacement", + .alias = "data_placement", + .lname = "Data Placement interface", + .type = FIO_OPT_STR, + .off1 = offsetof(struct thread_options, dp_type), + .help = "Data Placement interface to use", + .def = "none", + .category = FIO_OPT_C_IO, + .group = FIO_OPT_G_INVALID, + .posval = { + { .ival = "none", + .oval = FIO_DP_NONE, + .help = "Do not specify a data placement interface", + }, + { .ival = "fdp", + .oval = FIO_DP_FDP, + .help = "Use Flexible Data Placement interface", + }, + { .ival = "streams", + .oval = FIO_DP_STREAMS, + .help = "Use Streams interface", + }, + }, + }, + { + .name = "plid_select", + .alias = "fdp_pli_select", + .lname = "Data Placement ID selection strategy", .type = FIO_OPT_STR, - .off1 = offsetof(struct thread_options, fdp_pli_select), - .help = "Select which FDP placement ID to use next", + .off1 = offsetof(struct thread_options, dp_id_select), + .help = "Strategy for selecting next Data Placement ID", .def = "roundrobin", .category = FIO_OPT_C_IO, .group = FIO_OPT_G_INVALID, .posval = { { .ival = "random", - .oval = FIO_FDP_RANDOM, + .oval = FIO_DP_RANDOM, .help = "Choose a Placement ID at random (uniform)", }, { .ival = "roundrobin", - .oval = FIO_FDP_RR, + .oval = FIO_DP_RR, .help = "Round robin select Placement IDs", }, + { .ival = "scheme", + .oval = FIO_DP_SCHEME, + .help = "Use a scheme(based on LBA) to select Placement IDs", + }, }, }, { - .name = "fdp_pli", - .lname = "FDP Placement ID indicies", + .name = "plids", + .alias = "fdp_pli", + .lname = "Stream IDs/Data Placement ID indices", .type = FIO_OPT_STR, .cb = str_fdp_pli_cb, - .off1 = offsetof(struct thread_options, fdp_plis), - .help = "Sets which placement ids to use (defaults to all)", + .off1 = offsetof(struct thread_options, dp_ids), + .help = "Sets which Data Placement ids to use (defaults to all for FDP)", .hide = 1, .category = FIO_OPT_C_IO, .group = FIO_OPT_G_INVALID, }, + { + .name = "dp_scheme", + .lname = "Data Placement Scheme", + .type = FIO_OPT_STR_STORE, + .cb = str_dp_scheme_cb, + .off1 = offsetof(struct thread_options, dp_scheme_file), + .maxlen = PATH_MAX, + .help = "scheme file that specifies offset-RUH mapping", + .category = FIO_OPT_C_IO, + .group = FIO_OPT_G_INVALID, + }, { .name = "lockmem", .lname = "Lock memory",