[LTP] [PATCH] lapi/fs.h: Replace MAX_LFS_FILESIZE constant with own implementation
Murphy Zhou
jencce.kernel@gmail.com
Fri Aug 16 10:53:09 CEST 2019
On Thu, Aug 15, 2019 at 10:36:30AM +0200, Petr Vorel wrote:
> Some libc implementations on arm (at least AArch32 target with hard
> float (arm-linux-gnueabihf)) or some libc (musl, bionic) does not
> export PAGE_SHIFT. Replace it with own inline function.
>
> This required to replace MAX_LFS_FILESIZE constant with function
> tst_max_lfs_filesize(). Given that we must use MAX_OFF in a function,
> move dst from tcase struct to verify_copy_file_range().
>
> Credits for 32 bit MAX_LFS_FILESIZE algorithm: Cyril Hrubis.
I got the same results:
copy_file_range02.c:120: INFO: dst 9223372036854710270 len 65537
copy_file_range02.c:136: FAIL: copy_file_range returned wrong value: 32
THanks,
M
>
> + replace spaces with tabs in struct tcase.
>
> Fixes: bc514b224 ("syscalls/copy_file_range02: increase coverage and remove EXDEV test")
> Fixes: #555
>
> Reported-by: alexchu-cpe
> Suggested-by: Cyril Hrubis <chrubis@suse.cz>
> Signed-off-by: Petr Vorel <pvorel@suse.cz>
> ---
> include/lapi/fs.h | 31 ++++++++++++----
> .../copy_file_range/copy_file_range.h | 3 --
> .../copy_file_range/copy_file_range02.c | 35 +++++++++++--------
> 3 files changed, 45 insertions(+), 24 deletions(-)
>
> diff --git a/include/lapi/fs.h b/include/lapi/fs.h
> index 1af55628c..430d21f27 100644
> --- a/include/lapi/fs.h
> +++ b/include/lapi/fs.h
> @@ -1,14 +1,18 @@
> // SPDX-License-Identifier: GPL-2.0-or-later
> /*
> - * Referred from linux kernel -github/torvalds/linux/include/uapi/linux/fs.h
> + * Referred from linux kernel include/uapi/linux/fs.h
> + * Copyright (c) 2019 Petr Vorel <pvorel@suse.cz>
> * Copyright (c) Zilogic Systems Pvt. Ltd., 2018
> * Email: code@zilogic.com
> */
> +
> #ifdef HAVE_LINUX_FS_H
> # include <linux/fs.h>
> #endif
> -# include <sys/user.h>
> -# include "lapi/abisize.h"
> +
> +#include <sys/user.h>
> +#include <limits.h>
> +#include "lapi/abisize.h"
>
> #ifndef LAPI_FS_H
> #define LAPI_FS_H
> @@ -37,11 +41,26 @@
> #define FS_NODUMP_FL 0x00000040 /* do not dump file */
> #endif
>
> -/* Referred form linux kernel include/linux/fs.h */
> +/*
> + * Helper function to get MAX_LFS_FILESIZE.
> + * Missing PAGE_SHIFT on some libc prevents defining MAX_LFS_FILESIZE.
> + *
> + * 64 bit: macro taken from kernel from include/linux/fs.h
> + * 32 bit: own implementation
> + */
> +static inline loff_t tst_max_lfs_filesize(void)
> +{
> #ifdef TST_ABI64
> - #define MAX_LFS_FILESIZE ((loff_t)LLONG_MAX)
> + return (loff_t)LLONG_MAX;
> #else
> - #define MAX_LFS_FILESIZE ((loff_t)ULONG_MAX << PAGE_SHIFT)
> + long page_size = getpagesize();
> + loff_t ret = ULONG_MAX;
> +
> + while (page_size >>= 1)
> + ret <<= 1;
> +
> + return ret;
> #endif
> +}
>
> #endif
> diff --git a/testcases/kernel/syscalls/copy_file_range/copy_file_range.h b/testcases/kernel/syscalls/copy_file_range/copy_file_range.h
> index 24e08e390..40d05d653 100644
> --- a/testcases/kernel/syscalls/copy_file_range/copy_file_range.h
> +++ b/testcases/kernel/syscalls/copy_file_range/copy_file_range.h
> @@ -10,7 +10,6 @@
> #include <stdbool.h>
> #include <unistd.h>
> #include <sys/sysmacros.h>
> -#include <limits.h>
> #include "lapi/syscalls.h"
> #include "lapi/fs.h"
>
> @@ -30,9 +29,7 @@
>
> #define CONTENT "ABCDEFGHIJKLMNOPQRSTUVWXYZ12345\n"
> #define CONTSIZE (sizeof(CONTENT) - 1)
> -#define MAX_LEN MAX_LFS_FILESIZE
> #define MIN_OFF 65537
> -#define MAX_OFF (MAX_LEN - MIN_OFF)
>
> static void syscall_info(void)
> {
> 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 9004c4a40..a08df9bdb 100644
> --- a/testcases/kernel/syscalls/copy_file_range/copy_file_range02.c
> +++ b/testcases/kernel/syscalls/copy_file_range/copy_file_range02.c
> @@ -58,23 +58,22 @@ static struct tcase {
> int *copy_to_fd;
> int flags;
> int exp_err;
> - loff_t dst;
> loff_t len;
> const char *tname;
> } tcases[] = {
> - {&fd_rdonly, 0, EBADF, 0, CONTSIZE, "readonly file"},
> - {&fd_dir, 0, EISDIR, 0, CONTSIZE, "directory"},
> - {&fd_append, 0, EBADF, 0, CONTSIZE, "append to file"},
> - {&fd_closed, 0, EBADF, 0, CONTSIZE, "closed file descriptor"},
> - {&fd_dest, -1, EINVAL, 0, CONTSIZE, "invalid flags"},
> - {&fd_immutable, 0, EPERM, 0, CONTSIZE, "immutable file"},
> - {&fd_swapfile, 0, ETXTBSY, 0, CONTSIZE, "swap file"},
> - {&fd_dup, 0, EINVAL, 0, CONTSIZE/2, "overlaping range"},
> - {&fd_blkdev, 0, EINVAL, 0, CONTSIZE, "block device"},
> - {&fd_chrdev, 0, EINVAL, 0, CONTSIZE, "char device"},
> - {&fd_fifo, 0, EINVAL, 0, CONTSIZE, "fifo"},
> - {&fd_copy, 0, EOVERFLOW, MAX_OFF, ULLONG_MAX, "max length lenght"},
> - {&fd_copy, 0, EFBIG, MAX_OFF, MIN_OFF, "max file size"},
> + {&fd_rdonly, 0, EBADF, CONTSIZE, "readonly file"},
> + {&fd_dir, 0, EISDIR, CONTSIZE, "directory"},
> + {&fd_append, 0, EBADF, CONTSIZE, "append to file"},
> + {&fd_closed, 0, EBADF, CONTSIZE, "closed file descriptor"},
> + {&fd_dest, -1, EINVAL, CONTSIZE, "invalid flags"},
> + {&fd_immutable, 0, EPERM, CONTSIZE, "immutable file"},
> + {&fd_swapfile, 0, ETXTBSY, CONTSIZE, "swap file"},
> + {&fd_dup, 0, EINVAL, CONTSIZE/2, "overlaping range"},
> + {&fd_blkdev, 0, EINVAL, CONTSIZE, "block device"},
> + {&fd_chrdev, 0, EINVAL, CONTSIZE, "char device"},
> + {&fd_fifo, 0, EINVAL, CONTSIZE, "fifo"},
> + {&fd_copy, 0, EOVERFLOW, ULLONG_MAX, "max length lenght"},
> + {&fd_copy, 0, EFBIG, MIN_OFF, "max file size"},
> };
>
> static int run_command(char *command, char *option, char *file)
> @@ -98,6 +97,8 @@ static int run_command(char *command, char *option, char *file)
> static void verify_copy_file_range(unsigned int n)
> {
> struct tcase *tc = &tcases[n];
> + loff_t dst = 0;
> +
> tst_res(TINFO, "Test #%d: %s", n, tc->tname);
>
> if (tc->copy_to_fd == &fd_immutable && chattr_i_nsup) {
> @@ -112,8 +113,12 @@ static void verify_copy_file_range(unsigned int n)
> tst_res(TCONF, "filesystem doesn't have free loopdev, skip it");
> return;
> }
> +
> + if (tc->copy_to_fd == &fd_copy)
> + dst = tst_max_lfs_filesize() - MIN_OFF;
> +
> TEST(sys_copy_file_range(fd_src, 0, *tc->copy_to_fd,
> - &tc->dst, tc->len, tc->flags));
> + &dst, tc->len, tc->flags));
>
> if (TST_RET == -1) {
> if (tc->exp_err == TST_ERR) {
> --
> 2.22.0
>
More information about the ltp
mailing list