mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
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:
+19
-2
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user