summaryrefslogtreecommitdiff
path: root/ltp
diff options
context:
space:
mode:
authorFilipe Manana <fdmanana@suse.com>2019-04-04 17:29:52 +0100
committerEryu Guan <guaneryu@gmail.com>2019-04-19 15:25:01 +0800
commit2c492c4d166b7ceb8bbfcf64c979324cecd66f3c (patch)
tree518d516273b387fc42cd4c67b82c08552b07dabf /ltp
parent830349865e715f572595e97dc628dba5bc10b954 (diff)
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>
Diffstat (limited to 'ltp')
-rw-r--r--ltp/fsstress.c21
1 files 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) {