vfs: add a FALLOC_FL_UNSHARE mode to fallocate to unshare a range of blocks
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 3 Oct 2016 16:11:14 +0000 (09:11 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 3 Oct 2016 16:11:14 +0000 (09:11 -0700)
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>
fs/open.c
include/linux/falloc.h
include/uapi/linux/falloc.h

index 4fd6e256f4f454e0e8792d1a11c44e377dfbae04..d58525dda28dda7948b37b80b2e054fd53b843d1 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -256,6 +256,11 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
            (mode & ~FALLOC_FL_INSERT_RANGE))
                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))
                return -EBADF;
 
index 996111000a8c014556ff5997e609aeb28bd5ec1d..7494dc67c66f421541edf064d69233bbbc432d8f 100644 (file)
@@ -25,6 +25,7 @@ struct space_resv {
                                         FALLOC_FL_PUNCH_HOLE |         \
                                         FALLOC_FL_COLLAPSE_RANGE |     \
                                         FALLOC_FL_ZERO_RANGE |         \
-                                        FALLOC_FL_INSERT_RANGE)
+                                        FALLOC_FL_INSERT_RANGE |       \
+                                        FALLOC_FL_UNSHARE_RANGE)
 
 #endif /* _FALLOC_H_ */
index 3e445a760f14b384bd78636f5f90b2bcb4f723cf..b075f601919be12218726180837bc7b0d2eb4655 100644 (file)
  */
 #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_ */