[LTP] [PATCH v1 02/10] syscalls/ioctl:add common c file for loop ioctl

Yang Xu xuyang2018.jy@cn.fujitsu.com
Thu Apr 9 04:42:01 CEST 2020


Hi Cyril

> Hi!
>> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
>> ---
>>   testcases/kernel/syscalls/ioctl/Makefile      |  3 +
>>   .../syscalls/ioctl/ioctl_loop_support.c       | 74 +++++++++++++++++++
>>   .../syscalls/ioctl/ioctl_loop_support.h       | 14 ++++
>>   3 files changed, 91 insertions(+)
>>   create mode 100644 testcases/kernel/syscalls/ioctl/ioctl_loop_support.c
>>   create mode 100644 testcases/kernel/syscalls/ioctl/ioctl_loop_support.h
>>
>> diff --git a/testcases/kernel/syscalls/ioctl/Makefile b/testcases/kernel/syscalls/ioctl/Makefile
>> index c2ff6c8e7..05a75d1b4 100644
>> --- a/testcases/kernel/syscalls/ioctl/Makefile
>> +++ b/testcases/kernel/syscalls/ioctl/Makefile
>> @@ -7,6 +7,9 @@ include $(top_srcdir)/include/mk/testcases.mk
>>   
>>   INSTALL_TARGETS		+= test_ioctl
>>   
>> +MAKE_TARGETS            := $(patsubst $(abs_srcdir)/%.c,%,$(wildcard $(abs_srcdir)/ioctl_loop[0-9]*.c))
>> +$(MAKE_TARGETS): %: ioctl_loop_support.o
> 
> I guess that we should use anything else than MAKE_TARGETS because
> changing that variable will disable rest of the ioctl tests from build
> right?
> 
Yes, you are right.
> As this only expresses dependency on the object file we should use any
> variable name that is not used by the test library itself.
I think the following code maybe ok.
+FILTER_OUT_MAKE_TARGETS         := ioctl_loop_support
+
+LOOP_TARGETS            := $(patsubst $(abs_srcdir)/%.c,%,$(wildcard 
$(abs_srcdir)/ioctl_loop*[0-9].c))
+$(LOOP_TARGETS): %: ioctl_loop_support.o


> 
>>   ifeq ($(ANDROID),1)
>>   FILTER_OUT_MAKE_TARGETS	+= ioctl02
>>   endif
>> diff --git a/testcases/kernel/syscalls/ioctl/ioctl_loop_support.c b/testcases/kernel/syscalls/ioctl/ioctl_loop_support.c
>> new file mode 100644
>> index 000000000..4099bd364
>> --- /dev/null
>> +++ b/testcases/kernel/syscalls/ioctl/ioctl_loop_support.c
>> @@ -0,0 +1,74 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright (c) 2020 FUJITSU LIMITED. All rights reserved.
>> + * Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
>> + */
>> +#define TST_NO_DEFAULT_MAIN
>> +#include "ioctl_loop_support.h"
>> +#include "tst_test.h"
>> +
>> +void check_sys_value(char *path, int setvalue)
>> +{
>> +	int getvalue;
>> +
>> +	SAFE_FILE_SCANF(path, "%d", &getvalue);
>> +	if (setvalue == getvalue)
>> +		tst_res(TPASS, "%s value is %d", path, setvalue);
>> +	else
>> +		tst_res(TFAIL, "%s value expected %d got %d", path, setvalue, getvalue);
>> +}
>> +
>> +void check_sys_string(char *path, char *setmessage)
>> +{
>> +	char getmessage[1024];
>> +
>> +	SAFE_FILE_SCANF(path, "%s", getmessage);
>> +	if (strcmp(setmessage, getmessage))
>> +		tst_res(TFAIL, "%s expected %s got %s", path, setmessage, getmessage);
>> +	else
>> +		tst_res(TPASS, "%s string is %s", path, getmessage);
>> +}
>> +
>> +void safe_set_status(int dev_fd, struct loop_info loopinfo)
>> +{
>> +	int sleep_us = 4096;
>> +	int ret = 0;
>> +
>> +	/*
>> +	 * It may have dirty page, so loop dirver may get EAGAIN error
>> +	 * when we use different offset or sizelimit.
>> +	 */
>> +	ret = ioctl(dev_fd, LOOP_SET_STATUS, &loopinfo);
>> +	while (ret != 0 && errno == EAGAIN && sleep_us < 100000) {
>> +		ret = ioctl(dev_fd, LOOP_SET_STATUS, &loopinfo);
>> +		usleep(sleep_us);
>> +		sleep_us *= 2;
>> +	}
> 
> TBROK here if we failed to set the status?
Yes.
> 
> Also we should use the TST_RETRY_FUNC() instead because that one uses
> the timeout multiplier environment variable.
Ok, I will use TST_RETRY_FUNC macro.
> 
>> +}
>> +
>> +void safe_set_status64(int dev_fd, struct loop_info64 loopinfo)
>> +{
>> +	int sleep_us = 4096;
>> +	int ret = 0;
>> +
>> +	/*
>> +	 * It may have dirty page, so loop dirver may get EAGAIN error
>> +	 * when we use different offset or sizelimit.
>> +	 */
>> +	ret = ioctl(dev_fd, LOOP_SET_STATUS64, &loopinfo);
>> +	while (ret != 0 && errno == EAGAIN && sleep_us < 100000) {
>> +		ret = ioctl(dev_fd, LOOP_SET_STATUS64, &loopinfo);
>> +		usleep(sleep_us);
>> +		sleep_us *= 2;
>> +	}
> 
> Here as well.

> 
>> +}
>> +
>> +void check_support_cmd(int dev_fd, int ioctl_flag, int value, char *message)
>> +{
>> +	int ret = 0;
>> +
>> +	ret = ioctl(dev_fd, ioctl_flag, value);
>> +	if (ret && errno == EINVAL)
>> +		tst_brk(TCONF, "Current environment doesn't support this flag(%s)",
>> +				message);
>> +}
>> diff --git a/testcases/kernel/syscalls/ioctl/ioctl_loop_support.h b/testcases/kernel/syscalls/ioctl/ioctl_loop_support.h
>> new file mode 100644
>> index 000000000..44445af8a
>> --- /dev/null
>> +++ b/testcases/kernel/syscalls/ioctl/ioctl_loop_support.h
>> @@ -0,0 +1,14 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright (c) 2020 FUJITSU LIMITED. All rights reserved.
>> + * Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
>> + */
>> +#ifndef IOCTL_LOOP_H
>> +#define IOCTL_lOOP_H
>> +#include <linux/loop.h>
>> +void check_sys_value(char *path, int setvalue);
>> +void check_sys_string(char *path, char *setmessage);
>> +void safe_set_status(int dev_fd, struct loop_info loopinfo);
>> +void safe_set_status64(int dev_fd, struct loop_info64 loopinfo);
>> +void check_support_cmd(int dev_fd, int ioctl_flag, int value, char *message);
>> +#endif
>> -- 
>> 2.23.0
>>
>>
>>
>>
>> -- 
>> Mailing list info: https://lists.linux.it/listinfo/ltp
> 




More information about the ltp mailing list