Cygwin api to punch a hole into a file?

Corinna Vinschen corinna-cygwin@cygwin.com
Fri Dec 1 11:02:12 GMT 2023


On Dec  1 11:22, Cedric Blancher via Cygwin wrote:
> I see the value of 128k (128*1024 bytes) quite often in your sparse
> file commits.

Yes, but they have been removed.  Read the patches again, especially commit
65831f88d6c4.

> Can you please make this value a per filesystem tunable?

No, because we don't have a facility for that.

> 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).

There's no _PC_MIN_HOLE_SIZE in Linux or POSIX.  In Windows, a sparse
file uses chunks of 64K.  You can see this even with a file of just
a single block.  Try this:

  $ touch x
  $ chattr +S x

  $ echo 1234567890123456789012345678901234567890123456789012345678901234567890123456789 >> x
  $ ls -ls x
  1 -rw-r--r-- 1 corinna vinschen 80 Dec  1 11:56 x

  [repeat echo and ls -ls until...]

  $ echo 1234567890123456789012345678901234567890123456789012345678901234567890123456789 >> x
  $ ls -ls x
  1 -rw-r--r-- 1 corinna vinschen 720 Dec  1 11:56 x
  $ echo 1234567890123456789012345678901234567890123456789012345678901234567890123456789 >> x
  $ ls -ls x
  64 -rw-r--r-- 1 corinna vinschen 800 Dec  1 11:56 x2
  ^^
  This

I don't know how Windows stores short files, maybe they are part of the
metadata up to a point or some such.  However, as soon as you raise the
size over a given point, the *allocation size* will be rounded up to 64K
and from that point on, it will be in 64K chunks.  Also sparsifying and
desparsifying of blocks only works in 64K chunks.


Corinna


More information about the Cygwin mailing list