From: Darrick J. Wong Date: Mon, 29 Jul 2024 23:23:00 +0000 (-0700) Subject: xfs_fsr: skip the xattr/forkoff levering with the newer swapext implementations X-Git-Tag: v6.10.0~23^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=63ea34b8f00c4b86115b770fdab487e9157d712b;p=thirdparty%2Fxfsprogs-dev.git xfs_fsr: skip the xattr/forkoff levering with the newer swapext implementations The newer swapext implementations in the kernel run at a high enough level (above the bmap layer) that it's no longer required to manipulate bs_forkoff by creating garbage xattrs to get the extent tree that we want. If we detect the newer algorithms, skip this error prone step. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index c6dbfb22..22e134ad 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -999,6 +999,20 @@ fsr_setup_attr_fork( if (!(bstatp->bs_xflags & FS_XFLAG_HASATTR)) return 0; + /* + * If the filesystem has the ability to perform atomic file mapping + * exchanges, the file extent swap implementation uses a higher level + * algorithm that calls into the bmap code instead of playing games + * with swapping the extent forks. + * + * This new functionality does not require specific values of + * bs_forkoff, unlike the old fork swap code. Leave the extended + * attributes alone if we know we're not using the old fork swap + * strategy. This eliminates a major source of runtime errors in fsr. + */ + if (fsgeom.flags & XFS_FSOP_GEOM_FLAGS_EXCHANGE_RANGE) + return 0; + /* * use the old method if we have attr1 or the kernel does not yet * support passing the fork offset in the bulkstat data.