diff options
Diffstat (limited to 'fs/xfs/xfs_ialloc.c')
| -rw-r--r-- | fs/xfs/xfs_ialloc.c | 17 | 
1 files changed, 9 insertions, 8 deletions
diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 21e37b55f7e..5aceb3f8ecd 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -962,23 +962,22 @@ xfs_dialloc(  		if (!pag->pagi_freecount && !okalloc)  			goto nextag; +		/* +		 * Then read in the AGI buffer and recheck with the AGI buffer +		 * lock held. +		 */  		error = xfs_ialloc_read_agi(mp, tp, agno, &agbp);  		if (error)  			goto out_error; -		/* -		 * Once the AGI has been read in we have to recheck -		 * pagi_freecount with the AGI buffer lock held. -		 */  		if (pag->pagi_freecount) {  			xfs_perag_put(pag);  			goto out_alloc;  		} -		if (!okalloc) { -			xfs_trans_brelse(tp, agbp); -			goto nextag; -		} +		if (!okalloc) +			goto nextag_relse_buffer; +  		error = xfs_ialloc_ag_alloc(tp, agbp, &ialloced);  		if (error) { @@ -1007,6 +1006,8 @@ xfs_dialloc(  			return 0;  		} +nextag_relse_buffer: +		xfs_trans_brelse(tp, agbp);  nextag:  		xfs_perag_put(pag);  		if (++agno == mp->m_sb.sb_agcount)  |