mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 22:22:08 +02:00
xfs: realtime refcount 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 rtrefcountbt to add the record and a second split in the regular refcountbt to record the rtrefcountbt split. Signed-off-by: "Darrick J. Wong" <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
9abe03a0e4
commit
2003c6a875
|
|
@ -92,6 +92,14 @@ xfs_refcountbt_block_count(
|
|||
return num_ops * (2 * mp->m_refc_maxlevels - 1);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
xfs_rtrefcountbt_block_count(
|
||||
struct xfs_mount *mp,
|
||||
unsigned int num_ops)
|
||||
{
|
||||
return num_ops * (2 * mp->m_rtrefc_maxlevels - 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Logging inodes is really tricksy. They are logged in memory format,
|
||||
* which means that what we write into the log doesn't directly translate into
|
||||
|
|
@ -259,10 +267,13 @@ xfs_rtalloc_block_count(
|
|||
* Compute the log reservation required to handle the refcount update
|
||||
* transaction. Refcount updates are always done via deferred log items.
|
||||
*
|
||||
* This is calculated as:
|
||||
* This is calculated as the max of:
|
||||
* Data device refcount updates (t1):
|
||||
* the agfs of the ags containing the blocks: nr_ops * sector size
|
||||
* the refcount btrees: nr_ops * 1 trees * (2 * max depth - 1) * block size
|
||||
* Realtime refcount updates (t2);
|
||||
* the rt refcount inode
|
||||
* the rtrefcount btrees: nr_ops * 1 trees * (2 * max depth - 1) * block size
|
||||
*/
|
||||
static unsigned int
|
||||
xfs_calc_refcountbt_reservation(
|
||||
|
|
@ -270,12 +281,20 @@ xfs_calc_refcountbt_reservation(
|
|||
unsigned int nr_ops)
|
||||
{
|
||||
unsigned int blksz = XFS_FSB_TO_B(mp, 1);
|
||||
unsigned int t1, t2 = 0;
|
||||
|
||||
if (!xfs_has_reflink(mp))
|
||||
return 0;
|
||||
|
||||
return xfs_calc_buf_res(nr_ops, mp->m_sb.sb_sectsize) +
|
||||
xfs_calc_buf_res(xfs_refcountbt_block_count(mp, nr_ops), blksz);
|
||||
t1 = xfs_calc_buf_res(nr_ops, mp->m_sb.sb_sectsize) +
|
||||
xfs_calc_buf_res(xfs_refcountbt_block_count(mp, nr_ops), blksz);
|
||||
|
||||
if (xfs_has_realtime(mp))
|
||||
t2 = xfs_calc_inode_res(mp, 1) +
|
||||
xfs_calc_buf_res(xfs_rtrefcountbt_block_count(mp, nr_ops),
|
||||
blksz);
|
||||
|
||||
return max(t1, t2);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user