[PATCH v3 2/2] ntdll: Use the F_PREALLOCATE fcntl(2) on Mac OS when posix_fallocate(2/3) isn't available.
Alexandre Julliard
julliard at winehq.org
Wed Sep 15 03:52:35 CDT 2021
Huw Davies <huw at codeweavers.com> writes:
> 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 );
>> + }
Do we actually need this in the first place? I thought posix_fallocate()
was supposed to be the portable solution <g>
--
Alexandre Julliard
julliard at winehq.org
More information about the wine-devel
mailing list