From: Darrick J. Wong <djwong@xxxxxxxxxx> 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 <djwong@xxxxxxxxxx> --- fsr/xfs_fsr.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index bbc7d5fcabb..1fb2e5e7529 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -969,6 +969,22 @@ fsr_setup_attr_fork( if (!(bstatp->bs_xflags & FS_XFLAG_HASATTR)) return 0; + /* + * If the filesystem has the ability to perform atomic extent swaps or + * has the reverse mapping btree enabled, 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. + * + * The newer bmap implementation does not require specific values of + * bs_forkoff, unlike the old fork swap code. Therefore, 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_ATOMIC_SWAP | + XFS_FSOP_GEOM_FLAGS_RMAPBT)) + 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.