diff mbox series

[v4,2/3] syscalls/copy_file_range01: add cross-device test

Message ID 1562755997-5626-2-git-send-email-xuyang2018.jy@cn.fujitsu.com
State Changes Requested
Headers show
Series [v4,1/3] lib: alter find_free_loopdev() | expand

Commit Message

Yang Xu July 10, 2019, 10:53 a.m. UTC
Amir has relaxed cross-device constraint since commit(vfs: allow
copy_file_range to copy across devices), I think we can remove it
in copy_file_range02 and test it in copy_file_range01.

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
---
 .../copy_file_range/copy_file_range01.c       | 53 +++++++++++++++----
 1 file changed, 42 insertions(+), 11 deletions(-)

Comments

Xiao Yang July 10, 2019, 3:56 p.m. UTC | #1
On 07/10/2019 06:53 PM, Yang Xu wrote:
> Amir has relaxed cross-device constraint since commit(vfs: allow
> copy_file_range to copy across devices), I think we can remove it
> in copy_file_range02 and test it in copy_file_range01.
>
> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> Reviewed-by: Amir Goldstein <amir73il@gmail.com>
> ---
>   .../copy_file_range/copy_file_range01.c       | 53 +++++++++++++++----
>   1 file changed, 42 insertions(+), 11 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c b/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c
> index a5bd5e7f7..e1aa06c3e 100644
> --- a/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c
> +++ b/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c
> @@ -24,7 +24,17 @@
>   
>   static int page_size;
>   static int errcount, numcopies;
> -static int fd_in, fd_out;
> +static int fd_in, fd_out, cross_sup;
> +char FILE_TARGET_PATH[40];
> +
> +static struct tcase {
> +	char    *path;
> +	int     flags;
> +	char    *message;
> +} tcases[] = {
> +	{FILE_DEST_PATH,  0, "non cross-device"},
> +	{FILE_MNTED_PATH, 1, "cross-device"},
> +};
>   
>   static int check_file_content(const char *fname1, const char *fname2,
>   	loff_t *off1, loff_t *off2, size_t len)
> @@ -131,7 +141,7 @@ static void test_one(size_t len, loff_t *off_in, loff_t *off_out)
>   		to_copy -= TST_RET;
>   	} while (to_copy > 0);
>   
> -	ret = check_file_content(FILE_SRC_PATH, FILE_DEST_PATH,
> +	ret = check_file_content(FILE_SRC_PATH, FILE_TARGET_PATH,
>   		off_in, off_out, len);
>   	if (ret) {
>   		tst_res(TFAIL, "file contents do not match");
> @@ -152,7 +162,7 @@ static void test_one(size_t len, loff_t *off_in, loff_t *off_out)
>   static void open_files(void)
>   {
>   	fd_in  = SAFE_OPEN(FILE_SRC_PATH, O_RDONLY);
> -	fd_out = SAFE_OPEN(FILE_DEST_PATH, O_CREAT | O_WRONLY | O_TRUNC, 0644);
> +	fd_out = SAFE_OPEN(FILE_TARGET_PATH, O_CREAT | O_WRONLY | O_TRUNC, 0644);
Hi,

Why don't we remove the global FILE_TARGET_PATH by passing tc->path to 
open_files()?

>   }
>   
>   static void close_files(void)
> @@ -163,9 +173,18 @@ static void close_files(void)
>   		SAFE_CLOSE(fd_in);
>   }
>   
> -static void copy_file_range_verify(void)
> +static void copy_file_range_verify(unsigned int n)
>   {
>   	int i, j, k;
> +	struct tcase *tc = &tcases[n];
> +
> +	if (tc->flags && !cross_sup) {
> +		tst_res(TCONF,
> +			"copy_file_range doesn't support cross-device, skip it");
> +		return;
> +	}

Perhaps, we can remove the global cross_sup and check of EXDEV in 
setup() by passing tc->flag to one_test().

> +
> +	strcpy(FILE_TARGET_PATH, tc->path);
>   
>   	errcount = numcopies = 0;
>   	size_t len_arr[]	= {11, page_size-1, page_size, page_size+1};
> @@ -190,25 +209,33 @@ static void copy_file_range_verify(void)
>   
>   	if (errcount == 0)
>   		tst_res(TPASS,
> -			"copy_file_range completed all %d copy jobs successfully!",
> -			numcopies);
> +			"%s copy_file_range completed all %d copy jobs successfully!",
> +			tc->message, numcopies);
>   	else
> -		tst_res(TFAIL, "copy_file_range failed %d of %d copy jobs.",
> -				errcount, numcopies);
> +		tst_res(TFAIL, "%s copy_file_range failed %d of %d copy jobs.",
> +			tc->message, errcount, numcopies);
>   }
>   
>   static void setup(void)
>   {
> -	int i, fd;
> +	int i, fd, fd_test;
>   
>   	syscall_info();
>   
>   	page_size = getpagesize();
> -
> +	cross_sup = 1;
>   	fd = SAFE_OPEN(FILE_SRC_PATH, O_RDWR | O_CREAT, 0664);
>   	/* Writing page_size * 4 of data into test file */
>   	for (i = 0; i < (int)(page_size * 4); i++)
>   		SAFE_WRITE(1, fd, CONTENT, CONTSIZE);
> +
> +	fd_test = SAFE_OPEN(FILE_MNTED_PATH, O_RDWR | O_CREAT, 0664);
> +	TEST(sys_copy_file_range(fd, 0, fd_test, 0, CONTSIZE, 0));
> +	if (TST_ERR == EXDEV)
> +		cross_sup = 0;
> +
> +	SAFE_CLOSE(fd_test);
> +	remove(FILE_MNTED_PATH);
Is it necessary to remove it?

Best Regards,
Xiao Yang
>   	SAFE_CLOSE(fd);
>   }
>   
> @@ -220,7 +247,11 @@ static void cleanup(void)
>   static struct tst_test test = {
>   	.setup = setup,
>   	.cleanup = cleanup,
> +	.tcnt = ARRAY_SIZE(tcases),
>   	.needs_tmpdir = 1,
> -	.test_all = copy_file_range_verify,
> +	.mount_device = 1,
> +	.mntpoint = MNTPOINT,
> +	.all_filesystems = 1,
> +	.test = copy_file_range_verify,
>   	.test_variants = TEST_VARIANTS,
>   };
Yang Xu July 11, 2019, 6:18 a.m. UTC | #2
on 2019/07/10 23:56, Xiao Yang wrote:

> On 07/10/2019 06:53 PM, Yang Xu wrote:
>> Amir has relaxed cross-device constraint since commit(vfs: allow
>> copy_file_range to copy across devices), I think we can remove it
>> in copy_file_range02 and test it in copy_file_range01.
>>
>> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
>> Reviewed-by: Amir Goldstein <amir73il@gmail.com>
>> ---
>>   .../copy_file_range/copy_file_range01.c       | 53 +++++++++++++++----
>>   1 file changed, 42 insertions(+), 11 deletions(-)
>>
>> diff --git 
>> a/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c 
>> b/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c
>> index a5bd5e7f7..e1aa06c3e 100644
>> --- a/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c
>> +++ b/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c
>> @@ -24,7 +24,17 @@
>>     static int page_size;
>>   static int errcount, numcopies;
>> -static int fd_in, fd_out;
>> +static int fd_in, fd_out, cross_sup;
>> +char FILE_TARGET_PATH[40];
>> +
>> +static struct tcase {
>> +    char    *path;
>> +    int     flags;
>> +    char    *message;
>> +} tcases[] = {
>> +    {FILE_DEST_PATH,  0, "non cross-device"},
>> +    {FILE_MNTED_PATH, 1, "cross-device"},
>> +};
>>     static int check_file_content(const char *fname1, const char 
>> *fname2,
>>       loff_t *off1, loff_t *off2, size_t len)
>> @@ -131,7 +141,7 @@ static void test_one(size_t len, loff_t *off_in, 
>> loff_t *off_out)
>>           to_copy -= TST_RET;
>>       } while (to_copy > 0);
>>   -    ret = check_file_content(FILE_SRC_PATH, FILE_DEST_PATH,
>> +    ret = check_file_content(FILE_SRC_PATH, FILE_TARGET_PATH,
>>           off_in, off_out, len);
>>       if (ret) {
>>           tst_res(TFAIL, "file contents do not match");
>> @@ -152,7 +162,7 @@ static void test_one(size_t len, loff_t *off_in, 
>> loff_t *off_out)
>>   static void open_files(void)
>>   {
>>       fd_in  = SAFE_OPEN(FILE_SRC_PATH, O_RDONLY);
>> -    fd_out = SAFE_OPEN(FILE_DEST_PATH, O_CREAT | O_WRONLY | O_TRUNC, 
>> 0644);
>> +    fd_out = SAFE_OPEN(FILE_TARGET_PATH, O_CREAT | O_WRONLY | 
>> O_TRUNC, 0644);
> Hi,
>
> Why don't we remove the global FILE_TARGET_PATH by passing tc->path to 
> open_files()?
OK. I will remove it and pass tc->path to open_files() ,test_one();

>
>>   }
>>     static void close_files(void)
>> @@ -163,9 +173,18 @@ static void close_files(void)
>>           SAFE_CLOSE(fd_in);
>>   }
>>   -static void copy_file_range_verify(void)
>> +static void copy_file_range_verify(unsigned int n)
>>   {
>>       int i, j, k;
>> +    struct tcase *tc = &tcases[n];
>> +
>> +    if (tc->flags && !cross_sup) {
>> +        tst_res(TCONF,
>> +            "copy_file_range doesn't support cross-device, skip it");
>> +        return;
>> +    }
>
> Perhaps, we can remove the global cross_sup and check of EXDEV in 
> setup() by passing tc->flag to one_test().
OK. I will use tc->flag in setup,  flag =2 is equal to TCONF(doesn't support cross-dev).

>
>> +
>> +    strcpy(FILE_TARGET_PATH, tc->path);
>>         errcount = numcopies = 0;
>>       size_t len_arr[]    = {11, page_size-1, page_size, page_size+1};
>> @@ -190,25 +209,33 @@ static void copy_file_range_verify(void)
>>         if (errcount == 0)
>>           tst_res(TPASS,
>> -            "copy_file_range completed all %d copy jobs successfully!",
>> -            numcopies);
>> +            "%s copy_file_range completed all %d copy jobs 
>> successfully!",
>> +            tc->message, numcopies);
>>       else
>> -        tst_res(TFAIL, "copy_file_range failed %d of %d copy jobs.",
>> -                errcount, numcopies);
>> +        tst_res(TFAIL, "%s copy_file_range failed %d of %d copy jobs.",
>> +            tc->message, errcount, numcopies);
>>   }
>>     static void setup(void)
>>   {
>> -    int i, fd;
>> +    int i, fd, fd_test;
>>         syscall_info();
>>         page_size = getpagesize();
>> -
>> +    cross_sup = 1;
>>       fd = SAFE_OPEN(FILE_SRC_PATH, O_RDWR | O_CREAT, 0664);
>>       /* Writing page_size * 4 of data into test file */
>>       for (i = 0; i < (int)(page_size * 4); i++)
>>           SAFE_WRITE(1, fd, CONTENT, CONTSIZE);
>> +
>> +    fd_test = SAFE_OPEN(FILE_MNTED_PATH, O_RDWR | O_CREAT, 0664);
>> +    TEST(sys_copy_file_range(fd, 0, fd_test, 0, CONTSIZE, 0));
>> +    if (TST_ERR == EXDEV)
>> +        cross_sup = 0;
>> +
>> +    SAFE_CLOSE(fd_test);
>> +    remove(FILE_MNTED_PATH);
> Is it necessary to remove it?
>
I want to test on a clean environment, like FILE_DEST_PATH.
> Best Regards,
> Xiao Yang
>>       SAFE_CLOSE(fd);
>>   }
>>   @@ -220,7 +247,11 @@ static void cleanup(void)
>>   static struct tst_test test = {
>>       .setup = setup,
>>       .cleanup = cleanup,
>> +    .tcnt = ARRAY_SIZE(tcases),
>>       .needs_tmpdir = 1,
>> -    .test_all = copy_file_range_verify,
>> +    .mount_device = 1,
>> +    .mntpoint = MNTPOINT,
>> +    .all_filesystems = 1,
>> +    .test = copy_file_range_verify,
>>       .test_variants = TEST_VARIANTS,
>>   };
>
>
>
>
> .
>
diff mbox series

Patch

diff --git a/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c b/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c
index a5bd5e7f7..e1aa06c3e 100644
--- a/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c
+++ b/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c
@@ -24,7 +24,17 @@ 
 
 static int page_size;
 static int errcount, numcopies;
-static int fd_in, fd_out;
+static int fd_in, fd_out, cross_sup;
+char FILE_TARGET_PATH[40];
+
+static struct tcase {
+	char    *path;
+	int     flags;
+	char    *message;
+} tcases[] = {
+	{FILE_DEST_PATH,  0, "non cross-device"},
+	{FILE_MNTED_PATH, 1, "cross-device"},
+};
 
 static int check_file_content(const char *fname1, const char *fname2,
 	loff_t *off1, loff_t *off2, size_t len)
@@ -131,7 +141,7 @@  static void test_one(size_t len, loff_t *off_in, loff_t *off_out)
 		to_copy -= TST_RET;
 	} while (to_copy > 0);
 
-	ret = check_file_content(FILE_SRC_PATH, FILE_DEST_PATH,
+	ret = check_file_content(FILE_SRC_PATH, FILE_TARGET_PATH,
 		off_in, off_out, len);
 	if (ret) {
 		tst_res(TFAIL, "file contents do not match");
@@ -152,7 +162,7 @@  static void test_one(size_t len, loff_t *off_in, loff_t *off_out)
 static void open_files(void)
 {
 	fd_in  = SAFE_OPEN(FILE_SRC_PATH, O_RDONLY);
-	fd_out = SAFE_OPEN(FILE_DEST_PATH, O_CREAT | O_WRONLY | O_TRUNC, 0644);
+	fd_out = SAFE_OPEN(FILE_TARGET_PATH, O_CREAT | O_WRONLY | O_TRUNC, 0644);
 }
 
 static void close_files(void)
@@ -163,9 +173,18 @@  static void close_files(void)
 		SAFE_CLOSE(fd_in);
 }
 
-static void copy_file_range_verify(void)
+static void copy_file_range_verify(unsigned int n)
 {
 	int i, j, k;
+	struct tcase *tc = &tcases[n];
+
+	if (tc->flags && !cross_sup) {
+		tst_res(TCONF,
+			"copy_file_range doesn't support cross-device, skip it");
+		return;
+	}
+
+	strcpy(FILE_TARGET_PATH, tc->path);
 
 	errcount = numcopies = 0;
 	size_t len_arr[]	= {11, page_size-1, page_size, page_size+1};
@@ -190,25 +209,33 @@  static void copy_file_range_verify(void)
 
 	if (errcount == 0)
 		tst_res(TPASS,
-			"copy_file_range completed all %d copy jobs successfully!",
-			numcopies);
+			"%s copy_file_range completed all %d copy jobs successfully!",
+			tc->message, numcopies);
 	else
-		tst_res(TFAIL, "copy_file_range failed %d of %d copy jobs.",
-				errcount, numcopies);
+		tst_res(TFAIL, "%s copy_file_range failed %d of %d copy jobs.",
+			tc->message, errcount, numcopies);
 }
 
 static void setup(void)
 {
-	int i, fd;
+	int i, fd, fd_test;
 
 	syscall_info();
 
 	page_size = getpagesize();
-
+	cross_sup = 1;
 	fd = SAFE_OPEN(FILE_SRC_PATH, O_RDWR | O_CREAT, 0664);
 	/* Writing page_size * 4 of data into test file */
 	for (i = 0; i < (int)(page_size * 4); i++)
 		SAFE_WRITE(1, fd, CONTENT, CONTSIZE);
+
+	fd_test = SAFE_OPEN(FILE_MNTED_PATH, O_RDWR | O_CREAT, 0664);
+	TEST(sys_copy_file_range(fd, 0, fd_test, 0, CONTSIZE, 0));
+	if (TST_ERR == EXDEV)
+		cross_sup = 0;
+
+	SAFE_CLOSE(fd_test);
+	remove(FILE_MNTED_PATH);
 	SAFE_CLOSE(fd);
 }
 
@@ -220,7 +247,11 @@  static void cleanup(void)
 static struct tst_test test = {
 	.setup = setup,
 	.cleanup = cleanup,
+	.tcnt = ARRAY_SIZE(tcases),
 	.needs_tmpdir = 1,
-	.test_all = copy_file_range_verify,
+	.mount_device = 1,
+	.mntpoint = MNTPOINT,
+	.all_filesystems = 1,
+	.test = copy_file_range_verify,
 	.test_variants = TEST_VARIANTS,
 };