Cygwin api to punch a hole into a file?
Cedric Blancher
cedric.blancher@gmail.com
Fri Dec 1 10:22:20 GMT 2023
On Tue, 28 Nov 2023 at 11:30, Corinna Vinschen via Cygwin
<cygwin@cygwin.com> wrote:
>
> On Nov 24 12:01, Corinna Vinschen via Cygwin wrote:
> > On Nov 23 23:36, Cedric Blancher via Cygwin wrote:
> > > Linux has fallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, ...)
> > > to punch a hole into a file, i.e. deallocate the blocks given and make
> > > the file a "sparse file".
> >
> > We don't support the Linux-specific fallocate(2) call, only ftruncate(2)
> > and posix_fallocate(3). Patches, as usual, thoughtfully considered.
>
> The next test release cygwin-3.5.0-0.485.g65831f88d6c4 introduces
> the Linux-specific fallocate(2) call. Naturally we can't support
> all flags, but the following flag combinations are allowed:
>
> - 0 same as posix_fallocate(3)
> - FALLOC_FL_KEEP_SIZE
> - FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE
> - FALLOC_FL_ZERO_RANGE
> - FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE
>
> A few comments:
>
> - With 0 and FALLOC_FL_KEEP_SIZE, sparse blocks in the given range
> are re-allocated as per the POSIX requirements. For that, it uses
> the same code as FALLOC_FL_ZERO_RANGE, but only for the holes within
> the range.
>
> - With FALLOC_FL_KEEP_SIZE, over-allocation is done by setting
> the allocation size of a file while keeping EOF the same.
> However, in contrast to your typical Linux filesystem, over-
> allocation on Windows filesystems is only temporary. The
> over-allocated blocks are returned to free blocks as soon as
> the last HANDLE to the file is closed.
>
> - With FALLOC_FL_KEEP_SIZE, no over-allocation is performed on sparse
> files. The reason is that over-allocation on sparse files has no
> effect on Windows.
>
> - FALLOC_FL_ZERO_RANGE is implemented as writing zeros to the
> given range. For parts of the range which are already allocated
> data blocks, as much zeros are written as necessary. For holes
> in sparse files, only a single zero byte is written to the
> hole per 64K chunk, which is the allocation granularity of
> sparse files.
>
> - FALLOC_FL_ZERO_RANGE is NOT atomic.
>
> Please give it a try.
Corinna, THANK you!
Related question about commit "Cygwin: pwrite(2): sparsify file"
https://cygwin.com/git/?p=newlib-cygwin.git;a=blobdiff;f=winsup/cygwin/fhandler/disk_file.cc;h=c70afed49f1ecdb11812d31a9663d18c0a5f03f7;hp=b49b25c71ad030a9391db89a157cadcd095d4f36;hb=f64f3eced8e0f51753bc199f3ba96fab06a54848;hpb=114f89caff7b9b62b0b12bc2c6d143daf47b8042
I see the value of 128k (128*1024 bytes) quite often in your sparse
file commits. Can you please make this value a per filesystem tunable?
Not all filesystems have a 128k block/stripe size, and certainly most
filesystems have smaller minimum hole sizes than 128k (e.g. 512bytes
is common, ref pathconf _PC_MIN_HOLE_SIZE).
Ced
--
Cedric Blancher <cedric.blancher@gmail.com>
[https://plus.google.com/u/0/+CedricBlancher/]
Institute Pasteur
More information about the Cygwin
mailing list