[2/2] aio_tio: determine alignment based on target filesystem

Message ID 20190110132811.175790-2-maennich@google.com
State New
Headers show
Series
  • Untitled series #85383
Related show

Commit Message

Matthias Maennich Jan. 10, 2019, 1:28 p.m.
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.

Signed-off-by: Matthias Maennich <maennich@google.com>
Reviewed-by: Alessio Balsini <balsini@google.com>
---
 testcases/kernel/io/aio/aio02/aio_tio.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Li Wang Jan. 11, 2019, 5:56 a.m. | #1
On Thu, Jan 10, 2019 at 10:03 PM Matthias Maennich <maennich@google.com> wrote:
>
> 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.
>
> Signed-off-by: Matthias Maennich <maennich@google.com>
> Reviewed-by: Alessio Balsini <balsini@google.com>
> ---
>  testcases/kernel/io/aio/aio02/aio_tio.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/testcases/kernel/io/aio/aio02/aio_tio.c b/testcases/kernel/io/aio/aio02/aio_tio.c
> index 623c81a5e..b2d9a7bec 100644
> --- a/testcases/kernel/io/aio/aio02/aio_tio.c
> +++ b/testcases/kernel/io/aio/aio02/aio_tio.c
> @@ -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.

>
> +       /* 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

Patch

diff --git a/testcases/kernel/io/aio/aio02/aio_tio.c b/testcases/kernel/io/aio/aio02/aio_tio.c
index 623c81a5e..b2d9a7bec 100644
--- a/testcases/kernel/io/aio/aio02/aio_tio.c
+++ b/testcases/kernel/io/aio/aio02/aio_tio.c
@@ -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);