Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74f9ce1c authored by George Wang's avatar George Wang Committed by Dave Chinner
Browse files

xfs: use percpu_counter_read_positive for mp->m_icount



Function percpu_counter_read just return the current counter, which can be
negative. This will cause the checking of "allocated inode
counts <= m_maxicount" false positive. Use percpu_counter_read_positive can
solve this problem, and be consistent with the purpose to introduce percpu
mechanism to xfs.

Signed-off-by: default avatarGeorge Wang <xuw2015@gmail.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 5ebe6afa
Loading
Loading
Loading
Loading
+6 −3
Original line number Original line Diff line number Diff line
@@ -376,7 +376,7 @@ xfs_ialloc_ag_alloc(
	 */
	 */
	newlen = args.mp->m_ialloc_inos;
	newlen = args.mp->m_ialloc_inos;
	if (args.mp->m_maxicount &&
	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)
							args.mp->m_maxicount)
		return -ENOSPC;
		return -ENOSPC;
	args.minlen = args.maxlen = args.mp->m_ialloc_blks;
	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
	 * If we have already hit the ceiling of inode blocks then clear
	 * okalloc so we scan all available agi structures for a free
	 * okalloc so we scan all available agi structures for a free
	 * inode.
	 * 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 &&
	if (mp->m_maxicount &&
	    percpu_counter_read(&mp->m_icount) + mp->m_ialloc_inos >
	    percpu_counter_read_positive(&mp->m_icount) + mp->m_ialloc_inos
							mp->m_maxicount) {
							> mp->m_maxicount) {
		noroom = 1;
		noroom = 1;
		okalloc = 0;
		okalloc = 0;
	}
	}