From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E4C92C433E1 for ; Thu, 20 Aug 2020 00:06:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BD56A207FB for ; Thu, 20 Aug 2020 00:06:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1597881962; bh=+RV2FbktRp7uqlTiDsB12n09uKQ1Y76sFMGEZrnZyhU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=uTezZbELTRna8+98IarOnNbza7arbIJj8IVEUBjKfk3CCXQRFuTbvqV5iw0ylo3Hh Qg6O0tVpXQPXgao5OMe9NjYL3eF4Tkkr6iuinWkH+V7xR/tOmF6diIs5nA7z9QVRTA ZhTKQQWk3GLEdTHpOiFo7xoTAeZj4IBrICHcDe1c= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728121AbgHTAF7 (ORCPT ); Wed, 19 Aug 2020 20:05:59 -0400 Received: from mail.kernel.org ([198.145.29.99]:34056 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728387AbgHTAD6 (ORCPT ); Wed, 19 Aug 2020 20:03:58 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 03E88214F1; Thu, 20 Aug 2020 00:03:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1597881838; bh=+RV2FbktRp7uqlTiDsB12n09uKQ1Y76sFMGEZrnZyhU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pjnoC2CU716VcqDx6Srr7vbWfkZWndPtCiEd89rDe4o+m+6p83TQbmLiCI79KTZDE VT1CSfSVmCpBxgsf5nGHAYAKkuEkcrrhWX4Ggt6LZq0/TeofhmyjrXsuTpF4pv1Tzx wJEGfK8o9xD4b0on8cNAX1OZ59vM5FBsr47WHEoU= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: "Darrick J. Wong" , Allison Collins , Chandan Babu R , Christoph Hellwig , Sasha Levin , linux-xfs@vger.kernel.org Subject: [PATCH AUTOSEL 4.9 06/11] xfs: fix inode quota reservation checks Date: Wed, 19 Aug 2020 20:03:43 -0400 Message-Id: <20200820000348.215911-6-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200820000348.215911-1-sashal@kernel.org> References: <20200820000348.215911-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Darrick J. Wong" [ Upstream commit f959b5d037e71a4d69b5bf71faffa065d9269b4a ] xfs_trans_dqresv is the function that we use to make reservations against resource quotas. Each resource contains two counters: the q_core counter, which tracks resources allocated on disk; and the dquot reservation counter, which tracks how much of that resource has either been allocated or reserved by threads that are working on metadata updates. For disk blocks, we compare the proposed reservation counter against the hard and soft limits to decide if we're going to fail the operation. However, for inodes we inexplicably compare against the q_core counter, not the incore reservation count. Since the q_core counter is always lower than the reservation count and we unlock the dquot between reservation and transaction commit, this means that multiple threads can reserve the last inode count before we hit the hard limit, and when they commit, we'll be well over the hard limit. Fix this by checking against the incore inode reservation counter, since we would appear to maintain that correctly (and that's what we report in GETQUOTA). Signed-off-by: Darrick J. Wong Reviewed-by: Allison Collins Reviewed-by: Chandan Babu R Reviewed-by: Christoph Hellwig Signed-off-by: Sasha Levin --- fs/xfs/xfs_trans_dquot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index c3d547211d160..9c42e50a5cb7e 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -669,7 +669,7 @@ xfs_trans_dqresv( } } if (ninos > 0) { - total_count = be64_to_cpu(dqp->q_core.d_icount) + ninos; + total_count = dqp->q_res_icount + ninos; timer = be32_to_cpu(dqp->q_core.d_itimer); warns = be16_to_cpu(dqp->q_core.d_iwarns); warnlimit = dqp->q_mount->m_quotainfo->qi_iwarnlimit; -- 2.25.1