[LTP] [PATCH v1] aiocp: Filter out O_DIRECT before read

Cyril Hrubis chrubis@suse.cz
Thu Feb 9 12:06:45 CET 2023


Hi!
> When aiocp executed with -f DIRECT will fail.
> 
> <<<test_start>>>
> tag=AD049 stime=1675520824
> cmdline="aiocp -b 8k -n 8 -f DIRECT"
> contacts=""
> analysis=exit
> <<<test_output>>>
> tst_test.c:1560: TINFO: Timeout per run is 0h 30m 30s
> aiocp.c:211: TINFO: Maximum AIO blocks: 65536
> tst_device.c:585: TINFO: Use uevent strategy
> aiocp.c:250: TINFO: Fill srcfile.bin with random data
> aiocp.c:279: TINFO: Copy srcfile.bin -> dstfile.bin
> aiocp.c:291: TINFO: Comparing srcfile.bin with dstfile.bin
> aiocp.c:306: TBROK: read(3,0x7ffcd743abe0,4096) failed, returned -1: EINVAL (22)
> ...
> 
> syscall read manual ERROR section said that:
> EINVAL fd  is  attached to an object which is unsuitable for reading;
> or the file was opened with the O_DIRECT flag, and either the address
> specified in buf, the value specified in  count, or the file offset is
> not suitably aligned.
> 
> We need filter out O_DIRECT flag before read.

This is not very good changelog, I had to look closely at the source to
figure out why we may need this.

Better description should say that the code which checks that the data
has been written correctly does not use aligned buffers, which may cause
a failure like the one above.

> Signed-off-by: Ping Fang <pifang@redhat.com>
> ---
>  testcases/kernel/io/ltp-aiodio/aiocp.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/testcases/kernel/io/ltp-aiodio/aiocp.c b/testcases/kernel/io/ltp-aiodio/aiocp.c
> index bc0e209b2..e4252d641 100644
> --- a/testcases/kernel/io/ltp-aiodio/aiocp.c
> +++ b/testcases/kernel/io/ltp-aiodio/aiocp.c
> @@ -297,8 +297,8 @@ static void run(void)
>  		return;
>  	}
>  
> -	srcfd = SAFE_OPEN(srcname, srcflags | O_RDONLY, 0666);
> -	dstfd = SAFE_OPEN(dstname, srcflags | O_RDONLY, 0666);
> +	srcfd = SAFE_OPEN(srcname, (srcflags & ~O_DIRECT) | O_RDONLY, 0666);
> +	dstfd = SAFE_OPEN(dstname, (srcflags & ~O_DIRECT) | O_RDONLY, 0666);

I guess that we can as well just remove the srcflags and keep just the
O_RDONLY since the srcflags are by definition either O_RDONLY or
O_DIRECT | O_RDONLY.

I suppose that using scrflags and dstflags for anything else than the
filedescriptors passed to the async_run() is actually a mistake.

>  	reads = howmany(filesize, buffsize);
>  
> -- 
> 2.31.1
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list