[LTP] [PATCH] syscalls/ioctl_loop05: Do not fail on success
Yang Xu
xuyang_jy_0410@163.com
Tue May 5 18:23:34 CEST 2020
Hi Cyril
> Hi!
>>> The code in __loop_update_dio() uses inode->i_sb->s_bdev to get the
>>> logical block size for the backing file for the loop device. If that
>>> pointer is NULL, which happens to be the case for Btrfs, the checks for
>>> alignment and block size are ignored and direct I/O can be turned on
>>> regardless of the offset and logical block size.Since kernel comment "the above condition may be loosed in the future,
>> and direct I/O may be switched runtime at that time because most
>> of requests in sane applications should be PAGE_SIZE aligned". I think
>> pass is ok, also print filesystem let user know this fs igores this
>> align is better.
>
> I do not get what you mean here. Should we change the TPASS message to
> something "LOOP_SET_DIRECT_IO succeeded, offset is ignored" or something
> similar?
Yes. Add a comment here is better.
>
>> loopinfo.lo_offset = 0;
>> TST_RETRY_FUNC(ioctl(dev_fd, LOOP_SET_STATUS, &loopinfo),
>> TST_RETVAL_EQ0);
>>
>> These should be moved to the beginning of test function.
>
> I guess that we can do so, just to be extra sure, but we do zero the
> loopinfo structure in lib/tst_device.c so we start with zero offset,
> hence it does not matter if we reset it at the start or at the end of
> the test.
When I debug this case as below(early return, ext4 filesystem):
TEST(ioctl(dev_fd, LOOP_SET_DIRECT_IO, 1));
if (TST_RET == 0) {
tst_res(TFAIL, "LOOP_SET_DIRECT_IO succeeded
unexpectedly");
SAFE_IOCTL(dev_fd, LOOP_SET_DIRECT_IO, 0);
}
return;
this case will broke when using i parameter,
ioctl_loop05.c:50: BROK: ioctl(3,LOOP_SET_DIRECT_IO,...) failed: EINVAL (22)
It seems the last test affected the next test, so I think we should use
goto instead of return. Also including two typo, updata->update, need->needs
--- a/testcases/kernel/syscalls/ioctl/ioctl_loop05.c
+++ b/testcases/kernel/syscalls/ioctl/ioctl_loop05.c
@@ -5,8 +5,8 @@
*
* This is a basic ioctl test about loopdevice.
*
- * It is designed to test LOOP_SET_DIRECT_IO can updata a live
- * loop device dio mode. It need the backing file also supports
+ * It is designed to test LOOP_SET_DIRECT_IO can update a live
+ * loop device dio mode. It needs the backing file also supports
71,15 +71,16 @@ static void verify_ioctl_loop(void)
TEST(ioctl(dev_fd, LOOP_SET_DIRECT_IO, 1));
if (TST_RET == 0) {
- tst_res(TFAIL, "LOOP_SET_DIRECT_IO succeeded unexpectedly");
+ tst_res(TPASS, "Ignoring offset, LOOP_SET_DIRECT_IO
succeeded");
SAFE_IOCTL(dev_fd, LOOP_SET_DIRECT_IO, 0);
- return;
+ goto reset_offset;
}
if (TST_ERR == EINVAL)
tst_res(TPASS | TTERRNO, "LOOP_SET_DIRECT_IO failed as
expected");
else
tst_res(TFAIL | TTERRNO, "LOOP_SET_DIRECT_IO failed
expected EINVAL got");
+reset_offset:
loopinfo.lo_offset = 0;
TST_RETRY_FUNC(ioctl(dev_fd, LOOP_SET_STATUS, &loopinfo),
TST_RETVAL_EQ0);
Best Regards
Yang Xu
>
More information about the ltp
mailing list