All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH v2 04/10] syscalls/ioctl_loop02: Add LO_FLAGS_READ_ONLY and LOOP_CHANGE_FD test
Date: Thu, 9 Apr 2020 18:44:39 +0800	[thread overview]
Message-ID: <1586429086-22975-4-git-send-email-xuyang2018.jy@cn.fujitsu.com> (raw)
In-Reply-To: <1586429086-22975-1-git-send-email-xuyang2018.jy@cn.fujitsu.com>

For LOOP_CHANGE_FD, this operation is possible only if the loop device
is read-only and the new backing store is the same size and type as the
old backing store.

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 runtest/syscalls                              |   1 +
 testcases/kernel/syscalls/ioctl/.gitignore    |   1 +
 .../kernel/syscalls/ioctl/ioctl_loop02.c      | 150 ++++++++++++++++++
 3 files changed, 152 insertions(+)
 create mode 100644 testcases/kernel/syscalls/ioctl/ioctl_loop02.c

diff --git a/runtest/syscalls b/runtest/syscalls
index 8d1ce0c9a..80005227d 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -529,6 +529,7 @@ ioctl07      ioctl07
 ioctl08      ioctl08
 
 ioctl_loop01 ioctl_loop01
+ioctl_loop02 ioctl_loop02
 
 ioctl_ns01 ioctl_ns01
 ioctl_ns02 ioctl_ns02
diff --git a/testcases/kernel/syscalls/ioctl/.gitignore b/testcases/kernel/syscalls/ioctl/.gitignore
index 4cfef2839..534c4ab34 100644
--- a/testcases/kernel/syscalls/ioctl/.gitignore
+++ b/testcases/kernel/syscalls/ioctl/.gitignore
@@ -7,6 +7,7 @@
 /ioctl07
 /ioctl08
 /ioctl_loop01
+/ioctl_loop02
 /ioctl_ns01
 /ioctl_ns02
 /ioctl_ns03
diff --git a/testcases/kernel/syscalls/ioctl/ioctl_loop02.c b/testcases/kernel/syscalls/ioctl/ioctl_loop02.c
new file mode 100644
index 000000000..683171501
--- /dev/null
+++ b/testcases/kernel/syscalls/ioctl/ioctl_loop02.c
@@ -0,0 +1,150 @@
+// 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 LO_FLAGS_READ_ONLY(similar as losetup -r)
+ * and LOOP_CHANGE_FD.
+ *
+ * For LOOP_CHANGE_FD, this operation is possible only if the loop device
+ * is read-only and the new backing store is the same size and type as the
+ * old backing store.
+ */
+
+#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"
+
+static int file_fd, file_change_fd, file_fd_invalid;
+static char backing_path[1024], backing_file_path[1024], backing_file_change_path[1024];
+static int attach_flag, dev_fd, file_fd;
+static char loop_ro_path[1024], dev_path[1024];
+
+/*
+ * This function is different from tst_attach_dev lib/tst_device.c.
+ * It only opens file_path with O_RDONLY mode before loop_set_fd.
+ * So we can generate LO_FLAGS_READ_ONLY flag.
+ */
+static void attach_device(char *img)
+{
+	dev_fd = SAFE_OPEN(dev_path, O_RDWR);
+	file_fd = SAFE_OPEN(img, O_RDONLY);
+
+	SAFE_IOCTL(dev_fd, LOOP_SET_FD, file_fd);
+
+	SAFE_CLOSE(dev_fd);
+	SAFE_CLOSE(file_fd);
+}
+
+static void verify_ioctl_loop(void)
+{
+	struct loop_info loopinfoget;
+
+	attach_device("test.img");
+	attach_flag = 1;
+
+	check_sys_value(loop_ro_path, 1);
+	check_sys_string(backing_path, backing_file_path);
+
+	dev_fd = SAFE_OPEN(dev_path, O_RDWR);
+	file_change_fd = SAFE_OPEN("test1.img", O_RDWR);
+	file_fd_invalid = SAFE_OPEN("test2.img", O_RDWR);
+
+	memset(&loopinfoget, 0, sizeof(loopinfoget));
+
+	/*
+	 * In drivers/block/loop.c code, set status function doesn't handle
+	 * LO_FLAGS_READ_ONLY flag and ignore it. Only loop_set_fd with readonly
+	 * mode, lo_flags will include LO_FLAGS_READ_ONLY.
+	 */
+	SAFE_IOCTL(dev_fd, LOOP_GET_STATUS, &loopinfoget);
+
+	if (loopinfoget.lo_flags & ~LO_FLAGS_READ_ONLY)
+		tst_res(TFAIL, "lo_flags has unexpected %d flag", loopinfoget.lo_flags);
+	else
+		tst_res(TPASS, "lo_flags only has default LO_FLAGS_READ_ONLY flag");
+
+	TEST(write(dev_fd, "xx", 2));
+	if (TST_RET != -1)
+		tst_res(TFAIL, "write succeed unexpectedly");
+	else
+		tst_res(TPASS | TTERRNO, "Can not write data in RO mode");
+
+	TEST(ioctl(dev_fd, LOOP_CHANGE_FD, file_change_fd));
+	if (TST_RET) {
+		tst_res(TFAIL | TTERRNO, "LOOP_CHANGE_FD failed");
+	} else {
+		tst_res(TPASS, "LOOP_CHANGE_FD succeeded");
+		check_sys_value(loop_ro_path, 1);
+		check_sys_string(backing_path, backing_file_change_path);
+	}
+
+	TEST(ioctl(dev_fd, LOOP_CHANGE_FD, file_fd_invalid));
+	if (TST_RET) {
+		if (TST_ERR == EINVAL)
+			tst_res(TPASS | TTERRNO, "LOOP_CHANGE_FD failed as expected");
+		else
+			tst_res(TFAIL | TTERRNO, "LOOP_CHANGE_FD failed expected EINVAL got");
+	} else {
+		tst_res(TFAIL, "LOOP_CHANGE_FD succeeded");
+	}
+
+	SAFE_CLOSE(dev_fd);
+	SAFE_CLOSE(file_change_fd);
+	SAFE_CLOSE(file_fd_invalid);
+	tst_detach_device(dev_path);
+	attach_flag = 0;
+}
+
+static void setup(void)
+{
+	int dev_num;
+
+	char *tmpdir = tst_get_tmpdir();
+	dev_num = tst_find_free_loopdev(dev_path, sizeof(dev_path));
+	if (dev_num < 0)
+		tst_brk(TBROK, "Failed to find free loop device");
+
+	tst_fill_file("test.img", 0, 1024, 10);
+	tst_fill_file("test1.img", 0, 1024, 10);
+	tst_fill_file("test2.img", 0, 2048, 20);
+
+	sprintf(backing_path, "/sys/block/loop%d/loop/backing_file", dev_num);
+	sprintf(backing_file_path, "%s/test.img", tmpdir);
+	sprintf(backing_file_change_path, "%s/test1.img", tmpdir);
+	sprintf(loop_ro_path, "/sys/block/loop%d/ro", dev_num);
+	if (tmpdir)
+		free(tmpdir);
+}
+
+static void cleanup(void)
+{
+	if (dev_fd > 0)
+		SAFE_CLOSE(dev_fd);
+	if (file_fd > 0)
+		SAFE_CLOSE(file_fd);
+	if (file_change_fd > 0)
+		SAFE_CLOSE(file_change_fd);
+	if (file_fd_invalid > 0)
+		SAFE_CLOSE(file_fd_invalid);
+	if (attach_flag)
+		tst_detach_device(dev_path);
+}
+
+static struct tst_test test = {
+	.setup = setup,
+	.cleanup = cleanup,
+	.test_all = verify_ioctl_loop,
+	.needs_root = 1,
+	.needs_tmpdir = 1,
+	.needs_drivers = (const char *const []) {
+		"loop",
+		NULL
+	}
+};
-- 
2.23.0




  parent reply	other threads:[~2020-04-09 10: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             ` Yang Xu [this message]
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
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=1586429086-22975-4-git-send-email-xuyang2018.jy@cn.fujitsu.com \
    --to=xuyang2018.jy@cn.fujitsu.com \
    --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.