From: Ira Weiny Date: Mon, 23 Sep 2019 17:53:34 +0000 (-0700) Subject: src/locktest: Add truncate lease tests X-Git-Tag: v2022.05.01~1016 X-Git-Url: http://git.apps.os.sepia.ceph.com/?p=xfstests-dev.git;a=commitdiff_plain;h=a7bfbe8b2e19bffe4252c4cdfce0ace0927141be src/locktest: Add truncate lease tests Add verification of signal reception on truncate: /* 9 */"Write lease gets SIGIO on truncate", /* 10 */"Read lease gets SIGIO on truncate", Signed-off-by: Ira Weiny Reviewed-by: Eryu Guan Signed-off-by: Eryu Guan --- diff --git a/src/locktest.c b/src/locktest.c index be718668..8696966f 100644 --- a/src/locktest.c +++ b/src/locktest.c @@ -102,6 +102,7 @@ static HANDLE f_fd = INVALID_HANDLE; /* shared file */ #define CMD_GETLEASE 8 #define CMD_SIGIO 9 #define CMD_WAIT_SIGIO 10 +#define CMD_TRUNCATE 11 #define PASS 1 #define FAIL 0 @@ -133,6 +134,7 @@ static char *get_cmd_str(int cmd) case CMD_GETLEASE: return "Get Lease"; break; case CMD_SIGIO: return "Setup SIGIO"; break; case CMD_WAIT_SIGIO: return "Wait for SIGIO"; break; + case CMD_TRUNCATE: return "Truncate"; break; } return "unknown"; } @@ -574,6 +576,8 @@ char *lease_descriptions[] = { /* 6 */"Write lease gets SIGIO on read open", /* 7 */"Read lease does _not_ get SIGIO on read open", /* 8 */"Read lease gets SIGIO on write open", + /* 9 */"Write lease gets SIGIO on truncate", + /* 10 */"Read lease gets SIGIO on truncate", }; static int64_t lease_tests[][6] = @@ -654,6 +658,25 @@ static int64_t lease_tests[][6] = {8, CMD_CLOSE, 0, 0, PASS, SERVER }, {8, CMD_CLOSE, 0, 0, PASS, CLIENT }, + /* Get SIGIO when Write lease is broken by Truncate */ + {9, CMD_OPEN, O_RDWR, 0, PASS, CLIENT }, + {9, CMD_SETLEASE, F_WRLCK, 0, PASS, CLIENT }, + {9, CMD_GETLEASE, F_WRLCK, 0, PASS, CLIENT }, + {9, CMD_SIGIO, 0, 0, PASS, CLIENT }, + {9, CMD_TRUNCATE, FILE_SIZE/2, 0, PASS, CLIENT }, + {9, CMD_WAIT_SIGIO, 5, 0, PASS, CLIENT }, + {9, CMD_CLOSE, 0, 0, PASS, CLIENT }, + + /* Get SIGIO when Read lease is broken by Truncate */ + {10, CMD_OPEN, O_RDONLY, 0, PASS, CLIENT }, + {10, CMD_SETLEASE, F_RDLCK, 0, PASS, CLIENT }, + {10, CMD_GETLEASE, F_RDLCK, 0, PASS, CLIENT }, + {10, CMD_SIGIO, 0, 0, PASS, CLIENT }, + {10, CMD_TRUNCATE, FILE_SIZE/2, 0, PASS, SERVER }, + {10, CMD_WAIT_SIGIO, 5, 0, PASS, CLIENT }, + {10, CMD_CLOSE, 0, 0, PASS, CLIENT }, + + /* indicate end of array */ {0,0,0,0,0,SERVER}, {0,0,0,0,0,CLIENT} @@ -717,6 +740,27 @@ initialize(HANDLE fd) } } +static int do_truncate(size_t length) +{ + int rc; + + if (debug) + fprintf(stderr, "truncating to %ld\n", length); + +again: + rc = truncate(filename, length); + if (rc && errno == EINTR) + goto again; + + saved_errno = errno; + + if (rc) + fprintf(stderr, "%s %d : %s\n", + __FILE__, errno, strerror(errno)); + + return (rc == 0 ? PASS:FAIL); +} + void release_lease(int fd) { int rc; @@ -1245,6 +1289,9 @@ int run(int64_t tests[][6], char *descriptions[]) case CMD_WAIT_SIGIO: result = do_wait_sigio(tests[index][TIME]); break; + case CMD_TRUNCATE: + result = do_truncate(tests[index][OFFSET]); + break; } if( result != tests[index][RESULT]) { fail_flag++; @@ -1356,6 +1403,9 @@ int run(int64_t tests[][6], char *descriptions[]) case CMD_WAIT_SIGIO: result = do_wait_sigio(ctl.offset); break; + case CMD_TRUNCATE: + result = do_truncate(ctl.offset); + break; } if( result != ctl.result ) { fprintf(stderr,"Failure in %d:%s\n",