2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00

xfs: realtime rmap btree transaction reservations

Make sure that there's enough log reservation to handle mapping
and unmapping realtime extents.  We have to reserve enough space
to handle a split in the rtrmapbt to add the record and a second
split in the regular rmapbt to record the rtrmapbt split.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Darrick J. Wong 2024-11-20 16:20:22 -08:00
parent fc6856c6ff
commit e1c76fce50
3 changed files with 26 additions and 3 deletions

View File

@ -662,7 +662,9 @@ xfs_exchmaps_rmapbt_blocks(
if (!xfs_has_rmapbt(mp)) if (!xfs_has_rmapbt(mp))
return 0; return 0;
if (XFS_IS_REALTIME_INODE(req->ip1)) if (XFS_IS_REALTIME_INODE(req->ip1))
return 0; return howmany_64(req->nr_exchanges,
XFS_MAX_CONTIG_RTRMAPS_PER_BLOCK(mp)) *
XFS_RTRMAPADD_SPACE_RES(mp);
return howmany_64(req->nr_exchanges, return howmany_64(req->nr_exchanges,
XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp)) * XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp)) *

View File

@ -213,7 +213,9 @@ xfs_calc_inode_chunk_res(
* Per-extent log reservation for the btree changes involved in freeing or * Per-extent log reservation for the btree changes involved in freeing or
* allocating a realtime extent. We have to be able to log as many rtbitmap * allocating a realtime extent. We have to be able to log as many rtbitmap
* blocks as needed to mark inuse XFS_BMBT_MAX_EXTLEN blocks' worth of realtime * blocks as needed to mark inuse XFS_BMBT_MAX_EXTLEN blocks' worth of realtime
* extents, as well as the realtime summary block. * extents, as well as the realtime summary block (t1). Realtime rmap btree
* operations happen in a second transaction, so factor in a couple of rtrmapbt
* splits (t2).
*/ */
static unsigned int static unsigned int
xfs_rtalloc_block_count( xfs_rtalloc_block_count(
@ -222,10 +224,16 @@ xfs_rtalloc_block_count(
{ {
unsigned int rtbmp_blocks; unsigned int rtbmp_blocks;
xfs_rtxlen_t rtxlen; xfs_rtxlen_t rtxlen;
unsigned int t1, t2 = 0;
rtxlen = xfs_extlen_to_rtxlen(mp, XFS_MAX_BMBT_EXTLEN); rtxlen = xfs_extlen_to_rtxlen(mp, XFS_MAX_BMBT_EXTLEN);
rtbmp_blocks = xfs_rtbitmap_blockcount_len(mp, rtxlen); rtbmp_blocks = xfs_rtbitmap_blockcount_len(mp, rtxlen);
return (rtbmp_blocks + 1) * num_ops; t1 = (rtbmp_blocks + 1) * num_ops;
if (xfs_has_rmapbt(mp))
t2 = num_ops * (2 * mp->m_rtrmap_maxlevels - 1);
return max(t1, t2);
} }
/* /*

View File

@ -14,6 +14,19 @@
#define XFS_MAX_CONTIG_BMAPS_PER_BLOCK(mp) \ #define XFS_MAX_CONTIG_BMAPS_PER_BLOCK(mp) \
(((mp)->m_bmap_dmxr[0]) - ((mp)->m_bmap_dmnr[0])) (((mp)->m_bmap_dmxr[0]) - ((mp)->m_bmap_dmnr[0]))
/* Worst case number of realtime rmaps that can be held in a block. */
#define XFS_MAX_CONTIG_RTRMAPS_PER_BLOCK(mp) \
(((mp)->m_rtrmap_mxr[0]) - ((mp)->m_rtrmap_mnr[0]))
/* Adding one realtime rmap could split every level to the top of the tree. */
#define XFS_RTRMAPADD_SPACE_RES(mp) ((mp)->m_rtrmap_maxlevels)
/* Blocks we might need to add "b" realtime rmaps to a tree. */
#define XFS_NRTRMAPADD_SPACE_RES(mp, b) \
((((b) + XFS_MAX_CONTIG_RTRMAPS_PER_BLOCK(mp) - 1) / \
XFS_MAX_CONTIG_RTRMAPS_PER_BLOCK(mp)) * \
XFS_RTRMAPADD_SPACE_RES(mp))
/* Worst case number of rmaps that can be held in a block. */ /* Worst case number of rmaps that can be held in a block. */
#define XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) \ #define XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) \
(((mp)->m_rmap_mxr[0]) - ((mp)->m_rmap_mnr[0])) (((mp)->m_rmap_mxr[0]) - ((mp)->m_rmap_mnr[0]))