From: Cyril Hrubis <chrubis@suse.cz>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH v1 07/10] syscalls/ioctl_loop05: Add LOOP_SET_DIRECT_IO ioctl test
Date: Fri, 3 Apr 2020 18:44:16 +0200 [thread overview]
Message-ID: <20200403164416.GA11850@yuki.lan> (raw)
In-Reply-To: <1585839990-19923-8-git-send-email-xuyang2018.jy@cn.fujitsu.com>
Hi!
> LOOP_SET_DIRECT_IO can updata a live loop device dio mode. It needs the
> backing file also supports dio mode and the lo_offset is aligned with
> the logical I/O size.
>
> It was introduced into kernel since 4.10
> commit ab1cb278bc70 ("block: loop: introduce ioctl command of LOOP_SET_DIRECT_IO").
>
> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> ---
> runtest/syscalls | 1 +
> testcases/kernel/syscalls/ioctl/.gitignore | 1 +
> .../kernel/syscalls/ioctl/ioctl_loop05.c | 120 ++++++++++++++++++
> 3 files changed, 122 insertions(+)
> create mode 100644 testcases/kernel/syscalls/ioctl/ioctl_loop05.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 6e8d71d44..9644588f3 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -531,6 +531,7 @@ ioctl_loop01 ioctl_loop01
> ioctl_loop02 ioctl_loop02
> ioctl_loop03 ioctl_loop03
> ioctl_loop04 ioctl_loop04
> +ioctl_loop05 ioctl_loop05
>
> ioctl_ns01 ioctl_ns01
> ioctl_ns02 ioctl_ns02
> diff --git a/testcases/kernel/syscalls/ioctl/.gitignore b/testcases/kernel/syscalls/ioctl/.gitignore
> index 039a5251c..f484d98d6 100644
> --- a/testcases/kernel/syscalls/ioctl/.gitignore
> +++ b/testcases/kernel/syscalls/ioctl/.gitignore
> @@ -10,6 +10,7 @@
> /ioctl_loop02
> /ioctl_loop03
> /ioctl_loop04
> +/ioctl_loop05
> /ioctl_ns01
> /ioctl_ns02
> /ioctl_ns03
> diff --git a/testcases/kernel/syscalls/ioctl/ioctl_loop05.c b/testcases/kernel/syscalls/ioctl/ioctl_loop05.c
> new file mode 100644
> index 000000000..43bad6c18
> --- /dev/null
> +++ b/testcases/kernel/syscalls/ioctl/ioctl_loop05.c
> @@ -0,0 +1,120 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2020 FUJITSU LIMITED. All rights reserved.
> + * Author: Yang Xu <xuyang2018.jy@cn.jujitsu.com>
> + *
> + * 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
> + * dio mode and the lo_offset is aligned with the logical I/O size.
> + */
> +#include <stdio.h>
> +#include <unistd.h>
> +#include <string.h>
> +#include <stdlib.h>
> +#include "ioctl_loop_support.h"
> +#include "lapi/loop.h"
> +#include "tst_test.h"
> +
> +#define DIO_MESSAGE "In dio mode"
> +#define NON_DIO_MESSAGE "In non dio mode"
> +
> +static char dev_path[1024], sys_loop_diopath[1024];
> +static int dev_num, dev_fd, attach_flag;
> +
> +static void check_dio_value(int flag)
> +{
> + struct loop_info loopinfoget;
> +
> + memset(&loopinfoget, 0, sizeof(loopinfoget));
> +
> + SAFE_IOCTL(dev_fd, LOOP_GET_STATUS, &loopinfoget);
> + tst_res(TINFO, "%s", flag ? DIO_MESSAGE : NON_DIO_MESSAGE);
> +
> + if (loopinfoget.lo_flags & LO_FLAGS_DIRECT_IO)
> + tst_res(flag ? TPASS : TFAIL, "lo_flags has LO_FLAGS_DIRECT_IO flag");
> + else
> + tst_res(flag ? TFAIL : TPASS, "lo_flags doesn't have LO_FLAGS_DIRECT_IO flag");
> +
> + check_sys_value(sys_loop_diopath, flag);
> +}
> +
> +static void verify_ioctl_loop(void)
> +{
> + struct loop_info loopinfo;
> +
> + memset(&loopinfo, 0, sizeof(loopinfo));
> +
> + SAFE_IOCTL(dev_fd, LOOP_SET_DIRECT_IO, 0);
> + check_dio_value(0);
> + tst_res(TINFO, "Without setting lo_offset or sizelimit");
> + SAFE_IOCTL(dev_fd, LOOP_SET_DIRECT_IO, 1);
> + check_dio_value(1);
> +
> + tst_res(TINFO, "With offset equal to sector size");
> + loopinfo.lo_offset = 512;
We should use BLKSSZGET ioctl() to get the block size for direct I/O
otherwise I would expect that it would break on one of the less common
architectures. See also discussion at the end of man 2 open.
> + safe_set_status(dev_fd, loopinfo);
> + TEST(ioctl(dev_fd, LOOP_SET_DIRECT_IO, 1));
> + if (TST_RET == 0) {
> + tst_res(TPASS, "LOOP_SET_DIRECT_IO succeeded");
> + check_dio_value(1);
> + } else {
> + tst_res(TFAIL | TTERRNO, "LOOP_SET_DIRECT_IO failed");
> + }
> +
> + tst_res(TINFO, "With offset less than or unalign sector size");
> + loopinfo.lo_offset = 256;
> + safe_set_status(dev_fd, loopinfo);
> +
> + TEST(ioctl(dev_fd, LOOP_SET_DIRECT_IO, 1));
> + if (TST_RET == 0) {
> + tst_res(TFAIL, "LOOP_SET_DIRECT_IO succeeded unexpectedly");
> + return;
> + }
> + 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");
> +
> + loopinfo.lo_offset = 0;
> + safe_set_status(dev_fd, loopinfo);
> +}
> +
> +static void setup(void)
> +{
> + if (tst_fs_type(".") == TST_TMPFS_MAGIC)
> + tst_brk(TCONF, "tmpfd doesn't support O_DIRECT flag, skip it");
> +
> + dev_num = tst_find_free_loopdev(dev_path, sizeof(dev_path));
> + if (dev_num < 0)
> + tst_brk(TBROK, "Failed to find free loop device");
> +
> + sprintf(sys_loop_diopath, "/sys/block/loop%d/loop/dio", dev_num);
> + tst_fill_file("test.img", 0, 1024, 1024);
> + tst_attach_device(dev_path, "test.img");
> + attach_flag = 1;
> + dev_fd = SAFE_OPEN(dev_path, O_RDWR);
> + check_support_cmd(dev_fd, LOOP_SET_DIRECT_IO, 0, "LOOP_SET_DIRECT_IO");
> +}
> +
> +static void cleanup(void)
> +{
> + if (dev_fd > 0)
> + SAFE_CLOSE(dev_fd);
> + if (attach_flag)
> + tst_detach_device(dev_path);
> + unlink("test.img");
We don't have to remove the image here once the needs_tmpdir has been
uncommented below, right?
> +}
> +
> +static struct tst_test test = {
> + .setup = setup,
> + .cleanup = cleanup,
> + .test_all = verify_ioctl_loop,
> + .needs_root = 1,
> +// .needs_tmpdir = 1,
Looks like a forgotten debug measure.
> + .needs_drivers = (const char *const []) {
> + "loop",
> + NULL
> + }
> +};
> --
> 2.23.0
>
>
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
next prev parent reply other threads:[~2020-04-03 16:44 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-02 15:06 [LTP] [PATCH v1 00/10] add loop ioctl test Yang Xu
2020-04-02 15:06 ` [LTP] [PATCH v1 01/10] lapi: Add a configure check and fallback for loop ioctl and flag Yang Xu
2020-04-03 11:44 ` Cyril Hrubis
2020-04-06 6:01 ` Yang Xu
2020-04-09 8:47 ` Martin Doucha
2020-04-09 10:09 ` Cyril Hrubis
2020-04-09 10:14 ` Yang Xu
2020-04-02 15:06 ` [LTP] [PATCH v1 02/10] syscalls/ioctl:add common c file for loop ioctl Yang Xu
2020-04-03 12:16 ` Cyril Hrubis
2020-04-09 2:42 ` Yang Xu
2020-04-02 15:06 ` [LTP] [PATCH v1 03/10] syscalls/ioctl_loop01: Add LO_FLAGS_AUTOCLEAR and LO_FLAGS_PARTSCAN test Yang Xu
2020-04-03 11:55 ` Cyril Hrubis
2020-04-06 6:27 ` Yang Xu
2020-04-09 6:10 ` Yang Xu
2020-04-09 7:55 ` Cyril Hrubis
2020-04-09 10:44 ` [LTP] [PATCH v2 01/10] lapi/loop.h: Add fallback for loop ioctl and flag Yang Xu
2020-04-09 10:44 ` [LTP] [PATCH v2 02/10] syscalls/ioctl:add common c file for loop ioctl Yang Xu
2020-04-17 15:10 ` Cyril Hrubis
2020-04-20 2:23 ` Yang Xu
2020-04-20 6:08 ` Yang Xu
2020-04-20 13:01 ` Cyril Hrubis
2020-04-21 6:19 ` Yang Xu
2020-04-21 8:55 ` Cyril Hrubis
2020-04-21 10:35 ` Yang Xu
2020-04-21 12:12 ` Cyril Hrubis
2020-04-22 3:12 ` Yang Xu
2020-04-20 12:55 ` Cyril Hrubis
2020-04-09 10:44 ` [LTP] [PATCH v2 03/10] syscalls/ioctl_loop01: Add LO_FLAGS_AUTOCLEAR and LO_FLAGS_PARTSCAN test Yang Xu
2020-04-09 10:44 ` [LTP] [PATCH v2 04/10] syscalls/ioctl_loop02: Add LO_FLAGS_READ_ONLY and LOOP_CHANGE_FD test Yang Xu
2020-04-09 10:44 ` [LTP] [PATCH v2 05/10] syscalls/ioctl_loop03: Add LOOP_CHANGE_FD test with WR mode Yang Xu
2020-04-17 15:12 ` Cyril Hrubis
2020-04-09 10:44 ` [LTP] [PATCH v2 06/10] syscalls/ioctl_loop04: Add LOOP_SET_CAPACITY ioctl test Yang Xu
2020-04-09 10:44 ` [LTP] [PATCH v2 07/10] syscalls/ioctl_loop05: Add LOOP_SET_DIRECT_IO " Yang Xu
2020-04-09 10:44 ` [LTP] [PATCH v2 08/10] syscalls/ioctl_loop06: Add LOOP_SET_BLOCK_SIZE error test Yang Xu
2020-04-22 13:57 ` Cyril Hrubis
2020-04-09 10:44 ` [LTP] [PATCH v2 09/10] syscalls/ioctl_loop07: Add dio with logic block size " Yang Xu
2020-04-22 13:58 ` Cyril Hrubis
2020-04-23 6:06 ` Yang Xu
2020-04-23 10:12 ` Yang Xu
2020-04-24 4:43 ` Yang Xu
2020-04-09 10:44 ` [LTP] [PATCH v2 10/10] syscalls/ioctl_loop08: Add LOOP_SET/GET_STATUS64 sizelimit field test Yang Xu
2020-04-28 15:44 ` Cyril Hrubis
2020-04-09 10:44 ` [LTP] [PATCH v2 00/10] add loop ioctl test Yang Xu
2020-04-09 10:50 ` [LTP] [PATCH v2 01/10] lapi/loop.h: Add fallback for loop ioctl and flag Yang Xu
2020-04-17 15:11 ` Cyril Hrubis
2020-04-27 1:24 ` [LTP] [PATCH v1 03/10] syscalls/ioctl_loop01: Add LO_FLAGS_AUTOCLEAR and LO_FLAGS_PARTSCAN test Yang Xu
2020-04-02 15:06 ` [LTP] [PATCH v1 04/10] syscalls/ioctl_loop02: Add LO_FLAGS_READ_ONLY and LOOP_CHANGE_FD test Yang Xu
2020-04-03 13:34 ` Cyril Hrubis
2020-04-06 7:24 ` Yang Xu
2020-04-02 15:06 ` [LTP] [PATCH v1 05/10] syscalls/ioctl_loop03: Add LOOP_CHANGE_FD test with WR mode Yang Xu
2020-04-02 15:06 ` [LTP] [PATCH v1 06/10] syscalls/ioctl_loop04: Add LOOP_SET_CAPACITY ioctl test Yang Xu
2020-04-02 15:06 ` [LTP] [PATCH v1 07/10] syscalls/ioctl_loop05: Add LOOP_SET_DIRECT_IO " Yang Xu
2020-04-03 16:44 ` Cyril Hrubis [this message]
2020-04-06 7:53 ` Yang Xu
2020-04-06 8:30 ` Cyril Hrubis
2020-04-02 15:06 ` [LTP] [PATCH v1 08/10] syscalls/ioctl_loop06: Add LOOP_SET_BLOCK_SIZE error test Yang Xu
2020-04-02 15:06 ` [LTP] [PATCH v1 09/10] syscalls/ioctl_loop07: Add dio with logic block size " Yang Xu
2020-04-02 15:06 ` [LTP] [PATCH v1 10/10] syscalls/ioctl_loop08: Add LOOP_SET/GET_STATUS64 sizelimit field test Yang Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200403164416.GA11850@yuki.lan \
--to=chrubis@suse.cz \
--cc=ltp@lists.linux.it \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.