From 2c492c4d166b7ceb8bbfcf64c979324cecd66f3c Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Thu, 4 Apr 2019 17:29:52 +0100 Subject: [PATCH] fsstress: allow fsync on directories too Currently the fsync function can only be performed against regular files. Allow it to operate on directories too, to increase test coverage and allow for chances of finding bugs in a filesystem's implementation of fsync against directories. Signed-off-by: Filipe Manana Reviewed-by: Eryu Guan Signed-off-by: Eryu Guan --- ltp/fsstress.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index 41a0155e..72c574da 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -324,6 +324,7 @@ void make_freq_table(void); int mkdir_path(pathname_t *, mode_t); int mknod_path(pathname_t *, mode_t, dev_t); void namerandpad(int, char *, int); +int open_file_or_dir(pathname_t *, int); int open_path(pathname_t *, int); DIR *opendir_path(pathname_t *); void process_freq(char *); @@ -1384,6 +1385,22 @@ namerandpad(int id, char *buf, int i) } } +int +open_file_or_dir(pathname_t *name, int flags) +{ + int fd; + + fd = open_path(name, flags); + if (fd != -1) + return fd; + if (fd == -1 && errno != EISDIR) + return fd; + /* Directories can not be opened in write mode. */ + flags &= ~O_WRONLY; + flags |= O_RDONLY | O_DIRECTORY; + return open_path(name, flags); +} + int open_path(pathname_t *name, int oflag) { @@ -3455,13 +3472,13 @@ fsync_f(int opno, long r) int v; init_pathname(&f); - if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (!get_fname(FT_REGFILE | FT_DIRm, r, &f, NULL, NULL, &v)) { if (v) printf("%d/%d: fsync - no filename\n", procid, opno); free_pathname(&f); return; } - fd = open_path(&f, O_WRONLY); + fd = open_file_or_dir(&f, O_WRONLY); e = fd < 0 ? errno : 0; check_cwd(); if (fd < 0) {