[PATCH v2] sysdeps/posix/posix_fallocate*: Make emulated posix_fallocate() work properly
Siddhesh Poyarekar
siddhesh@gotplt.org
Mon Dec 21 04:13:17 GMT 2020
On 1/15/20 7:01 AM, Xiao Yang wrote:
> Emulated posix_fallocate() only writes data in one block if block
> size is 4096, offset is 4095 and len is 2. The emulated code should
> write data in two blocks in the case because it actually crosses two
> blocks.
>
> Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
Could you please clarify your copyright assignment status? I suppose
you ought to be covered by any agreement Fujitsu may have with the FSF
but I'm not a steward and hence do not have a way to check. I'll review
anyway given that there are patches from @cn.fujitsu.com in the repo.
> ---
> sysdeps/posix/posix_fallocate.c | 17 +++++++++++++++++
> sysdeps/posix/posix_fallocate64.c | 17 +++++++++++++++++
> 2 files changed, 34 insertions(+)
Please file a bug report describing the issue and also add a test case
to protect from regressions.
> diff --git a/sysdeps/posix/posix_fallocate.c b/sysdeps/posix/posix_fallocate.c
> index e7fccfc1c8..22e5fea091 100644
> --- a/sysdeps/posix/posix_fallocate.c
> +++ b/sysdeps/posix/posix_fallocate.c
> @@ -93,6 +93,23 @@ posix_fallocate (int fd, __off_t offset, __off_t len)
> increment = 4096;
> }
>
> + if (offset % increment + len % increment > increment)
> + {
> + if (offset < st.st_size)
> + {
> + unsigned char b;
> + ssize_t rdsize = __pread (fd, &b, 1, offset);
> + if (rdsize < 0)
> + return errno;
> + if (rdsize == 1 && b != 0)
> + goto next;
> + }
> +
> + if (__pwrite (fd, "", 1, offset) != 1)
> + return errno;
> + }
A better fix may be to fix the loop conditions to fold this corner case in.
Thanks,
Siddhesh
More information about the Libc-alpha
mailing list