On 28.03.19 г. 23:36 ч., Nikolay Borisov wrote: > > > On 28.03.19 г. 20:54 ч., fdmanana@xxxxxxxxxx wrote: >> From: Filipe Manana <fdmanana@xxxxxxxx> >> >> Currently the afsync 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 the filesystem implementation of fsync >> against directories. >> >> Signed-off-by: Filipe Manana <fdmanana@xxxxxxxx> >> --- >> ltp/fsstress.c | 24 ++++++++++++++++-------- >> 1 file changed, 16 insertions(+), 8 deletions(-) >> >> diff --git a/ltp/fsstress.c b/ltp/fsstress.c >> index ffe78ef7..0fb9e399 100644 >> --- a/ltp/fsstress.c >> +++ b/ltp/fsstress.c >> @@ -1767,15 +1767,21 @@ afsync_f(int opno, long r) >> struct iocb iocb; >> struct iocb *iocbs[] = { &iocb }; >> struct io_event event; >> + DIR *dir = NULL; >> >> 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)) { > > s/FT_DIRm/FT_DIR/ Bummer, FT_DIRm is defined to FT_DIR.... disregard this... > >> if (v) >> printf("%d/%d: afsync - no filename\n", procid, opno); >> free_pathname(&f); >> return; >> } >> fd = open_path(&f, O_WRONLY | O_DIRECT); >> + if (fd < 0 && errno == EISDIR) { >> + dir = opendir_path(&f); >> + if (dir) >> + fd = dirfd(dir); >> + } >> e = fd < 0 ? errno : 0; >> check_cwd(); >> if (fd < 0) { >> @@ -1783,6 +1789,8 @@ afsync_f(int opno, long r) >> printf("%d/%d: afsync - open %s failed %d\n", >> procid, opno, f.path, e); >> free_pathname(&f); >> + if (dir) >> + closedir(dir); >> return; >> } >> >> @@ -1791,24 +1799,24 @@ afsync_f(int opno, long r) >> if (v) >> printf("%d/%d: afsync - io_submit %s %d\n", >> procid, opno, f.path, e); >> - free_pathname(&f); >> - close(fd); >> - return; >> + goto out; >> } >> if ((e = io_getevents(io_ctx, 1, 1, &event, NULL)) != 1) { >> if (v) >> printf("%d/%d: afsync - io_getevents failed %d\n", >> procid, opno, e); >> - free_pathname(&f); >> - close(fd); >> - return; >> + goto out; >> } >> >> e = event.res2; >> if (v) >> printf("%d/%d: afsync %s %d\n", procid, opno, f.path, e); >> +out: >> free_pathname(&f); >> - close(fd); >> + if (dir) >> + closedir(dir); >> + else >> + close(fd); >> #endif >> } >> >> >