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 <fdmanana@suse.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Filipe Manana
2019-04-04 17:29:52 +01:00
committed by Eryu Guan
parent 830349865e
commit 2c492c4d16
+19 -2
View File
@@ -324,6 +324,7 @@ void make_freq_table(void);
int mkdir_path(pathname_t *, mode_t); int mkdir_path(pathname_t *, mode_t);
int mknod_path(pathname_t *, mode_t, dev_t); int mknod_path(pathname_t *, mode_t, dev_t);
void namerandpad(int, char *, int); void namerandpad(int, char *, int);
int open_file_or_dir(pathname_t *, int);
int open_path(pathname_t *, int); int open_path(pathname_t *, int);
DIR *opendir_path(pathname_t *); DIR *opendir_path(pathname_t *);
void process_freq(char *); 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 int
open_path(pathname_t *name, int oflag) open_path(pathname_t *name, int oflag)
{ {
@@ -3455,13 +3472,13 @@ fsync_f(int opno, long r)
int v; int v;
init_pathname(&f); 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) if (v)
printf("%d/%d: fsync - no filename\n", procid, opno); printf("%d/%d: fsync - no filename\n", procid, opno);
free_pathname(&f); free_pathname(&f);
return; return;
} }
fd = open_path(&f, O_WRONLY); fd = open_file_or_dir(&f, O_WRONLY);
e = fd < 0 ? errno : 0; e = fd < 0 ? errno : 0;
check_cwd(); check_cwd();
if (fd < 0) { if (fd < 0) {