diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2021-10-15 09:44:15 +0200 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2021-10-15 09:55:54 +0200 |
commit | 037165300ea1f6d9c9f8587360792505b2f3988d (patch) | |
tree | 837d595272d79ff59fc5c806c8d5f0b138d83ae4 | |
parent | 52a52d556773cf57007932ed483d20d21bd53823 (diff) | |
download | lvm2-037165300ea1f6d9c9f8587360792505b2f3988d.tar.gz |
unit-test: better check for O_DIRECT
Instead of guessing tmpfs usage, just directly try if we could
reopen file with O_DIRECT on the used filesystem.
-rw-r--r-- | test/unit/bcache_utils_t.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/test/unit/bcache_utils_t.c b/test/unit/bcache_utils_t.c index 73b8902fb..daed0ce39 100644 --- a/test/unit/bcache_utils_t.c +++ b/test/unit/bcache_utils_t.c @@ -49,31 +49,39 @@ static uint64_t byte(block_address b, uint64_t offset) static void *_fix_init(struct io_engine *engine) { - uint8_t buffer[T_BLOCK_SIZE]; - struct fixture *f = malloc(sizeof(*f)); - unsigned b, i; - struct statvfs fsdata = { 0 }; + uint8_t buffer[T_BLOCK_SIZE]; + struct fixture *f = malloc(sizeof(*f)); + unsigned b, i; static int _runs_is_tmpfs = -1; memset(buffer, 0, sizeof(buffer)); + T_ASSERT(f); + if (_runs_is_tmpfs == -1) { - // With testing in tmpfs directory O_DIRECT cannot be used - // tmpfs has f_fsid == 0 (unsure if this is best guess) - _runs_is_tmpfs = (statvfs(".", &fsdata) == 0 && !fsdata.f_fsid) ? 1 : 0; - if (_runs_is_tmpfs) + snprintf(f->fname, sizeof(f->fname), "unit-test-XXXXXX"); + /* coverity[secure_temp] don't care */ + f->fd = mkstemp(f->fname); + T_ASSERT(f->fd >= 0); + (void) close(f->fd); + // test if we can reopen with O_DIRECT + if ((f->fd = open(f->fname, O_RDWR | O_DIRECT)) >= 0) { + _runs_is_tmpfs = 0; + (void) close(f->fd); + } else { + _runs_is_tmpfs = 1; // likely running on tmpfs printf(" Running test in tmpfs, *NOT* using O_DIRECT\n"); + } + (void) unlink(f->fname); } - T_ASSERT(f); - - snprintf(f->fname, sizeof(f->fname), "unit-test-XXXXXX"); + snprintf(f->fname, sizeof(f->fname), "unit-test-XXXXXX"); /* coverity[secure_temp] don't care */ f->fd = mkstemp(f->fname); T_ASSERT(f->fd >= 0); for (b = 0; b < NR_BLOCKS; b++) { - for (i = 0; i < sizeof(buffer); i++) - buffer[i] = _pattern_at(INIT_PATTERN, byte(b, i)); + for (i = 0; i < sizeof(buffer); i++) + buffer[i] = _pattern_at(INIT_PATTERN, byte(b, i)); T_ASSERT(write(f->fd, buffer, T_BLOCK_SIZE) > 0); } @@ -89,7 +97,7 @@ static void *_fix_init(struct io_engine *engine) f->di = bcache_set_fd(f->fd); - return f; + return f; } static void *_async_init(void) |