* [PATCH 5/7] fsstress: allow afsync on directories too
@ 2019-03-28 18:54 fdmanana
2019-03-28 21:36 ` Nikolay Borisov
2019-03-28 21:55 ` Dave Chinner
0 siblings, 2 replies; 4+ messages in thread
From: fdmanana @ 2019-03-28 18:54 UTC (permalink / raw)
To: fstests; +Cc: linux-btrfs, Filipe Manana
From: Filipe Manana <fdmanana@suse.com>
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@suse.com>
---
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)) {
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
}
--
2.11.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 5/7] fsstress: allow afsync on directories too
2019-03-28 18:54 [PATCH 5/7] fsstress: allow afsync on directories too fdmanana
@ 2019-03-28 21:36 ` Nikolay Borisov
2019-03-28 21:37 ` Nikolay Borisov
2019-03-28 21:55 ` Dave Chinner
1 sibling, 1 reply; 4+ messages in thread
From: Nikolay Borisov @ 2019-03-28 21:36 UTC (permalink / raw)
To: fdmanana, fstests; +Cc: linux-btrfs, Filipe Manana
On 28.03.19 г. 20:54 ч., fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
>
> 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@suse.com>
> ---
> 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/
> 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
> }
>
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 5/7] fsstress: allow afsync on directories too
2019-03-28 21:36 ` Nikolay Borisov
@ 2019-03-28 21:37 ` Nikolay Borisov
0 siblings, 0 replies; 4+ messages in thread
From: Nikolay Borisov @ 2019-03-28 21:37 UTC (permalink / raw)
To: fdmanana, fstests; +Cc: linux-btrfs, Filipe Manana
On 28.03.19 г. 23:36 ч., Nikolay Borisov wrote:
>
>
> On 28.03.19 г. 20:54 ч., fdmanana@kernel.org wrote:
>> From: Filipe Manana <fdmanana@suse.com>
>>
>> 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@suse.com>
>> ---
>> 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
>> }
>>
>>
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 5/7] fsstress: allow afsync on directories too
2019-03-28 18:54 [PATCH 5/7] fsstress: allow afsync on directories too fdmanana
2019-03-28 21:36 ` Nikolay Borisov
@ 2019-03-28 21:55 ` Dave Chinner
1 sibling, 0 replies; 4+ messages in thread
From: Dave Chinner @ 2019-03-28 21:55 UTC (permalink / raw)
To: fdmanana; +Cc: fstests, linux-btrfs, Filipe Manana
On Thu, Mar 28, 2019 at 06:54:58PM +0000, fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
>
> 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@suse.com>
> ---
> 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)) {
> 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);
> + }
You've added this pattern to about 5 functions now. Please factor
the whole getname/open thing into a helper that can be used
everywhere....
> 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);
Same here for close.
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-03-28 21:55 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-28 18:54 [PATCH 5/7] fsstress: allow afsync on directories too fdmanana
2019-03-28 21:36 ` Nikolay Borisov
2019-03-28 21:37 ` Nikolay Borisov
2019-03-28 21:55 ` Dave Chinner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).