From patchwork Thu Sep 24 15:32:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11797763 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BE7E86CA for ; Thu, 24 Sep 2020 15:33:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A1BFE221EB for ; Thu, 24 Sep 2020 15:33:05 +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="wrEUSbcO" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728547AbgIXPdF (ORCPT ); Thu, 24 Sep 2020 11:33:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39572 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728538AbgIXPdA (ORCPT ); Thu, 24 Sep 2020 11:33:00 -0400 Received: from mail-qt1-x842.google.com (mail-qt1-x842.google.com [IPv6:2607:f8b0:4864:20::842]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A877FC0613D3 for ; Thu, 24 Sep 2020 08:33:00 -0700 (PDT) Received: by mail-qt1-x842.google.com with SMTP id b2so3264337qtp.8 for ; Thu, 24 Sep 2020 08:33:00 -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=jfjglTCoup5k7um3ixkgbD99pAW0YWdv2A4fHlezTzY=; b=wrEUSbcO5WF03DSwd2iVM44FbxzBfVDQlpikGeXiWCBeDRpcHDo6YJC0PAVf20z2YF H5thQfd0hF1g2NeupGMFYi7WY+sLFyxJ6ROJr9kBJttYUxE1Yrf754PtmkxR4zxnaagU vRDi7yvb/wvKIqNViSJyLD2MlrK2/4jRnAjSFLEKP0yWkmAy14q1F9yIKS81mezWC3TT yrypF6EIPgesIaV6kXogk9m1U7USDkOPSENggxs46gH1DfH/OrzjWsNbJTgEkp+I642g bbrSPmnWA6H48OwlqMk7a4pTIkqXAMaSfPxkte9hw5Ow0/c2IZT0/JijNCMENp0vjZrv ABhQ== 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=jfjglTCoup5k7um3ixkgbD99pAW0YWdv2A4fHlezTzY=; b=f65Tk5hOxtSx6K5wjEn48Mc90RIiA0kiKJlaWiytYEZtlhrV2ljIXy24lkPE31gNCj ZKarfKrd5fGTTAkGoG3MCwFsWtWdFAvMRg6yMry56lVzjUKhbNiY5i9KgyCf8Tj4ajOR 7rsXlRWa58SchUQM71km6FUnmJBhoiVsv2L1bqzpdF8g3p47UsVMbMPbQ2LkNOamJpzS hAmnpLtgsSVmRPOUM9dicF0WNPZbY2+qRXX0pDUX0rjaGLjFjr8kJo76s6AiGzr/qG50 Djq/rWBOtR/6GzhV2VF0sKNFWI91Dw5dDRzX8ND9+IbRYQeyJdzl3bNrHLnqJvTmdNdM bl+Q== X-Gm-Message-State: AOAM530vNkjjh510GjMeUh7AfrI5B3n9Dk3K8OzwwLpahtD/vSDHeuXx eFykR3X/SSinAAbY/Vl7pHWAiV5U5grTVnDw X-Google-Smtp-Source: ABdhPJwGHZ5XosxBNccLx9vIs7XmIjxWLsrT+MZGAGpR88F1HaDiO9++5vCMR2rctF49Fv7enEnzXg== X-Received: by 2002:ac8:6ec2:: with SMTP id f2mr92429qtv.159.1600961579567; Thu, 24 Sep 2020 08:32:59 -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 s20sm2207465qkg.65.2020.09.24.08.32.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2020 08:32:58 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 1/5] btrfs: unify the ro checking for mount options Date: Thu, 24 Sep 2020 11:32:50 -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 more options that require RDONLY, so add a helper to do the check and error out if we don't have RDONLY set. Signed-off-by: Josef Bacik Reviewed-by: Qu Wenruo --- 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 Thu Sep 24 15:32:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11797769 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5D1C059D for ; Thu, 24 Sep 2020 15:33:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3EA05221EB for ; Thu, 24 Sep 2020 15:33:07 +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="bwnHqTs9" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728541AbgIXPdE (ORCPT ); Thu, 24 Sep 2020 11:33:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39584 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728360AbgIXPdD (ORCPT ); Thu, 24 Sep 2020 11:33:03 -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 D53C7C0613D5 for ; Thu, 24 Sep 2020 08:33:02 -0700 (PDT) Received: by mail-qk1-x741.google.com with SMTP id t138so3688590qka.0 for ; Thu, 24 Sep 2020 08:33:02 -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=9gEtPQD4EpxQ0sNieQuWsjfv/UYDxta6WrtRrHM8TX4=; b=bwnHqTs9XF0rttUUFNZM8lSEpYuufwO5sn00Ft57TYCKIEAj2i263INS+NqOZ3xiXu M0rqZuK8g8A6le8mt2fbQjPA17ckMff/TQGwEOkRORHp07EAQjrgT2KbLVchwOY03791 hHSPshJTvxa/BbCDRZoJjt6xAC1eFZgnY4wDkvv8JMcrl/pYxmeWoV5lYksVq+03mwVo 0Cf7Fz0lRprn/kQj9ZmBd4nJHi/r41qY5+cBPKPEgL6gxspePZhN4deZbT72fmwoKCiG 89roxj7stp4kujlkPzZPkd5rX71s73OJ5iQI+0GKIvsK2tPnbatlS5jGGV1d1HFfIqKE nw4w== 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=9gEtPQD4EpxQ0sNieQuWsjfv/UYDxta6WrtRrHM8TX4=; b=Ajq5SoREYLkLGhPFhQfJIT/TN6jFZqMpd98IXKNrNC6b/QUTtKk9cNTSR5weiojeCl t+D0uxJ1sjDI0xu3fmw4pf5KZ3Dk35lClfhnVs4npIw3ANup7hKrME7c3OUxCRKpzYgL zOKdCceUGx8aer+dVyrKT9atY9ZqvEjSenXGlAJwaIjf3d6vxMb4fTIW23F1hQ4Kw1XK U8n68nI/zhanyfbm9ihrnOoQ9Xjw66Ksq557aARCmpUno+oPA1wcY4v43KXnkICLpRpZ YynxdJlDdjs7VrYe3C/je5YZIwQIAJFli3uu9fUpl+VffHWjkpiipch+Fm6wr6Yt4UPR Ng3Q== X-Gm-Message-State: AOAM533fX+SCozvg3KNvbncBo7BlkDow8WPSyBKv9ycXbN4a2bm3zaDf xQtFz98+yCqzovlkCLGOFdYdz16vuZ1u0vIA X-Google-Smtp-Source: ABdhPJw7eeQynzuq5gmqQy2FTLwuul2LPbnmsGirpP3LDce/ZbTbzYzaI2l7wGYVHc/gfi14ZDND1w== X-Received: by 2002:a05:620a:1583:: with SMTP id d3mr160267qkk.495.1600961581535; Thu, 24 Sep 2020 08:33:01 -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 d12sm2329400qka.34.2020.09.24.08.33.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2020 08:33:00 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 2/5] btrfs: push the NODATASUM check into btrfs_lookup_bio_sums Date: Thu, 24 Sep 2020 11:32:51 -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 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. Signed-off-by: Josef Bacik Reviewed-by: Qu Wenruo Reviewed-by: Johannes Thumshirn --- 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 d526833b5ec0..d262944c4297 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; @@ -7781,7 +7786,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); @@ -7808,10 +7812,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 Thu Sep 24 15:32:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11797767 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B48B46CA for ; Thu, 24 Sep 2020 15:33:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 973DD2344C for ; Thu, 24 Sep 2020 15:33:06 +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="edNUTpYT" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728548AbgIXPdG (ORCPT ); Thu, 24 Sep 2020 11:33:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39586 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728517AbgIXPdF (ORCPT ); Thu, 24 Sep 2020 11:33:05 -0400 Received: from mail-qt1-x842.google.com (mail-qt1-x842.google.com [IPv6:2607:f8b0:4864:20::842]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CDE5DC0613D3 for ; Thu, 24 Sep 2020 08:33:04 -0700 (PDT) Received: by mail-qt1-x842.google.com with SMTP id k25so3280708qtu.4 for ; Thu, 24 Sep 2020 08:33:04 -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=JCTglmZe/QBM+g1hPCvDVs1GjqQ3tJzCC0CEKE+/U0E=; b=edNUTpYTAO/LGFa/eaghfflRmZq5Z1/DPzby0AUmHlly/tAbMw09MD6ILCw1fKUd6n IV16QuWZCOYC2cWgVdGndpmoYVkzwZNgfu5uytKSPryZRBMmjyaWEPUik+dAO8bge7m3 8h1EC8rpY6XIhVechfZ3DK+JrlYiyOiEMI9HNPtvForjh7nfjbjrR+N6KxPaUQLqlI5f Ui78rmVn/F3v+wp0Os5JPZLdqzQ0x6n8FdtOgRP48DZpis9YP9a9yLEqQu88Nl0Z+PPV 7N7+oGC6X5/ZxhWU3hHPSZS06AK2zv+hUlN2jpTRQ5TTVcuYas8VpdAi9yP3ZQR9ZKM2 bjBg== 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=JCTglmZe/QBM+g1hPCvDVs1GjqQ3tJzCC0CEKE+/U0E=; b=HLKC40gxlT72+HbHPT2aBtNJIGLlKSghkhya4AghUd+irlaC53c+a0g5/eoppI3Nbm Pfi604t+bp6GwDmJ7ELsnrTrc3QZHbPbp8Llh3OZQ/gwfa2ibK4gtcm1fUS1AR32ZVdl VPln+n3SqP21PJbJ5pRytupHMLpF/fv9Wt4jj5cp8NrFxb36A09oxb6DlIaBrHOw8qSr tCPYeHeoe96owsnp/7D/x3K+sbSA3uucoRyECwJSD/99vyj+UoDUE9stvu42MjXo6GxN V16aXsyx91EqUEaqifaak2r1hK+troXKZ5A+iW4afn+RP3TYZl3x4BODaxyHSP110wkW 82/g== X-Gm-Message-State: AOAM531phPoh0Dx9kUQ+n+o8mVx663reaWTbBkm4WtlnZGE8K/THEKCL bRRvsO4XPzzoH9OK5SgiIDPQ4N9Fq7CJFY8P X-Google-Smtp-Source: ABdhPJwAZ0M6VqiGSStDjKRQ+JSJ8ILGRa4GgY25mJm74FY4FpjgbCfupY2aGiIuUlQUmSYHuXgPvw== X-Received: by 2002:ac8:6e90:: with SMTP id c16mr57153qtv.391.1600961583355; Thu, 24 Sep 2020 08:33:03 -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 c28sm2529729qtk.18.2020.09.24.08.33.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2020 08:33:02 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 3/5] btrfs: introduce rescue=ignorebadroots Date: Thu, 24 Sep 2020 11:32:52 -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 | 11 ++++++- fs/btrfs/volumes.c | 7 +++++ 9 files changed, 124 insertions(+), 28 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index c0f1d6818df7..7e32f7820543 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 3d39f5d47ad3..5deedfb0e5c7 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2247,30 +2247,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 @@ -2279,11 +2288,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); @@ -2296,9 +2308,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; @@ -2308,11 +2322,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 d262944c4297..27752c66dec4 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 f99e89ec46b2..7cc7a9233f5e 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,7 @@ static const match_table_t tokens = { static const match_table_t rescue_tokens = { {Opt_usebackuproot, "usebackuproot"}, {Opt_nologreplay, "nologreplay"}, + {Opt_ignorebadroots, "ignorebadroots"}, {Opt_err, NULL}, }; @@ -498,6 +500,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 +989,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) && @@ -1430,6 +1437,8 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) seq_puts(seq, ",notreelog"); if (btrfs_test_opt(info, NOLOGREPLAY)) seq_puts(seq, ",rescue=nologreplay"); + if (btrfs_test_opt(info, IGNOREBADROOTS)) + seq_puts(seq, ",rescue=ignorebadroots"); if (btrfs_test_opt(info, FLUSHONCOMMIT)) seq_puts(seq, ",flushoncommit"); if (btrfs_test_opt(info, DISCARD_SYNC)) diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 46f4efd58652..08b3ca60f3df 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -7656,6 +7656,13 @@ 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 skip the verification. + */ + if (!root) + return 0; + key.objectid = 1; key.type = BTRFS_DEV_EXTENT_KEY; key.offset = 0; From patchwork Thu Sep 24 15:32:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11797771 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 596576CA for ; Thu, 24 Sep 2020 15:33:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3C983221EB for ; Thu, 24 Sep 2020 15:33:08 +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="TCV/4/eR" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728551AbgIXPdH (ORCPT ); Thu, 24 Sep 2020 11:33:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39598 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728517AbgIXPdH (ORCPT ); Thu, 24 Sep 2020 11:33:07 -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 E8011C0613CE for ; Thu, 24 Sep 2020 08:33:06 -0700 (PDT) Received: by mail-qt1-x844.google.com with SMTP id g3so3249273qtq.10 for ; Thu, 24 Sep 2020 08:33:06 -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=t73NgxwDYgtQirb7X6yceENW0PFaSD+3K+ON0ltvmUw=; b=TCV/4/eRBDFbltN1gnCUGNEEZ2TTovezFLB3iBhjHlK0MoLwO40Q0GdNaFF0WKTfmG maWVyni/vN80XxXC/DRsjPDFvugjVG9JB7lkpBOm4EUguotkQ+HI6LgbDS1fIuVvrsSP W1UsJN+Ntio0KzDhWUT8GQcUsGrJN9Umge9JYYH48lAXMrMgbGB/6+GR1KjmseXBc8fj VPJBIBUkMQJPqbNH0qlvEvYhoFK3IAOnsPFXMk1eBh8JlefUGVVQ7AkTFqMSZHA1b5d/ PNO3tVUnDS3Pmj3R8r8JhAljc7S/eBpRRo6/G7S7CBkEK0/LE2vgVW5XGKq9nl2w2jky jRpA== 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=t73NgxwDYgtQirb7X6yceENW0PFaSD+3K+ON0ltvmUw=; b=FrnIj/gvTWMHkGvSCV7lyi3DOPN0NL1Gnzw7FxGOKIxM/r9j6BNJ7RJuqIN1BEk1nk yi8vOMRd37e0gZPJuZ5fGILuiGhldvqTXm5PR5gxEcANXmvmgBOAJx+FjNdBbKASi1JR 317fpLMTxNz512UaXaSnc9YMBLmPdz7Zw9H8gpGmTbX3+3egPZSu5PWUaIsy/u5V5Tf8 98bSD/hOOGkqhbdJEV/z6zncDcgN2jiwViMw6Vi4Ree/oOcjZgNMMSAzJeE2BkinwOsJ IvPXTJuFtxFwT7OPNS5t0GQhTp0fo9OMni7LAg/T6gmp57S7rHLy/TmyASlCQZDgmpVH Spjw== X-Gm-Message-State: AOAM5336cxDqKr7JY2s49uea6+sx2a2i7t4UA68kMwQMe948RJCT28Fl hYJIWrnafdudZrbj0plxNrGDOcLSjFDGUXtg X-Google-Smtp-Source: ABdhPJw5VyR0DESQXhc4q7jfHbifS3TyL07wkzDe9wBSlZOBh3PMLWdwkfl8UoTxRAjakxqtohoA+g== X-Received: by 2002:aed:26a1:: with SMTP id q30mr106743qtd.25.1600961585719; Thu, 24 Sep 2020 08:33:05 -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 m10sm2445834qti.46.2020.09.24.08.33.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2020 08:33:04 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 4/5] btrfs: introduce rescue=ignoredatacsums Date: Thu, 24 Sep 2020 11:32:53 -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. Signed-off-by: Josef Bacik Reviewed-by: Qu Wenruo --- fs/btrfs/ctree.h | 1 + fs/btrfs/disk-io.c | 21 ++++++++++++--------- fs/btrfs/super.c | 11 ++++++++++- 3 files changed, 23 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 5deedfb0e5c7..6f9d37567a10 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2269,16 +2269,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 7cc7a9233f5e..2282f0240c1d 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, @@ -457,6 +458,7 @@ static const match_table_t rescue_tokens = { {Opt_usebackuproot, "usebackuproot"}, {Opt_nologreplay, "nologreplay"}, {Opt_ignorebadroots, "ignorebadroots"}, + {Opt_ignoredatacsums, "ignoredatacsums"}, {Opt_err, NULL}, }; @@ -504,6 +506,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; @@ -990,7 +996,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) && From patchwork Thu Sep 24 15:32:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11797773 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 87CC16CA for ; Thu, 24 Sep 2020 15:33:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6B2C32388A for ; Thu, 24 Sep 2020 15:33:10 +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="gDxxYeaG" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728554AbgIXPdJ (ORCPT ); Thu, 24 Sep 2020 11:33:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39600 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728517AbgIXPdJ (ORCPT ); Thu, 24 Sep 2020 11:33:09 -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 CB035C0613CE for ; Thu, 24 Sep 2020 08:33:08 -0700 (PDT) Received: by mail-qk1-x741.google.com with SMTP id f142so3589150qke.13 for ; Thu, 24 Sep 2020 08:33:08 -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=zhYasqp4t3/Sq5r00l9oBUtB0wtxnmCZxQcvro0K8MY=; b=gDxxYeaGgnRN1EtN/u9Y/InhEcy4zyLfL9uWJ09cOQd//K/xVVbZMW2CN0P1zpwbwh u/xhC9BWjEl4Nxlz44GJqrt8Q62xMA5TlyoOAnkcn2W3l2nfZMKhL5RpI4U2UAaNAQYP ocbA1tVCGQVuPqqDdYVmE1BQr9qGupnbvlayWi46MyFjAoa6IdNBZm/tQqT2pTT838cl iXDIMM/arQw+m2F1j1MXptA0r/IGd1YD3zi+PKMyjRDj1peGCA2PB13BlSQRJy0vp+Fg JWsTnJGsKhvpOsTAKYppmaLFp1LOGyrJCwNEIQAJjDXcJqrlyaza81dWiuE6091KJGlL McyQ== 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=zhYasqp4t3/Sq5r00l9oBUtB0wtxnmCZxQcvro0K8MY=; b=XgfwWN4HPxNFschht/zfWglBWx3xE49cyRQ1TK5H2o0Iuch1J/4c2TbQPvcKl/PBzs 6WVsFXc8kxGywM7YX8QmJzkjCjxcKw5WcABM6RB0OVFnazKgqb8KFRXd8Hy+QKBwUsAq F1gY1N2BdUNJ6Uxg43eyK6EnaoBDh2L2lqM1advztdSYJNFB4VHfaV2xnXtji0SJuM+M ZKUjX3QoyWrXo1nlL4bHxJe2xpLay90F2B7a2Z/yLRwbVgxrGgsNdRzCKm6tTYvXaGwd +yiUvhRtyY9flVuQLlbjToqH9Q7lS9OwVZ2mWnpE376vS78ABx4WaHtYhbwWjbtTxP7B 5xLw== X-Gm-Message-State: AOAM532mn1BsvYPKM4yC8inruadKKsFJTOstlI2KPiTWWvAZPEE0w4Ht ZXTxLrG4dmUGUeDBEbY6+bH2vV/6+0scZVxT X-Google-Smtp-Source: ABdhPJwhDerO27HXwzGdudGjhTpaJcx9gKiy/11vB7pSV/S8KoppjtBP9FDt3kvLraoERlHMcSPE6g== X-Received: by 2002:a05:620a:159b:: with SMTP id d27mr237945qkk.28.1600961587546; Thu, 24 Sep 2020 08:33:07 -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 p192sm2368517qke.7.2020.09.24.08.33.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2020 08:33:06 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 5/5] btrfs: introduce rescue=all Date: Thu, 24 Sep 2020 11:32:54 -0400 Message-Id: <2377349868151ecd4be5f7077d22220793492f58.1600961206.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. Signed-off-by: Josef Bacik Reviewed-by: Qu Wenruo --- fs/btrfs/super.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 2282f0240c1d..3412763a9a0d 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, @@ -459,6 +460,7 @@ static const match_table_t rescue_tokens = { {Opt_nologreplay, "nologreplay"}, {Opt_ignorebadroots, "ignorebadroots"}, {Opt_ignoredatacsums, "ignoredatacsums"}, + {Opt_all, "all"}, {Opt_err, NULL}, }; @@ -510,6 +512,12 @@ 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_set_opt(info->mount_opt, IGNOREDATACSUMS); + btrfs_set_opt(info->mount_opt, IGNOREBADROOTS); + btrfs_set_opt(info->mount_opt, NOLOGREPLAY); + btrfs_info(info, "enabling all of the rescue options"); + break; case Opt_err: btrfs_info(info, "unrecognized rescue option '%s'", p); ret = -EINVAL;