From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757896AbbEEWCw (ORCPT ); Tue, 5 May 2015 18:02:52 -0400 Received: from ipmail04.adl6.internode.on.net ([150.101.137.141]:55779 "EHLO ipmail04.adl6.internode.on.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933228AbbEEWCV (ORCPT ); Tue, 5 May 2015 18:02:21 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BHBwB2PUlVPH8+LHlcgwyBL4ZLrUgBAQEBAQabDE0BAQEBAQEHAQEBAUE/hCEBBScvIxAIGDE5AwcUGYgrxSKGF4pEhBcFhlOicYlegQNmAYI/LDGCRQEBAQ From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org Subject: [PATCH 2/2] xfs: inode counter needs to use __percpu_counter_compare Date: Wed, 6 May 2015 08:01:39 +1000 Message-Id: <1430863299-9341-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1430863299-9341-1-git-send-email-david@fromorbit.com> References: <1430863299-9341-1-git-send-email-david@fromorbit.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dave Chinner From: Dave Chinner Because the counter uses a custom batch size, the comparison function needs to be aware of that batch size otherwise the comparison does not work correctly. This leads to ASSERT failures on generic/027 like this: XFS: Assertion failed: 0, file: fs/xfs/xfs_mount.c, line: 1099 ------------[ cut here ]------------ .... Call Trace: [] xfs_mod_icount+0x99/0xc0 [] xfs_trans_unreserve_and_mod_sb+0x28b/0x5b0 [] xfs_log_commit_cil+0x321/0x580 [] xfs_trans_commit+0xb7/0x260 [] xfs_bmap_finish+0xcd/0x1b0 [] xfs_inactive_ifree+0x1e1/0x250 [] xfs_inactive+0x130/0x200 [] xfs_fs_evict_inode+0x91/0xf0 [] evict+0xb8/0x190 [] iput+0x18b/0x1f0 [] do_unlinkat+0x1f3/0x320 [] ? filp_close+0x5a/0x80 [] SyS_unlinkat+0x1b/0x40 [] system_call_fastpath+0x12/0x71 This is a regression introduced by commit 501ab32 ("xfs: use generic percpu counters for inode counter"). Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 02f827f..900f8ce 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1106,8 +1106,9 @@ xfs_mod_icount( int64_t delta) { /* deltas are +/-64, hence the large batch size of 128. */ - __percpu_counter_add(&mp->m_icount, delta, 128); - if (percpu_counter_compare(&mp->m_icount, 0) < 0) { +#define _ICOUNT_BATCH 128 + __percpu_counter_add(&mp->m_icount, delta, _ICOUNT_BATCH); + if (__percpu_counter_compare(&mp->m_icount, 0, _ICOUNT_BATCH) < 0) { ASSERT(0); percpu_counter_add(&mp->m_icount, -delta); return -EINVAL; -- 2.0.0