From 1b37d45c4373fc359a5cf3be3f91d3e1ce9e09da Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Thu, 4 Dec 2025 13:53:17 -0800 Subject: [PATCH] fsstress: allow multiple suboptions to -f I got bitten by fsstress's argument parsing recently because it turns out that if you do: # fsstress -z -f creat=2,unlink=1 It will ignore everything after the '2' and worse yet it won't tell you that it's done so unless you happen to pass -S to make it spit out the frequency table. Adapt process_freq to tokenize the argument string so that it can handle a comma-separated list of key-value arguments. Signed-off-by: Darrick J. Wong Reviewed-by: Zorro Lang Signed-off-by: Zorro Lang --- ltp/fsstress.c | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index ae31c6a2..dfd85db8 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -1781,23 +1781,38 @@ opendir_path(pathname_t *name) void process_freq(char *arg) { - opdesc_t *p; - char *s; + char *token; + char *argstr = strdup(arg); + char *tokstr = argstr ? argstr : arg; - s = strchr(arg, '='); - if (s == NULL) { - fprintf(stderr, "bad argument '%s'\n", arg); - exit(1); - } - *s++ = '\0'; - for (p = ops; p < ops_end; p++) { - if (strcmp(arg, p->name) == 0) { - p->freq = atoi(s); - return; + while ((token = strtok(tokstr, ",")) != NULL) { + opdesc_t *p = ops; + char *s = strchr(token, '='); + int found = 0; + + if (!s) { + fprintf(stderr, "bad argument '%s'\n", token); + exit(1); + } + + *s = '\0'; + for (; p < ops_end; p++) { + if (strcmp(token, p->name) == 0) { + p->freq = atoi(s + 1); + found = 1; + break; + } + } + + if (!found) { + fprintf(stderr, "can't find op type %s for -f\n", token); + exit(1); } + + tokstr = NULL; } - fprintf(stderr, "can't find op type %s for -f\n", arg); - exit(1); + + free(argstr); } int -- 2.47.3