diff options
| author | Christoph Hellwig <hch@infradead.org> | 2011-02-13 13:25:31 +0000 | 
|---|---|---|
| committer | Alex Elder <aelder@sgi.com> | 2011-02-22 20:30:21 -0600 | 
| commit | 1050c71e2925ab0cb025e4c89e08b15529a1ee36 (patch) | |
| tree | eacaa53e025ab0da4793f1c3c09fc9e15ebee6a5 /fs/xfs/xfs_rtalloc.c | |
| parent | 5d15765594eeb5d82c5630b3428ea0ac4f7d3c31 (diff) | |
| download | olio-linux-3.10-1050c71e2925ab0cb025e4c89e08b15529a1ee36.tar.xz olio-linux-3.10-1050c71e2925ab0cb025e4c89e08b15529a1ee36.zip  | |
xfs: stop using xfs_trans_iget in the RT allocator
During mount we establish references to the RT inodes, which we keep for
the lifetime of the filesystem.  Instead of using xfs_trans_iget to grab
additional references when adding RT inodes to transactions use the
combination of xfs_ilock and xfs_trans_ijoin_ref, which archives the same
end result with less overhead.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_rtalloc.c')
| -rw-r--r-- | fs/xfs/xfs_rtalloc.c | 54 | 
1 files changed, 21 insertions, 33 deletions
diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index f592ac97818..fbff89344ba 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -76,7 +76,7 @@ xfs_growfs_rt_alloc(  	xfs_mount_t	*mp,		/* file system mount point */  	xfs_extlen_t	oblocks,	/* old count of blocks */  	xfs_extlen_t	nblocks,	/* new count of blocks */ -	xfs_ino_t	ino)		/* inode number (bitmap/summary) */ +	xfs_inode_t	*ip)		/* inode (bitmap/summary) */  {  	xfs_fileoff_t	bno;		/* block number in file */  	xfs_buf_t	*bp;		/* temporary buffer for zeroing */ @@ -86,7 +86,6 @@ xfs_growfs_rt_alloc(  	xfs_fsblock_t	firstblock;	/* first block allocated in xaction */  	xfs_bmap_free_t	flist;		/* list of freed blocks */  	xfs_fsblock_t	fsbno;		/* filesystem block for bno */ -	xfs_inode_t	*ip;		/* pointer to incore inode */  	xfs_bmbt_irec_t	map;		/* block map output */  	int		nmap;		/* number of block maps */  	int		resblks;	/* space reservation */ @@ -112,9 +111,9 @@ xfs_growfs_rt_alloc(  		/*  		 * Lock the inode.  		 */ -		if ((error = xfs_trans_iget(mp, tp, ino, 0, -						XFS_ILOCK_EXCL, &ip))) -			goto error_cancel; +		xfs_ilock(ip, XFS_ILOCK_EXCL); +		xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); +  		xfs_bmap_init(&flist, &firstblock);  		/*  		 * Allocate blocks to the bitmap file. @@ -155,9 +154,8 @@ xfs_growfs_rt_alloc(  			/*  			 * Lock the bitmap inode.  			 */ -			if ((error = xfs_trans_iget(mp, tp, ino, 0, -							XFS_ILOCK_EXCL, &ip))) -				goto error_cancel; +			xfs_ilock(ip, XFS_ILOCK_EXCL); +			xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL);  			/*  			 * Get a buffer for the block.  			 */ @@ -1854,7 +1852,6 @@ xfs_growfs_rt(  	xfs_rtblock_t	bmbno;		/* bitmap block number */  	xfs_buf_t	*bp;		/* temporary buffer */  	int		error;		/* error return value */ -	xfs_inode_t	*ip;		/* bitmap inode, used as lock */  	xfs_mount_t	*nmp;		/* new (fake) mount structure */  	xfs_drfsbno_t	nrblocks;	/* new number of realtime blocks */  	xfs_extlen_t	nrbmblocks;	/* new number of rt bitmap blocks */ @@ -1918,11 +1915,11 @@ xfs_growfs_rt(  	/*  	 * Allocate space to the bitmap and summary files, as necessary.  	 */ -	if ((error = xfs_growfs_rt_alloc(mp, rbmblocks, nrbmblocks, -			mp->m_sb.sb_rbmino))) +	error = xfs_growfs_rt_alloc(mp, rbmblocks, nrbmblocks, mp->m_rbmip); +	if (error)  		return error; -	if ((error = xfs_growfs_rt_alloc(mp, rsumblocks, nrsumblocks, -			mp->m_sb.sb_rsumino))) +	error = xfs_growfs_rt_alloc(mp, rsumblocks, nrsumblocks, mp->m_rsumip); +	if (error)  		return error;  	/*  	 * Allocate a new (fake) mount/sb. @@ -1972,12 +1969,8 @@ xfs_growfs_rt(  		/*  		 * Lock out other callers by grabbing the bitmap inode lock.  		 */ -		error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, -				       XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP, -				       &ip); -		if (error) -			goto error_cancel; -		ASSERT(ip == mp->m_rbmip); +		xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); +		xfs_trans_ijoin_ref(tp, mp->m_rbmip, XFS_ILOCK_EXCL);  		/*  		 * Update the bitmap inode's size.  		 */ @@ -1988,11 +1981,8 @@ xfs_growfs_rt(  		/*  		 * Get the summary inode into the transaction.  		 */ -		error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rsumino, 0, -				       XFS_ILOCK_EXCL | XFS_ILOCK_RTSUM, &ip); -		if (error) -			goto error_cancel; -		ASSERT(ip == mp->m_rsumip); +		xfs_ilock(mp->m_rsumip, XFS_ILOCK_EXCL); +		xfs_trans_ijoin_ref(tp, mp->m_rsumip, XFS_ILOCK_EXCL);  		/*  		 * Update the summary inode's size.  		 */ @@ -2154,7 +2144,6 @@ xfs_rtfree_extent(  	xfs_extlen_t	len)		/* length of extent freed */  {  	int		error;		/* error value */ -	xfs_inode_t	*ip;		/* bitmap file inode */  	xfs_mount_t	*mp;		/* file system mount structure */  	xfs_fsblock_t	sb;		/* summary file block number */  	xfs_buf_t	*sumbp;		/* summary file block buffer */ @@ -2163,10 +2152,9 @@ xfs_rtfree_extent(  	/*  	 * Synchronize by locking the bitmap inode.  	 */ -	error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, -			       XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP, &ip); -	if (error) -		return error; +	xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); +	xfs_trans_ijoin_ref(tp, mp->m_rbmip, XFS_ILOCK_EXCL); +  #if defined(__KERNEL__) && defined(DEBUG)  	/*  	 * Check to see that this whole range is currently allocated. @@ -2199,10 +2187,10 @@ xfs_rtfree_extent(  	 */  	if (tp->t_frextents_delta + mp->m_sb.sb_frextents ==  	    mp->m_sb.sb_rextents) { -		if (!(ip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) -			ip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; -		*(__uint64_t *)&ip->i_d.di_atime = 0; -		xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); +		if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) +			mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; +		*(__uint64_t *)&mp->m_rbmip->i_d.di_atime = 0; +		xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE);  	}  	return 0;  }  |