[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