From patchwork Thu Dec 8 14:28:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhihao Cheng X-Patchwork-Id: 31365 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp215340wrr; Thu, 8 Dec 2022 06:08:48 -0800 (PST) X-Google-Smtp-Source: AA0mqf5pQVF0aqEkJYIytjRzgGgVDzAoY+F2BRXpxwWzTb9Hg5/ZKJRU4bQ2RxrbbT7V9i0IjhMy X-Received: by 2002:a62:ee0f:0:b0:56c:8dbc:f83e with SMTP id e15-20020a62ee0f000000b0056c8dbcf83emr76024935pfi.41.1670508528362; Thu, 08 Dec 2022 06:08:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670508528; cv=none; d=google.com; s=arc-20160816; b=bL0/ssVW742M1qdKr1XUlY0k5xgE2GHL/0Y0QpHUTvg7C6jdAB961pvyjPmj8Dy0MP su71L61k6FPFsQACQHARO6viBxZWIS0LtaflEuN/QQj5i85inQK3AalFbTwz50wx50xo W3z5aR1wGbQGjlrWx4n9LqzUimdlHZKiSUkVC+YicNQBlXOWVxF65MdwYmTMumdQJsNq EOWjowhvdHFncLm2Kec3VOhFdXeONk3/hX9PRY7yLLt0kQuw2ChR8/6gDl+wMFWn8e7i +Ev8ZX8jiiryWTe3kAYdwWm5Y37nvegwnanTVS8pdzft2lMV7oM6HdAy5lTWV8adkra8 CWrA== 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 :message-id:date:subject:cc:to:from; bh=KS7G6PnDBKn3xIaKoNPOMB/NNZ7woVEyi+XRWkf9US8=; b=k/aMyNZRGsDWD+dDdBthlndUBSV2+HovEJe6Tp9yHMGwcOvj2nIQywmNROpd21NW8C blaygpCrsIdtUAv0oywBsnbUVZYeejdP+JXGEPwUbYx6DHLFTS3NksaveM5sf7FbEVGp jDRemvDrtfqMFSrFoAnm3Z5FgIJaTpfKjFa5wkF++8QaeW3cIMEZJC5m0b0MEfn9W/VW HnghamxZxMaApXVxGauKfKzCtP0V7UbFq24Uei6XIeY2dughdn/8mtPI/hdHxxjjyrGB s9YXaRgxirlVhglvc+liodOKETRSswBMSdhD42H49ea075IaSeLITz60LnX++oyumPz1 Za+A== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id me15-20020a17090b17cf00b002134d2f9848si4943596pjb.9.2022.12.08.06.08.03; Thu, 08 Dec 2022 06:08:48 -0800 (PST) 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; 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=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229684AbiLHOHV (ORCPT + 99 others); Thu, 8 Dec 2022 09:07:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42248 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229602AbiLHOHQ (ORCPT ); Thu, 8 Dec 2022 09:07:16 -0500 Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D34B3F018 for ; Thu, 8 Dec 2022 06:07:14 -0800 (PST) Received: from kwepemm600013.china.huawei.com (unknown [172.30.72.54]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4NSbV36Xm6zJpCN; Thu, 8 Dec 2022 22:03:39 +0800 (CST) Received: from huawei.com (10.175.127.227) by kwepemm600013.china.huawei.com (7.193.23.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Thu, 8 Dec 2022 22:07:11 +0800 From: Zhihao Cheng To: , , , , CC: , , , Subject: [dm-devel][PATCH -next] dm thin: Use last transaction's pmd->root when commit failed Date: Thu, 8 Dec 2022 22:28:02 +0800 Message-ID: <20221208142802.1479048-1-chengzhihao1@huawei.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-Originating-IP: [10.175.127.227] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To kwepemm600013.china.huawei.com (7.193.23.68) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1751655150834343846?= X-GMAIL-MSGID: =?utf-8?q?1751655150834343846?= Recently we found a softlock up problem in dm thin pool looking up btree caused by corrupted metadata: Kernel panic - not syncing: softlockup: hung tasks CPU: 7 PID: 2669225 Comm: kworker/u16:3 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) Workqueue: dm-thin do_worker [dm_thin_pool] Call Trace: dump_stack+0x9c/0xd3 panic+0x35d/0x6b9 watchdog_timer_fn.cold+0x16/0x25 __run_hrtimer+0xa2/0x2d0 RIP: 0010:__relink_lru+0x102/0x220 [dm_bufio] __bufio_new+0x11f/0x4f0 [dm_bufio] new_read+0xa3/0x1e0 [dm_bufio] dm_bm_read_lock+0x33/0xd0 [dm_persistent_data] ro_step+0x63/0x100 [dm_persistent_data] btree_lookup_raw.constprop.0+0x44/0x220 [dm_persistent_data] dm_btree_lookup+0x16f/0x210 [dm_persistent_data] dm_thin_find_block+0x12c/0x210 [dm_thin_pool] __process_bio_read_only+0xc5/0x400 [dm_thin_pool] process_thin_deferred_bios+0x1a4/0x4a0 [dm_thin_pool] process_one_work+0x3c5/0x730 Following process may generate a broken btree mixed with fresh and stale nodes, which could let dm thin trapped into an infinite loop while looking up data block: Transaction 1: pmd->root = A, A->B->C // One path in btree pmd->root = X, X->Y->Z // Copy-up Transaction 2: X,Z is updated on disk, Y is written failed. // Commit failed, dm thin becomes read-only. process_bio_read_only dm_thin_find_block __find_block dm_btree_lookup(pmd->root) The pmd->root points to a broken btree, Y may contain stale node pointing to any block, for example X, which lets dm thin trapped into a dead loop while looking up Z. Fix it by setting pmd->root in __open_metadata(), so that dm thin will use last transaction's pmd->root if commit failed. Fetch a reproducer in [Link]. Linke: https://bugzilla.kernel.org/show_bug.cgi?id=216790 Fixes: 991d9fa02da0 ("dm: add thin provisioning target") Signed-off-by: Zhihao Cheng --- drivers/md/dm-thin-metadata.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index 1a62226ac34e..26c42ee183ed 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c @@ -724,6 +724,15 @@ static int __open_metadata(struct dm_pool_metadata *pmd) goto bad_cleanup_data_sm; } + /* + * For pool metadata opening process, root setting is redundant + * because it will be set again in __begin_transaction(). But dm + * pool aborting process really needs to get last transaction's + * root in case accessing broken btree. + */ + pmd->root = le64_to_cpu(disk_super->data_mapping_root); + pmd->details_root = le64_to_cpu(disk_super->device_details_root); + __setup_btree_details(pmd); dm_bm_unlock(sblock);