mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
9a64d9b310
Introduce a new ioctl to handle exchanging ranges of bytes between files. The goal here is to perform the exchange atomically with respect to applications -- either they see the file contents before the exchange or they see that A-B is now B-A, even if the kernel crashes. My original goal with all this code was to make it so that online repair can build a replacement directory or xattr structure in a temporary file and commit the repair by atomically exchanging all the data blocks between the two files. However, I needed a way to test this mechanism thoroughly, so I've been evolving an ioctl interface since then. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
31 lines
796 B
C
31 lines
796 B
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (c) 2020-2024 Oracle. All Rights Reserved.
|
|
* Author: Darrick J. Wong <djwong@kernel.org>
|
|
*/
|
|
#ifndef __XFS_EXCHRANGE_H__
|
|
#define __XFS_EXCHRANGE_H__
|
|
|
|
/* Update the mtime/cmtime of file1 and file2 */
|
|
#define __XFS_EXCHANGE_RANGE_UPD_CMTIME1 (1ULL << 63)
|
|
#define __XFS_EXCHANGE_RANGE_UPD_CMTIME2 (1ULL << 62)
|
|
|
|
#define XFS_EXCHANGE_RANGE_PRIV_FLAGS (__XFS_EXCHANGE_RANGE_UPD_CMTIME1 | \
|
|
__XFS_EXCHANGE_RANGE_UPD_CMTIME2)
|
|
|
|
struct xfs_exchrange {
|
|
struct file *file1;
|
|
struct file *file2;
|
|
|
|
loff_t file1_offset;
|
|
loff_t file2_offset;
|
|
u64 length;
|
|
|
|
u64 flags; /* XFS_EXCHANGE_RANGE flags */
|
|
};
|
|
|
|
long xfs_ioc_exchange_range(struct file *file,
|
|
struct xfs_exchange_range __user *argp);
|
|
|
|
#endif /* __XFS_EXCHRANGE_H__ */
|