From: George Wang <xuw2015@xxxxxxxxx> Function percpu_counter_read just return the current counter, regardless of every cpu's count. This counter can be negative value, which will cause the checking of "allocated inode counts <= m_maxicount" false positive. Commit 501ab3238753 "xfs: use generic percpu counters for inode counter " introduced this problem. Use the percpu_counter_compare, which will first do stuff in current cpu for performance; if can not get the result, it will get the exactly counter based on the count of every cpu. Signed-off-by: George Wang <xuw2015@xxxxxxxxx> --- fs/xfs/libxfs/xfs_ialloc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 07349a1..af9e7d2 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -376,8 +376,8 @@ xfs_ialloc_ag_alloc( */ newlen = args.mp->m_ialloc_inos; if (args.mp->m_maxicount && - percpu_counter_read(&args.mp->m_icount) + newlen > - args.mp->m_maxicount) + percpu_counter_compare(&args.mp->m_icount, + args.mp->m_maxicount - newlen) > 0) return -ENOSPC; args.minlen = args.maxlen = args.mp->m_ialloc_blks; /* @@ -1341,8 +1341,8 @@ xfs_dialloc( * inode. */ if (mp->m_maxicount && - percpu_counter_read(&mp->m_icount) + mp->m_ialloc_inos > - mp->m_maxicount) { + percpu_counter_compare(&mp->m_icount, + mp->m_maxicount - mp->m_ialloc_inos) > 0) { noroom = 1; okalloc = 0; } -- 1.9.3 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs