Received: by 2002:a17:90a:88:0:0:0:0 with SMTP id a8csp8348pja; Fri, 22 Nov 2019 02:43:46 -0800 (PST) X-Google-Smtp-Source: APXvYqzGuJT3GELHbfzRmU9doSGQ5YSVrTTPxS5z8ESE5msGkknWeR2zmVlgCx81baXtimUBnbwZ X-Received: by 2002:a17:906:2e81:: with SMTP id o1mr21201349eji.284.1574419426814; Fri, 22 Nov 2019 02:43:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574419426; cv=none; d=google.com; s=arc-20160816; b=vWD0D1bsGSpGybjAG0i/nAhm55q0UcYM4JYgm4iUrcJI3q9u5HvRP0pXUnMzmUXrAB MR0phdAOdz5ky1uqb73fiIkfotE/vfeKHxZgeNqgTaAHIiM7S4qNxfJGzjQ9fH/Avkr7 xqu+HSzP/Vqtz3c1V2DXrZPYoG8cDMyn/HHJ8Gl8dF5bJKqYeUNWjoDiWH9DTK1A2yNy tO1EaEqt5ZSCFGf6C21zLZW0iQ3Dl09TUfv1SxZbN+tZtHgXTG/M3htd0sUYIErPfQRg Jxf3FIU/Lgk2ETyv3zOmBOhN5elS/a0CtaFBVSs57JV3QQe5PjojzI4R6dTWfvp2CUZL s8Mw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=aXqXZPrMkSbdzBIK91mhDwsi5jj8MnZqg5TgkcA/JF8=; b=MsiFfzVI6lMgO2GyhuIS9Vlb3Ju+DVZl4UtDC3a1vVdsIGrM3uHpmKYGh03R4sjx9m Pwk4ggDrJpJ8FLiNZZzFV8SYI9a6ukS13StMqXd5Tde1N7R5M0KX+mnFI2tjT1mFJqkx tQrv9PApnv2tpiSionJX+1Vz7q0Kt4i4ZfBW2ogUamwx28RqMsnRnPWETkThANkX9Idn nWaRG4Jps2hMP1NZt0tFNs12U6HMM/UyzJQssPk5bNcQy5N1RSvfoJ0/07baTAeTfWIC BD80oQ6qU5lSv4be7RWRlYXQ6VOuHzVfKkhuOnw7e+igHNiQUqm5c2G0qSNd4wwxuyb/ lvyg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=A55ASMvH; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u24si5121446edl.447.2019.11.22.02.43.22; Fri, 22 Nov 2019 02:43:46 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=A55ASMvH; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727787AbfKVKlD (ORCPT + 99 others); Fri, 22 Nov 2019 05:41:03 -0500 Received: from mail.kernel.org ([198.145.29.99]:45302 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728551AbfKVKlA (ORCPT ); Fri, 22 Nov 2019 05:41:00 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 045F22071F; Fri, 22 Nov 2019 10:40:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1574419259; bh=cz9yANBsZW2qAh4Evu4ZWcIfTP6aODRHbacB8e9E0Ik=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=A55ASMvHa35gPowENgN3BMwY+QAuebAv//FPP6bvjQJfTGLFd/rfGPiINdHTNMRSd jpGwoVZC1FoOpe46lohdbE1y5C32SesmIHex2WxUmSDErt81c5J0vG4bxLoiBDEpTj eXnrej2jpyPeNc0b5H8pjxaDS9DRTsXnZK4r4vh0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Bob Peterson , Sasha Levin Subject: [PATCH 4.9 024/222] gfs2: Dont set GFS2_RDF_UPTODATE when the lvb is updated Date: Fri, 22 Nov 2019 11:26:04 +0100 Message-Id: <20191122100838.381317027@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191122100830.874290814@linuxfoundation.org> References: <20191122100830.874290814@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Bob Peterson [ Upstream commit 4f36cb36c9d14340bb200d2ad9117b03ce992cfe ] The GFS2_RDF_UPTODATE flag in the rgrp is used to determine when a rgrp buffer is valid. It's cleared when the glock is invalidated, signifying that the buffer data is now invalid. But before this patch, function update_rgrp_lvb was setting the flag when it determined it had a valid lvb. But that's an invalid assumption: just because you have a valid lvb doesn't mean you have valid buffers. After all, another node may have made the lvb valid, and this node just fetched it from the glock via dlm. Consider this scenario: 1. The file system is mounted with RGRPLVB option. 2. In gfs2_inplace_reserve it locks the rgrp glock EX, but thanks to GL_SKIP, it skips the gfs2_rgrp_bh_get. 3. Since loops == 0 and the allocation target (ap->target) is bigger than the largest known chunk of blocks in the rgrp (rs->rs_rbm.rgd->rd_extfail_pt) it skips that rgrp and bypasses the call to gfs2_rgrp_bh_get there as well. 4. update_rgrp_lvb sees the lvb MAGIC number is valid, so bypasses gfs2_rgrp_bh_get, but it still sets sets GFS2_RDF_UPTODATE due to this invalid assumption. 5. The next time update_rgrp_lvb is called, it sees the bit is set and just returns 0, assuming both the lvb and rgrp are both uptodate. But since this is a smaller allocation, or space has been freed by another node, thus adjusting the lvb values, it decides to use the rgrp for allocations, with invalid rd_free due to the fact it was never updated. This patch changes update_rgrp_lvb so it doesn't set the UPTODATE flag anymore. That way, it has no choice but to fetch the latest values. Signed-off-by: Bob Peterson Signed-off-by: Sasha Levin --- fs/gfs2/rgrp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 0731267072706..f77a38755aea6 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c @@ -1211,7 +1211,7 @@ static int update_rgrp_lvb(struct gfs2_rgrpd *rgd) rl_flags = be32_to_cpu(rgd->rd_rgl->rl_flags); rl_flags &= ~GFS2_RDF_MASK; rgd->rd_flags &= GFS2_RDF_MASK; - rgd->rd_flags |= (rl_flags | GFS2_RDF_UPTODATE | GFS2_RDF_CHECK); + rgd->rd_flags |= (rl_flags | GFS2_RDF_CHECK); if (rgd->rd_rgl->rl_unlinked == 0) rgd->rd_flags &= ~GFS2_RDF_CHECK; rgd->rd_free = be32_to_cpu(rgd->rd_rgl->rl_free); -- 2.20.1