[PATCH v3 2/2] ntdll: Use the F_PREALLOCATE fcntl(2) on Mac OS when posix_fallocate(2/3) isn't available.

Huw Davies huw at codeweavers.com
Wed Sep 15 03:04:42 CDT 2021


On Tue, Sep 14, 2021 at 04:57:42PM -0500, Chip Davis wrote:
> From: Charles Davis <cdavis5x at gmail.com>
> 
> Signed-off-by: Chip Davis <cdavis at codeweavers.com>
> ---
>  dlls/ntdll/unix/file.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
> index c92cbd1db4a..899cdc9868a 100644
> --- a/dlls/ntdll/unix/file.c
> +++ b/dlls/ntdll/unix/file.c
> @@ -4581,6 +4581,22 @@ NTSTATUS WINAPI NtSetInformationFile( HANDLE handle, IO_STATUS_BLOCK *io,
>                      if (err == EOPNOTSUPP) WARN( "posix_fallocate not supported on this filesystem\n" );
>                      else status = errno_to_status( err );
>                  }
> +#elif defined(F_PREALLOCATE)
> +                struct stat st;
> +
> +                if (fstat( fd, &st ) < 0)
> +                    status = errno_to_status( errno );

There's already a call to fstat() in the outer block so this seems
unnecessary.

> +                else
> +                {
> +                    struct fstore fst;
> +
> +                    fst.fst_flags = F_ALLOCATECONTIG|F_ALLOCATEALL;
> +                    fst.fst_posmode = F_PEOFPOSMODE;
> +                    fst.fst_offset = 0;
> +                    fst.fst_length = (off_t)info->ValidDataLength.QuadPart - st.st_blocks * 512;

Ignoring the potential for a race here, shouldn't you fetch the block
size from fstatfs() rather than hard-coding it?

> +                    if (fcntl( fd, F_PREALLOCATE, &fst ) < 0)
> +                        status = errno_to_status( errno );
> +                }

Huw.



More information about the wine-devel mailing list