All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] generic/465: just check the actual read data under dio read/write
@ 2017-11-21  7:10 Xiao Yang
  2017-11-23  6:14 ` Eryu Guan
  0 siblings, 1 reply; 6+ messages in thread
From: Xiao Yang @ 2017-11-21  7:10 UTC (permalink / raw)
  To: fstests; +Cc: Xiao Yang

I got the following message when running generic/465 on RHEL7.4
---------------------------------------------------------------
QA output created by 465
non-aio dio test
encounter an error: block 43 offset 0, content 0
encounter an error: block 0 offset 4096, content 62
encounter an error: block 1 offset 0, content 0
encounter an error: block 17 offset 0, content 0
aio-dio test
encounter an error: block 9 offset 0, content 0
encounter an error: block 2 offset 0, content 0
encounter an error: block 0 offset 4096, content 62
encounter an error: block 12 offset 0, content 0
---------------------------------------------------------------

It is possible that dio read reads less than 1M data while dio write
is writing 1M data into file, because concurrent dio read/write to the
same file cannot guarantee atomicity and may split specified size.
Please see this URL for detailed explanation:
https://marc.info/?l=linux-fsdevel&m=151053542926457&w=2

We can just check the actual read data instead of the whole read buffer.

Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
---
 src/aio-dio-regress/aio-dio-append-write-read-race.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/aio-dio-regress/aio-dio-append-write-read-race.c b/src/aio-dio-regress/aio-dio-append-write-read-race.c
index 8f94d50..848755c 100644
--- a/src/aio-dio-regress/aio-dio-append-write-read-race.c
+++ b/src/aio-dio-regress/aio-dio-append-write-read-race.c
@@ -46,6 +46,7 @@ struct io_data {
 };
 
 int reader_ready = 0;
+static volatile int act_rd_sz;
 
 static void usage(const char *prog)
 {
@@ -57,15 +58,15 @@ static void usage(const char *prog)
 static void *reader(void *arg)
 {
 	struct io_data *data = (struct io_data *)arg;
-	int ret;
 
+	act_rd_sz = 0;
 	memset(data->buf, 'b', data->blksize);
 	reader_ready = 1;
 	do {
-		ret = pread(data->fd, data->buf, data->blksize, data->offset);
-		if (ret < 0)
+		act_rd_sz = pread(data->fd, data->buf, data->blksize, data->offset);
+		if (act_rd_sz < 0)
 			perror("read file");
-	} while (ret <= 0);
+	} while (act_rd_sz <= 0);
 
 	return NULL;
 }
@@ -203,7 +204,7 @@ int main(int argc, char *argv[])
 			goto err;
 		}
 
-		for (j = 0; j < blksize; j++) {
+		for (j = 0; j < act_rd_sz; j++) {
 			if (rdata.buf[j] != 'a') {
 				fail("encounter an error: "
 					"block %d offset %d, content %x\n",
-- 
1.8.3.1




^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-11-29  1:44 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-21  7:10 [PATCH] generic/465: just check the actual read data under dio read/write Xiao Yang
2017-11-23  6:14 ` Eryu Guan
2017-11-27  2:34   ` [PATCH v2] " Xiao Yang
2017-11-28  7:20     ` Eryu Guan
2017-11-29  1:42       ` Xiao Yang
2017-11-29  1:44       ` [PATCH v3] " Xiao Yang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.