From patchwork Fri Oct 16 15:29:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11841919 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=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,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 F2B65C433E7 for ; Fri, 16 Oct 2020 15:29:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 94A64207C4 for ; Fri, 16 Oct 2020 15:29:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="BxOK23nf" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2408084AbgJPP30 (ORCPT ); Fri, 16 Oct 2020 11:29:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35394 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2407581AbgJPP30 (ORCPT ); Fri, 16 Oct 2020 11:29:26 -0400 Received: from mail-qk1-x742.google.com (mail-qk1-x742.google.com [IPv6:2607:f8b0:4864:20::742]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1A103C061755 for ; Fri, 16 Oct 2020 08:29:25 -0700 (PDT) Received: by mail-qk1-x742.google.com with SMTP id c2so2208331qkf.10 for ; Fri, 16 Oct 2020 08:29:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=LSEkm8l0uk4G5NH+FdJxG9QmpxzL0u4w35EHq1RNxq4=; b=BxOK23nfeXNqtO1+9bulz46MV7nyIKHapSoFRWx9/kUsCS1n9dW7m/LKI19LGIzAud tN02ycE4zqT+r65UNCpBMBraUeSjzCV5bF3NQF1U+Qkvqay8ROVhh1esoWGQql+bs9p0 BoSQ4wc4NFktgviiIu8gVdh02i8JKm2JblISKQJS1dcnho1Ydur00v6AgzeFj7tDAoZJ VmiWgOyBNF6CwDsJt/7uVHf4oufFTAcEJIbKiMgSv3PbqeGMhMvitZW+Ct/s05l34h8P CtlA0n4QgS922RFRA/LrGn8fIE/x6akInSzyO2t//L8LCJgaF35KD3xtypM7rIJGTNeG QmGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=LSEkm8l0uk4G5NH+FdJxG9QmpxzL0u4w35EHq1RNxq4=; b=HRSph8mdZ7rWKMWE2IUDGsGzQ+U7se0jlYUv0e3bDuASZtaYVMABK6ZbGkHILcOPlV zailE4zPNczW/2CWTuaF28U/KxaPExYr/0dXQjhCehoEWJ2pYQ+eu1cOj+4/uuYYd0PI gcUr06ty7cZXZq9BUoap1RFOKtkHR3Ks3qCBnL0Vp6oM5atzt1cWNByAe85/Tkw5SkUW REAdaESdJ/eCYbdmPAsGnsuDxByiGnHRHfr9k7OGU37V5AAiVEaCuyYC+o5mtmDyVovE a0AKpiRENwVmDRNFBo7SllLI0yreU4E5bK6x9IswoL1SyV7i4URpIW4/vYqykEuNW03k Jvfw== X-Gm-Message-State: AOAM531RP1BARR3J3stRUCXZudEAAG/rRNUf1mO345Ay0iZdv3YhgqZH GW8awzuuAVzY/8EgmE3JVRUm3HZkih5gVbpW X-Google-Smtp-Source: ABdhPJyy20bAx+GafiJ03sZOwjh9lkqrTv8GkecmPhBKKMtiHmKQYiPJotshJ9MkfljoEXJ0Xwn5Cg== X-Received: by 2002:a05:620a:ed1:: with SMTP id x17mr4364909qkm.322.1602862163549; Fri, 16 Oct 2020 08:29:23 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id f187sm983870qke.60.2020.10.16.08.29.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Oct 2020 08:29:22 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Cc: Johannes Thumshirn , Qu Wenruo Subject: [PATCH v4 1/8] btrfs: unify the ro checking for mount options Date: Fri, 16 Oct 2020 11:29:13 -0400 Message-Id: <4e8692bf3f8e37824710e91a8a13f3ea20b3cdcc.1602862052.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We're going to be adding more options that require RDONLY, so add a helper to do the check and error out if we don't have RDONLY set. Reviewed-by: Johannes Thumshirn Reviewed-by: Qu Wenruo Signed-off-by: Josef Bacik --- fs/btrfs/super.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 8840a4fa81eb..f99e89ec46b2 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -458,6 +458,17 @@ static const match_table_t rescue_tokens = { {Opt_err, NULL}, }; +static bool check_ro_option(struct btrfs_fs_info *fs_info, unsigned long opt, + const char *opt_name) +{ + if (fs_info->mount_opt & opt) { + btrfs_err(fs_info, "%s must be used with ro mount option", + opt_name); + return true; + } + return false; +} + static int parse_rescue_options(struct btrfs_fs_info *info, const char *options) { char *opts; @@ -968,14 +979,12 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options, } } check: - /* - * Extra check for current option against current flag - */ - if (btrfs_test_opt(info, NOLOGREPLAY) && !(new_flags & SB_RDONLY)) { - btrfs_err(info, - "nologreplay must be used with ro mount option"); + /* We're read-only, don't have to check. */ + if (new_flags & SB_RDONLY) + goto out; + + if (check_ro_option(info, BTRFS_MOUNT_NOLOGREPLAY, "nologreplay")) ret = -EINVAL; - } out: if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE) && !btrfs_test_opt(info, FREE_SPACE_TREE) && From patchwork Fri Oct 16 15:29:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11841931 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=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,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 311C0C43457 for ; Fri, 16 Oct 2020 15:29:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D5DC3207C4 for ; Fri, 16 Oct 2020 15:29:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="yg6+/yGF" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2410104AbgJPP32 (ORCPT ); Fri, 16 Oct 2020 11:29:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2407581AbgJPP30 (ORCPT ); Fri, 16 Oct 2020 11:29:26 -0400 Received: from mail-qk1-x743.google.com (mail-qk1-x743.google.com [IPv6:2607:f8b0:4864:20::743]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D04DFC061755 for ; Fri, 16 Oct 2020 08:29:26 -0700 (PDT) Received: by mail-qk1-x743.google.com with SMTP id k9so2224907qki.6 for ; Fri, 16 Oct 2020 08:29:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=zeaV1DHKYkprUTioJ5r5xvlxV0lCO7Hfg6R1ere1s7Q=; b=yg6+/yGF/1LVojo28i/MPMz1CKka8xCLjaB578FUp1mlcQaLuPlcPT0YWsZ3FeBbnW sIltPsz5KsSrDzdRKEN5HHDXSNKL2bjC9Ohc8ZiUekd4PZJ/rvva4x3YC2QdWbAytPUK 9GHXG5d6JO2pTH8uxscsQSgkiX73c6Tq08OaussvUD46kpg79jHkHpJFfeUOM4n7V1eE kXfujXP71DRWtBadzX/vN5lQpxQ+J2D5j48dA9NxelNBP4pGIHuYKlogg2NnNh+7EWeY gnAYwSLNj335vrcQd26DwmKQEUe4vgcUYqxfEeHQefhjlSu077jpzA3K0vBWmcBoPIXd O/MQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zeaV1DHKYkprUTioJ5r5xvlxV0lCO7Hfg6R1ere1s7Q=; b=I53lhCgbqTcSAOrUJcSnANo/x8dC8oMJ7g3MxzJg5UTbmLtPQSmXZ29032AOJCP6I1 c1yZCBaT1YE0aK1b078zBs201+lNQWtHnik6Lyi8EVYJ+F4ai7XGWXJIygUjZNXTIfac hHiYy0+Ls5B9LUry+MTO6YaR56acvbJMZETPbLEgsM3xvWXgBgK92UorAdcg8uBBOvyy fkcAa8xxygTc7NLGscMPJJwoea4Sq2o47DmQ7fPDkESP7WrAITzP4wxizxzbJi4MgLN6 SYQuzzYpqbLf5ZVCUFNEiTp2jKEBbgwI0UsuPNOAQq8vGik/pXTp7bFjImDxNGICuKeY REqg== X-Gm-Message-State: AOAM533E/2Vm4hVEDfUwKREdS+M0mBeX6y+lvaa2s/yI5K0cpBqSxQnI Gx7Vhzgh1TazqwUp6vWYLt2LoC01lUtu2g1M X-Google-Smtp-Source: ABdhPJwHV0ZLj8J93pQwT90nEohQKs2Eeo6qlbicuVKXpNkDPKrvCoDEDw/IlVv7FAq9ZVeXxk9nqQ== X-Received: by 2002:ae9:edc2:: with SMTP id c185mr4556707qkg.65.1602862165633; Fri, 16 Oct 2020 08:29:25 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id p136sm981487qke.25.2020.10.16.08.29.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Oct 2020 08:29:24 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Cc: Johannes Thumshirn , Qu Wenruo Subject: [PATCH v4 2/8] btrfs: push the NODATASUM check into btrfs_lookup_bio_sums Date: Fri, 16 Oct 2020 11:29:14 -0400 Message-Id: <22b630722cf136979cb91b6f233568979ca6e75a.1602862052.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When we move to being able to handle NULL csum_roots it'll be cleaner to just check in btrfs_lookup_bio_sums instead of at all of the caller locations, so push the NODATASUM check into it as well so it's unified. Reviewed-by: Johannes Thumshirn Reviewed-by: Qu Wenruo Signed-off-by: Josef Bacik --- fs/btrfs/compression.c | 14 +++++--------- fs/btrfs/file-item.c | 3 +++ fs/btrfs/inode.c | 12 +++++++++--- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index eeface30facd..7e1eb57b923c 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -722,11 +722,9 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, */ refcount_inc(&cb->pending_bios); - if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { - ret = btrfs_lookup_bio_sums(inode, comp_bio, - (u64)-1, sums); - BUG_ON(ret); /* -ENOMEM */ - } + ret = btrfs_lookup_bio_sums(inode, comp_bio, (u64)-1, + sums); + BUG_ON(ret); /* -ENOMEM */ nr_sectors = DIV_ROUND_UP(comp_bio->bi_iter.bi_size, fs_info->sectorsize); @@ -751,10 +749,8 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, ret = btrfs_bio_wq_end_io(fs_info, comp_bio, BTRFS_WQ_ENDIO_DATA); BUG_ON(ret); /* -ENOMEM */ - if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { - ret = btrfs_lookup_bio_sums(inode, comp_bio, (u64)-1, sums); - BUG_ON(ret); /* -ENOMEM */ - } + ret = btrfs_lookup_bio_sums(inode, comp_bio, (u64)-1, sums); + BUG_ON(ret); /* -ENOMEM */ ret = btrfs_map_bio(fs_info, comp_bio, mirror_num); if (ret) { diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 8f4f2bd6d9b9..8083d71d6af6 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -272,6 +272,9 @@ blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio, int count = 0; u16 csum_size = btrfs_super_csum_size(fs_info->super_copy); + if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) + return BLK_STS_OK; + path = btrfs_alloc_path(); if (!path) return BLK_STS_RESOURCE; diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index da58c58ef9aa..de69bef92c9a 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2202,7 +2202,12 @@ blk_status_t btrfs_submit_data_bio(struct inode *inode, struct bio *bio, mirror_num, bio_flags); goto out; - } else if (!skip_sum) { + } else { + /* + * Lookup bio sums does extra checks around whether we + * need to csum or not, which is why we ignore skip_sum + * here. + */ ret = btrfs_lookup_bio_sums(inode, bio, (u64)-1, NULL); if (ret) goto out; @@ -7778,7 +7783,6 @@ static blk_qc_t btrfs_submit_direct(struct inode *inode, struct iomap *iomap, struct bio *dio_bio, loff_t file_offset) { const bool write = (bio_op(dio_bio) == REQ_OP_WRITE); - const bool csum = !(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM); struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); const bool raid56 = (btrfs_data_alloc_profile(fs_info) & BTRFS_BLOCK_GROUP_RAID56_MASK); @@ -7805,10 +7809,12 @@ static blk_qc_t btrfs_submit_direct(struct inode *inode, struct iomap *iomap, return BLK_QC_T_NONE; } - if (!write && csum) { + if (!write) { /* * Load the csums up front to reduce csum tree searches and * contention when submitting bios. + * + * If we have csums disabled this will do nothing. */ status = btrfs_lookup_bio_sums(inode, dio_bio, file_offset, dip->csums); From patchwork Fri Oct 16 15:29:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11841923 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=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,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 DBB2CC433DF for ; Fri, 16 Oct 2020 15:29:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7DF08207C4 for ; Fri, 16 Oct 2020 15:29:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="QAF9Jd9I" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2410107AbgJPP33 (ORCPT ); Fri, 16 Oct 2020 11:29:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35408 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2407581AbgJPP33 (ORCPT ); Fri, 16 Oct 2020 11:29:29 -0400 Received: from mail-qk1-x741.google.com (mail-qk1-x741.google.com [IPv6:2607:f8b0:4864:20::741]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E2A23C061755 for ; Fri, 16 Oct 2020 08:29:28 -0700 (PDT) Received: by mail-qk1-x741.google.com with SMTP id a23so2189048qkg.13 for ; Fri, 16 Oct 2020 08:29:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=izFhU7y9bRtQlue4F9fNXBKfqx5axdLtCILmMRY3Qkk=; b=QAF9Jd9I3u0Z5FjAcUZA+/zk+0IviBgtOEJUVP6zV0evnY3QEdXH7NwgBHtWrhUQ01 HdLDTJFvAz3RB0T9kUVWo+t6T5npWSiFwSr1zuOb1wNCoyGs1HU8wWQHRec1+LvP2/FY kaerIhioapn2ufQaOWFO2TfQI9pBhwuIV6UlK4E9m/XArLJQdsDZF/sDT6HjHCBbFN3W mtxaDGnPozYT4c7NtxmrqDPuotlCr39WDPcX8DCL5XD1+NPEfq9MTyE8Zw2+VixHIM8u 9YghjEzfdUvFy4r2Y2IFDc/+6xWxBj1JzAdL6S6Ta5vDYXjBtfC7X7y0ZXsdBbRq5G0K affA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=izFhU7y9bRtQlue4F9fNXBKfqx5axdLtCILmMRY3Qkk=; b=ou8OFAaq4oVX9aqyMq93v0889gRyA2xzX8DRuDu4wgY22e7kmEboVTdzFOULEMQsba mVNdpzBudSsRFkxiBnSHIMPxrLIta4EF0mjpV7cF3B3q8IHAfDyrU1OH0DPYnDYlwrg0 Lu76/cdQ/BOBIsF9j9BtEwC6TMOqSePMFwqHN4+0y+pgs8uVEEQQw2q7pXpvBorT3Z+u X7IvhlOEy73M6bV2Mp6MPYfKXWK//0p19f6iD1b3rP2uaHF0+yesrDTqmLPoyGSUyim0 gg1GMQkMe477I4iYIYkHcIwqhfsmwuRukMOzBJtM8rkkp31m5lyEZGGWbguHELug8Vn1 rwWA== X-Gm-Message-State: AOAM533GMGhZR5mPCxajM6BzvntusaaxEP8QRmlyG+wyC1UdYOaTWHHf 7Nu0u/O9B8RHwMzlt8Ez6oOd0ZD9y3OLGclI X-Google-Smtp-Source: ABdhPJyEJSxLaFb++64fpVcCuIQRb3ASbbeRFmzzt1SJeDe3P5h91DzDl7dNxe+e08tMLiX9AUk/ZQ== X-Received: by 2002:a37:9a46:: with SMTP id c67mr4372499qke.292.1602862167759; Fri, 16 Oct 2020 08:29:27 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id 184sm984039qkl.34.2020.10.16.08.29.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Oct 2020 08:29:27 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Cc: Johannes Thumshirn Subject: [PATCH v4 3/8] btrfs: add a supported_rescue_options file to sysfs Date: Fri, 16 Oct 2020 11:29:15 -0400 Message-Id: X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We're going to be adding a variety of different rescue options, we should advertise which ones we support to make user spaces life easier in the future. Reviewed-by: Johannes Thumshirn Signed-off-by: Josef Bacik --- fs/btrfs/sysfs.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 8424f5d0e5ed..8f0462d6855d 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -329,10 +329,32 @@ static ssize_t send_stream_version_show(struct kobject *kobj, } BTRFS_ATTR(static_feature, send_stream_version, send_stream_version_show); +static const char *rescue_opts[] = { + "usebackuproot", + "nologreplay", +}; + +static ssize_t supported_rescue_options_show(struct kobject *kobj, + struct kobj_attribute *a, + char *buf) +{ + ssize_t ret = 0; + int i; + + for (i = 0; i < ARRAY_SIZE(rescue_opts); i++) + ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%s", + (i ? " " : ""), rescue_opts[i]); + ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n"); + return ret; +} +BTRFS_ATTR(static_feature, supported_rescue_options, + supported_rescue_options_show); + static struct attribute *btrfs_supported_static_feature_attrs[] = { BTRFS_ATTR_PTR(static_feature, rmdir_subvol), BTRFS_ATTR_PTR(static_feature, supported_checksums), BTRFS_ATTR_PTR(static_feature, send_stream_version), + BTRFS_ATTR_PTR(static_feature, supported_rescue_options), NULL }; From patchwork Fri Oct 16 15:29:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11841929 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=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,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 CBFDCC43457 for ; Fri, 16 Oct 2020 15:29:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 64E15207C4 for ; Fri, 16 Oct 2020 15:29:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="V+dwo/PZ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2410109AbgJPP3b (ORCPT ); Fri, 16 Oct 2020 11:29:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35410 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2407477AbgJPP3a (ORCPT ); Fri, 16 Oct 2020 11:29:30 -0400 Received: from mail-qk1-x742.google.com (mail-qk1-x742.google.com [IPv6:2607:f8b0:4864:20::742]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D14D6C061755 for ; Fri, 16 Oct 2020 08:29:30 -0700 (PDT) Received: by mail-qk1-x742.google.com with SMTP id i22so2216702qkn.9 for ; Fri, 16 Oct 2020 08:29:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=0MSsz6C6/qJTpq+PhQqbvsOarnY1YcBhqdx9TT4q8z0=; b=V+dwo/PZpm1jkddagfWykzS2cz5Z1kBHcbs/4wAKU+KdUSxIYEw+RscZVbU1IB0FLK YXfHIgqGzATQu8VZN9qUkTgJtnucnIhS7WwONQvf6fkd8uZk/Xw4QEqYk/WjmRIP21fE XHDP+pM2f1thBinjTDZF0Cicel72S1cypp1A2devp+CY6689ICvnVN4OV5JkIEED7jmC gMi0o9qhSdvhSyODEm/8/P/U1jn5PnbQZ64msc+O4dXYLiZp8PiP54Dxr3P9hPtYEUAe Gs3kaOIQdXBsD7UgnzcZxgPJh0kroWvYBUQQjyExGllhDEe0CGdP4GxLAE34wSsgOs12 nWvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0MSsz6C6/qJTpq+PhQqbvsOarnY1YcBhqdx9TT4q8z0=; b=MlvcCzkjksyPUMJL3Wi3I2FZYTxwBZM5m42huw0QAq4Ri+2DcRAxkgxPJsnxy9ctuX 3gzrT2Wkf55Mb9DAOdKsAuJxzImKAaKnWqo1vAQdjAJfWScYtDHM0eOJkT8s0dOyljTJ 6oddBhErPqZuQ9CRE9ltCcct5a+o8wvBJSKTiK/ixAy0lr/dwVlzy9e/EQcd9gtIwXZD kZ8+eNs+c46P6cfd9aJO+HdF916XCcmSjve3oI4KvGWm8kOgz1a93rgfMasUAvsQVf4a ZQXVjoxip/LK2TpYnla7GT+AYExIlJsPUdCRoUZAotYBdwyXhO9ClT0MFQ2s+qG1UFKz ha5w== X-Gm-Message-State: AOAM532gcGIwSxtYQLTba/7QKcFmIi8Cbv3brGcA2qY3ITIL5TGg3bV1 kAAKVNHO7IAwR5AwZ41PHz8B8w9ajfilEP2C X-Google-Smtp-Source: ABdhPJzz08VY2hpzCAfYY7vxTIeSznmNdG3bD0NlrJ0xuxFXTF7QRiw2Z1aktldUchJlITr5B4PwhA== X-Received: by 2002:ae9:ec0a:: with SMTP id h10mr4476136qkg.102.1602862169520; Fri, 16 Oct 2020 08:29:29 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id l125sm998463qke.23.2020.10.16.08.29.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Oct 2020 08:29:28 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v4 4/8] btrfs: add a helper to print out rescue= options Date: Fri, 16 Oct 2020 11:29:16 -0400 Message-Id: <4d3297668dd9ab26681b5632232fb1f6eb00cb73.1602862052.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We're going to have a lot of rescue options, add a helper to collapse the /proc/mounts output to rescue=option1:option2:option3 format. Signed-off-by: Josef Bacik Reviewed-by: Johannes Thumshirn --- fs/btrfs/super.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index f99e89ec46b2..f41f7af27ff7 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -1392,11 +1392,19 @@ int btrfs_sync_fs(struct super_block *sb, int wait) return btrfs_commit_transaction(trans); } +static void print_rescue_option(struct seq_file *seq, const char *s, + bool *printed) +{ + seq_printf(seq, "%s%s", (*printed) ? ":" : ",rescue=", s); + *printed = true; +} + static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) { struct btrfs_fs_info *info = btrfs_sb(dentry->d_sb); const char *compress_type; const char *subvol_name; + bool printed = false; if (btrfs_test_opt(info, DEGRADED)) seq_puts(seq, ",degraded"); @@ -1429,7 +1437,7 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) if (btrfs_test_opt(info, NOTREELOG)) seq_puts(seq, ",notreelog"); if (btrfs_test_opt(info, NOLOGREPLAY)) - seq_puts(seq, ",rescue=nologreplay"); + print_rescue_option(seq, "nologreplay", &printed); if (btrfs_test_opt(info, FLUSHONCOMMIT)) seq_puts(seq, ",flushoncommit"); if (btrfs_test_opt(info, DISCARD_SYNC)) From patchwork Fri Oct 16 15:29:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11841925 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=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,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 810FAC433DF for ; Fri, 16 Oct 2020 15:29:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 186F5207C4 for ; Fri, 16 Oct 2020 15:29:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="gd06BLzR" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2410112AbgJPP3d (ORCPT ); Fri, 16 Oct 2020 11:29:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35418 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2407477AbgJPP3c (ORCPT ); Fri, 16 Oct 2020 11:29:32 -0400 Received: from mail-qt1-x844.google.com (mail-qt1-x844.google.com [IPv6:2607:f8b0:4864:20::844]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86F4DC061755 for ; Fri, 16 Oct 2020 08:29:32 -0700 (PDT) Received: by mail-qt1-x844.google.com with SMTP id e6so1819132qtw.10 for ; Fri, 16 Oct 2020 08:29:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Yx9otvDd5onkeTvAXlblsQFo6BfxZq/uyXmsV0srymM=; b=gd06BLzRX9qG66VRM7VOVUOYVQhEf7vFhSPG4O+dwfbL40/nME8lSaypu1fESmxlBj 395yevBuh+I64OmR43Y1uab2sk/o6RScD6wWwd6vTbfmxdvVXn6V71d4ramh7qNq3XJV OI34a1Uns6Yt2/fSwc3jTKu/aruUsa9QDsIpqi6/R2wJqT4xayNepDl7dj77eUv+KUA8 4bcQLi7VsfsnVcyDu+0sNCDmgRlGa3UqoMtBykETVXqhrEzZyJ5IBX/m+FVrkQSnu6Fq T6ZKkn2kApimGcwQbEGpZywUive2okzNt9GUiBCYmymLjNvF5QdKTFRW+iJby3+PBiw1 FgXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Yx9otvDd5onkeTvAXlblsQFo6BfxZq/uyXmsV0srymM=; b=Ycre7Fjm10qGlUNw0tQ8FJWM7RVvgJNSV28nNtRkRYeNyD+8mkXIjjR1/NuMxjPl39 1943o4LbiKOA3ztbZB8OBOg1SH+55ayJlVs6ZkfMOhMXJkN7hDCzkW2mtGWHavqPSdP6 q5rVr8Y3FOf+afdCGDaeMmIRVYHGlEu55sKCevuvX7qrYLtoLKSGzIl/+rP7Tli81e1b 6/7hVr7FyuCcBXDFsffga4rqgFbIKQ48kMHKphEBFL2MqQc2ZLUadVWAfoC7LwXlxAsq MYm64w/zF4/nwHEJsVQBj/FvWjJ+QhXIZL2yStTMqSNISL1Djb0o7/lFyvOdzfOu8waZ iHyA== X-Gm-Message-State: AOAM533p96ED+lvgJwjn0P+EfgXZ1s3FT429NBd+e7vHCHuF2B7YXRBM enTJqy+0Cqa2ZUWpI0sWp4fVh23LDmKfWCzD X-Google-Smtp-Source: ABdhPJxxvubOMo5eXfL79N1Bd8ghTVcbCu03N+RxJe1IwUOs8VyW0L+Fuoxyp3gvwzFQkCD6lxt3Dg== X-Received: by 2002:ac8:4791:: with SMTP id k17mr3995990qtq.264.1602862171203; Fri, 16 Oct 2020 08:29:31 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id m6sm968201qki.112.2020.10.16.08.29.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Oct 2020 08:29:30 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v4 5/8] btrfs: show rescue=usebackuproot in /proc/mounts Date: Fri, 16 Oct 2020 11:29:17 -0400 Message-Id: <007ef6e4d542210148bc373d3a432d801e83019e.1602862052.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This got missed somehow, so add it in. Signed-off-by: Josef Bacik Reviewed-by: Johannes Thumshirn --- fs/btrfs/super.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index f41f7af27ff7..ca270649fe10 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -1438,6 +1438,8 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) seq_puts(seq, ",notreelog"); if (btrfs_test_opt(info, NOLOGREPLAY)) print_rescue_option(seq, "nologreplay", &printed); + if (btrfs_test_opt(info, USEBACKUPROOT)) + print_rescue_option(seq, "usebackuproot", &printed); if (btrfs_test_opt(info, FLUSHONCOMMIT)) seq_puts(seq, ",flushoncommit"); if (btrfs_test_opt(info, DISCARD_SYNC)) From patchwork Fri Oct 16 15:29:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11841921 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=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,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 5BE9EC43457 for ; Fri, 16 Oct 2020 15:29:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EAA0A207C4 for ; Fri, 16 Oct 2020 15:29:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="E1DFesgn" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2410115AbgJPP3f (ORCPT ); Fri, 16 Oct 2020 11:29:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35424 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2407477AbgJPP3e (ORCPT ); Fri, 16 Oct 2020 11:29:34 -0400 Received: from mail-qk1-x744.google.com (mail-qk1-x744.google.com [IPv6:2607:f8b0:4864:20::744]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6E5F9C061755 for ; Fri, 16 Oct 2020 08:29:34 -0700 (PDT) Received: by mail-qk1-x744.google.com with SMTP id c2so2208729qkf.10 for ; Fri, 16 Oct 2020 08:29:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=OGpFhusWWzXsE36CfNn5Km0r75QjQrHg5FEvD3UfkGc=; b=E1DFesgnTGEhTePw3lTD0LslQ0SHCNu/RtbqLEb5eheziQ36eABWUQxrVIPfxEGUPT uIIW/1WVNYfNlgJsNOtQhef+d7u/C0NasUvZOHSQcbyiXzNIYbJavqPhvmo2jNLufIA1 K6XSqUHGknQnL2l6MILn1nn/1rWEspxq7vTflTDQn0oUZ8aP+2sUK/c5NqSxboi9Xkxn 87Oaqzse00DPGOaDkKHVl06UL3uYaEp2wOQaNDjZgcvOdM+q8x04AmLvdggCDhqQHDdA oM4V5VY653TC8j02FqttZdRr9Bo3Ah4uX7Bun+4DzrLYqHRhrjX/0UBBVZx0noItZ3F+ aHCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=OGpFhusWWzXsE36CfNn5Km0r75QjQrHg5FEvD3UfkGc=; b=n8LmKyN4qCY78HcAhs0D4FZRRmRqKY+Qzb52viOUnb+f8MhAHX8SOreBTESgyJuEZE EA5ku03sAJ1vJMA27A9cUdadTmLxZpy8g8jdqbxI3LKhdFB79kNPfnnYbFrXsVByfiy8 siNHs8c0CRIONOv0xeF13K4eAFhCIJ9dDjRCSXKIyZAEeRSkY1Uvf4D3PRgYV1tkil/K pPRrdw1ACE8PM1lSdeTXvBRV3ye7bBL82l+SOv8brmmEwDqXzK8/8sbNuJICU1XYEgMM /0r2EqivLwmXLHZakgAlmG7SOimxaY/mgHIrYeK+PPpJhnm/ziSdSdLS0A/32H09WlKH 0TgA== X-Gm-Message-State: AOAM530QknxmxsGwLS4C9n8o8NQEQtSDtlW8pPiJf/M18DFjTE5vbayK A+Ud6wgJj1xZZuoDAuWk1xFI4CLdLbk2XgX0 X-Google-Smtp-Source: ABdhPJwix+HzB0lYMjzZob38PZOOU2ikys8NMJTLXI7nsi1VwsNmy5EvmaWJ+3Q0WIecJ4alKc4DRA== X-Received: by 2002:a37:88c:: with SMTP id 134mr4334553qki.17.1602862173037; Fri, 16 Oct 2020 08:29:33 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id j16sm986960qkg.26.2020.10.16.08.29.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Oct 2020 08:29:32 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v4 6/8] btrfs: introduce rescue=ignorebadroots Date: Fri, 16 Oct 2020 11:29:18 -0400 Message-Id: X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org In the face of extent root corruption, or any other core fs wide root corruption we will fail to mount the file system. This makes recovery kind of a pain, because you need to fall back to userspace tools to scrape off data. Instead provide a mechanism to gracefully handle bad roots, so we can at least mount read-only and possibly recover data from the file system. Signed-off-by: Josef Bacik --- fs/btrfs/block-group.c | 48 +++++++++++++++++++++++++++++++ fs/btrfs/block-rsv.c | 8 ++++++ fs/btrfs/compression.c | 3 +- fs/btrfs/ctree.h | 1 + fs/btrfs/disk-io.c | 65 ++++++++++++++++++++++++++---------------- fs/btrfs/file-item.c | 3 +- fs/btrfs/inode.c | 6 +++- fs/btrfs/super.c | 12 +++++++- fs/btrfs/sysfs.c | 1 + fs/btrfs/volumes.c | 13 +++++++++ 10 files changed, 132 insertions(+), 28 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 3ba6f3839d39..faf98571d746 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1985,6 +1985,51 @@ static int read_one_block_group(struct btrfs_fs_info *info, return ret; } +static int fill_dummy_bgs(struct btrfs_fs_info *fs_info) +{ + struct extent_map_tree *em_tree = &fs_info->mapping_tree; + struct extent_map *em; + struct map_lookup *map; + struct btrfs_block_group *bg; + struct btrfs_space_info *space_info; + struct rb_node *node; + int ret = 0; + + for (node = rb_first_cached(&em_tree->map); node; + node = rb_next(node)) { + em = rb_entry(node, struct extent_map, rb_node); + map = em->map_lookup; + bg = btrfs_create_block_group_cache(fs_info, em->start); + if (!bg) { + ret = -ENOMEM; + break; + } + + /* Fill dummy cache as FULL */ + bg->length = em->len; + bg->flags = map->type; + bg->last_byte_to_unpin = (u64)-1; + bg->cached = BTRFS_CACHE_FINISHED; + bg->used = em->len; + bg->flags = map->type; + ret = btrfs_add_block_group_cache(fs_info, bg); + if (ret) { + btrfs_remove_free_space_cache(bg); + btrfs_put_block_group(bg); + break; + } + btrfs_update_space_info(fs_info, bg->flags, em->len, em->len, + 0, &space_info); + bg->space_info = space_info; + link_block_group(bg); + + set_avail_alloc_bits(fs_info, bg->flags); + } + if (!ret) + btrfs_init_global_block_rsv(fs_info); + return ret; +} + int btrfs_read_block_groups(struct btrfs_fs_info *info) { struct btrfs_path *path; @@ -1995,6 +2040,9 @@ int btrfs_read_block_groups(struct btrfs_fs_info *info) int need_clear = 0; u64 cache_gen; + if (!info->extent_root) + return fill_dummy_bgs(info); + key.objectid = 0; key.offset = 0; key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; diff --git a/fs/btrfs/block-rsv.c b/fs/btrfs/block-rsv.c index 7e1549a84fcc..58b38912498d 100644 --- a/fs/btrfs/block-rsv.c +++ b/fs/btrfs/block-rsv.c @@ -426,6 +426,14 @@ void btrfs_init_global_block_rsv(struct btrfs_fs_info *fs_info) fs_info->delayed_block_rsv.space_info = space_info; fs_info->delayed_refs_rsv.space_info = space_info; + /* + * Our various recovery options can leave us with NULL roots, so check + * here and just bail before we go deref'ing NULLS everywhere. + */ + if (!fs_info->extent_root || !fs_info->csum_root || + !fs_info->dev_root || !fs_info->chunk_root || !fs_info->tree_root) + return; + fs_info->extent_root->block_rsv = &fs_info->delayed_refs_rsv; fs_info->csum_root->block_rsv = &fs_info->delayed_refs_rsv; fs_info->dev_root->block_rsv = &fs_info->global_block_rsv; diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 7e1eb57b923c..46dc621f599d 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -150,7 +150,8 @@ static int check_compressed_csum(struct btrfs_inode *inode, struct bio *bio, struct compressed_bio *cb = bio->bi_private; u8 *cb_sum = cb->sums; - if (inode->flags & BTRFS_INODE_NODATASUM) + if (!fs_info->csum_root || + inode->flags & BTRFS_INODE_NODATASUM) return 0; shash->tfm = fs_info->csum_shash; diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index aac3d6f4e35b..fb3cfd0aaf1e 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -1295,6 +1295,7 @@ static inline u32 BTRFS_MAX_XATTR_SIZE(const struct btrfs_fs_info *info) #define BTRFS_MOUNT_NOLOGREPLAY (1 << 27) #define BTRFS_MOUNT_REF_VERIFY (1 << 28) #define BTRFS_MOUNT_DISCARD_ASYNC (1 << 29) +#define BTRFS_MOUNT_IGNOREBADROOTS (1 << 30) #define BTRFS_DEFAULT_COMMIT_INTERVAL (30) #define BTRFS_DEFAULT_MAX_INLINE (2048) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index c5d3e7f75066..82f125a77911 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2246,30 +2246,39 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) root = btrfs_read_tree_root(tree_root, &location); if (IS_ERR(root)) { - ret = PTR_ERR(root); - goto out; + if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) { + ret = PTR_ERR(root); + goto out; + } + } else { + set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); + fs_info->extent_root = root; } - set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); - fs_info->extent_root = root; location.objectid = BTRFS_DEV_TREE_OBJECTID; root = btrfs_read_tree_root(tree_root, &location); if (IS_ERR(root)) { - ret = PTR_ERR(root); - goto out; + if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) { + ret = PTR_ERR(root); + goto out; + } + } else { + set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); + fs_info->dev_root = root; + btrfs_init_devices_late(fs_info); } - set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); - fs_info->dev_root = root; - btrfs_init_devices_late(fs_info); location.objectid = BTRFS_CSUM_TREE_OBJECTID; root = btrfs_read_tree_root(tree_root, &location); if (IS_ERR(root)) { - ret = PTR_ERR(root); - goto out; + if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) { + ret = PTR_ERR(root); + goto out; + } + } else { + set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); + fs_info->csum_root = root; } - set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); - fs_info->csum_root = root; /* * This tree can share blocks with some other fs tree during relocation @@ -2278,11 +2287,14 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) root = btrfs_get_fs_root(tree_root->fs_info, BTRFS_DATA_RELOC_TREE_OBJECTID, true); if (IS_ERR(root)) { - ret = PTR_ERR(root); - goto out; + if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) { + ret = PTR_ERR(root); + goto out; + } + } else { + set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); + fs_info->data_reloc_root = root; } - set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); - fs_info->data_reloc_root = root; location.objectid = BTRFS_QUOTA_TREE_OBJECTID; root = btrfs_read_tree_root(tree_root, &location); @@ -2295,9 +2307,11 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) location.objectid = BTRFS_UUID_TREE_OBJECTID; root = btrfs_read_tree_root(tree_root, &location); if (IS_ERR(root)) { - ret = PTR_ERR(root); - if (ret != -ENOENT) - goto out; + if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) { + ret = PTR_ERR(root); + if (ret != -ENOENT) + goto out; + } } else { set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); fs_info->uuid_root = root; @@ -2307,11 +2321,14 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) location.objectid = BTRFS_FREE_SPACE_TREE_OBJECTID; root = btrfs_read_tree_root(tree_root, &location); if (IS_ERR(root)) { - ret = PTR_ERR(root); - goto out; + if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) { + ret = PTR_ERR(root); + goto out; + } + } else { + set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); + fs_info->free_space_root = root; } - set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); - fs_info->free_space_root = root; } return 0; diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 8083d71d6af6..90c728652033 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -272,7 +272,8 @@ blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio, int count = 0; u16 csum_size = btrfs_super_csum_size(fs_info->super_copy); - if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) + if (!fs_info->csum_root || + BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) return BLK_STS_OK; path = btrfs_alloc_path(); diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index de69bef92c9a..b50a5f468b67 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2187,7 +2187,8 @@ blk_status_t btrfs_submit_data_bio(struct inode *inode, struct bio *bio, int skip_sum; int async = !atomic_read(&BTRFS_I(inode)->sync_writers); - skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; + skip_sum = (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) || + !fs_info->csum_root; if (btrfs_is_free_space_inode(BTRFS_I(inode))) metadata = BTRFS_WQ_ENDIO_FREE_SPACE; @@ -2844,6 +2845,9 @@ int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u64 phy_offset, if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) return 0; + if (!root->fs_info->csum_root) + return 0; + if (root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID && test_range_bit(io_tree, start, end, EXTENT_NODATASUM, 1, NULL)) { clear_extent_bits(io_tree, start, end, EXTENT_NODATASUM); diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index ca270649fe10..230caa4252b3 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -360,6 +360,7 @@ enum { Opt_rescue, Opt_usebackuproot, Opt_nologreplay, + Opt_ignorebadroots, /* Deprecated options */ Opt_recovery, @@ -455,6 +456,8 @@ static const match_table_t tokens = { static const match_table_t rescue_tokens = { {Opt_usebackuproot, "usebackuproot"}, {Opt_nologreplay, "nologreplay"}, + {Opt_ignorebadroots, "ignorebadroots"}, + {Opt_ignorebadroots, "ibadroots"}, {Opt_err, NULL}, }; @@ -498,6 +501,10 @@ static int parse_rescue_options(struct btrfs_fs_info *info, const char *options) btrfs_set_and_info(info, NOLOGREPLAY, "disabling log replay at mount time"); break; + case Opt_ignorebadroots: + btrfs_set_and_info(info, IGNOREBADROOTS, + "ignoring bad roots"); + break; case Opt_err: btrfs_info(info, "unrecognized rescue option '%s'", p); ret = -EINVAL; @@ -983,7 +990,8 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options, if (new_flags & SB_RDONLY) goto out; - if (check_ro_option(info, BTRFS_MOUNT_NOLOGREPLAY, "nologreplay")) + if (check_ro_option(info, BTRFS_MOUNT_NOLOGREPLAY, "nologreplay") || + check_ro_option(info, BTRFS_MOUNT_IGNOREBADROOTS, "ignorebadroots")) ret = -EINVAL; out: if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE) && @@ -1440,6 +1448,8 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) print_rescue_option(seq, "nologreplay", &printed); if (btrfs_test_opt(info, USEBACKUPROOT)) print_rescue_option(seq, "usebackuproot", &printed); + if (btrfs_test_opt(info, IGNOREBADROOTS)) + print_rescue_option(seq, "ignorebadroots", &printed); if (btrfs_test_opt(info, FLUSHONCOMMIT)) seq_puts(seq, ",flushoncommit"); if (btrfs_test_opt(info, DISCARD_SYNC)) diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 8f0462d6855d..e9f482989415 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -332,6 +332,7 @@ BTRFS_ATTR(static_feature, send_stream_version, send_stream_version_show); static const char *rescue_opts[] = { "usebackuproot", "nologreplay", + "ignorebadroots", }; static ssize_t supported_rescue_options_show(struct kobject *kobj, diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 58b9c419a2b6..1dc0b9425a28 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -7662,6 +7662,19 @@ int btrfs_verify_dev_extents(struct btrfs_fs_info *fs_info) u64 prev_dev_ext_end = 0; int ret = 0; + /* + * We don't have a dev_root because we mounted with ignorebadroots and + * failed to load the root, so we want to skip the verification in this + * case for sure. + * + * However if the dev root is fine, but the tree itself is corrupt we'd + * still fail to mount. This verification is only to make sure writes + * can happen safely, so instead just bypass this check completely in + * the case of IGNOREBADROOTS. + */ + if (btrfs_test_opt(fs_info, IGNOREBADROOTS)) + return 0; + key.objectid = 1; key.type = BTRFS_DEV_EXTENT_KEY; key.offset = 0; From patchwork Fri Oct 16 15:29:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11841927 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=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,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 59324C433E7 for ; Fri, 16 Oct 2020 15:29:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EBDF8207C4 for ; Fri, 16 Oct 2020 15:29:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="KcoZBAUb" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2410117AbgJPP3h (ORCPT ); Fri, 16 Oct 2020 11:29:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35432 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2407477AbgJPP3g (ORCPT ); Fri, 16 Oct 2020 11:29:36 -0400 Received: from mail-qk1-x743.google.com (mail-qk1-x743.google.com [IPv6:2607:f8b0:4864:20::743]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 39443C061755 for ; Fri, 16 Oct 2020 08:29:36 -0700 (PDT) Received: by mail-qk1-x743.google.com with SMTP id 188so2196074qkk.12 for ; Fri, 16 Oct 2020 08:29:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=NpnUXtAXjyTWlnwMA3aBaxYEdlZZnjtTMX7pzJkxGs0=; b=KcoZBAUbdWCnW6GAz/3v75EkZqTIvm0f3UGF2hYcMtvAnXYUMym2IIfYhdkKS7OHok RaTOcqK5IQEybfgrKWE6PbGcFIjWvtr4m8kh6V//K5NoWw5twylTYdrR6If2adOvrJmu M8FJpZI1CBRUgCDabN6aMZxHG3/6MwsBWCyr1filjqmb4m07P1N6DFXE5Ez21lYb4oIa tohsl/sQvt5utGnwnwBtx07VwBThvRZec3Osv5opwwL/AiX7ja7hiIXnaBVwITHkfxMq Jc0grwYOyEj4ulQ5wacho0eqQ2nulJIFJlHWMsWnSTbr6UWHHTL4KRwUcuZgEJpCzPUX VwCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NpnUXtAXjyTWlnwMA3aBaxYEdlZZnjtTMX7pzJkxGs0=; b=YubKvSoDnbiT+pWSvupwMP6ecZFDH/TGJGFwni83AK8ceK9CF6hI9BSFrM2yJs4RsP zi5niBQn+LZQw9+PmR3imWL9oKiY/e9b726235SN1z/fmZ/NuawfLV8u+QlsAn9Az9y/ F9DWHx0/S0dWBk5aKQxDsR+geRwlAVEIF3kz6SlNWJCJ8gFWa0h13g2gxFF+of8+BEkk GdnoUtNaqyClGjs+MmtUjMsACNzF1hisA84sCUB9ly/+afpcTlzhfAP8nJ2/24wTGEwB Rdv30gzeUncMhiNihhuvN6jTkpgeZJfKgamo8NLfIeV20SQ3QSXyDhbOE/vZJJjlu0eP WzRQ== X-Gm-Message-State: AOAM531vJoQpBAMYbKLqG7w65kWqJ2wNgB+CV88VDO2GnR7NxAPzG2H0 5TJqb86QzlvJ9Wxy3zxv6L1wqX6GIJmRDx84 X-Google-Smtp-Source: ABdhPJydHy1qRqIZSQIi7JtvEkXT7ucsMkXFNtM0cDCIEwIFkgUTvgXVO3QASEz7PXKQtGAi/XJVYQ== X-Received: by 2002:a37:ba42:: with SMTP id k63mr4393423qkf.22.1602862174762; Fri, 16 Oct 2020 08:29:34 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id n201sm330772qka.32.2020.10.16.08.29.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Oct 2020 08:29:34 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Cc: Qu Wenruo Subject: [PATCH v4 7/8] btrfs: introduce rescue=ignoredatacsums Date: Fri, 16 Oct 2020 11:29:19 -0400 Message-Id: X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org There are cases where you can end up with bad data csums because of misbehaving applications. This happens when an application modifies a buffer in-flight when doing an O_DIRECT write. In order to recover the file we need a way to turn off data checksums so you can copy the file off, and then you can delete the file and restore it properly later. Reviewed-by: Qu Wenruo Signed-off-by: Josef Bacik --- fs/btrfs/ctree.h | 1 + fs/btrfs/disk-io.c | 21 ++++++++++++--------- fs/btrfs/super.c | 14 +++++++++++++- fs/btrfs/sysfs.c | 1 + 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index fb3cfd0aaf1e..397f5f6b88a4 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -1296,6 +1296,7 @@ static inline u32 BTRFS_MAX_XATTR_SIZE(const struct btrfs_fs_info *info) #define BTRFS_MOUNT_REF_VERIFY (1 << 28) #define BTRFS_MOUNT_DISCARD_ASYNC (1 << 29) #define BTRFS_MOUNT_IGNOREBADROOTS (1 << 30) +#define BTRFS_MOUNT_IGNOREDATACSUMS (1 << 31) #define BTRFS_DEFAULT_COMMIT_INTERVAL (30) #define BTRFS_DEFAULT_MAX_INLINE (2048) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 82f125a77911..504262e7c7d5 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2268,16 +2268,19 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) btrfs_init_devices_late(fs_info); } - location.objectid = BTRFS_CSUM_TREE_OBJECTID; - root = btrfs_read_tree_root(tree_root, &location); - if (IS_ERR(root)) { - if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) { - ret = PTR_ERR(root); - goto out; + /* If IGNOREDATASCUMS is set don't bother reading the csum root. */ + if (!btrfs_test_opt(fs_info, IGNOREDATACSUMS)) { + location.objectid = BTRFS_CSUM_TREE_OBJECTID; + root = btrfs_read_tree_root(tree_root, &location); + if (IS_ERR(root)) { + if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) { + ret = PTR_ERR(root); + goto out; + } + } else { + set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); + fs_info->csum_root = root; } - } else { - set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); - fs_info->csum_root = root; } /* diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 230caa4252b3..83689e6659fc 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -361,6 +361,7 @@ enum { Opt_usebackuproot, Opt_nologreplay, Opt_ignorebadroots, + Opt_ignoredatacsums, /* Deprecated options */ Opt_recovery, @@ -458,6 +459,8 @@ static const match_table_t rescue_tokens = { {Opt_nologreplay, "nologreplay"}, {Opt_ignorebadroots, "ignorebadroots"}, {Opt_ignorebadroots, "ibadroots"}, + {Opt_ignoredatacsums, "ignoredatacsums"}, + {Opt_ignoredatacsums, "idatacsums"}, {Opt_err, NULL}, }; @@ -505,6 +508,10 @@ static int parse_rescue_options(struct btrfs_fs_info *info, const char *options) btrfs_set_and_info(info, IGNOREBADROOTS, "ignoring bad roots"); break; + case Opt_ignoredatacsums: + btrfs_set_and_info(info, IGNOREDATACSUMS, + "ignoring data csums"); + break; case Opt_err: btrfs_info(info, "unrecognized rescue option '%s'", p); ret = -EINVAL; @@ -991,7 +998,10 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options, goto out; if (check_ro_option(info, BTRFS_MOUNT_NOLOGREPLAY, "nologreplay") || - check_ro_option(info, BTRFS_MOUNT_IGNOREBADROOTS, "ignorebadroots")) + check_ro_option(info, BTRFS_MOUNT_IGNOREBADROOTS, + "ignorebadroots") || + check_ro_option(info, BTRFS_MOUNT_IGNOREDATACSUMS, + "ignoredatacsums")) ret = -EINVAL; out: if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE) && @@ -1450,6 +1460,8 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) print_rescue_option(seq, "usebackuproot", &printed); if (btrfs_test_opt(info, IGNOREBADROOTS)) print_rescue_option(seq, "ignorebadroots", &printed); + if (btrfs_test_opt(info, IGNOREDATACSUMS)) + print_rescue_option(seq, "ignoredatacsums", &printed); if (btrfs_test_opt(info, FLUSHONCOMMIT)) seq_puts(seq, ",flushoncommit"); if (btrfs_test_opt(info, DISCARD_SYNC)) diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index e9f482989415..86f70a60447b 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -333,6 +333,7 @@ static const char *rescue_opts[] = { "usebackuproot", "nologreplay", "ignorebadroots", + "ignoredatacsums", }; static ssize_t supported_rescue_options_show(struct kobject *kobj, From patchwork Fri Oct 16 15:29:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11841933 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=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,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 551EBC43457 for ; Fri, 16 Oct 2020 15:29:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id ED0BB207C4 for ; Fri, 16 Oct 2020 15:29:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="MRbpY6eg" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2410120AbgJPP3j (ORCPT ); Fri, 16 Oct 2020 11:29:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2407477AbgJPP3i (ORCPT ); Fri, 16 Oct 2020 11:29:38 -0400 Received: from mail-qk1-x741.google.com (mail-qk1-x741.google.com [IPv6:2607:f8b0:4864:20::741]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 085B5C061755 for ; Fri, 16 Oct 2020 08:29:38 -0700 (PDT) Received: by mail-qk1-x741.google.com with SMTP id b69so2214202qkg.8 for ; Fri, 16 Oct 2020 08:29:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=R86yHF8mmwe0DChfPpFQwDkY+H3Wr/ye808Nk2VTBvg=; b=MRbpY6egO4Eg+FklASjcbG5xT4TW6WkOaYVZqdLTQGwJbYLetKyoHOpdNRKHGWuG89 90OM4kYkDHGGr+7Af/AFeDJLjxcFS9+5Wkn633BGBtvEWkfD7TLNXenAIeg+lDKbkkyZ 38DQdId/TUL2qsIFMPRjuiraN6K3WpB5XnZQfGyeDz96X/IGIEOTPNTcyvVn5J3JIIuF eVX4eE0w9ZmTIvruwr0NePTjh8mo6XUuBAB115AJ90oUgGQ4skBUEKpTrFqdThBDhQ+f XVVHVZnJj3e3aoKYqNe/d3jltLXpJaagt+/C86tNk/835JTrwK+VMnDjZPS4JdM5Jsq3 l1LA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=R86yHF8mmwe0DChfPpFQwDkY+H3Wr/ye808Nk2VTBvg=; b=hNV9hjgXBGhoJSCyuxJRiYHsON80B67dIgChjja/BKfi0KkzTWtoqnEXFlWAls6BO1 gVcheYISgtVzXjmNwuO9N7OPEQsS+3wMsbA5UxaFaGCFjhn3ajpVczA5oduFZUkKysUP qJGT2UNO4jxyKYIkxVUXySPJYkGwDc5EzeV4Qlkt3mv2qD8PVQlpc39zHRKJ6Qx/hoMB T6uH9nxKnCuMtl5nIbj/ZFl5+KTbPovAwwRHmb3wyuSWqgTGjJaCgZptZjq1fTXeO8ou UoYfen0Scb3oy01gmC5v51xJbbYFFS8i+PzCdJGErDD74VIJBnPStvUzZ+dEj4R/eTTa gfUA== X-Gm-Message-State: AOAM530ylaVV4syfnEFzs38EP3xcyRaxjf58j8LAUZ8K0HaPR79QkQGd hgKWhT+SzIFgWcqARxT65WzeTp/jnKRIYZ3+ X-Google-Smtp-Source: ABdhPJya1JTGzVd3kOFxsi1t7iaUemMEQ98Ba0mxUXGSwtZoZOC57LgjkSXiCmyNrEGXd14lGJuXkA== X-Received: by 2002:ae9:ea18:: with SMTP id f24mr4182763qkg.135.1602862176849; Fri, 16 Oct 2020 08:29:36 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id g1sm1103769qtp.74.2020.10.16.08.29.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Oct 2020 08:29:36 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Cc: Qu Wenruo Subject: [PATCH v4 8/8] btrfs: introduce rescue=all Date: Fri, 16 Oct 2020 11:29:20 -0400 Message-Id: <30396ee8e71dbcd707c84046917a6e378c89fd98.1602862052.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Now that we have the building blocks for some better recovery options with corrupted file systems, add a rescue=all option to enable all of the relevant rescue options. This will allow distro's to simply default to rescue=all for the "oh dear lord the world's on fire" recovery without needing to know all the different options that we have and may add in the future. Reviewed-by: Qu Wenruo Signed-off-by: Josef Bacik --- fs/btrfs/super.c | 11 +++++++++++ fs/btrfs/sysfs.c | 1 + 2 files changed, 12 insertions(+) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 83689e6659fc..bc28747cf7b3 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -362,6 +362,7 @@ enum { Opt_nologreplay, Opt_ignorebadroots, Opt_ignoredatacsums, + Opt_all, /* Deprecated options */ Opt_recovery, @@ -461,6 +462,7 @@ static const match_table_t rescue_tokens = { {Opt_ignorebadroots, "ibadroots"}, {Opt_ignoredatacsums, "ignoredatacsums"}, {Opt_ignoredatacsums, "idatacsums"}, + {Opt_all, "all"}, {Opt_err, NULL}, }; @@ -512,6 +514,15 @@ static int parse_rescue_options(struct btrfs_fs_info *info, const char *options) btrfs_set_and_info(info, IGNOREDATACSUMS, "ignoring data csums"); break; + case Opt_all: + btrfs_info(info, "enabling all of the rescue options"); + btrfs_set_and_info(info, IGNOREDATACSUMS, + "ignoring data csums"); + btrfs_set_and_info(info, IGNOREBADROOTS, + "ignoring bad roots"); + btrfs_set_and_info(info, NOLOGREPLAY, + "disabling log replay at mount time"); + break; case Opt_err: btrfs_info(info, "unrecognized rescue option '%s'", p); ret = -EINVAL; diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 86f70a60447b..fcd6c7a9bbd1 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -334,6 +334,7 @@ static const char *rescue_opts[] = { "nologreplay", "ignorebadroots", "ignoredatacsums", + "all", }; static ssize_t supported_rescue_options_show(struct kobject *kobj,