Cygwin api to punch a hole into a file?
Corinna Vinschen
corinna-cygwin@cygwin.com
Tue Nov 28 10:29:51 GMT 2023
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
More information about the Cygwin
mailing list