diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_rtbitmap.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_rtbitmap.c | 57 | 
1 files changed, 57 insertions, 0 deletions
diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index f246d6dbf4ec..386b672c5058 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -1168,3 +1168,60 @@ xfs_rtsummary_wordcount(  	blocks = xfs_rtsummary_blockcount(mp, rsumlevels, rbmblocks);  	return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG;  } + +/* + * Lock both realtime free space metadata inodes for a freespace update.  If a + * transaction is given, the inodes will be joined to the transaction and the + * ILOCKs will be released on transaction commit. + */ +void +xfs_rtbitmap_lock( +	struct xfs_trans	*tp, +	struct xfs_mount	*mp) +{ +	xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP); +	if (tp) +		xfs_trans_ijoin(tp, mp->m_rbmip, XFS_ILOCK_EXCL); + +	xfs_ilock(mp->m_rsumip, XFS_ILOCK_EXCL | XFS_ILOCK_RTSUM); +	if (tp) +		xfs_trans_ijoin(tp, mp->m_rsumip, XFS_ILOCK_EXCL); +} + +/* Unlock both realtime free space metadata inodes after a freespace update. */ +void +xfs_rtbitmap_unlock( +	struct xfs_mount	*mp) +{ +	xfs_iunlock(mp->m_rsumip, XFS_ILOCK_EXCL | XFS_ILOCK_RTSUM); +	xfs_iunlock(mp->m_rbmip, XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP); +} + +/* + * Lock the realtime free space metadata inodes for a freespace scan.  Callers + * must walk metadata blocks in order of increasing file offset. + */ +void +xfs_rtbitmap_lock_shared( +	struct xfs_mount	*mp, +	unsigned int		rbmlock_flags) +{ +	if (rbmlock_flags & XFS_RBMLOCK_BITMAP) +		xfs_ilock(mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP); + +	if (rbmlock_flags & XFS_RBMLOCK_SUMMARY) +		xfs_ilock(mp->m_rsumip, XFS_ILOCK_SHARED | XFS_ILOCK_RTSUM); +} + +/* Unlock the realtime free space metadata inodes after a freespace scan. */ +void +xfs_rtbitmap_unlock_shared( +	struct xfs_mount	*mp, +	unsigned int		rbmlock_flags) +{ +	if (rbmlock_flags & XFS_RBMLOCK_SUMMARY) +		xfs_iunlock(mp->m_rsumip, XFS_ILOCK_SHARED | XFS_ILOCK_RTSUM); + +	if (rbmlock_flags & XFS_RBMLOCK_BITMAP) +		xfs_iunlock(mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP); +}  |