From: Filipe Manana <fdmanana@xxxxxxxx> 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 <fdmanana@xxxxxxxx> --- V2: Added helper functions to open and close files or directories. V3: Simplified helper to open file or directory, removed no longer needed helper for closing file or directory. 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 *); @@ -1385,6 +1386,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) { char buf[NAME_MAX + 1]; @@ -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) { -- 2.11.0