xfs: implement swapext for rmap filesystems
Implement swapext for filesystems that have reverse mapping. Back in the reflink patches, we augmented the bmap code with a 'REMAP' flag that updates only the bmbt and doesn't touch the allocator and implemented log redo items for those two operations. Now we can rewrite extent swapping as a (looong) series of remap operations. This is far less efficient than the fork swapping method implemented in the past, so we only switch this on for rmap. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
@@ -21,6 +21,8 @@
|
||||
/*
|
||||
* Components of space reservations.
|
||||
*/
|
||||
#define XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) \
|
||||
(((mp)->m_rmap_mxr[0]) - ((mp)->m_rmap_mnr[0]))
|
||||
#define XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) \
|
||||
(((mp)->m_alloc_mxr[0]) - ((mp)->m_alloc_mnr[0]))
|
||||
#define XFS_EXTENTADD_SPACE_RES(mp,w) (XFS_BM_MAXLEVELS(mp,w) - 1)
|
||||
@@ -28,6 +30,13 @@
|
||||
(((b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) - 1) / \
|
||||
XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)) * \
|
||||
XFS_EXTENTADD_SPACE_RES(mp,w))
|
||||
#define XFS_SWAP_RMAP_SPACE_RES(mp,b,w)\
|
||||
(((b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) - 1) / \
|
||||
XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)) * \
|
||||
XFS_EXTENTADD_SPACE_RES(mp,w) + \
|
||||
((b + XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) - 1) / \
|
||||
XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp)) * \
|
||||
(mp)->m_rmap_maxlevels)
|
||||
#define XFS_DAENTER_1B(mp,w) \
|
||||
((w) == XFS_DATA_FORK ? (mp)->m_dir_geo->fsbcount : 1)
|
||||
#define XFS_DAENTER_DBS(mp,w) \
|
||||
|
Reference in New Issue
Block a user