* [LTP] [PATCH v1 1/2] Allow detach file from loop device with opening dev_fd @ 2020-07-23 8:30 Yang Xu 2020-07-23 8:30 ` [LTP] [PATCH v1 2/2] syscalls/ioctl: Use tst_detach_device_by_fd api Yang Xu 2020-07-23 9:25 ` [LTP] [PATCH v1 1/2] Allow detach file from loop device with opening dev_fd Cyril Hrubis 0 siblings, 2 replies; 4+ messages in thread From: Yang Xu @ 2020-07-23 8:30 UTC (permalink / raw) To: ltp Before this api, it will report the following error when using tst_attach_device with opening device fd because the device was opened twice at this point. tst_device.c:223: WARN: ioctl(/dev/loop0, LOOP_CLR_FD, 0) no ENXIO for >> too long Add a tst_detach_device_by_fd() and change the library so that tst_detach_device() opens/close the dev_path and calls tst_detach_device_by_fd() internally. Suggested-by: Cyril Hrubis <chrubis@suse.cz> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com> --- include/tst_device.h | 11 +++++++++++ lib/tst_device.c | 31 ++++++++++++++++++------------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/include/tst_device.h b/include/tst_device.h index 6a1fc5186..59cc5b96c 100644 --- a/include/tst_device.h +++ b/include/tst_device.h @@ -57,11 +57,22 @@ int tst_find_free_loopdev(const char *path, size_t path_len); */ int tst_attach_device(const char *dev_path, const char *file_path); +/* + * Detaches a file from a loop device fd. + * + * @dev_path Path to the loop device e.g. /dev/loop0 + * @dev_fd a open fd for the loop device + * @return Zero on succes, non-zero otherwise. + * */ + +int tst_detach_device_by_fd(const char *dev_path, int dev_fd); + /* * Detaches a file from a loop device. * * @dev_path Path to the loop device e.g. /dev/loop0 * @return Zero on succes, non-zero otherwise. + * In internal, call tst_detach_device_by_fd api. */ int tst_detach_device(const char *dev_path); diff --git a/lib/tst_device.c b/lib/tst_device.c index 131a223be..8d8bc5b40 100644 --- a/lib/tst_device.c +++ b/lib/tst_device.c @@ -187,43 +187,48 @@ int tst_attach_device(const char *dev, const char *file) return 0; } -int tst_detach_device(const char *dev) +int tst_detach_device_by_fd(const char *dev, int dev_fd) { - int dev_fd, ret, i; - - dev_fd = open(dev, O_RDONLY); - if (dev_fd < 0) { - tst_resm(TWARN | TERRNO, "open(%s) failed", dev); - return 1; - } + int ret, i; /* keep trying to clear LOOPDEV until we get ENXIO, a quick succession * of attach/detach might not give udev enough time to complete */ for (i = 0; i < 40; i++) { ret = ioctl(dev_fd, LOOP_CLR_FD, 0); - if (ret && (errno == ENXIO)) { - close(dev_fd); + if (ret && (errno == ENXIO)) return 0; - } if (ret && (errno != EBUSY)) { tst_resm(TWARN, "ioctl(%s, LOOP_CLR_FD, 0) unexpectedly failed with: %s", dev, tst_strerrno(errno)); - close(dev_fd); return 1; } usleep(50000); } - close(dev_fd); tst_resm(TWARN, "ioctl(%s, LOOP_CLR_FD, 0) no ENXIO for too long", dev); return 1; } +int tst_detach_device(const char *dev) +{ + int dev_fd, ret; + + dev_fd = open(dev, O_RDONLY); + if (dev_fd < 0) { + tst_resm(TWARN | TERRNO, "open(%s) failed", dev); + return 1; + } + + ret = tst_detach_device_by_fd(dev, dev_fd); + close(dev_fd); + return ret; +} + int tst_dev_sync(int fd) { return syscall(__NR_syncfs, fd); -- 2.23.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [LTP] [PATCH v1 2/2] syscalls/ioctl: Use tst_detach_device_by_fd api 2020-07-23 8:30 [LTP] [PATCH v1 1/2] Allow detach file from loop device with opening dev_fd Yang Xu @ 2020-07-23 8:30 ` Yang Xu 2020-07-23 9:26 ` Cyril Hrubis 2020-07-23 9:25 ` [LTP] [PATCH v1 1/2] Allow detach file from loop device with opening dev_fd Cyril Hrubis 1 sibling, 1 reply; 4+ messages in thread From: Yang Xu @ 2020-07-23 8:30 UTC (permalink / raw) To: ltp Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com> --- testcases/kernel/syscalls/ioctl/ioctl09.c | 5 ++--- testcases/kernel/syscalls/ioctl/ioctl_loop01.c | 6 ++---- testcases/kernel/syscalls/ioctl/ioctl_loop02.c | 5 +---- testcases/kernel/syscalls/ioctl/ioctl_loop04.c | 5 ++--- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/testcases/kernel/syscalls/ioctl/ioctl09.c b/testcases/kernel/syscalls/ioctl/ioctl09.c index 6a7f4042b..151618df4 100644 --- a/testcases/kernel/syscalls/ioctl/ioctl09.c +++ b/testcases/kernel/syscalls/ioctl/ioctl09.c @@ -70,7 +70,6 @@ static void verify_ioctl(void) tst_attach_device(dev_path, "test.img"); attach_flag = 1; - dev_fd = SAFE_OPEN(dev_path, O_RDWR); loopinfo.lo_flags = LO_FLAGS_PARTSCAN; SAFE_IOCTL(dev_fd, LOOP_SET_STATUS, &loopinfo); check_partition(1, true); @@ -81,8 +80,7 @@ static void verify_ioctl(void) check_partition(1, true); check_partition(2, true); - SAFE_CLOSE(dev_fd); - tst_detach_device(dev_path); + tst_detach_device_by_fd(dev_path, dev_fd); attach_flag = 0; } @@ -92,6 +90,7 @@ static void setup(void) if (dev_num < 0) tst_brk(TBROK, "Failed to find free loop device"); tst_prealloc_file("test.img", 1024 * 1024, 20); + dev_fd = SAFE_OPEN(dev_path, O_RDWR); } static void cleanup(void) diff --git a/testcases/kernel/syscalls/ioctl/ioctl_loop01.c b/testcases/kernel/syscalls/ioctl/ioctl_loop01.c index f334b5eb2..845a1399b 100644 --- a/testcases/kernel/syscalls/ioctl/ioctl_loop01.c +++ b/testcases/kernel/syscalls/ioctl/ioctl_loop01.c @@ -86,15 +86,12 @@ static void verify_ioctl_loop(void) TST_ASSERT_INT(autoclear_path, 0); TST_ASSERT_STR(backing_path, backing_file_path); - dev_fd = SAFE_OPEN(dev_path, O_RDWR); - check_loop_value(SET_FLAGS, GET_FLAGS, 1); tst_res(TINFO, "Test flag can be clear"); check_loop_value(0, LO_FLAGS_PARTSCAN, 0); - SAFE_CLOSE(dev_fd); - tst_detach_device(dev_path); + tst_detach_device_by_fd(dev_path, dev_fd); attach_flag = 0; } @@ -129,6 +126,7 @@ static void setup(void) sprintf(sys_loop_partpath, "/sys/block/loop%d/loop%dp1", dev_num, dev_num); sprintf(backing_file_path, "%s/test.img", tst_get_tmpdir()); sprintf(loop_partpath, "%sp1", dev_path); + dev_fd = SAFE_OPEN(dev_path, O_RDWR); } static void cleanup(void) diff --git a/testcases/kernel/syscalls/ioctl/ioctl_loop02.c b/testcases/kernel/syscalls/ioctl/ioctl_loop02.c index 3a03d052a..ac6184216 100644 --- a/testcases/kernel/syscalls/ioctl/ioctl_loop02.c +++ b/testcases/kernel/syscalls/ioctl/ioctl_loop02.c @@ -50,7 +50,6 @@ static void verify_ioctl_loop(unsigned int n) tst_res(TINFO, "%s", tc->message); file_fd = SAFE_OPEN("test.img", tc->mode); - dev_fd = SAFE_OPEN(dev_path, O_RDWR); if (tc->ioctl == LOOP_SET_FD) { SAFE_IOCTL(dev_fd, LOOP_SET_FD, file_fd); @@ -97,9 +96,8 @@ static void verify_ioctl_loop(unsigned int n) tst_res(TFAIL, "LOOP_CHANGE_FD succeeded"); } - SAFE_CLOSE(dev_fd); SAFE_CLOSE(file_fd); - tst_detach_device(dev_path); + tst_detach_device_by_fd(dev_path, dev_fd); attach_flag = 0; } @@ -136,7 +134,6 @@ static void setup(void) loop_configure_sup = 0; } loopconfig.info.lo_flags = LO_FLAGS_READ_ONLY; - SAFE_CLOSE(dev_fd); } static void cleanup(void) diff --git a/testcases/kernel/syscalls/ioctl/ioctl_loop04.c b/testcases/kernel/syscalls/ioctl/ioctl_loop04.c index b882728fc..af3e90ddc 100644 --- a/testcases/kernel/syscalls/ioctl/ioctl_loop04.c +++ b/testcases/kernel/syscalls/ioctl/ioctl_loop04.c @@ -33,7 +33,6 @@ static void verify_ioctl_loop(void) attach_flag = 1; TST_ASSERT_INT(sys_loop_sizepath, OLD_SIZE/512); - dev_fd = SAFE_OPEN(dev_path, O_RDWR); file_fd = SAFE_OPEN("test.img", O_RDWR); SAFE_IOCTL(dev_fd, LOOP_GET_STATUS, &loopinfoget); @@ -55,8 +54,7 @@ static void verify_ioctl_loop(void) TST_ASSERT_INT(sys_loop_sizepath, NEW_SIZE/512); SAFE_CLOSE(file_fd); - SAFE_CLOSE(dev_fd); - tst_detach_device(dev_path); + tst_detach_device_by_fd(dev_path, dev_fd); unlink("test.img"); attach_flag = 0; } @@ -70,6 +68,7 @@ static void setup(void) wrbuf = SAFE_MALLOC(OLD_SIZE); memset(wrbuf, 'x', OLD_SIZE); sprintf(sys_loop_sizepath, "/sys/block/loop%d/size", dev_num); + dev_fd = SAFE_OPEN(dev_path, O_RDWR); } static void cleanup(void) -- 2.23.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [LTP] [PATCH v1 2/2] syscalls/ioctl: Use tst_detach_device_by_fd api 2020-07-23 8:30 ` [LTP] [PATCH v1 2/2] syscalls/ioctl: Use tst_detach_device_by_fd api Yang Xu @ 2020-07-23 9:26 ` Cyril Hrubis 0 siblings, 0 replies; 4+ messages in thread From: Cyril Hrubis @ 2020-07-23 9:26 UTC (permalink / raw) To: ltp Hi! Pushed with fix for ioctl_loop04, thanks. I've fixed the -i 2 case for ioctl_loop04 with: diff --git a/testcases/kernel/syscalls/ioctl/ioctl_loop04.c b/testcases/kernel/syscalls/ioctl/ioctl_loop04.c index af3e90ddc..b4ab44a74 100644 --- a/testcases/kernel/syscalls/ioctl/ioctl_loop04.c +++ b/testcases/kernel/syscalls/ioctl/ioctl_loop04.c @@ -42,6 +42,8 @@ static void verify_ioctl_loop(void) SAFE_TRUNCATE("test.img", NEW_SIZE); SAFE_IOCTL(dev_fd, LOOP_SET_CAPACITY); + SAFE_LSEEK(dev_fd, 0, SEEK_SET); + /*check that we can't write data beyond 5K into loop device*/ TEST(write(dev_fd, wrbuf, OLD_SIZE)); if (TST_RET == NEW_SIZE) { -- Cyril Hrubis chrubis@suse.cz ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [LTP] [PATCH v1 1/2] Allow detach file from loop device with opening dev_fd 2020-07-23 8:30 [LTP] [PATCH v1 1/2] Allow detach file from loop device with opening dev_fd Yang Xu 2020-07-23 8:30 ` [LTP] [PATCH v1 2/2] syscalls/ioctl: Use tst_detach_device_by_fd api Yang Xu @ 2020-07-23 9:25 ` Cyril Hrubis 1 sibling, 0 replies; 4+ messages in thread From: Cyril Hrubis @ 2020-07-23 9:25 UTC (permalink / raw) To: ltp Hi! I've added a bit more verbose explanation to the comments in the header and pushed, thanks. -- Cyril Hrubis chrubis@suse.cz ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-07-23 9:26 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-07-23 8:30 [LTP] [PATCH v1 1/2] Allow detach file from loop device with opening dev_fd Yang Xu 2020-07-23 8:30 ` [LTP] [PATCH v1 2/2] syscalls/ioctl: Use tst_detach_device_by_fd api Yang Xu 2020-07-23 9:26 ` Cyril Hrubis 2020-07-23 9:25 ` [LTP] [PATCH v1 1/2] Allow detach file from loop device with opening dev_fd Cyril Hrubis
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.