diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_ialloc.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_ialloc.c | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 07349a183a11..1c9e75521250 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -376,7 +376,7 @@ xfs_ialloc_ag_alloc(  	 */  	newlen = args.mp->m_ialloc_inos;  	if (args.mp->m_maxicount && -	    percpu_counter_read(&args.mp->m_icount) + newlen > +	    percpu_counter_read_positive(&args.mp->m_icount) + newlen >  							args.mp->m_maxicount)  		return -ENOSPC;  	args.minlen = args.maxlen = args.mp->m_ialloc_blks; @@ -1339,10 +1339,13 @@ xfs_dialloc(  	 * If we have already hit the ceiling of inode blocks then clear  	 * okalloc so we scan all available agi structures for a free  	 * inode. +	 * +	 * Read rough value of mp->m_icount by percpu_counter_read_positive, +	 * which will sacrifice the preciseness but improve the performance.  	 */  	if (mp->m_maxicount && -	    percpu_counter_read(&mp->m_icount) + mp->m_ialloc_inos > -							mp->m_maxicount) { +	    percpu_counter_read_positive(&mp->m_icount) + mp->m_ialloc_inos +							> mp->m_maxicount) {  		noroom = 1;  		okalloc = 0;  	}  |