Commit 71be6b49 authored by Darrick J. Wong's avatar Darrick J. Wong

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: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 0a6eab8b
...@@ -256,6 +256,11 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) ...@@ -256,6 +256,11 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
(mode & ~FALLOC_FL_INSERT_RANGE)) (mode & ~FALLOC_FL_INSERT_RANGE))
return -EINVAL; return -EINVAL;
/* Unshare range should only be used with allocate mode. */
if ((mode & FALLOC_FL_UNSHARE_RANGE) &&
(mode & ~(FALLOC_FL_UNSHARE_RANGE | FALLOC_FL_KEEP_SIZE)))
return -EINVAL;
if (!(file->f_mode & FMODE_WRITE)) if (!(file->f_mode & FMODE_WRITE))
return -EBADF; return -EBADF;
......
...@@ -25,6 +25,7 @@ struct space_resv { ...@@ -25,6 +25,7 @@ struct space_resv {
FALLOC_FL_PUNCH_HOLE | \ FALLOC_FL_PUNCH_HOLE | \
FALLOC_FL_COLLAPSE_RANGE | \ FALLOC_FL_COLLAPSE_RANGE | \
FALLOC_FL_ZERO_RANGE | \ FALLOC_FL_ZERO_RANGE | \
FALLOC_FL_INSERT_RANGE) FALLOC_FL_INSERT_RANGE | \
FALLOC_FL_UNSHARE_RANGE)
#endif /* _FALLOC_H_ */ #endif /* _FALLOC_H_ */
...@@ -58,4 +58,22 @@ ...@@ -58,4 +58,22 @@
*/ */
#define FALLOC_FL_INSERT_RANGE 0x20 #define FALLOC_FL_INSERT_RANGE 0x20
/*
* FALLOC_FL_UNSHARE_RANGE is used to unshare shared blocks within the
* file size without overwriting any existing data. The purpose of this
* call is to preemptively reallocate any blocks that are subject to
* copy-on-write.
*
* Different filesystems may implement different limitations on the
* granularity of the operation. Most will limit operations to filesystem
* block size boundaries, but this boundary may be larger or smaller
* depending on the filesystem and/or the configuration of the filesystem
* or file.
*
* This flag can only be used with allocate-mode fallocate, which is
* to say that it cannot be used with the punch, zero, collapse, or
* insert range modes.
*/
#define FALLOC_FL_UNSHARE_RANGE 0x40
#endif /* _UAPI_FALLOC_H_ */ #endif /* _UAPI_FALLOC_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment