]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: introduce new file range commit ioctls
authorDarrick J. Wong <djwong@kernel.org>
Wed, 3 Jul 2024 21:21:43 +0000 (14:21 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 30 Jul 2024 00:13:15 +0000 (17:13 -0700)
This patch introduces two more new ioctls to manage atomic updates to
file contents -- XFS_IOC_START_COMMIT and XFS_IOC_COMMIT_RANGE.  The
commit mechanism here is exactly the same as what XFS_IOC_EXCHANGE_RANGE
does, but with the additional requirement that file2 cannot have changed
since some sampling point.  The start-commit ioctl performs the sampling
of file attributes.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
libxfs/xfs_fs.h

index 454b63ef720162f27c49b8fba15f5994064ca9ad..c85c8077fac391ba182fe89334c016d3c6934d38 100644 (file)
@@ -825,6 +825,30 @@ struct xfs_exchange_range {
        __u64           flags;          /* see XFS_EXCHANGE_RANGE_* below */
 };
 
+/*
+ * Using the same definition of file2 as struct xfs_exchange_range, commit the
+ * contents of file1 into file2 if file2 has the same inode number, mtime, and
+ * ctime as the arguments provided to the call.  The old contents of file2 will
+ * be moved to file1.
+ *
+ * Returns -EBUSY if there isn't an exact match for the file2 fields.
+ *
+ * Filesystems must be able to restart and complete the operation even after
+ * the system goes down.
+ */
+struct xfs_commit_range {
+       __s32           file1_fd;
+       __u32           pad;            /* must be zeroes */
+       __u64           file1_offset;   /* file1 offset, bytes */
+       __u64           file2_offset;   /* file2 offset, bytes */
+       __u64           length;         /* bytes to exchange */
+
+       __u64           flags;          /* see XFS_EXCHANGE_RANGE_* below */
+
+       /* opaque file2 metadata for freshness checks */
+       __u64           file2_freshness[6];
+};
+
 /*
  * Exchange file data all the way to the ends of both files, and then exchange
  * the file sizes.  This flag can be used to replace a file's contents with a
@@ -997,6 +1021,8 @@ struct xfs_getparents_by_handle {
 #define XFS_IOC_BULKSTAT            _IOR ('X', 127, struct xfs_bulkstat_req)
 #define XFS_IOC_INUMBERS            _IOR ('X', 128, struct xfs_inumbers_req)
 #define XFS_IOC_EXCHANGE_RANGE      _IOW ('X', 129, struct xfs_exchange_range)
+#define XFS_IOC_START_COMMIT        _IOR ('X', 130, struct xfs_commit_range)
+#define XFS_IOC_COMMIT_RANGE        _IOW ('X', 131, struct xfs_commit_range)
 /*     XFS_IOC_GETFSUUID ---------- deprecated 140      */