Skip to contentSkip to conversation

aio_tio: fix error diagnosis for byte transfers

PATCH Superseded Matthias Maennich 2 participants 3 messages Jan 10, 2019 – Jan 11, 2019

v1 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 aio_tio: fix error diagnosis for byte transfers

In case the expected bytes written during an async io operation did not match the actually written ones, the wrong error code (res2) had been reported. Correct that to reflect the error condition (res!=bytes).

---
 testcases/kernel/io/aio/aio02/aio_tio.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
testcases/kernel/io/aio/aio02/aio_tio.c +1 -1
index 08fb04162..623c81a5e 100644
@@ -57,7 +57,7 @@ static void work_done(io_context_t ctx, struct iocb *iocb, long res, long res2)
 
 	if (res != iocb->u.c.nbytes) {
 		fprintf(stderr, "write missed bytes expect %lu got %ld\n",
-			iocb->u.c.nbytes, res2);
+			iocb->u.c.nbytes, res);
 		exit(1);
 	}
 	wait_count--;
Signature · 1 line
2.20.1.97.g81188d93c3-goog
#1 lore raw

PATCH 2/2 aio_tio: determine alignment based on target filesystem

The alignment for O_DIRECT operations has to match the blocksize of the underlying filesystem. Determine the alignment from the target file's file system.

aio_tio test cases 1 and 2 failed (nondeterministic) on aarch64 when run on a 4096 byte blocksize filesystem and with an alignment of 512 bytes.

Determining the blocksize from the file system and using it for the alignment resolves the test issue.

---
 testcases/kernel/io/aio/aio02/aio_tio.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
testcases/kernel/io/aio/aio02/aio_tio.c +7 -1
index 623c81a5e..b2d9a7bec 100644
@@ -34,6 +34,7 @@
 #include "config.h"
 #include "common.h"
 #include "test.h"
+#include "tst_safe_macros.h"
 #include <string.h>
 #include <errno.h>
 
@@ -42,7 +43,6 @@
 #define AIO_MAXIO 32
 #define AIO_BLKSIZE (64*1024)
 
-static int alignment = 512;
 static int wait_count = 0;
 
 /*
@@ -94,6 +94,8 @@ int io_tio(char *pathname, int flag, int n, int operation)
 	void *bufptr = NULL;
 	off_t offset = 0;
 	struct timespec timeout;
+	struct stat fi_stat;
+	size_t alignment;
 
 	io_context_t myctx;
 	struct iocb iocb_array[AIO_MAXIO];
@@ -105,6 +107,10 @@ int io_tio(char *pathname, int flag, int n, int operation)
 		return -1;
 	}
 
+	/* determine the alignment from the blksize of the underlying fs */
+	SAFE_FSTAT(fd, &fi_stat);
+	alignment = fi_stat.st_blksize;
+
 	res = io_queue_init(n, &myctx);
 	//printf (" res = %d \n", res);
 
Signature · 1 line
2.20.1.97.g81188d93c3-goog
#2 lore raw

PATCH 2/2 aio_tio: determine alignment based on target filesystem

Quoted 22 lines · Matthias Maennich

The alignment for O_DIRECT operations has to match the blocksize of the underlying filesystem. Determine the alignment from the target file's file system.

aio_tio test cases 1 and 2 failed (nondeterministic) on aarch64 when run on a 4096 byte blocksize filesystem and with an alignment of 512 bytes.

Determining the blocksize from the file system and using it for the alignment resolves the test issue.

---
 testcases/kernel/io/aio/aio02/aio_tio.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
testcases/kernel/io/aio/aio02/aio_tio.c +0 -0
index 623c81a5e..b2d9a7bec 100644

testcases/kernel/io/aio/aio02/aio_tio.c line 37

Quoted 4 lines
testcases/kernel/io/aio/aio02/aio_tio.c +1 -0
@@ -34,6 +34,7 @@
 #include "config.h"
 #include "common.h"
 #include "test.h"
+#include "tst_safe_macros.h"

Since aio_tio.c is still written in old API, so here we probably need to include original safe_macros.h but not the tst_safe_macros.h which is for new LTP API.

testcases/kernel/io/aio/aio02/aio_tio.c int io_tio(char *pathname, int flag, int n, int operation) · line 111

Quoted 3 lines
testcases/kernel/io/aio/aio02/aio_tio.c +2 -0
+       /* determine the alignment from the blksize of the underlying fs */
+       SAFE_FSTAT(fd, &fi_stat);

Then, here needs old using way too: SAFE_FSTAT(NULL, fd, &fi_stat);

Beside these tiny issues, patch set LGTM.

--
Regards,
Li Wang