xref: /linux/fs/xfs/xfs_exchrange.c (revision 9208c05f9fdfd927ea160b97dfef3c379049fff2)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (c) 2020-2024 Oracle.  All Rights Reserved.
4  * Author: Darrick J. Wong <djwong@kernel.org>
5  */
6 #include "xfs.h"
7 #include "xfs_shared.h"
8 #include "xfs_format.h"
9 #include "xfs_log_format.h"
10 #include "xfs_trans_resv.h"
11 #include "xfs_mount.h"
12 #include "xfs_defer.h"
13 #include "xfs_inode.h"
14 #include "xfs_trans.h"
15 #include "xfs_quota.h"
16 #include "xfs_bmap_util.h"
17 #include "xfs_reflink.h"
18 #include "xfs_trace.h"
19 #include "xfs_exchrange.h"
20 #include "xfs_exchmaps.h"
21 #include "xfs_sb.h"
22 #include "xfs_icache.h"
23 #include "xfs_log.h"
24 #include "xfs_rtbitmap.h"
25 #include <linux/fsnotify.h>
26 
27 /* Lock (and optionally join) two inodes for a file range exchange. */
28 void
29 xfs_exchrange_ilock(
30 	struct xfs_trans	*tp,
31 	struct xfs_inode	*ip1,
32 	struct xfs_inode	*ip2)
33 {
34 	if (ip1 != ip2)
35 		xfs_lock_two_inodes(ip1, XFS_ILOCK_EXCL,
36 				    ip2, XFS_ILOCK_EXCL);
37 	else
38 		xfs_ilock(ip1, XFS_ILOCK_EXCL);
39 	if (tp) {
40 		xfs_trans_ijoin(tp, ip1, 0);
41 		if (ip2 != ip1)
42 			xfs_trans_ijoin(tp, ip2, 0);
43 	}
44 
45 }
46 
47 /* Unlock two inodes after a file range exchange operation. */
48 void
49 xfs_exchrange_iunlock(
50 	struct xfs_inode	*ip1,
51 	struct xfs_inode	*ip2)
52 {
53 	if (ip2 != ip1)
54 		xfs_iunlock(ip2, XFS_ILOCK_EXCL);
55 	xfs_iunlock(ip1, XFS_ILOCK_EXCL);
56 }
57 
58 /*
59  * Estimate the resource requirements to exchange file contents between the two
60  * files.  The caller is required to hold the IOLOCK and the MMAPLOCK and to
61  * have flushed both inodes' pagecache and active direct-ios.
62  */
63 int
64 xfs_exchrange_estimate(
65 	struct xfs_exchmaps_req	*req)
66 {
67 	int			error;
68 
69 	xfs_exchrange_ilock(NULL, req->ip1, req->ip2);
70 	error = xfs_exchmaps_estimate(req);
71 	xfs_exchrange_iunlock(req->ip1, req->ip2);
72 	return error;
73 }
74 
75 /*
76  * Check that file2's metadata agree with the snapshot that we took for the
77  * range commit request.
78  *
79  * This should be called after the filesystem has locked /all/ inode metadata
80  * against modification.
81  */
82 STATIC int
83 xfs_exchrange_check_freshness(
84 	const struct xfs_exchrange	*fxr,
85 	struct xfs_inode		*ip2)
86 {
87 	struct inode			*inode2 = VFS_I(ip2);
88 	struct timespec64		ctime = inode_get_ctime(inode2);
89 	struct timespec64		mtime = inode_get_mtime(inode2);
90 
91 	trace_xfs_exchrange_freshness(fxr, ip2);
92 
93 	/* Check that file2 hasn't otherwise been modified. */
94 	if (fxr->file2_ino != ip2->i_ino ||
95 	    fxr->file2_gen != inode2->i_generation ||
96 	    !timespec64_equal(&fxr->file2_ctime, &ctime) ||
97 	    !timespec64_equal(&fxr->file2_mtime, &mtime))
98 		return -EBUSY;
99 
100 	return 0;
101 }
102 
103 #define QRETRY_IP1	(0x1)
104 #define QRETRY_IP2	(0x2)
105 
106 /*
107  * Obtain a quota reservation to make sure we don't hit EDQUOT.  We can skip
108  * this if quota enforcement is disabled or if both inodes' dquots are the
109  * same.  The qretry structure must be initialized to zeroes before the first
110  * call to this function.
111  */
112 STATIC int
113 xfs_exchrange_reserve_quota(
114 	struct xfs_trans		*tp,
115 	const struct xfs_exchmaps_req	*req,
116 	unsigned int			*qretry)
117 {
118 	int64_t				ddelta, rdelta;
119 	int				ip1_error = 0;
120 	int				error;
121 
122 	/*
123 	 * Don't bother with a quota reservation if we're not enforcing them
124 	 * or the two inodes have the same dquots.
125 	 */
126 	if (!XFS_IS_QUOTA_ON(tp->t_mountp) || req->ip1 == req->ip2 ||
127 	    (req->ip1->i_udquot == req->ip2->i_udquot &&
128 	     req->ip1->i_gdquot == req->ip2->i_gdquot &&
129 	     req->ip1->i_pdquot == req->ip2->i_pdquot))
130 		return 0;
131 
132 	*qretry = 0;
133 
134 	/*
135 	 * For each file, compute the net gain in the number of regular blocks
136 	 * that will be mapped into that file and reserve that much quota.  The
137 	 * quota counts must be able to absorb at least that much space.
138 	 */
139 	ddelta = req->ip2_bcount - req->ip1_bcount;
140 	rdelta = req->ip2_rtbcount - req->ip1_rtbcount;
141 	if (ddelta > 0 || rdelta > 0) {
142 		error = xfs_trans_reserve_quota_nblks(tp, req->ip1,
143 				ddelta > 0 ? ddelta : 0,
144 				rdelta > 0 ? rdelta : 0,
145 				false);
146 		if (error == -EDQUOT || error == -ENOSPC) {
147 			/*
148 			 * Save this error and see what happens if we try to
149 			 * reserve quota for ip2.  Then report both.
150 			 */
151 			*qretry |= QRETRY_IP1;
152 			ip1_error = error;
153 			error = 0;
154 		}
155 		if (error)
156 			return error;
157 	}
158 	if (ddelta < 0 || rdelta < 0) {
159 		error = xfs_trans_reserve_quota_nblks(tp, req->ip2,
160 				ddelta < 0 ? -ddelta : 0,
161 				rdelta < 0 ? -rdelta : 0,
162 				false);
163 		if (error == -EDQUOT || error == -ENOSPC)
164 			*qretry |= QRETRY_IP2;
165 		if (error)
166 			return error;
167 	}
168 	if (ip1_error)
169 		return ip1_error;
170 
171 	/*
172 	 * For each file, forcibly reserve the gross gain in mapped blocks so
173 	 * that we don't trip over any quota block reservation assertions.
174 	 * We must reserve the gross gain because the quota code subtracts from
175 	 * bcount the number of blocks that we unmap; it does not add that
176 	 * quantity back to the quota block reservation.
177 	 */
178 	error = xfs_trans_reserve_quota_nblks(tp, req->ip1, req->ip1_bcount,
179 			req->ip1_rtbcount, true);
180 	if (error)
181 		return error;
182 
183 	return xfs_trans_reserve_quota_nblks(tp, req->ip2, req->ip2_bcount,
184 			req->ip2_rtbcount, true);
185 }
186 
187 /* Exchange the mappings (and hence the contents) of two files' forks. */
188 STATIC int
189 xfs_exchrange_mappings(
190 	const struct xfs_exchrange	*fxr,
191 	struct xfs_inode		*ip1,
192 	struct xfs_inode		*ip2)
193 {
194 	struct xfs_mount		*mp = ip1->i_mount;
195 	struct xfs_exchmaps_req		req = {
196 		.ip1			= ip1,
197 		.ip2			= ip2,
198 		.startoff1		= XFS_B_TO_FSBT(mp, fxr->file1_offset),
199 		.startoff2		= XFS_B_TO_FSBT(mp, fxr->file2_offset),
200 		.blockcount		= XFS_B_TO_FSB(mp, fxr->length),
201 	};
202 	struct xfs_trans		*tp;
203 	unsigned int			qretry;
204 	bool				retried = false;
205 	int				error;
206 
207 	trace_xfs_exchrange_mappings(fxr, ip1, ip2);
208 
209 	if (fxr->flags & XFS_EXCHANGE_RANGE_TO_EOF)
210 		req.flags |= XFS_EXCHMAPS_SET_SIZES;
211 	if (fxr->flags & XFS_EXCHANGE_RANGE_FILE1_WRITTEN)
212 		req.flags |= XFS_EXCHMAPS_INO1_WRITTEN;
213 
214 	/*
215 	 * Round the request length up to the nearest file allocation unit.
216 	 * The prep function already checked that the request offsets and
217 	 * length in @fxr are safe to round up.
218 	 */
219 	if (xfs_inode_has_bigrtalloc(ip2))
220 		req.blockcount = xfs_blen_roundup_rtx(mp, req.blockcount);
221 
222 	error = xfs_exchrange_estimate(&req);
223 	if (error)
224 		return error;
225 
226 retry:
227 	/* Allocate the transaction, lock the inodes, and join them. */
228 	error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, req.resblks, 0,
229 			XFS_TRANS_RES_FDBLKS, &tp);
230 	if (error)
231 		return error;
232 
233 	xfs_exchrange_ilock(tp, ip1, ip2);
234 
235 	trace_xfs_exchrange_before(ip2, 2);
236 	trace_xfs_exchrange_before(ip1, 1);
237 
238 	error = xfs_exchmaps_check_forks(mp, &req);
239 	if (error)
240 		goto out_trans_cancel;
241 
242 	/*
243 	 * Reserve ourselves some quota if any of them are in enforcing mode.
244 	 * In theory we only need enough to satisfy the change in the number
245 	 * of blocks between the two ranges being remapped.
246 	 */
247 	error = xfs_exchrange_reserve_quota(tp, &req, &qretry);
248 	if ((error == -EDQUOT || error == -ENOSPC) && !retried) {
249 		xfs_trans_cancel(tp);
250 		xfs_exchrange_iunlock(ip1, ip2);
251 		if (qretry & QRETRY_IP1)
252 			xfs_blockgc_free_quota(ip1, 0);
253 		if (qretry & QRETRY_IP2)
254 			xfs_blockgc_free_quota(ip2, 0);
255 		retried = true;
256 		goto retry;
257 	}
258 	if (error)
259 		goto out_trans_cancel;
260 
261 	/* If we got this far on a dry run, all parameters are ok. */
262 	if (fxr->flags & XFS_EXCHANGE_RANGE_DRY_RUN)
263 		goto out_trans_cancel;
264 
265 	/* Update the mtime and ctime of both files. */
266 	if (fxr->flags & __XFS_EXCHANGE_RANGE_UPD_CMTIME1)
267 		xfs_trans_ichgtime(tp, ip1, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
268 	if (fxr->flags & __XFS_EXCHANGE_RANGE_UPD_CMTIME2)
269 		xfs_trans_ichgtime(tp, ip2, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
270 
271 	xfs_exchange_mappings(tp, &req);
272 
273 	/*
274 	 * Force the log to persist metadata updates if the caller or the
275 	 * administrator requires this.  The generic prep function already
276 	 * flushed the relevant parts of the page cache.
277 	 */
278 	if (xfs_has_wsync(mp) || (fxr->flags & XFS_EXCHANGE_RANGE_DSYNC))
279 		xfs_trans_set_sync(tp);
280 
281 	error = xfs_trans_commit(tp);
282 
283 	trace_xfs_exchrange_after(ip2, 2);
284 	trace_xfs_exchrange_after(ip1, 1);
285 
286 	if (error)
287 		goto out_unlock;
288 
289 	/*
290 	 * If the caller wanted us to exchange the contents of two complete
291 	 * files of unequal length, exchange the incore sizes now.  This should
292 	 * be safe because we flushed both files' page caches, exchanged all
293 	 * the mappings, and updated the ondisk sizes.
294 	 */
295 	if (fxr->flags & XFS_EXCHANGE_RANGE_TO_EOF) {
296 		loff_t	temp;
297 
298 		temp = i_size_read(VFS_I(ip2));
299 		i_size_write(VFS_I(ip2), i_size_read(VFS_I(ip1)));
300 		i_size_write(VFS_I(ip1), temp);
301 	}
302 
303 out_unlock:
304 	xfs_exchrange_iunlock(ip1, ip2);
305 	return error;
306 
307 out_trans_cancel:
308 	xfs_trans_cancel(tp);
309 	goto out_unlock;
310 }
311 
312 /*
313  * Generic code for exchanging ranges of two files via XFS_IOC_EXCHANGE_RANGE.
314  * This part deals with struct file objects and byte ranges and does not deal
315  * with XFS-specific data structures such as xfs_inodes and block ranges.  This
316  * separation may some day facilitate porting to another filesystem.
317  *
318  * The goal is to exchange fxr.length bytes starting at fxr.file1_offset in
319  * file1 with the same number of bytes starting at fxr.file2_offset in file2.
320  * Implementations must call xfs_exchange_range_prep to prepare the two
321  * files prior to taking locks; and they must update the inode change and mod
322  * times of both files as part of the metadata update.  The timestamp update
323  * and freshness checks must be done atomically as part of the data exchange
324  * operation to ensure correctness of the freshness check.
325  * xfs_exchange_range_finish must be called after the operation completes
326  * successfully but before locks are dropped.
327  */
328 
329 /* Verify that we have security clearance to perform this operation. */
330 static int
331 xfs_exchange_range_verify_area(
332 	struct xfs_exchrange	*fxr)
333 {
334 	int			ret;
335 
336 	ret = remap_verify_area(fxr->file1, fxr->file1_offset, fxr->length,
337 			true);
338 	if (ret)
339 		return ret;
340 
341 	return remap_verify_area(fxr->file2, fxr->file2_offset, fxr->length,
342 			true);
343 }
344 
345 /*
346  * Performs necessary checks before doing a range exchange, having stabilized
347  * mutable inode attributes via i_rwsem.
348  */
349 static inline int
350 xfs_exchange_range_checks(
351 	struct xfs_exchrange	*fxr,
352 	unsigned int		alloc_unit)
353 {
354 	struct inode		*inode1 = file_inode(fxr->file1);
355 	struct inode		*inode2 = file_inode(fxr->file2);
356 	uint64_t		allocmask = alloc_unit - 1;
357 	int64_t			test_len;
358 	uint64_t		blen;
359 	loff_t			size1, size2, tmp;
360 	int			error;
361 
362 	/* Don't touch certain kinds of inodes */
363 	if (IS_IMMUTABLE(inode1) || IS_IMMUTABLE(inode2))
364 		return -EPERM;
365 	if (IS_SWAPFILE(inode1) || IS_SWAPFILE(inode2))
366 		return -ETXTBSY;
367 
368 	size1 = i_size_read(inode1);
369 	size2 = i_size_read(inode2);
370 
371 	/* Ranges cannot start after EOF. */
372 	if (fxr->file1_offset > size1 || fxr->file2_offset > size2)
373 		return -EINVAL;
374 
375 	/*
376 	 * If the caller said to exchange to EOF, we set the length of the
377 	 * request large enough to cover everything to the end of both files.
378 	 */
379 	if (fxr->flags & XFS_EXCHANGE_RANGE_TO_EOF) {
380 		fxr->length = max_t(int64_t, size1 - fxr->file1_offset,
381 					     size2 - fxr->file2_offset);
382 
383 		error = xfs_exchange_range_verify_area(fxr);
384 		if (error)
385 			return error;
386 	}
387 
388 	/*
389 	 * The start of both ranges must be aligned to the file allocation
390 	 * unit.
391 	 */
392 	if (!IS_ALIGNED(fxr->file1_offset, alloc_unit) ||
393 	    !IS_ALIGNED(fxr->file2_offset, alloc_unit))
394 		return -EINVAL;
395 
396 	/* Ensure offsets don't wrap. */
397 	if (check_add_overflow(fxr->file1_offset, fxr->length, &tmp) ||
398 	    check_add_overflow(fxr->file2_offset, fxr->length, &tmp))
399 		return -EINVAL;
400 
401 	/*
402 	 * We require both ranges to end within EOF, unless we're exchanging
403 	 * to EOF.
404 	 */
405 	if (!(fxr->flags & XFS_EXCHANGE_RANGE_TO_EOF) &&
406 	    (fxr->file1_offset + fxr->length > size1 ||
407 	     fxr->file2_offset + fxr->length > size2))
408 		return -EINVAL;
409 
410 	/*
411 	 * Make sure we don't hit any file size limits.  If we hit any size
412 	 * limits such that test_length was adjusted, we abort the whole
413 	 * operation.
414 	 */
415 	test_len = fxr->length;
416 	error = generic_write_check_limits(fxr->file2, fxr->file2_offset,
417 			&test_len);
418 	if (error)
419 		return error;
420 	error = generic_write_check_limits(fxr->file1, fxr->file1_offset,
421 			&test_len);
422 	if (error)
423 		return error;
424 	if (test_len != fxr->length)
425 		return -EINVAL;
426 
427 	/*
428 	 * If the user wanted us to exchange up to the infile's EOF, round up
429 	 * to the next allocation unit boundary for this check.  Do the same
430 	 * for the outfile.
431 	 *
432 	 * Otherwise, reject the range length if it's not aligned to an
433 	 * allocation unit.
434 	 */
435 	if (fxr->file1_offset + fxr->length == size1)
436 		blen = ALIGN(size1, alloc_unit) - fxr->file1_offset;
437 	else if (fxr->file2_offset + fxr->length == size2)
438 		blen = ALIGN(size2, alloc_unit) - fxr->file2_offset;
439 	else if (!IS_ALIGNED(fxr->length, alloc_unit))
440 		return -EINVAL;
441 	else
442 		blen = fxr->length;
443 
444 	/* Don't allow overlapped exchanges within the same file. */
445 	if (inode1 == inode2 &&
446 	    fxr->file2_offset + blen > fxr->file1_offset &&
447 	    fxr->file1_offset + blen > fxr->file2_offset)
448 		return -EINVAL;
449 
450 	/*
451 	 * Ensure that we don't exchange a partial EOF block into the middle of
452 	 * another file.
453 	 */
454 	if ((fxr->length & allocmask) == 0)
455 		return 0;
456 
457 	blen = fxr->length;
458 	if (fxr->file2_offset + blen < size2)
459 		blen &= ~allocmask;
460 
461 	if (fxr->file1_offset + blen < size1)
462 		blen &= ~allocmask;
463 
464 	return blen == fxr->length ? 0 : -EINVAL;
465 }
466 
467 /*
468  * Check that the two inodes are eligible for range exchanges, the ranges make
469  * sense, and then flush all dirty data.  Caller must ensure that the inodes
470  * have been locked against any other modifications.
471  */
472 static inline int
473 xfs_exchange_range_prep(
474 	struct xfs_exchrange	*fxr,
475 	unsigned int		alloc_unit)
476 {
477 	struct inode		*inode1 = file_inode(fxr->file1);
478 	struct inode		*inode2 = file_inode(fxr->file2);
479 	bool			same_inode = (inode1 == inode2);
480 	int			error;
481 
482 	/* Check that we don't violate system file offset limits. */
483 	error = xfs_exchange_range_checks(fxr, alloc_unit);
484 	if (error || fxr->length == 0)
485 		return error;
486 
487 	/* Wait for the completion of any pending IOs on both files */
488 	inode_dio_wait(inode1);
489 	if (!same_inode)
490 		inode_dio_wait(inode2);
491 
492 	error = filemap_write_and_wait_range(inode1->i_mapping,
493 			fxr->file1_offset,
494 			fxr->file1_offset + fxr->length - 1);
495 	if (error)
496 		return error;
497 
498 	error = filemap_write_and_wait_range(inode2->i_mapping,
499 			fxr->file2_offset,
500 			fxr->file2_offset + fxr->length - 1);
501 	if (error)
502 		return error;
503 
504 	/*
505 	 * If the files or inodes involved require synchronous writes, amend
506 	 * the request to force the filesystem to flush all data and metadata
507 	 * to disk after the operation completes.
508 	 */
509 	if (((fxr->file1->f_flags | fxr->file2->f_flags) & O_SYNC) ||
510 	    IS_SYNC(inode1) || IS_SYNC(inode2))
511 		fxr->flags |= XFS_EXCHANGE_RANGE_DSYNC;
512 
513 	return 0;
514 }
515 
516 /*
517  * Finish a range exchange operation, if it was successful.  Caller must ensure
518  * that the inodes are still locked against any other modifications.
519  */
520 static inline int
521 xfs_exchange_range_finish(
522 	struct xfs_exchrange	*fxr)
523 {
524 	int			error;
525 
526 	error = file_remove_privs(fxr->file1);
527 	if (error)
528 		return error;
529 	if (file_inode(fxr->file1) == file_inode(fxr->file2))
530 		return 0;
531 
532 	return file_remove_privs(fxr->file2);
533 }
534 
535 /*
536  * Check the alignment of an exchange request when the allocation unit size
537  * isn't a power of two.  The generic file-level helpers use (fast)
538  * bitmask-based alignment checks, but here we have to use slow long division.
539  */
540 static int
541 xfs_exchrange_check_rtalign(
542 	const struct xfs_exchrange	*fxr,
543 	struct xfs_inode		*ip1,
544 	struct xfs_inode		*ip2,
545 	unsigned int			alloc_unit)
546 {
547 	uint64_t			length = fxr->length;
548 	uint64_t			blen;
549 	loff_t				size1, size2;
550 
551 	size1 = i_size_read(VFS_I(ip1));
552 	size2 = i_size_read(VFS_I(ip2));
553 
554 	/* The start of both ranges must be aligned to a rt extent. */
555 	if (!isaligned_64(fxr->file1_offset, alloc_unit) ||
556 	    !isaligned_64(fxr->file2_offset, alloc_unit))
557 		return -EINVAL;
558 
559 	if (fxr->flags & XFS_EXCHANGE_RANGE_TO_EOF)
560 		length = max_t(int64_t, size1 - fxr->file1_offset,
561 					size2 - fxr->file2_offset);
562 
563 	/*
564 	 * If the user wanted us to exchange up to the infile's EOF, round up
565 	 * to the next rt extent boundary for this check.  Do the same for the
566 	 * outfile.
567 	 *
568 	 * Otherwise, reject the range length if it's not rt extent aligned.
569 	 * We already confirmed the starting offsets' rt extent block
570 	 * alignment.
571 	 */
572 	if (fxr->file1_offset + length == size1)
573 		blen = roundup_64(size1, alloc_unit) - fxr->file1_offset;
574 	else if (fxr->file2_offset + length == size2)
575 		blen = roundup_64(size2, alloc_unit) - fxr->file2_offset;
576 	else if (!isaligned_64(length, alloc_unit))
577 		return -EINVAL;
578 	else
579 		blen = length;
580 
581 	/* Don't allow overlapped exchanges within the same file. */
582 	if (ip1 == ip2 &&
583 	    fxr->file2_offset + blen > fxr->file1_offset &&
584 	    fxr->file1_offset + blen > fxr->file2_offset)
585 		return -EINVAL;
586 
587 	/*
588 	 * Ensure that we don't exchange a partial EOF rt extent into the
589 	 * middle of another file.
590 	 */
591 	if (isaligned_64(length, alloc_unit))
592 		return 0;
593 
594 	blen = length;
595 	if (fxr->file2_offset + length < size2)
596 		blen = rounddown_64(blen, alloc_unit);
597 
598 	if (fxr->file1_offset + blen < size1)
599 		blen = rounddown_64(blen, alloc_unit);
600 
601 	return blen == length ? 0 : -EINVAL;
602 }
603 
604 /* Prepare two files to have their data exchanged. */
605 STATIC int
606 xfs_exchrange_prep(
607 	struct xfs_exchrange	*fxr,
608 	struct xfs_inode	*ip1,
609 	struct xfs_inode	*ip2)
610 {
611 	struct xfs_mount	*mp = ip2->i_mount;
612 	unsigned int		alloc_unit = xfs_inode_alloc_unitsize(ip2);
613 	int			error;
614 
615 	trace_xfs_exchrange_prep(fxr, ip1, ip2);
616 
617 	/* Verify both files are either real-time or non-realtime */
618 	if (XFS_IS_REALTIME_INODE(ip1) != XFS_IS_REALTIME_INODE(ip2))
619 		return -EINVAL;
620 
621 	/* Check non-power of two alignment issues, if necessary. */
622 	if (!is_power_of_2(alloc_unit)) {
623 		error = xfs_exchrange_check_rtalign(fxr, ip1, ip2, alloc_unit);
624 		if (error)
625 			return error;
626 
627 		/*
628 		 * Do the generic file-level checks with the regular block
629 		 * alignment.
630 		 */
631 		alloc_unit = mp->m_sb.sb_blocksize;
632 	}
633 
634 	error = xfs_exchange_range_prep(fxr, alloc_unit);
635 	if (error || fxr->length == 0)
636 		return error;
637 
638 	if (fxr->flags & __XFS_EXCHANGE_RANGE_CHECK_FRESH2) {
639 		error = xfs_exchrange_check_freshness(fxr, ip2);
640 		if (error)
641 			return error;
642 	}
643 
644 	/* Attach dquots to both inodes before changing block maps. */
645 	error = xfs_qm_dqattach(ip2);
646 	if (error)
647 		return error;
648 	error = xfs_qm_dqattach(ip1);
649 	if (error)
650 		return error;
651 
652 	trace_xfs_exchrange_flush(fxr, ip1, ip2);
653 
654 	/* Flush the relevant ranges of both files. */
655 	error = xfs_flush_unmap_range(ip2, fxr->file2_offset, fxr->length);
656 	if (error)
657 		return error;
658 	error = xfs_flush_unmap_range(ip1, fxr->file1_offset, fxr->length);
659 	if (error)
660 		return error;
661 
662 	/*
663 	 * Cancel CoW fork preallocations for the ranges of both files.  The
664 	 * prep function should have flushed all the dirty data, so the only
665 	 * CoW mappings remaining should be speculative.
666 	 */
667 	if (xfs_inode_has_cow_data(ip1)) {
668 		error = xfs_reflink_cancel_cow_range(ip1, fxr->file1_offset,
669 				fxr->length, true);
670 		if (error)
671 			return error;
672 	}
673 
674 	if (xfs_inode_has_cow_data(ip2)) {
675 		error = xfs_reflink_cancel_cow_range(ip2, fxr->file2_offset,
676 				fxr->length, true);
677 		if (error)
678 			return error;
679 	}
680 
681 	return 0;
682 }
683 
684 /*
685  * Exchange contents of files.  This is the binding between the generic
686  * file-level concepts and the XFS inode-specific implementation.
687  */
688 STATIC int
689 xfs_exchrange_contents(
690 	struct xfs_exchrange	*fxr)
691 {
692 	struct inode		*inode1 = file_inode(fxr->file1);
693 	struct inode		*inode2 = file_inode(fxr->file2);
694 	struct xfs_inode	*ip1 = XFS_I(inode1);
695 	struct xfs_inode	*ip2 = XFS_I(inode2);
696 	struct xfs_mount	*mp = ip1->i_mount;
697 	int			error;
698 
699 	if (!xfs_has_exchange_range(mp))
700 		return -EOPNOTSUPP;
701 
702 	if (fxr->flags & ~(XFS_EXCHANGE_RANGE_ALL_FLAGS |
703 			   XFS_EXCHANGE_RANGE_PRIV_FLAGS))
704 		return -EINVAL;
705 
706 	if (xfs_is_shutdown(mp))
707 		return -EIO;
708 
709 	/* Lock both files against IO */
710 	error = xfs_ilock2_io_mmap(ip1, ip2);
711 	if (error)
712 		goto out_err;
713 
714 	/* Prepare and then exchange file contents. */
715 	error = xfs_exchrange_prep(fxr, ip1, ip2);
716 	if (error)
717 		goto out_unlock;
718 
719 	error = xfs_exchrange_mappings(fxr, ip1, ip2);
720 	if (error)
721 		goto out_unlock;
722 
723 	/*
724 	 * Finish the exchange by removing special file privileges like any
725 	 * other file write would do.  This may involve turning on support for
726 	 * logged xattrs if either file has security capabilities.
727 	 */
728 	error = xfs_exchange_range_finish(fxr);
729 	if (error)
730 		goto out_unlock;
731 
732 out_unlock:
733 	xfs_iunlock2_io_mmap(ip1, ip2);
734 out_err:
735 	if (error)
736 		trace_xfs_exchrange_error(ip2, error, _RET_IP_);
737 	return error;
738 }
739 
740 /* Exchange parts of two files. */
741 static int
742 xfs_exchange_range(
743 	struct xfs_exchrange	*fxr)
744 {
745 	struct inode		*inode1 = file_inode(fxr->file1);
746 	struct inode		*inode2 = file_inode(fxr->file2);
747 	int			ret;
748 
749 	BUILD_BUG_ON(XFS_EXCHANGE_RANGE_ALL_FLAGS &
750 		     XFS_EXCHANGE_RANGE_PRIV_FLAGS);
751 
752 	/* Both files must be on the same mount/filesystem. */
753 	if (fxr->file1->f_path.mnt != fxr->file2->f_path.mnt)
754 		return -EXDEV;
755 
756 	if (fxr->flags & ~(XFS_EXCHANGE_RANGE_ALL_FLAGS |
757 			 __XFS_EXCHANGE_RANGE_CHECK_FRESH2))
758 		return -EINVAL;
759 
760 	/* Userspace requests only honored for regular files. */
761 	if (S_ISDIR(inode1->i_mode) || S_ISDIR(inode2->i_mode))
762 		return -EISDIR;
763 	if (!S_ISREG(inode1->i_mode) || !S_ISREG(inode2->i_mode))
764 		return -EINVAL;
765 
766 	/* Both files must be opened for read and write. */
767 	if (!(fxr->file1->f_mode & FMODE_READ) ||
768 	    !(fxr->file1->f_mode & FMODE_WRITE) ||
769 	    !(fxr->file2->f_mode & FMODE_READ) ||
770 	    !(fxr->file2->f_mode & FMODE_WRITE))
771 		return -EBADF;
772 
773 	/* Neither file can be opened append-only. */
774 	if ((fxr->file1->f_flags & O_APPEND) ||
775 	    (fxr->file2->f_flags & O_APPEND))
776 		return -EBADF;
777 
778 	/*
779 	 * If we're not exchanging to EOF, we can check the areas before
780 	 * stabilizing both files' i_size.
781 	 */
782 	if (!(fxr->flags & XFS_EXCHANGE_RANGE_TO_EOF)) {
783 		ret = xfs_exchange_range_verify_area(fxr);
784 		if (ret)
785 			return ret;
786 	}
787 
788 	/* Update cmtime if the fd/inode don't forbid it. */
789 	if (!(fxr->file1->f_mode & FMODE_NOCMTIME) && !IS_NOCMTIME(inode1))
790 		fxr->flags |= __XFS_EXCHANGE_RANGE_UPD_CMTIME1;
791 	if (!(fxr->file2->f_mode & FMODE_NOCMTIME) && !IS_NOCMTIME(inode2))
792 		fxr->flags |= __XFS_EXCHANGE_RANGE_UPD_CMTIME2;
793 
794 	file_start_write(fxr->file2);
795 	ret = xfs_exchrange_contents(fxr);
796 	file_end_write(fxr->file2);
797 	if (ret)
798 		return ret;
799 
800 	fsnotify_modify(fxr->file1);
801 	if (fxr->file2 != fxr->file1)
802 		fsnotify_modify(fxr->file2);
803 	return 0;
804 }
805 
806 /* Collect exchange-range arguments from userspace. */
807 long
808 xfs_ioc_exchange_range(
809 	struct file			*file,
810 	struct xfs_exchange_range __user *argp)
811 {
812 	struct xfs_exchrange		fxr = {
813 		.file2			= file,
814 	};
815 	struct xfs_exchange_range	args;
816 
817 	if (copy_from_user(&args, argp, sizeof(args)))
818 		return -EFAULT;
819 	if (memchr_inv(&args.pad, 0, sizeof(args.pad)))
820 		return -EINVAL;
821 	if (args.flags & ~XFS_EXCHANGE_RANGE_ALL_FLAGS)
822 		return -EINVAL;
823 
824 	fxr.file1_offset	= args.file1_offset;
825 	fxr.file2_offset	= args.file2_offset;
826 	fxr.length		= args.length;
827 	fxr.flags		= args.flags;
828 
829 	CLASS(fd, file1)(args.file1_fd);
830 	if (fd_empty(file1))
831 		return -EBADF;
832 	fxr.file1 = fd_file(file1);
833 
834 	return xfs_exchange_range(&fxr);
835 }
836 
837 /* Opaque freshness blob for XFS_IOC_COMMIT_RANGE */
838 struct xfs_commit_range_fresh {
839 	xfs_fsid_t	fsid;		/* m_fixedfsid */
840 	__u64		file2_ino;	/* inode number */
841 	__s64		file2_mtime;	/* modification time */
842 	__s64		file2_ctime;	/* change time */
843 	__s32		file2_mtime_nsec; /* mod time, nsec */
844 	__s32		file2_ctime_nsec; /* change time, nsec */
845 	__u32		file2_gen;	/* inode generation */
846 	__u32		magic;		/* zero */
847 };
848 #define XCR_FRESH_MAGIC	0x444F524B	/* DORK */
849 
850 /* Set up a commitrange operation by sampling file2's write-related attrs */
851 long
852 xfs_ioc_start_commit(
853 	struct file			*file,
854 	struct xfs_commit_range __user	*argp)
855 {
856 	struct xfs_commit_range		args = { };
857 	struct timespec64		ts;
858 	struct xfs_commit_range_fresh	*kern_f;
859 	struct xfs_commit_range_fresh	__user *user_f;
860 	struct inode			*inode2 = file_inode(file);
861 	struct xfs_inode		*ip2 = XFS_I(inode2);
862 	const unsigned int		lockflags = XFS_IOLOCK_SHARED |
863 						    XFS_MMAPLOCK_SHARED |
864 						    XFS_ILOCK_SHARED;
865 
866 	BUILD_BUG_ON(sizeof(struct xfs_commit_range_fresh) !=
867 		     sizeof(args.file2_freshness));
868 
869 	kern_f = (struct xfs_commit_range_fresh *)&args.file2_freshness;
870 
871 	memcpy(&kern_f->fsid, ip2->i_mount->m_fixedfsid, sizeof(xfs_fsid_t));
872 
873 	xfs_ilock(ip2, lockflags);
874 	ts = inode_get_ctime(inode2);
875 	kern_f->file2_ctime		= ts.tv_sec;
876 	kern_f->file2_ctime_nsec	= ts.tv_nsec;
877 	ts = inode_get_mtime(inode2);
878 	kern_f->file2_mtime		= ts.tv_sec;
879 	kern_f->file2_mtime_nsec	= ts.tv_nsec;
880 	kern_f->file2_ino		= ip2->i_ino;
881 	kern_f->file2_gen		= inode2->i_generation;
882 	kern_f->magic			= XCR_FRESH_MAGIC;
883 	xfs_iunlock(ip2, lockflags);
884 
885 	user_f = (struct xfs_commit_range_fresh __user *)&argp->file2_freshness;
886 	if (copy_to_user(user_f, kern_f, sizeof(*kern_f)))
887 		return -EFAULT;
888 
889 	return 0;
890 }
891 
892 /*
893  * Exchange file1 and file2 contents if file2 has not been written since the
894  * start commit operation.
895  */
896 long
897 xfs_ioc_commit_range(
898 	struct file			*file,
899 	struct xfs_commit_range __user	*argp)
900 {
901 	struct xfs_exchrange		fxr = {
902 		.file2			= file,
903 	};
904 	struct xfs_commit_range		args;
905 	struct xfs_commit_range_fresh	*kern_f;
906 	struct xfs_inode		*ip2 = XFS_I(file_inode(file));
907 	struct xfs_mount		*mp = ip2->i_mount;
908 
909 	kern_f = (struct xfs_commit_range_fresh *)&args.file2_freshness;
910 
911 	if (copy_from_user(&args, argp, sizeof(args)))
912 		return -EFAULT;
913 	if (args.flags & ~XFS_EXCHANGE_RANGE_ALL_FLAGS)
914 		return -EINVAL;
915 	if (kern_f->magic != XCR_FRESH_MAGIC)
916 		return -EBUSY;
917 	if (memcmp(&kern_f->fsid, mp->m_fixedfsid, sizeof(xfs_fsid_t)))
918 		return -EBUSY;
919 
920 	fxr.file1_offset	= args.file1_offset;
921 	fxr.file2_offset	= args.file2_offset;
922 	fxr.length		= args.length;
923 	fxr.flags		= args.flags | __XFS_EXCHANGE_RANGE_CHECK_FRESH2;
924 	fxr.file2_ino		= kern_f->file2_ino;
925 	fxr.file2_gen		= kern_f->file2_gen;
926 	fxr.file2_mtime.tv_sec	= kern_f->file2_mtime;
927 	fxr.file2_mtime.tv_nsec	= kern_f->file2_mtime_nsec;
928 	fxr.file2_ctime.tv_sec	= kern_f->file2_ctime;
929 	fxr.file2_ctime.tv_nsec	= kern_f->file2_ctime_nsec;
930 
931 	CLASS(fd, file1)(args.file1_fd);
932 	if (fd_empty(file1))
933 		return -EBADF;
934 	fxr.file1 = fd_file(file1);
935 
936 	return xfs_exchange_range(&fxr);
937 }
938