[LTP] [PATCH v7 3/3] syscalls/copy_file_range02: increase coverage and remove EXDEV test

Murphy Zhou
2019-08-08T03:57:30Z

On Thu, Aug 08, 2019 at 11:11:43AM +0800, Yang Xu wrote:
> on 2019/08/07 18:17, Murphy Zhou wrote:
>
> > And I have a question about LTP itself.
> >
> > If we run the testcase directly like:
> > ./testcases/kernel/syscalls/copy_file_range/copy_file_range02
> >
> > to test all_filesystems, for every filesystem, we mkfs and mount it in
> > .mntpoint, but we do not chdir to .mntpoint. So we are running tests in
> > the same tmpdir, fs type of which does not change while looping
> > all_filesystems. Only the .mntpoint in tmpdir has different fs type in
> > each loop.
> >
> > Now we are using this to test cross-device copy in copy_file_range01.c,
> > but in copy_file_range02.c, we are not using .mntpint at all, all the
> > tests in the all_filesystems loop are running in the same tmpdir. In other
> > words, we are NOT testing all filesystems.
> >
> > Is this expected?
> I removed the mnted test for cross-device copy_file_range in copy_file_range02.c.
> And I ignore the non-used mntpoint. IMO, we can directly use the FILE_MNTED to test EFBIG on all filesystems,

If mntpoint is not used, it makes absolutely NO sense to test all_filesystems.

Because in the all_filesystems loop, various supported filesystems are
created and mounted in mntpoint.

And the copy_file_range tests happens outside of mntpoint. It just repeats
the same test several times in the same tmpdir, fs type of which depends
on /tmp configuration.

When the log prints "testing ext2", it's not the truth.

EFBIG is another issue.

Thanks,
Murphy
>
> as below:
> diff --git a/testcases/kernel/syscalls/copy_file_range/copy_file_range02.c b/testcases/kernel/syscalls/copy_file_range/copy_file_range02.c
> index 26bfa008a..67974ffa2 100644
> --- a/testcases/kernel/syscalls/copy_file_range/copy_file_range02.c
> +++ b/testcases/kernel/syscalls/copy_file_range/copy_file_range02.c
> @@ -49,6 +49,7 @@ static int fd_blkdev;
> static int fd_chrdev;
> static int fd_fifo;
> static int fd_copy;
> +static int fd_mnted;
>
> static int chattr_i_nsup;
> static int swap_nsup;
>
> @@ -73,7 +74,7 @@ static struct tcase {
> {&fd_chrdev, 0, EINVAL, 0, CONTSIZE},
> {&fd_fifo, 0, EINVAL, 0, CONTSIZE},
> {&fd_copy, 0, EOVERFLOW, MAX_OFF, ULLONG_MAX},
> - {&fd_copy, 0, EFBIG, MAX_OFF, MIN_OFF},
> + {&fd_mnted, 0, EFBIG, MAX_OFF, MIN_OFF},
> };
>
> static int run_command(char *command, char *option, char *file)
> @@ -117,7 +118,10 @@ static void verify_copy_file_range(unsigned int n)
> tst_res(TPASS | TTERRNO,
> "copy_file_range failed as expected");
> } else {
> - tst_res(TFAIL | TTERRNO,
> + if (tc->exp_err == EFBIG && TST_ERR == EXDEV)
> + tst_res(TCONF, "copy_file_range doesn't support cross-device,skip it");
> + else
> + tst_res(TFAIL | TTERRNO,
> "copy_file_range failed unexpectedly; expected %s, but got",
> tst_strerrno(tc->exp_err));
> return;
>
> @@ -152,6 +156,8 @@ static void cleanup(void)
> SAFE_CLOSE(fd_dup);
> if (fd_copy > 0)
> SAFE_CLOSE(fd_copy);
> + if (fd_mnted > 0)
> + SAFE_CLOSE(fd_mnted);
> SAFE_UNLINK(FILE_FIFO);
> }
>
> @@ -194,6 +200,7 @@ static void setup(void)
>
> fd_copy = SAFE_OPEN(FILE_COPY_PATH, O_RDWR | O_CREAT | O_TRUNC, 0664);
> chattr_i_nsup = run_command("chattr", "+i", FILE_IMMUTABLE_PATH);
> + fd_mnted = SAFE_OPEN(FILE_MNTED_PATH, O_RDWR | O_CREAT, 0664);
>
> if (!tst_fs_has_free(".", sysconf(_SC_PAGESIZE) * 10, TST_BYTES)) {
> tst_res(TCONF, "Insufficient disk space to create swap file");
> swap_nsup = 3;
>
> test12) succeed on extN, failed on both btrfs and xfs, we need to detect filesystem type to handle. Or, I think we
> can set a limit on filesize because this kind of user scene is a bit more than the first one , the EFBIG error can be
> received easily (Also, we don't need mnt_device mntpoint all_filesystem if so).
> What do you think about it?
>
> > I commented out testcases in copy_file_range02.c other then #12, and add
> > some nasty debug info:
>
>
>