fs: Add support FALLOC_FL_INSERT_RANGE for fallocate
PATCH v10 1/12 fs: Add support FALLOC_FL_INSERT_RANGE for fallocate
FALLOC_FL_INSERT_RANGE command is the opposite command of FALLOC_FL_COLLAPSE_RANGE that is needed for advertisers or someone who want to add some data in the middle of file. FALLOC_FL_INSERT_RANGE will create space for writing new data within a file after shifting extents to right as given length. and this command also has same limitation as FALLOC_FL_COLLAPSE_RANGE, that is block boundary and use ftruncate(2) for crosses EOF.
Signed-off-by Namjae Jeon <[email protected]>
Signed-off-by Ashish Sangwan <[email protected]>
--- fs/open.c | 8 ++++++-- include/linux/falloc.h | 6 ++++++ include/uapi/linux/falloc.h | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-)
fs/open.c +6 -2
@@ -231,8 +231,7 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len)return -EINVAL ;/* Return error if mode is not supported */ -if (mode & ~(FALLOC_FL_KEEP_SIZE |FALLOC_FL_PUNCH_HOLE | -FALLOC_FL_COLLAPSE_RANGE |FALLOC_FL_ZERO_RANGE )) +if (mode & ~FALLOC_FL_SUPPORTED_MASK )return -EOPNOTSUPP ;/* Punch hole and zero range are mutually exclusive */
@@ -250,6 +249,11 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) (mode & ~FALLOC_FL_COLLAPSE_RANGE))return -EINVAL ; +/* Insert range should only be used exclusively. */ +if ((mode &FALLOC_FL_INSERT_RANGE ) && + (mode & ~FALLOC_FL_INSERT_RANGE )) +return -EINVAL ; +if (!(file->f_mode &FMODE_WRITE ))return -EBADF ;
include/linux/falloc.h +6 -0
@@ -21,4 +21,10 @@ struct space_resv {#define FS_IOC_RESVSP _IOW('X', 40, struct space_resv)#define FS_IOC_RESVSP64 _IOW('X', 42, struct space_resv) +#define FALLOC_FL_SUPPORTED_MASK (FALLOC_FL_KEEP_SIZE | \ + FALLOC_FL_PUNCH_HOLE | \ + FALLOC_FL_COLLAPSE_RANGE | \ + FALLOC_FL_ZERO_RANGE | \ + FALLOC_FL_INSERT_RANGE) +#endif /* _FALLOC_H_ */
include/uapi/linux/falloc.h +17 -0
@@ -41,4 +41,21 @@*/ #define FALLOC_FL_ZERO_RANGE 0x10 +/* +* FALLOC_FL_INSERT_RANGE is use to insert space within the file size without +* overwriting any existing data. The contents of the file beyond offset are +* shifted towards right by len bytes to create a hole. As such, this +* operation will increase the size of the file by len bytes. +* +* 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. +* +* Attempting to insert space using this flag at OR beyond the end of +* the file is considered an illegal operation - just use ftruncate(2) or +* fallocate(2) with mode 0 for such type of operations. +*/ +#define FALLOC_FL_INSERT_RANGE 0x20 +#endif /* _UAPI_FALLOC_H_ */
Signature · 1 line
1.8.5.5