]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: update rmap to allow cow staging extents in the rt rmap
authorDarrick J. Wong <djwong@kernel.org>
Tue, 7 Mar 2023 03:56:19 +0000 (19:56 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 22 Nov 2023 23:03:41 +0000 (15:03 -0800)
Don't error out on CoW staging extent records when realtime reflink is
enabled.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
libxfs/xfs_rmap.c

index e43ff529b590637f65f6988baf5b63414e002c23..15790d7d6c710cf4cc652d76dbc6ed5bf9c1837a 100644 (file)
@@ -274,6 +274,7 @@ xfs_rmap_check_rtgroup_irec(
        bool                            is_unwritten;
        bool                            is_bmbt;
        bool                            is_attr;
+       bool                            is_cow;
 
        if (irec->rm_blockcount == 0)
                return __this_address;
@@ -285,6 +286,12 @@ xfs_rmap_check_rtgroup_irec(
                        return __this_address;
                if (irec->rm_offset != 0)
                        return __this_address;
+       } else if (irec->rm_owner == XFS_RMAP_OWN_COW) {
+               if (!xfs_has_rtreflink(mp))
+                       return __this_address;
+               if (!xfs_verify_rgbext(rtg, irec->rm_startblock,
+                                           irec->rm_blockcount))
+                       return __this_address;
        } else {
                if (!xfs_verify_rgbext(rtg, irec->rm_startblock,
                                            irec->rm_blockcount))
@@ -301,8 +308,10 @@ xfs_rmap_check_rtgroup_irec(
        is_bmbt = irec->rm_flags & XFS_RMAP_BMBT_BLOCK;
        is_attr = irec->rm_flags & XFS_RMAP_ATTR_FORK;
        is_unwritten = irec->rm_flags & XFS_RMAP_UNWRITTEN;
+       is_cow = xfs_has_rtreflink(mp) &&
+                irec->rm_owner == XFS_RMAP_OWN_COW;
 
-       if (!is_inode && irec->rm_owner != XFS_RMAP_OWN_FS)
+       if (!is_inode && !is_cow && irec->rm_owner != XFS_RMAP_OWN_FS)
                return __this_address;
 
        if (!is_inode && irec->rm_offset != 0)
@@ -314,6 +323,9 @@ xfs_rmap_check_rtgroup_irec(
        if (is_unwritten && !is_inode)
                return __this_address;
 
+       if (is_unwritten && is_cow)
+               return __this_address;
+
        /* Check for a valid fork offset, if applicable. */
        if (is_inode &&
            !xfs_verify_fileext(mp, irec->rm_offset, irec->rm_blockcount))