[LTP] [PATCH v1] syscalls/copy_file_range: add/restructured tests
Petr Vorel
pvorel@suse.cz
Tue Apr 23 10:24:39 CEST 2019
Hi Christian,
good work. Some details below, not really related to copy_file_range() syscall.
> copy_file_range01:
> restructured testcase, removed unnecessary code,
> improved readability and shortened output (only
> failures get printed now).
> copy_file_range02:
> add testcases which test basic functions and error
> handling of the syscall.
> copy_file_range03:
> add testcase to check if this operation updates
> timestamps accordingly.
> Signed-off-by: Christian Amann <camann@suse.com>
> ---
> .../kernel/syscalls/copy_file_range/.gitignore | 2 +
> .../syscalls/copy_file_range/copy_file_range.h | 31 +++
> .../syscalls/copy_file_range/copy_file_range01.c | 229 +++++++++++----------
> .../syscalls/copy_file_range/copy_file_range02.c | 123 +++++++++++
> .../syscalls/copy_file_range/copy_file_range03.c | 78 +++++++
> 5 files changed, 355 insertions(+), 108 deletions(-)
> create mode 100644 testcases/kernel/syscalls/copy_file_range/copy_file_range.h
> create mode 100644 testcases/kernel/syscalls/copy_file_range/copy_file_range02.c
> create mode 100644 testcases/kernel/syscalls/copy_file_range/copy_file_range03.c
1) You're missing newly added copy_file_range0{2,3} into runtest/syscalls.
2) There are some failures in old distros caused by variables initialised inside
for loop: error [1] [2]:
copy_file_range01.c: In function 'setup':
copy_file_range01.c:216:2: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (int i = 0; i < (int)(page_size * 4); i++)
^
...
> +++ b/testcases/kernel/syscalls/copy_file_range/copy_file_range.h
> @@ -0,0 +1,31 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2019 SUSE LLC
> + * Author: Christian Amann <camann@suse.com>
> + */
> +
> +#ifndef __COPY_FILE_RANGE_H__
> +#define __COPY_FILE_RANGE_H__
> +
> +#include "lapi/syscalls.h"
> +
> +#define SUCCESS 0
I wonder if using <stdbool.h> and true/false wouldn't be better.
I know it's C++, but we're using this header in some tests already.
(than it'd be good to do the same approach in
testcases/kernel/syscalls/ioctl/ioctl08.c, other files defining it are still
using test.h - legacy API, so they're waiting for a cleanup).
+ you define SUCCESS also in copy_file_range02.c, which is using this header, so
it's redundant there.
> +
> +#define MNTPOINT "mnt_point"
> +#define FILE_SRC_PATH "file_src"
> +#define FILE_DEST_PATH "file_dest"
> +#define FILE_RDONL_PATH "file_rdonl"
> +#define FILE_DIR_PATH "file_dir"
> +#define FILE_MNTED_PATH MNTPOINT"/file_mnted"
> +
> +
> +#define CONTENT "ABCDEFGHIJKLMNOPQRSTUVWXYZ12345\n"
> +
> +static int sys_copy_file_range(int fd_in, loff_t *off_in,
> + int fd_out, loff_t *off_out, size_t len, unsigned int flags)
> +{
> + return tst_syscall(__NR_copy_file_range, fd_in, off_in, fd_out,
> + off_out, len, flags);
> +}
According to man copy_file_range(2) there is also glibc implementation since
glibc 2.27 (in io/copy_file_range-compat.c, with tests in io/tst-copy_file_range.c).
Maybe it'd be good to test also this via .test_variants [3]. That'd require
autotools check for libc implementation.
...
> +++ b/testcases/kernel/syscalls/copy_file_range/copy_file_range01.c
> @@ -1,5 +1,6 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> /*
> - * Copyright (c) Linux Test Project, 2017
> + * Copyright (c) Linux Test Project, 2019
> *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License as published by
> @@ -12,55 +13,28 @@
> * the GNU General Public License for more details.
> */
> +/*
> + * This tests the fundamental functionalities of the copy_file_range
> + * syscall. It does so by copying the contents of one file into
> + * another using various different combinations for length and
> + * input/output offsets.
> + *
> + * After a copy is done this test checks if the contents of both files
> + * are equal at the given offsets. It is also inspected if the offsets
> + * of the file descriptors are advanced correctly.
> + */
> +
> #define _GNU_SOURCE
nitpicking: Any idea why _GNU_SOURCE is needed? It's in a man page, but even
when compiling without -D_FORTIFY_SOURCE=2 it does not complain.
...
> +static void openFiles(void)
I guess we prefer underscore instead of camel case style (i.e. open_files).
> +{
> + fd_in = SAFE_OPEN(FILE_SRC_PATH, O_RDONLY);
> + fd_out = SAFE_OPEN(FILE_DEST_PATH, O_CREAT | O_WRONLY | O_TRUNC, 0644);
> +}
> +
> +static void closeFiles(void)
Same here.
> +{
> + if (fd_out > 0)
> + SAFE_CLOSE(fd_out);
> + if (fd_in > 0)
> + SAFE_CLOSE(fd_in);
> }
...
Kind regards,
Petr
[1] https://api.travis-ci.org/v3/job/523356189/log.txt
[2] https://api.travis-ci.org/v3/job/523356184/log.txt
[3] https://github.com/linux-test-project/ltp/wiki/Test-Writing-Guidelines#2229-testing-similar-syscalls-in-one-test
More information about the ltp
mailing list