]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: support recovering rmap intent items targetting realtime extents
authorDarrick J. Wong <djwong@kernel.org>
Mon, 23 Sep 2024 20:41:58 +0000 (13:41 -0700)
committerChristoph Hellwig <hch@lst.de>
Wed, 9 Oct 2024 13:55:45 +0000 (15:55 +0200)
Now that we have rmap on the realtime device, log recovery has to
support remapping extents on the realtime volume.  Make this work.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/xfs_rmap_item.c

index b34a70deff7374d918ac6a27d3bbfb36fbcfda34..65636f12940d9c51d5128cb31fdf2bb4e72b0670 100644 (file)
@@ -459,6 +459,7 @@ xfs_rmap_update_abort_intent(
 static inline bool
 xfs_rui_validate_map(
        struct xfs_mount                *mp,
+       bool                            isrt,
        struct xfs_map_extent           *map)
 {
        if (!xfs_has_rmapbt(mp))
@@ -488,6 +489,9 @@ xfs_rui_validate_map(
        if (!xfs_verify_fileext(mp, map->me_startoff, map->me_len))
                return false;
 
+       if (isrt)
+               return xfs_verify_rtbext(mp, map->me_startblock, map->me_len);
+
        return xfs_verify_fsbext(mp, map->me_startblock, map->me_len);
 }
 
@@ -495,6 +499,7 @@ static inline void
 xfs_rui_recover_work(
        struct xfs_mount                *mp,
        struct xfs_defer_pending        *dfp,
+       bool                            isrt,
        const struct xfs_map_extent     *map)
 {
        struct xfs_rmap_intent          *ri;
@@ -539,7 +544,9 @@ xfs_rui_recover_work(
        ri->ri_bmap.br_blockcount = map->me_len;
        ri->ri_bmap.br_state = (map->me_flags & XFS_RMAP_EXTENT_UNWRITTEN) ?
                        XFS_EXT_UNWRITTEN : XFS_EXT_NORM;
-       ri->ri_group = xfs_group_intent_get(mp, map->me_startblock, XG_TYPE_AG);
+       ri->ri_group = xfs_group_intent_get(mp, map->me_startblock,
+                       isrt ? XG_TYPE_RTG : XG_TYPE_AG);
+       ri->ri_realtime = isrt;
 
        xfs_defer_add_item(dfp, &ri->ri_list);
 }
@@ -558,6 +565,7 @@ xfs_rmap_recover_work(
        struct xfs_rui_log_item         *ruip = RUI_ITEM(lip);
        struct xfs_trans                *tp;
        struct xfs_mount                *mp = lip->li_log->l_mp;
+       bool                            isrt = xfs_rui_item_isrt(lip);
        int                             i;
        int                             error = 0;
 
@@ -567,7 +575,7 @@ xfs_rmap_recover_work(
         * just toss the RUI.
         */
        for (i = 0; i < ruip->rui_format.rui_nextents; i++) {
-               if (!xfs_rui_validate_map(mp,
+               if (!xfs_rui_validate_map(mp, isrt,
                                        &ruip->rui_format.rui_extents[i])) {
                        XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
                                        &ruip->rui_format,
@@ -575,7 +583,8 @@ xfs_rmap_recover_work(
                        return -EFSCORRUPTED;
                }
 
-               xfs_rui_recover_work(mp, dfp, &ruip->rui_format.rui_extents[i]);
+               xfs_rui_recover_work(mp, dfp, isrt,
+                               &ruip->rui_format.rui_extents[i]);
        }
 
        resv = xlog_recover_resv(&M_RES(mp)->tr_itruncate);