mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 15:03:53 +02:00
xfs: support recovering rmap intent items targetting realtime extents
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>
This commit is contained in:
parent
9e823fc274
commit
5e0679d1c6
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user