Re: [PATCH v2] xfs: fix exchange-range reflink flag clearing issue with INO1_WRITTEN
m00nb1rd lin <[email protected]> Tue, 28 Jul 2026 14:50:35 +0800
| Newsgroups | org.kernel.vger.linux-xfs,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
在 2026/7/28 11:14, Christoph Hellwig 写道: > On Tue, Jul 28, 2026 at 10:23:03AM +0800, Lin Jiapeng wrote: >> When exchanging two full-file ranges, xmi_can_exchange_reflink_flags() >> can move the reflink inode flag from the file that currently has it to >> the other file, as long as exactly one side is marked. This assumes >> that the file contents, and therefore all shared extents, are exchanged. >> >> That assumption is not true when XFS_EXCHMAPS_INO1_WRITTEN is set. >> xfs_exchmaps_can_skip_mapping() can skip hole and unwritten mappings >> from file1, so an exchange can complete without moving every mapping >> that the earlier flag-swap decision accounted for. In that case the >> post-operation cleanup can clear the reflink flag from an inode that >> still owns shared written extents. Later writes then take the >> non-reflink write path and may update blocks that should still have >> been protected by CoW, which shows up as data corruption between >> reflink-related files. >> >> Fix this by disabling the reflink flag exchange whenever >> XFS_EXCHMAPS_INO1_WRITTEN is requested. The contents exchange can still >> proceed; the conservative outcome is that both inodes keep the reflink >> flag. The regular reflink flag cleanup path can drop the extra flag >> later once the inode no longer has shared extents. > > The fix looks good: > > Reviewed-by: Christoph Hellwig <[email protected]> > > Can you add a test case to fstests for this? > Thanks for the review. Sure, I'll add an fstests regression test and send it separately.