commit 250990a7df3159a84b488bb2a6ba6b5f888f2618 from: xaizek via: Sergey Bronnikov date: Tue May 16 08:22:51 2023 UTC unreliablefs: allow arbitrary large duration values `nanosleep()` fails if `.tv_nsec` is larger than 999999999, so duration must be distributed between `.tv_sec` and `.tv_nsec`. Duration also needs to be stored in `unsigned long long` to be able to store values of more than ~4 seconds. commit - 1cbd57169f4ba279ab21cc2ad55c5f53f03f68b1 commit + 250990a7df3159a84b488bb2a6ba6b5f888f2618 blob - a71c63da063644a19fa0b53b3485807c6d165773 blob + 9785ff4b77d9a64822eae1267d98d0cd9ba083ef --- unreliablefs/unreliablefs_errinj.c +++ unreliablefs/unreliablefs_errinj.c @@ -223,12 +223,13 @@ int error_inject(const char* path, fuse_op operation) break; case ERRINJ_SLOWDOWN: ; struct timespec ts = {}; - ts.tv_nsec = err->duration; - fprintf(stdout, "start of '%s' slowdown for '%d' ns\n", op_name, err->duration); + ts.tv_sec = err->duration / 1000000000; + ts.tv_nsec = err->duration % 1000000000; + fprintf(stdout, "start of '%s' slowdown for '%llu' ns\n", op_name, err->duration); if (nanosleep(&ts, NULL) != 0) { perror("nanosleep"); } else { - fprintf(stdout, "end of '%s' slowdown with '%d' ns\n", op_name, err->duration); + fprintf(stdout, "end of '%s' slowdown with '%llu' ns\n", op_name, err->duration); } break; } @@ -328,7 +329,7 @@ int conf_option_handler(void* cfg, const char* section } else if (strcmp(key, "probability") == 0) { err->probability = atoi(value); } else if (strcmp(key, "duration") == 0) { - err->duration = atoi(value); + err->duration = atoll(value); } else { fprintf(stderr, "unknown option '%s' in configuration file\n", key); return 0; blob - 2dcc775ca5c9a010de8149d51d0bc8a92deee037 blob + 0197c155f5bfe601935ad57cdd4d78bb67deb23d --- unreliablefs/unreliablefs_errinj.h +++ unreliablefs/unreliablefs_errinj.h @@ -54,7 +54,7 @@ struct errinj_conf { char *path_regexp; char *errno_regexp; unsigned int probability; - unsigned int duration; + unsigned long long duration; errinj_type type; TAILQ_ENTRY(errinj_conf) entries;