Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vfs: add a FALLOC_FL_UNSHARE mode to fallocate to unshare a range of blocks

Add a new fallocate mode flag that explicitly unshares blocks on
filesystems that support such features. The new flag can only
be used with an allocate-mode fallocate call.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

+25 -1
+5
fs/open.c
··· 256 256 (mode & ~FALLOC_FL_INSERT_RANGE)) 257 257 return -EINVAL; 258 258 259 + /* Unshare range should only be used with allocate mode. */ 260 + if ((mode & FALLOC_FL_UNSHARE_RANGE) && 261 + (mode & ~(FALLOC_FL_UNSHARE_RANGE | FALLOC_FL_KEEP_SIZE))) 262 + return -EINVAL; 263 + 259 264 if (!(file->f_mode & FMODE_WRITE)) 260 265 return -EBADF; 261 266
+2 -1
include/linux/falloc.h
··· 25 25 FALLOC_FL_PUNCH_HOLE | \ 26 26 FALLOC_FL_COLLAPSE_RANGE | \ 27 27 FALLOC_FL_ZERO_RANGE | \ 28 - FALLOC_FL_INSERT_RANGE) 28 + FALLOC_FL_INSERT_RANGE | \ 29 + FALLOC_FL_UNSHARE_RANGE) 29 30 30 31 #endif /* _FALLOC_H_ */
+18
include/uapi/linux/falloc.h
··· 58 58 */ 59 59 #define FALLOC_FL_INSERT_RANGE 0x20 60 60 61 + /* 62 + * FALLOC_FL_UNSHARE_RANGE is used to unshare shared blocks within the 63 + * file size without overwriting any existing data. The purpose of this 64 + * call is to preemptively reallocate any blocks that are subject to 65 + * copy-on-write. 66 + * 67 + * Different filesystems may implement different limitations on the 68 + * granularity of the operation. Most will limit operations to filesystem 69 + * block size boundaries, but this boundary may be larger or smaller 70 + * depending on the filesystem and/or the configuration of the filesystem 71 + * or file. 72 + * 73 + * This flag can only be used with allocate-mode fallocate, which is 74 + * to say that it cannot be used with the punch, zero, collapse, or 75 + * insert range modes. 76 + */ 77 + #define FALLOC_FL_UNSHARE_RANGE 0x40 78 + 61 79 #endif /* _UAPI_FALLOC_H_ */