Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp650463iog; Thu, 30 Jun 2022 07:41:12 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vBZ7wJS4hKseQkvYV6iDUiOUQexEaUeEwo8K3jNVOidL40TbotCK6kSOKQfdDVwbww4ffp X-Received: by 2002:a17:90b:1e02:b0:1ec:d979:4a8e with SMTP id pg2-20020a17090b1e0200b001ecd9794a8emr10405088pjb.181.1656600071733; Thu, 30 Jun 2022 07:41:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656600071; cv=none; d=google.com; s=arc-20160816; b=x3OGhe5//wug+NJDuVtjesbGwXqm61XGSJC8BQtMVi9j7MOqnXQQA38d5D9rjkSGAm 1CsVmekFnDhE0ZDayM5vy6fY7aH9EQn7ItsnZQeURrT2ZGlMszmOpIi4pZRDFZ11zvDn I6KReeRrG0DDnsy5q5ZtzksEO078fC6nw+x7bhMzRCZXJ0G/5oSKfPMG6HCWQ2bPmBty 1Ej4nKGmN0EV6qQk6567VjnsPe6z+TEZnvf794HbX8cmW0HNfewpH/6recg/W6/BrcuN igbTLMplhQ2wAuY2DqM+tQFe1HD0qlaNkr6cHeiURQf0SrcPvLBMUG7cIWWspVZSOPus IL5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=pnRT5eohsk+ZxxgCA18aDkGhFV17s27cLlk3M8MaCJM=; b=HXNZGVqfaSRi1j+GvoFFicFz4CG4nS/iAO8sL0wqboye43LLrgJ6Edjo6xgpLyFX2f fXZvckp9rmI/jTj83RPMswByYD5BfC4x42uNcMjEDIqySdesPeMm/pivhpv6zW9X1I1r pQub0I1/Waw9AlhA8bb6Kr+5VZrz7HVtvQZyvmaFuvWtXDTX2ykNNZVJRDKbRdlXKunh Jb3+EVj21lePsetaH8tyuAMue7iZM9ARmqtOtMEYffk7f4YQVwjyCFQ1OQ0zHSMNFLTx 869pdrvnrjwC6PW08iet4fvQi91vxTW0Ccll7auD5E9bejbgJTMsfbmQ31QZdjtJ8UJ8 cRIQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=u6fLRcWm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n6-20020a170902e54600b001623b7bdd65si29666086plf.335.2022.06.30.07.41.00; Thu, 30 Jun 2022 07:41:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=u6fLRcWm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236813AbiF3OJs (ORCPT + 99 others); Thu, 30 Jun 2022 10:09:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58052 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237098AbiF3OIN (ORCPT ); Thu, 30 Jun 2022 10:08:13 -0400 Received: from sin.source.kernel.org (sin.source.kernel.org [IPv6:2604:1380:40e1:4800::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D75D3599D2; Thu, 30 Jun 2022 06:55:05 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id A36E9CE2EC5; Thu, 30 Jun 2022 13:55:02 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 759F0C34115; Thu, 30 Jun 2022 13:55:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1656597300; bh=IlUuLaioXD4aLocQ1ckAcqmG2YPQSwNfIkXxiJQxQdw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u6fLRcWm4GBnMO2CkLpZEnhAJUjabHvVjXzjVBGoSDeD/nfwhO7mwIC1ETZcImTSB uioFSsHbtUqeSLntJHLpPxhUzg0UdnJ+ORkVlN3ygqbbJ+qWHkbN7UD6e5Bac11ahU VuZfHaWoQVG5Jq2U3Qsm4O2p/TzUNkCL9wTUWnV0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Greg Kroah-Hartman , Dave Chinner , "Darrick J. Wong" , Leah Rumancik Subject: [PATCH 5.15 09/28] xfs: check sb_meta_uuid for dabuf buffer recovery Date: Thu, 30 Jun 2022 15:47:05 +0200 Message-Id: <20220630133233.201165379@linuxfoundation.org> X-Mailer: git-send-email 2.37.0 In-Reply-To: <20220630133232.926711493@linuxfoundation.org> References: <20220630133232.926711493@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dave Chinner [ Upstream commit 09654ed8a18cfd45027a67d6cbca45c9ea54feab ] Got a report that a repeated crash test of a container host would eventually fail with a log recovery error preventing the system from mounting the root filesystem. It manifested as a directory leaf node corruption on writeback like so: XFS (loop0): Mounting V5 Filesystem XFS (loop0): Starting recovery (logdev: internal) XFS (loop0): Metadata corruption detected at xfs_dir3_leaf_check_int+0x99/0xf0, xfs_dir3_leaf1 block 0x12faa158 XFS (loop0): Unmount and run xfs_repair XFS (loop0): First 128 bytes of corrupted metadata buffer: 00000000: 00 00 00 00 00 00 00 00 3d f1 00 00 e1 9e d5 8b ........=....... 00000010: 00 00 00 00 12 fa a1 58 00 00 00 29 00 00 1b cc .......X...).... 00000020: 91 06 78 ff f7 7e 4a 7d 8d 53 86 f2 ac 47 a8 23 ..x..~J}.S...G.# 00000030: 00 00 00 00 17 e0 00 80 00 43 00 00 00 00 00 00 .........C...... 00000040: 00 00 00 2e 00 00 00 08 00 00 17 2e 00 00 00 0a ................ 00000050: 02 35 79 83 00 00 00 30 04 d3 b4 80 00 00 01 50 .5y....0.......P 00000060: 08 40 95 7f 00 00 02 98 08 41 fe b7 00 00 02 d4 .@.......A...... 00000070: 0d 62 ef a7 00 00 01 f2 14 50 21 41 00 00 00 0c .b.......P!A.... XFS (loop0): Corruption of in-memory data (0x8) detected at xfs_do_force_shutdown+0x1a/0x20 (fs/xfs/xfs_buf.c:1514). Shutting down. XFS (loop0): Please unmount the filesystem and rectify the problem(s) XFS (loop0): log mount/recovery failed: error -117 XFS (loop0): log mount failed Tracing indicated that we were recovering changes from a transaction at LSN 0x29/0x1c16 into a buffer that had an LSN of 0x29/0x1d57. That is, log recovery was overwriting a buffer with newer changes on disk than was in the transaction. Tracing indicated that we were hitting the "recovery immediately" case in xfs_buf_log_recovery_lsn(), and hence it was ignoring the LSN in the buffer. The code was extracting the LSN correctly, then ignoring it because the UUID in the buffer did not match the superblock UUID. The problem arises because the UUID check uses the wrong UUID - it should be checking the sb_meta_uuid, not sb_uuid. This filesystem has sb_uuid != sb_meta_uuid (which is fine), and the buffer has the correct matching sb_meta_uuid in it, it's just the code checked it against the wrong superblock uuid. The is no corruption in the filesystem, and failing to recover the buffer due to a write verifier failure means the recovery bug did not propagate the corruption to disk. Hence there is no corruption before or after this bug has manifested, the impact is limited simply to an unmountable filesystem.... This was missed back in 2015 during an audit of incorrect sb_uuid usage that resulted in commit fcfbe2c4ef42 ("xfs: log recovery needs to validate against sb_meta_uuid") that fixed the magic32 buffers to validate against sb_meta_uuid instead of sb_uuid. It missed the magicda buffers.... Fixes: ce748eaa65f2 ("xfs: create new metadata UUID field and incompat flag") Signed-off-by: Dave Chinner Reviewed-by: Darrick J. Wong Signed-off-by: Darrick J. Wong Signed-off-by: Leah Rumancik Acked-by: Darrick J. Wong Signed-off-by: Greg Kroah-Hartman --- fs/xfs/xfs_buf_item_recover.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- a/fs/xfs/xfs_buf_item_recover.c +++ b/fs/xfs/xfs_buf_item_recover.c @@ -816,7 +816,7 @@ xlog_recover_get_buf_lsn( } if (lsn != (xfs_lsn_t)-1) { - if (!uuid_equal(&mp->m_sb.sb_uuid, uuid)) + if (!uuid_equal(&mp->m_sb.sb_meta_uuid, uuid)) goto recover_immediately; return lsn; }