diff mbox series

[1/1] aiocp.c: TCONF on O_DIRECT on tmpfs

Message ID 20221216115052.30511-1-pvorel@suse.cz
State Superseded
Headers show
Series [1/1] aiocp.c: TCONF on O_DIRECT on tmpfs | expand

Commit Message

Petr Vorel Dec. 16, 2022, 11:50 a.m. UTC
O_DIRECT is not supported on tmpfs. This flag is added by -f option,
thus cannot be filtered with .skip_filesystems.

Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
 testcases/kernel/io/ltp-aiodio/aiocp.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Petr Vorel Dec. 16, 2022, 1:08 p.m. UTC | #1
Hi,

hm, it looks like it requires to skip tmpfs, as all tests TCONF:
aiocp.c:231: TINFO: Maximum AIO blocks: 65536
tst_device.c:541: TINFO: Use BTRFS specific strategy
tst_device.c:559: TBROK: BTRFS ioctl failed. Is . on a tmpfs?: ENOTTY (25)

I check if it'd work without
e1b1ae66b2 ("tst_find_backing_dev: Get dev name from /sys/dev/block/*/uevent")

Kind regards,
Petr
Petr Vorel Dec. 16, 2022, 1:13 p.m. UTC | #2
> hm, it looks like it requires to skip tmpfs, as all tests TCONF:
> aiocp.c:231: TINFO: Maximum AIO blocks: 65536
> tst_device.c:541: TINFO: Use BTRFS specific strategy
> tst_device.c:559: TBROK: BTRFS ioctl failed. Is . on a tmpfs?: ENOTTY (25)

> I check if it'd work without
> e1b1ae66b2 ("tst_find_backing_dev: Get dev name from /sys/dev/block/*/uevent")

TMPDIR=/home/foo ./aiocp -b 1k -n 1 -f DIRECT # xfs
tst_test.c:1558: TINFO: Timeout per run is 0h 30m 30s
tst_test.c:1310: TINFO: xfs is supported by the test
aiocp.c:231: TINFO: Maximum AIO blocks: 65536
tst_device.c:585: TINFO: Use uevent strategy
aiocp.c:267: TINFO: Fill srcfile.bin with random data
aiocp.c:84: TBROK: write(3,0x7ffeccb9da00,60274) failed: EINVAL (22)

TMPDIR=/var/tmp ./aiocp -b 1k -n 1 -f DIRECT # ext4
tst_test.c:1558: TINFO: Timeout per run is 0h 30m 30s
tst_test.c:1310: TINFO: ext2/ext3/ext4 is supported by the test
aiocp.c:231: TINFO: Maximum AIO blocks: 65536
tst_device.c:585: TINFO: Use uevent strategy
aiocp.c:267: TINFO: Fill srcfile.bin with random data
aiocp.c:84: TBROK: write(3,0x7ffda9e14120,50530) failed: EINVAL (22)

uname -r
6.1.0-rc8-2.g2fb1790-default

=> even more things to investigate.

Kind regards,
Petr

> Kind regards,
> Petr
Cyril Hrubis Dec. 19, 2022, 12:07 p.m. UTC | #3
Hi!
> > hm, it looks like it requires to skip tmpfs, as all tests TCONF:
> > aiocp.c:231: TINFO: Maximum AIO blocks: 65536
> > tst_device.c:541: TINFO: Use BTRFS specific strategy
> > tst_device.c:559: TBROK: BTRFS ioctl failed. Is . on a tmpfs?: ENOTTY (25)
> 
> > I check if it'd work without
> > e1b1ae66b2 ("tst_find_backing_dev: Get dev name from /sys/dev/block/*/uevent")
> 
> TMPDIR=/home/foo ./aiocp -b 1k -n 1 -f DIRECT # xfs
> tst_test.c:1558: TINFO: Timeout per run is 0h 30m 30s
> tst_test.c:1310: TINFO: xfs is supported by the test
> aiocp.c:231: TINFO: Maximum AIO blocks: 65536
> tst_device.c:585: TINFO: Use uevent strategy
> aiocp.c:267: TINFO: Fill srcfile.bin with random data
> aiocp.c:84: TBROK: write(3,0x7ffeccb9da00,60274) failed: EINVAL (22)
> 
> TMPDIR=/var/tmp ./aiocp -b 1k -n 1 -f DIRECT # ext4
> tst_test.c:1558: TINFO: Timeout per run is 0h 30m 30s
> tst_test.c:1310: TINFO: ext2/ext3/ext4 is supported by the test
> aiocp.c:231: TINFO: Maximum AIO blocks: 65536
> tst_device.c:585: TINFO: Use uevent strategy
> aiocp.c:267: TINFO: Fill srcfile.bin with random data
> aiocp.c:84: TBROK: write(3,0x7ffda9e14120,50530) failed: EINVAL (22)

Ah, I suppose that this fails because we are wrongly passing the
srcflags to the open() that fills the source file with random data and
we end up passing O_DIRECT to the function that does not aling the
buffers and sizes at all.

Does this fix it?

diff --git a/testcases/kernel/io/ltp-aiodio/aiocp.c b/testcases/kernel/io/ltp-aiodio/aiocp.c
index ee893ab11..a75da6a0c 100644
--- a/testcases/kernel/io/ltp-aiodio/aiocp.c
+++ b/testcases/kernel/io/ltp-aiodio/aiocp.c
@@ -263,7 +263,7 @@ static void setup(void)

        tst_res(TINFO, "Fill %s with random data", srcname);

-       srcfd = SAFE_OPEN(srcname, srcflags | O_RDWR | O_CREAT, 0666);
+       srcfd = SAFE_OPEN(srcname, O_WRONLY | O_CREAT, 0666);
        fill_with_rand_data(srcfd, filesize);
        SAFE_CLOSE(srcfd);
 }
Richard Palethorpe Dec. 20, 2022, 1:19 p.m. UTC | #4
Hello,

Petr Vorel <pvorel@suse.cz> writes:

> Hi,
>
> hm, it looks like it requires to skip tmpfs, as all tests TCONF:
> aiocp.c:231: TINFO: Maximum AIO blocks: 65536
> tst_device.c:541: TINFO: Use BTRFS specific strategy
> tst_device.c:559: TBROK: BTRFS ioctl failed. Is . on a tmpfs?: ENOTTY (25)
>
> I check if it'd work without
> e1b1ae66b2 ("tst_find_backing_dev: Get dev name from /sys/dev/block/*/uevent")
>
> Kind regards,
> Petr

tmpfs is not backed by a block device so there is no block size. Unless
we treat the page size as the block size. So possibly tst_dev_block_size
should return the page size.
Petr Vorel Dec. 23, 2022, 6:26 p.m. UTC | #5
> Hi!
> > > hm, it looks like it requires to skip tmpfs, as all tests TCONF:
> > > aiocp.c:231: TINFO: Maximum AIO blocks: 65536
> > > tst_device.c:541: TINFO: Use BTRFS specific strategy
> > > tst_device.c:559: TBROK: BTRFS ioctl failed. Is . on a tmpfs?: ENOTTY (25)

> > > I check if it'd work without
> > > e1b1ae66b2 ("tst_find_backing_dev: Get dev name from /sys/dev/block/*/uevent")

> > TMPDIR=/home/foo ./aiocp -b 1k -n 1 -f DIRECT # xfs
> > tst_test.c:1558: TINFO: Timeout per run is 0h 30m 30s
> > tst_test.c:1310: TINFO: xfs is supported by the test
> > aiocp.c:231: TINFO: Maximum AIO blocks: 65536
> > tst_device.c:585: TINFO: Use uevent strategy
> > aiocp.c:267: TINFO: Fill srcfile.bin with random data
> > aiocp.c:84: TBROK: write(3,0x7ffeccb9da00,60274) failed: EINVAL (22)

> > TMPDIR=/var/tmp ./aiocp -b 1k -n 1 -f DIRECT # ext4
> > tst_test.c:1558: TINFO: Timeout per run is 0h 30m 30s
> > tst_test.c:1310: TINFO: ext2/ext3/ext4 is supported by the test
> > aiocp.c:231: TINFO: Maximum AIO blocks: 65536
> > tst_device.c:585: TINFO: Use uevent strategy
> > aiocp.c:267: TINFO: Fill srcfile.bin with random data
> > aiocp.c:84: TBROK: write(3,0x7ffda9e14120,50530) failed: EINVAL (22)

> Ah, I suppose that this fails because we are wrongly passing the
> srcflags to the open() that fills the source file with random data and
> we end up passing O_DIRECT to the function that does not aling the
> buffers and sizes at all.

> Does this fix it?

Hi Cyril,

unfortunately the output is the same on all 3 tested filesystems.
Any other hint what could fix it?

Kind regards,
Petr

> diff --git a/testcases/kernel/io/ltp-aiodio/aiocp.c b/testcases/kernel/io/ltp-aiodio/aiocp.c
> index ee893ab11..a75da6a0c 100644
> --- a/testcases/kernel/io/ltp-aiodio/aiocp.c
> +++ b/testcases/kernel/io/ltp-aiodio/aiocp.c
> @@ -263,7 +263,7 @@ static void setup(void)

>         tst_res(TINFO, "Fill %s with random data", srcname);

> -       srcfd = SAFE_OPEN(srcname, srcflags | O_RDWR | O_CREAT, 0666);
> +       srcfd = SAFE_OPEN(srcname, O_WRONLY | O_CREAT, 0666);
>         fill_with_rand_data(srcfd, filesize);
>         SAFE_CLOSE(srcfd);
>  }
Richard Palethorpe Jan. 9, 2023, 11:19 a.m. UTC | #6
Hello,

Petr Vorel <pvorel@suse.cz> writes:

>> Hi!
>> > > hm, it looks like it requires to skip tmpfs, as all tests TCONF:
>> > > aiocp.c:231: TINFO: Maximum AIO blocks: 65536
>> > > tst_device.c:541: TINFO: Use BTRFS specific strategy
>> > > tst_device.c:559: TBROK: BTRFS ioctl failed. Is . on a tmpfs?: ENOTTY (25)
>
>> > > I check if it'd work without
>> > > e1b1ae66b2 ("tst_find_backing_dev: Get dev name from /sys/dev/block/*/uevent")
>
>> > TMPDIR=/home/foo ./aiocp -b 1k -n 1 -f DIRECT # xfs
>> > tst_test.c:1558: TINFO: Timeout per run is 0h 30m 30s
>> > tst_test.c:1310: TINFO: xfs is supported by the test
>> > aiocp.c:231: TINFO: Maximum AIO blocks: 65536
>> > tst_device.c:585: TINFO: Use uevent strategy
>> > aiocp.c:267: TINFO: Fill srcfile.bin with random data
>> > aiocp.c:84: TBROK: write(3,0x7ffeccb9da00,60274) failed: EINVAL (22)
>
>> > TMPDIR=/var/tmp ./aiocp -b 1k -n 1 -f DIRECT # ext4
>> > tst_test.c:1558: TINFO: Timeout per run is 0h 30m 30s
>> > tst_test.c:1310: TINFO: ext2/ext3/ext4 is supported by the test
>> > aiocp.c:231: TINFO: Maximum AIO blocks: 65536
>> > tst_device.c:585: TINFO: Use uevent strategy
>> > aiocp.c:267: TINFO: Fill srcfile.bin with random data
>> > aiocp.c:84: TBROK: write(3,0x7ffda9e14120,50530) failed: EINVAL (22)
>
>> Ah, I suppose that this fails because we are wrongly passing the
>> srcflags to the open() that fills the source file with random data and
>> we end up passing O_DIRECT to the function that does not aling the
>> buffers and sizes at all.
>
>> Does this fix it?
>
> Hi Cyril,
>
> unfortunately the output is the same on all 3 tested filesystems.
> Any other hint what could fix it?
>

       EINVAL fd is attached to an object which is unsuitable for writing;  or
              the  file  was opened with the O_DIRECT flag, and either the ad-
              dress specified in buf, the value specified  in  count,  or  the
              file offset is not suitably aligned.

I suppose that writes should be aligned to the block size. Which
according to the lengths written they are not. There's also no reason to
open srcfd with O_DIRECT AFAICT?

We could also change fill_with_rand_data to use tst_rand_data. I'll post
a patch

>
> Kind regards,
> Petr
>
>> diff --git a/testcases/kernel/io/ltp-aiodio/aiocp.c b/testcases/kernel/io/ltp-aiodio/aiocp.c
>> index ee893ab11..a75da6a0c 100644
>> --- a/testcases/kernel/io/ltp-aiodio/aiocp.c
>> +++ b/testcases/kernel/io/ltp-aiodio/aiocp.c
>> @@ -263,7 +263,7 @@ static void setup(void)
>
>>         tst_res(TINFO, "Fill %s with random data", srcname);
>
>> -       srcfd = SAFE_OPEN(srcname, srcflags | O_RDWR | O_CREAT, 0666);
>> +       srcfd = SAFE_OPEN(srcname, O_WRONLY | O_CREAT, 0666);
>>         fill_with_rand_data(srcfd, filesize);
>>         SAFE_CLOSE(srcfd);
>>  }
diff mbox series

Patch

diff --git a/testcases/kernel/io/ltp-aiodio/aiocp.c b/testcases/kernel/io/ltp-aiodio/aiocp.c
index ee893ab118..275000f3e8 100644
--- a/testcases/kernel/io/ltp-aiodio/aiocp.c
+++ b/testcases/kernel/io/ltp-aiodio/aiocp.c
@@ -240,6 +240,9 @@  static void setup(void)
 		if (strncmp(str_oflag, "SYNC", 4) == 0) {
 			dstflags |= O_SYNC;
 		} else if (strncmp(str_oflag, "DIRECT", 6) == 0) {
+			if (tst_fs_type(".") == TST_TMPFS_MAGIC)
+				tst_brk(TCONF, "O_DIRECT not supported on tmpfs");
+
 			srcflags |= O_DIRECT;
 			dstflags |= O_DIRECT;
 		}