]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
xfs: support recovering rmap intent items targetting realtime extents
authorDarrick J. Wong <djwong@kernel.org>
Thu, 21 Nov 2024 00:20:25 +0000 (16:20 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 23 Dec 2024 21:06:05 +0000 (13:06 -0800)
Now that we have rmap on the realtime device and rmap intent items that
target the realtime device, log recovery has to support remapping
extents on the realtime volume.  Make this work.  Identify rtrmapbt
blocks in the log correctly so that we can validate them during log
recovery.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_buf_item_recover.c
fs/xfs/xfs_rmap_item.c

index 3d0c6402cb36344244daf8a5c8c6fa1cf6e95714..4f2e4ea29e1f574151b9eabea96fae4e37e28471 100644 (file)
@@ -262,6 +262,9 @@ xlog_recover_validate_buf_type(
                case XFS_BMAP_MAGIC:
                        bp->b_ops = &xfs_bmbt_buf_ops;
                        break;
+               case XFS_RTRMAP_CRC_MAGIC:
+                       bp->b_ops = &xfs_rtrmapbt_buf_ops;
+                       break;
                case XFS_RMAP_CRC_MAGIC:
                        bp->b_ops = &xfs_rmapbt_buf_ops;
                        break;
@@ -855,6 +858,7 @@ xlog_recover_get_buf_lsn(
                uuid = &btb->bb_u.s.bb_uuid;
                break;
        }
+       case XFS_RTRMAP_CRC_MAGIC:
        case XFS_BMAP_CRC_MAGIC:
        case XFS_BMAP_MAGIC: {
                struct xfs_btree_block *btb = blk;
index e8caa600a95cae53790894a93a6d2d951021c4f5..89decffe76c8b530f9445614c2f771dbb3436153 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);