From patchwork Fri Nov 5 20:45:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605921 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 46B12C4332F for ; Fri, 5 Nov 2021 20:45:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 30E2D6128E for ; Fri, 5 Nov 2021 20:45:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233728AbhKEUsg (ORCPT ); Fri, 5 Nov 2021 16:48:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56282 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233729AbhKEUsf (ORCPT ); Fri, 5 Nov 2021 16:48:35 -0400 Received: from mail-qk1-x733.google.com (mail-qk1-x733.google.com [IPv6:2607:f8b0:4864:20::733]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 45E4DC061208 for ; Fri, 5 Nov 2021 13:45:55 -0700 (PDT) Received: by mail-qk1-x733.google.com with SMTP id p17so8786380qkj.0 for ; Fri, 05 Nov 2021 13:45:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=UmDPx42Lh0e/mAEfjAlWcp+fHjd7jEd5+SgYFfM0DRc=; b=ec3VP9Udyqu6EiY/sx0tpRZy2EadoZcZijduf1M0euEFc3T1wVX+m5GJmwgQhptvH8 UsZhW23PG4p+Uwdad8noD/8oJ5+ANTMmRvdG8sAQJNlYzm0fGFlRAV+XOhslIkVtksIr WKA+3Us33aU1M+e/taPtV7++uBsaL7MXlo1f9xI0dXr+w1Mi0b+Fn8RIR9iF7Mh764h2 3WBWdHGZ2Qz9NBt39mJe/SOODUQDjixJhHjPsrXDIqOo/fA2BYMh0plNDosSZfToLrwF vnigmVL/Jn9W+cEhG7relR+4GkSICPz+/NlMy1yI3XOLJMDTWxY9llO1tNTzSxXu45tl cB6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UmDPx42Lh0e/mAEfjAlWcp+fHjd7jEd5+SgYFfM0DRc=; b=zzTZo10u0pO8ngqQZVMEmr3dJWhBbrFz/dmi7hv8Eeyp3Ucbs4wgZ7BywPNM4DnU/U Y6Jv/9F2y7LmUweT+IyBuL479rOYhKN1Ht7MdKGyNOyFH2sThLZq9hDPDlHXxdvVrTSq Cx1X+FFWG644i0fura+zspUmfm/+oxvif/wN+dcrzsIuxZdWPxkGkJ1/zEz0XqYVBHcJ OPQBIlCM2Cxl0qHmC7OQP7MikEFHqSimAwzuVb/7O9v6Dvm4i+JeF61/yBPpGOK20nJK snpxRc5xDWZ+T1Dd67P+y0lADqIaUyB6lmb+yrcr4qbmQNj2eKbpAQ8jLyl1Tzi/ZdtM KdLw== X-Gm-Message-State: AOAM533l9awvuH7ly0rGTyhPMjOxQoQY9AMfx/mnngtbMSdB6yRp4DUR t3ECwBdCjq/K0pmIy37c6SGEVA8mgJu6Aw== X-Google-Smtp-Source: ABdhPJy8jWFWVZlcYqHBMD3FYdM2Cha2+r/jf/8oTLoJf9+PEI2c2ETdG6QcWMiwtWJflnWRN/7mbg== X-Received: by 2002:a05:620a:458c:: with SMTP id bp12mr5462265qkb.409.1636145154185; Fri, 05 Nov 2021 13:45:54 -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 o6sm6733519qta.2.2021.11.05.13.45.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:45:53 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 01/25] btrfs: kill BTRFS_FS_BARRIER Date: Fri, 5 Nov 2021 16:45:27 -0400 Message-Id: <5ce10de7df0ace8ee6d03d2bd6d8f89d7f2bba11.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This is no longer used, it's a relic from when we had -o nobarrier. Remove the flag. Signed-off-by: Josef Bacik --- fs/btrfs/ctree.h | 1 - fs/btrfs/disk-io.c | 1 - 2 files changed, 2 deletions(-) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 01f6a40ba2dd..ce48ff69c77f 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -548,7 +548,6 @@ struct btrfs_swapfile_pin { bool btrfs_pinned_by_swapfile(struct btrfs_fs_info *fs_info, void *ptr); enum { - BTRFS_FS_BARRIER, BTRFS_FS_CLOSING_START, BTRFS_FS_CLOSING_DONE, BTRFS_FS_LOG_RECOVERING, diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 5be0ae67ceb7..8d36950800f4 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2949,7 +2949,6 @@ void btrfs_init_fs_info(struct btrfs_fs_info *fs_info) extent_io_tree_init(fs_info, &fs_info->excluded_extents, IO_TREE_FS_EXCLUDED_EXTENTS, NULL); - set_bit(BTRFS_FS_BARRIER, &fs_info->flags); mutex_init(&fs_info->ordered_operations_mutex); mutex_init(&fs_info->tree_log_mutex); From patchwork Fri Nov 5 20:45:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605925 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 083ADC433EF for ; Fri, 5 Nov 2021 20:46:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E58826128E for ; Fri, 5 Nov 2021 20:46:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233731AbhKEUsj (ORCPT ); Fri, 5 Nov 2021 16:48:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56296 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233724AbhKEUsg (ORCPT ); Fri, 5 Nov 2021 16:48:36 -0400 Received: from mail-qv1-xf30.google.com (mail-qv1-xf30.google.com [IPv6:2607:f8b0:4864:20::f30]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AB501C061205 for ; Fri, 5 Nov 2021 13:45:56 -0700 (PDT) Received: by mail-qv1-xf30.google.com with SMTP id j9so8034767qvm.10 for ; Fri, 05 Nov 2021 13:45:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Gzm0QAOunUEnULgc5TIwl5ZukYTklD1Fq1MMp8p/OZE=; b=SpWn5SkyiUsSV9aoaFhYFrNSLC2R6A60GQVAbbHwYDA4D8/3goQYyXEoBwxaBC5j4J kGZ1gmPjuBr58HsYKjglmnNQ6q+SKljtD3nPm2plWUsF2zJJcXfBhlvvRvyCy55LlP4f vANh256eb1t6OJv4Hi7Nk8F2Eh9241E2J0YTbF2nrLQp+KcaiVIdIQgRxQ5GZRWGW5Hj ciaPIvc35Bm9pjttO+7+eINgnV5dK8Dde7GxNS9MndK63VG0B/jyftNfpxKu043oaPrb K/wFPSzCOvAHueH/He5l7uhDy308LXwKYoleyziVYA+l0ffmHrgnOiEFoP+Qo3Z40bEd uDTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Gzm0QAOunUEnULgc5TIwl5ZukYTklD1Fq1MMp8p/OZE=; b=l12gYkfuVwCPKGRoCy24xpBjcYeAcWjEtX+HGO4yon57WM183/KCkztt1zBjXhSUxr HOPXD4fsgMe5/cEOgoNEaI4bxvw6WPzjlghzrEZmT8sMhwriftyI5Opbr0uHj9fZlXNr irlsLc6b6n5r12XcwTNzlGVOpyZ86a6wVzEh4kf/Oc0kPImr+T/rLBbPVd8A846X2t0T Guu4Z8JxtxL5t7zrcl61GbmJXvivBpFpXscHulntKqzN/dyopB0Q/TA8y+gog+PNrlps Y7BVHwVHor9riP9zKxzqNsAnCYXwnxgopkGIquS6LAG0Tnr8jzdjO34fzzelq5fMTONW KfPg== X-Gm-Message-State: AOAM533AqJFCsPqo5zdVu38xYvB82Ixy837iBO/NhWP47Re2GCedWkzm toSTokH89Jk3RU0I+aC9Ot/nmJr4tlR5Gg== X-Google-Smtp-Source: ABdhPJzOTmbAa6x7llLc/1Cz7ww0G2BZ23U9KW1JA8orTk7oPEx/9ZCWmZRONh/sxAjOBUuRLARDiw== X-Received: by 2002:a05:6214:509a:: with SMTP id kk26mr1485283qvb.43.1636145155509; Fri, 05 Nov 2021 13:45:55 -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 h68sm5990755qkf.126.2021.11.05.13.45.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:45:55 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 02/25] btrfs: rework async transaction committing Date: Fri, 5 Nov 2021 16:45:28 -0400 Message-Id: <5a181fb41c864ca518a35defc2547abef30afb18.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Currently we do this awful thing where we get another ref on a trans handle, async off that handle and commit the transaction from that work. Because we do this we have to mess with current->journal_info and the freeze counting stuff. We already have an async thing to kick for the transaction commit, the transaction kthread. Replace this work struct with a flag on the fs_info to tell the kthread to go ahead and commit even if it's before our timeout. Then we can drastically simplify the async transaction commit path. Signed-off-by: Josef Bacik --- fs/btrfs/ctree.h | 3 ++ fs/btrfs/disk-io.c | 3 +- fs/btrfs/ioctl.c | 7 +---- fs/btrfs/transaction.c | 64 ++++++++---------------------------------- fs/btrfs/transaction.h | 2 +- 5 files changed, 18 insertions(+), 61 deletions(-) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index ce48ff69c77f..fb49162311b9 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -595,6 +595,9 @@ enum { /* Indicate whether there are any tree modification log users */ BTRFS_FS_TREE_MOD_LOG_USERS, + /* Indicate that we want the transaction kthread to commit right now. */ + BTRFS_FS_COMMIT_TRANS, + #if BITS_PER_LONG == 32 /* Indicate if we have error/warn message printed on 32bit systems */ BTRFS_FS_32BIT_ERROR, diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 8d36950800f4..4c4357724ed0 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1926,7 +1926,8 @@ static int transaction_kthread(void *arg) } delta = ktime_get_seconds() - cur->start_time; - if (cur->state < TRANS_STATE_COMMIT_START && + if (!test_and_clear_bit(BTRFS_FS_COMMIT_TRANS, &fs_info->flags) && + cur->state < TRANS_STATE_COMMIT_START && delta < fs_info->commit_interval) { spin_unlock(&fs_info->trans_lock); delay -= msecs_to_jiffies((delta - 1) * 1000); diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index c474f7e24163..44372f1e61ac 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -3622,7 +3622,6 @@ static noinline long btrfs_ioctl_start_sync(struct btrfs_root *root, { struct btrfs_trans_handle *trans; u64 transid; - int ret; trans = btrfs_attach_transaction_barrier(root); if (IS_ERR(trans)) { @@ -3634,11 +3633,7 @@ static noinline long btrfs_ioctl_start_sync(struct btrfs_root *root, goto out; } transid = trans->transid; - ret = btrfs_commit_transaction_async(trans); - if (ret) { - btrfs_end_transaction(trans); - return ret; - } + btrfs_commit_transaction_async(trans); out: if (argp) if (copy_to_user(argp, &transid, sizeof(transid))) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index b958e0fdfe10..befe04019271 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -1861,50 +1861,14 @@ int btrfs_transaction_blocked(struct btrfs_fs_info *info) return ret; } -/* - * commit transactions asynchronously. once btrfs_commit_transaction_async - * returns, any subsequent transaction will not be allowed to join. - */ -struct btrfs_async_commit { - struct btrfs_trans_handle *newtrans; - struct work_struct work; -}; - -static void do_async_commit(struct work_struct *work) -{ - struct btrfs_async_commit *ac = - container_of(work, struct btrfs_async_commit, work); - - /* - * We've got freeze protection passed with the transaction. - * Tell lockdep about it. - */ - if (ac->newtrans->type & __TRANS_FREEZABLE) - __sb_writers_acquired(ac->newtrans->fs_info->sb, SB_FREEZE_FS); - - current->journal_info = ac->newtrans; - - btrfs_commit_transaction(ac->newtrans); - kfree(ac); -} - -int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans) +void btrfs_commit_transaction_async(struct btrfs_trans_handle *trans) { struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_async_commit *ac; struct btrfs_transaction *cur_trans; - ac = kmalloc(sizeof(*ac), GFP_NOFS); - if (!ac) - return -ENOMEM; - - INIT_WORK(&ac->work, do_async_commit); - ac->newtrans = btrfs_join_transaction(trans->root); - if (IS_ERR(ac->newtrans)) { - int err = PTR_ERR(ac->newtrans); - kfree(ac); - return err; - } + /* Kick the transaction kthread. */ + set_bit(BTRFS_FS_COMMIT_TRANS, &fs_info->flags); + wake_up_process(fs_info->transaction_kthread); /* take transaction reference */ cur_trans = trans->transaction; @@ -1912,14 +1876,6 @@ int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans) btrfs_end_transaction(trans); - /* - * Tell lockdep we've released the freeze rwsem, since the - * async commit thread will be the one to unlock it. - */ - if (ac->newtrans->type & __TRANS_FREEZABLE) - __sb_writers_release(fs_info->sb, SB_FREEZE_FS); - - schedule_work(&ac->work); /* * Wait for the current transaction commit to start and block * subsequent transaction joins @@ -1927,14 +1883,9 @@ int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans) wait_event(fs_info->transaction_blocked_wait, cur_trans->state >= TRANS_STATE_COMMIT_START || TRANS_ABORTED(cur_trans)); - if (current->journal_info == trans) - current->journal_info = NULL; - btrfs_put_transaction(cur_trans); - return 0; } - static void cleanup_transaction(struct btrfs_trans_handle *trans, int err) { struct btrfs_fs_info *fs_info = trans->fs_info; @@ -2200,6 +2151,13 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans) wait_event(cur_trans->writer_wait, atomic_read(&cur_trans->num_writers) == 1); + /* + * We've started the commit, clear the flag in case we were triggered to + * do an async commit but somebody else started before the transaction + * kthread could do the work. + */ + clear_bit(BTRFS_FS_COMMIT_TRANS, &fs_info->flags); + if (TRANS_ABORTED(cur_trans)) { ret = cur_trans->aborted; goto scrub_continue; diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index ba45065f9451..e4b9b251a29e 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -217,7 +217,7 @@ void btrfs_add_dead_root(struct btrfs_root *root); int btrfs_defrag_root(struct btrfs_root *root); int btrfs_clean_one_deleted_snapshot(struct btrfs_root *root); int btrfs_commit_transaction(struct btrfs_trans_handle *trans); -int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans); +void btrfs_commit_transaction_async(struct btrfs_trans_handle *trans); int btrfs_end_transaction_throttle(struct btrfs_trans_handle *trans); bool btrfs_should_end_transaction(struct btrfs_trans_handle *trans); void btrfs_throttle(struct btrfs_fs_info *fs_info); From patchwork Fri Nov 5 20:45:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605923 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42FE0C4332F for ; Fri, 5 Nov 2021 20:46:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2CDB76135A for ; Fri, 5 Nov 2021 20:46:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233650AbhKEUsj (ORCPT ); Fri, 5 Nov 2021 16:48:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56302 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233705AbhKEUsi (ORCPT ); Fri, 5 Nov 2021 16:48:38 -0400 Received: from mail-qt1-x82b.google.com (mail-qt1-x82b.google.com [IPv6:2607:f8b0:4864:20::82b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 17FFFC061714 for ; Fri, 5 Nov 2021 13:45:58 -0700 (PDT) Received: by mail-qt1-x82b.google.com with SMTP id 8so8296384qty.10 for ; Fri, 05 Nov 2021 13:45:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=L/nYdpdG5bpBnjTH0NMaB2UpDSiLeRTeXvP2uidFDng=; b=58x/0b7PCCp8pYLa0Ax0YSX+oZB/UXaFNvdds8+Qh0mr35y0GJ2W5SHDxbSTubMFHB A1qj/+WZiWiyiQzptKpJ0/72pcDfC4vZKop0GrSf1PbcMh1rEYriXQTE/RrGe0BouGV4 nQi2TU2z0opMnDz3zjFXjPXV50XmRqei7iAwiadm40X8BdVH3Tw7xltPn+70aLWswpyp FDIAy7Mc/zo3EGy/LOjvU5/o1FtWLpeyITlJjtoc+ZLu1kTTVp691+3998OSRvfTu68E 50Ht8FkzAjE/8heJXbWcbT3CGqh9VOt40rVit7wkVoFPVY8HGC6sbSlCAwMdaT4H+k1w ffCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=L/nYdpdG5bpBnjTH0NMaB2UpDSiLeRTeXvP2uidFDng=; b=kpsYBr7DJCnUjbsdyK/6M5/nZDZKKzMuO8ytOPEI/czb/gSLzBY4E7D/wqxtUGzPZ5 K9zLeL5v4uboAxT9KbTijnKP6lfWYorMaKqNjEGYinvI5MKoWmWjO3ZMklaoPCZJiiJh 3mvHdymwShFI7IXz743WUGjo1TBSjjDjNPe/2VGd8RD/kPHtRzS0ULlMNT2VTKpnl3x/ 90p2HdHJWuVFSWgacdHeoPgCP4xaM2clstwuD8AsgUeylp7yGnEslTDfgYLmr77lF9b0 JDvCAEiRDIae2xdIwhIpFX1rhjqkMy0Vhba8H8cRfNlSElH3QJHY7SX8bn+/Jo/OG4bI aB3Q== X-Gm-Message-State: AOAM5331upTarEud5lc0UqTd0RlTi+WpcF6Yd40hcpJHjmQ6yzyEm7U5 kpLxk9L0h25BKnvBbNtsYab1Hjj/9rwTRg== X-Google-Smtp-Source: ABdhPJzJbGGRYSlMq7gKyRb4+d+2yPRazBsGwUK/hpAcRp/UWbbNKFV9NAb2RbMnLoEzNtgzP7wNzQ== X-Received: by 2002:a05:622a:60f:: with SMTP id z15mr62701563qta.286.1636145156912; Fri, 05 Nov 2021 13:45:56 -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 az39sm6430572qkb.2.2021.11.05.13.45.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:45:56 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 03/25] btrfs: pass fs_info to trace_btrfs_transaction_commit Date: Fri, 5 Nov 2021 16:45:29 -0400 Message-Id: <26fac9990c46aec3f1113f32afd280fae5ed38a5.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The root on the trans->root can be anything, and generally we're committing from the transaction kthread so it's usually the tree_root. Change this to just take an fs_info, and to maintain compatibility simply put the ROOT_TREE_OBJECTID as the root objectid for the tracepoint. This will allow use to remove trans->root. Signed-off-by: Josef Bacik --- fs/btrfs/disk-io.c | 2 +- fs/btrfs/transaction.c | 4 ++-- include/trace/events/btrfs.h | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 4c4357724ed0..3bd3a06a9627 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4968,7 +4968,7 @@ static int btrfs_cleanup_transaction(struct btrfs_fs_info *fs_info) spin_unlock(&fs_info->trans_lock); btrfs_put_transaction(t); - trace_btrfs_transaction_commit(fs_info->tree_root); + trace_btrfs_transaction_commit(fs_info); spin_lock(&fs_info->trans_lock); } spin_unlock(&fs_info->trans_lock); diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index befe04019271..4738ad1d826e 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -1937,7 +1937,7 @@ static void cleanup_transaction(struct btrfs_trans_handle *trans, int err) btrfs_put_transaction(cur_trans); btrfs_put_transaction(cur_trans); - trace_btrfs_transaction_commit(trans->root); + trace_btrfs_transaction_commit(fs_info); if (current->journal_info == trans) current->journal_info = NULL; @@ -2351,7 +2351,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans) if (trans->type & __TRANS_FREEZABLE) sb_end_intwrite(fs_info->sb); - trace_btrfs_transaction_commit(trans->root); + trace_btrfs_transaction_commit(fs_info); btrfs_scrub_continue(fs_info); diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h index 8f58fd95efc7..0d729664b4b4 100644 --- a/include/trace/events/btrfs.h +++ b/include/trace/events/btrfs.h @@ -182,18 +182,18 @@ FLUSH_STATES TRACE_EVENT(btrfs_transaction_commit, - TP_PROTO(const struct btrfs_root *root), + TP_PROTO(const struct btrfs_fs_info *fs_info), - TP_ARGS(root), + TP_ARGS(fs_info), TP_STRUCT__entry_btrfs( __field( u64, generation ) __field( u64, root_objectid ) ), - TP_fast_assign_btrfs(root->fs_info, - __entry->generation = root->fs_info->generation; - __entry->root_objectid = root->root_key.objectid; + TP_fast_assign_btrfs(fs_info, + __entry->generation = fs_info->generation; + __entry->root_objectid = BTRFS_ROOT_TREE_OBJECTID; ), TP_printk_btrfs("root=%llu(%s) gen=%llu", From patchwork Fri Nov 5 20:45:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605927 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 45F15C433F5 for ; Fri, 5 Nov 2021 20:46:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 301266128E for ; Fri, 5 Nov 2021 20:46:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233733AbhKEUsl (ORCPT ); Fri, 5 Nov 2021 16:48:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56310 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233197AbhKEUsj (ORCPT ); Fri, 5 Nov 2021 16:48:39 -0400 Received: from mail-qv1-xf2e.google.com (mail-qv1-xf2e.google.com [IPv6:2607:f8b0:4864:20::f2e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7CB34C061205 for ; Fri, 5 Nov 2021 13:45:59 -0700 (PDT) Received: by mail-qv1-xf2e.google.com with SMTP id a24so8056283qvb.5 for ; Fri, 05 Nov 2021 13:45:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=JaEXAFvl6LEWgaqIupynca0Pk9JLSpVgQ8bP1uf2aKc=; b=lTal3Ezt/sTN+kgqofWWQ7yjRPcLCZ0HumFEPk/s7xoTpu+BlXgX8zIKKEferpMooJ SQwS4mDDMEaK5nK+BfZxGp6zQuB0wta/fShrSFkwNtAuRtNNbemaRLPmTkAtQuWfBJ7n LYKpTN7y2rHcNsrcNRLufkRprdR3KLdypmjQ6UdLhnM3U4stimf/RwE9q9RsxYOAkM9D nxA0Rvw9ypmwhwTpHokye38Xwa0CmdXewXobOI8Dj5GnlX+QRzqW1u1oYrxbm7XIIgjX AfMOI6LO+bFlY/tGZmblBBtyPGfjOqrOw/6viZS/ZNverhFVcRAY+IR5gglqEwLNTiY9 oTHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JaEXAFvl6LEWgaqIupynca0Pk9JLSpVgQ8bP1uf2aKc=; b=RXB1nLn9sftS/FAopbIbEP6HHEP1xq73Tq8+X8Hwo3IWeUkbDHHs+UgTA+9jU7Egs2 QMRwuxnHrZ4XpSpja964RDbWA4fAtcD8oZ7/Rd1z03F1QdRFyIss4FJLIAYNLQDLaMUu BSl9jyc2X/+5v6j4DlMs4+FMf+AttItgIiMA4QTujr2pgKdc6xlW3RipC7/zSkbMbqrv U//qsRYGLtK+XgK219ni5U36HKDVDeoElHLT5SZrnflF+0d+gw9UmYE1ZDFGsaQI6N63 Kwz0jALKvMDL9NgjUMRtSAgVZwHpxYeTztou9MBg4kIPcX7mAPU2UjNIo8JPVf8fGQpF ameA== X-Gm-Message-State: AOAM531maj1DnsY55sLkATpHiPG3qeTM/e1BEd0HydNn7VYyAKWYu/yZ wgseoentJwqis7eWkZqGalvg494pNFux4Q== X-Google-Smtp-Source: ABdhPJzaz79lQO0MEDxiqE6lICdb/ivPz1NrZCD3AGneJroMSV59iltalEKskWpm2HI120PuzOkm2w== X-Received: by 2002:a0c:f942:: with SMTP id i2mr1519813qvo.51.1636145158376; Fri, 05 Nov 2021 13:45:58 -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 q13sm6512214qtx.80.2021.11.05.13.45.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:45:57 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 04/25] btrfs: remove trans_handle->root Date: Fri, 5 Nov 2021 16:45:30 -0400 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Nobody is using this anymore, remove it. Signed-off-by: Josef Bacik --- fs/btrfs/transaction.c | 1 - fs/btrfs/transaction.h | 1 - 2 files changed, 2 deletions(-) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 4738ad1d826e..451788400e17 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -692,7 +692,6 @@ start_transaction(struct btrfs_root *root, unsigned int num_items, h->transid = cur_trans->transid; h->transaction = cur_trans; - h->root = root; refcount_set(&h->use_count, 1); h->fs_info = root->fs_info; diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index e4b9b251a29e..1852ed9de7fd 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -135,7 +135,6 @@ struct btrfs_trans_handle { bool removing_chunk; bool reloc_reserved; bool in_fsync; - struct btrfs_root *root; struct btrfs_fs_info *fs_info; struct list_head new_bgs; }; From patchwork Fri Nov 5 20:45:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605929 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 58DFCC4332F for ; Fri, 5 Nov 2021 20:46:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 409D16128E for ; Fri, 5 Nov 2021 20:46:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233735AbhKEUsl (ORCPT ); Fri, 5 Nov 2021 16:48:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56316 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233705AbhKEUsk (ORCPT ); Fri, 5 Nov 2021 16:48:40 -0400 Received: from mail-qt1-x834.google.com (mail-qt1-x834.google.com [IPv6:2607:f8b0:4864:20::834]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C5D2DC061714 for ; Fri, 5 Nov 2021 13:46:00 -0700 (PDT) Received: by mail-qt1-x834.google.com with SMTP id g13so7880094qtk.12 for ; Fri, 05 Nov 2021 13:46:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=8CZlK/mVRjCE83Floj+bdzaWZVtmNB/g8tMTKubriWc=; b=g7g7f7nzCm78efB/ozeAqi4d8ih1IIXRTZDPqj5wyd3AkZHfDruk30WzAng78nngA4 7wuh/GC9n3mu0h4LmN8ZBa4aPSFH+Y65t51PmK70g0m1WXjQLav2/JzSinWePtYUwkcI QwOVw+sfxmPIaL0937uaCE7qJo/2uNL9q4YJ9o3c6wjQycdoHnmTuNFTMKCOv5y0ByJM Y9yKPnVXzQ9P0Q0ooCYfTQFh0P+N8EwAXv6sI+bdY2h89YhNSTaRN19BzzX+tsutyimQ RpC1FvpXmMiIvhuWTmP0q4mVDRxGRZbN8uT885BqHK5eCkpnNetXy+u9e1EGlzw22ZLo jvuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8CZlK/mVRjCE83Floj+bdzaWZVtmNB/g8tMTKubriWc=; b=ssMwBn4AV5RkA5pvBCVUS1lbEk0NscQnt260a7Q/OVt5eaxh2FO5T+rJaKb9J2aRmT 7796IhkeQ4VZXoTDBlBA59zVQYpZ4n6uHXixqvCFa3427DLTZo6pxZ6n7cqtFsg+S1l0 mSZ55vppl9XYGTIRdrQyGFEHAmNgdewmck3J6D8bEB6/JfGI9daaXpjZiS5p6PH3PZ1n mCeAsd26rmBAD2AHam//f0or5S8igMm7HHDMJfMnGlROF/d0Ls6sXdm/gm4Gw7FqrbjK i0lmcHU/npkEZQ/LJ/gd75yNn2rGAEJT1wx0MSnKFiNWVlym85HkLt24AlF3I6ZYPrtS lTbw== X-Gm-Message-State: AOAM531NqfJgPPFC9B20uDsrhgkLlUmDv4We3Viuu9RhqajynZH87fml 3m65vKwTwsAeya/kDwo2u0RB5REXDK2PKw== X-Google-Smtp-Source: ABdhPJyiYF9C5aIUjsrly9JtyperJIoBhLV0H6EokdOcGmDsV9KmFRxAvKHL+EfTn0VUXY/SSboeXQ== X-Received: by 2002:ac8:5716:: with SMTP id 22mr33119529qtw.20.1636145159740; Fri, 05 Nov 2021 13:45: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 q13sm6068367qkl.7.2021.11.05.13.45.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:45:59 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 05/25] btrfs: pass the root to add_keyed_refs Date: Fri, 5 Nov 2021 16:45:31 -0400 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We pass in the path, but use btrfs_next_item() using the root we searched with. Pass the root down to add_keyed_refs() instead of the fs_info so we can continue to use the same root we searched with. Signed-off-by: Josef Bacik --- fs/btrfs/backref.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index f735b8798ba1..53140f6ba78a 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1049,12 +1049,12 @@ static int add_inline_refs(const struct btrfs_fs_info *fs_info, * * Returns 0 on success, <0 on error, or BACKREF_FOUND_SHARED. */ -static int add_keyed_refs(struct btrfs_fs_info *fs_info, +static int add_keyed_refs(struct btrfs_root *extent_root, struct btrfs_path *path, u64 bytenr, int info_level, struct preftrees *preftrees, struct share_check *sc) { - struct btrfs_root *extent_root = fs_info->extent_root; + struct btrfs_fs_info *fs_info = extent_root->fs_info; int ret; int slot; struct extent_buffer *leaf; @@ -1170,6 +1170,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, struct ulist *roots, const u64 *extent_item_pos, struct share_check *sc, bool ignore_offset) { + struct btrfs_root *root = fs_info->extent_root; struct btrfs_key key; struct btrfs_path *path; struct btrfs_delayed_ref_root *delayed_refs = NULL; @@ -1211,7 +1212,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, again: head = NULL; - ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0); + ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); if (ret < 0) goto out; BUG_ON(ret == 0); @@ -1271,7 +1272,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, &info_level, &preftrees, sc); if (ret) goto out; - ret = add_keyed_refs(fs_info, path, bytenr, info_level, + ret = add_keyed_refs(root, path, bytenr, info_level, &preftrees, sc); if (ret) goto out; From patchwork Fri Nov 5 20:45:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605931 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 54129C433F5 for ; Fri, 5 Nov 2021 20:46:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 412C06135A for ; Fri, 5 Nov 2021 20:46:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233719AbhKEUso (ORCPT ); Fri, 5 Nov 2021 16:48:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56326 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233724AbhKEUsm (ORCPT ); Fri, 5 Nov 2021 16:48:42 -0400 Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A2547C061714 for ; Fri, 5 Nov 2021 13:46:02 -0700 (PDT) Received: by mail-qt1-x82f.google.com with SMTP id w9so3234082qtk.13 for ; Fri, 05 Nov 2021 13:46:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=u/M/Q4QHG8MY4NqRtxXE3pMvPpVP5i/CBa8oOhB4jaY=; b=QmMVaNZELbuFGuaf70vOSVMMC4Nj8ZpdVTula5DpagiVkS+iiPEUuxPg4M82Kb2FBu L48RT6FwyuD6swtlq27vJEInXMABThy4nk/faiIGf3X7ioU9Yo3ZJz5Z8d0SYvPt5KTW 7od4sny2J8a8HbuAHsFfzPtKU8ielXB4WVJPB6MGu+tPhhBNZ41KW5I3H77d5YCSGmw2 3HIfGVaEfCNM2rqyRzj4KjIzx4EtRt7HEPmJVurlQgIY/7en7p4JRr1SaNlhKJlrTNLJ kbQO6JhO/UHbZtzFsUbb95YEYIpn9hhGo4zoQgPLOK8vbgocBokloIHEYrfWVFrfmZdS s3mQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=u/M/Q4QHG8MY4NqRtxXE3pMvPpVP5i/CBa8oOhB4jaY=; b=apd+eNU5vPyiWOScl8ZdFZhbHxGE8LrKqFIFd0fsTiLmOSWiO3CuppyEtFaOkGq6/9 IS/l0O5tblYZyLaOxHJT7KKV6RoY8hthl4TrSRFNb5cmxixZNOqWMrG3QfGDHc54k1Qs KTPdeCAaGOuL30MzQDiVdXX36K4OksA1v1Ag6JWt5aRYAwaDatM1hXTKvMVQrWyRbt0G KnBVf/sXWVoOeMZY755Gev1URRWNPqH+ZVI4udl6oZLGRNBTVCeJoEyGtGkUCXwSVFFg A9W/suzU/NcKzW+0HY/dVWwqM0vrF8EgrCgOHhYwKHBtmZL8I73BF9k8QTRx5xTHGikz 5WtQ== X-Gm-Message-State: AOAM531nC9BZ7GV7fkceFcpy+S12uEan6vJCdsmeXiUmc85mcTwN5ibj +7S9ekdZI8pKoKFeY9N/MKyjyLHz4IsK1g== X-Google-Smtp-Source: ABdhPJyEfjclfytRBYu2fYLt+chIGX6eiEOF7itbDc+779W6xNpsKBOjcZPjoAxQtnsTTo7qHm87bg== X-Received: by 2002:a05:622a:593:: with SMTP id c19mr65494889qtb.240.1636145161514; Fri, 05 Nov 2021 13:46: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 v3sm4427268qtw.53.2021.11.05.13.46.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:01 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 06/25] btrfs: move comment in find_parent_nodes() Date: Fri, 5 Nov 2021 16:45:32 -0400 Message-Id: <1074b1a14b58f421ac7be6ff12192af991d2d7dc.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This comment was much closer to the related code when it was originally added, but has slowly migrated north far from its ancestral lands. Move it back down with its people. Signed-off-by: Josef Bacik --- fs/btrfs/backref.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 53140f6ba78a..17766b7635f9 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1204,11 +1204,6 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, if (time_seq == BTRFS_SEQ_LAST) path->skip_locking = 1; - /* - * grab both a lock on the path and a lock on the delayed ref head. - * We need both to get a consistent picture of how the refs look - * at a specified point in time - */ again: head = NULL; @@ -1224,8 +1219,10 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, if (trans && time_seq != BTRFS_SEQ_LAST) { #endif /* - * look if there are updates for this ref queued and lock the - * head + * We have a specific time_seq we care about and trans which + * means we have the path lock, we need to grab the ref head and + * lock it so we have a consistent view of the refs at the given + * time. */ delayed_refs = &trans->transaction->delayed_refs; spin_lock(&delayed_refs->lock); From patchwork Fri Nov 5 20:45:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605933 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1EFBEC4332F for ; Fri, 5 Nov 2021 20:46:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0AA5861288 for ; Fri, 5 Nov 2021 20:46:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233742AbhKEUso (ORCPT ); Fri, 5 Nov 2021 16:48:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56332 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233729AbhKEUso (ORCPT ); Fri, 5 Nov 2021 16:48:44 -0400 Received: from mail-qt1-x82b.google.com (mail-qt1-x82b.google.com [IPv6:2607:f8b0:4864:20::82b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F3075C061714 for ; Fri, 5 Nov 2021 13:46:03 -0700 (PDT) Received: by mail-qt1-x82b.google.com with SMTP id d21so8297167qtw.11 for ; Fri, 05 Nov 2021 13:46:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=rg/IjMPlPfL33FJPhmbLuem6SioCUK7Z9ZpA4q6dSZA=; b=MlOiT5TD8ckLXunO7A1N1YQunOeUqJlDtD4H/2jdb40oLkCVqOum25uE2LfHz9aRZu d4Vbn8Hz0sftFtKOe4m7GqbfxhbebBaoPH4rr59JMaS/KTIcaQN+Zg2nD/MDpxVNWKTj KRywrTSfEmtxiy615Nqo2ogFiPKvzP5ffdlj2J7+AGbjWInda+0Cc7357uDOlI/lOvT+ Tw8z6VxT/Zqsn4Vvhu3N5UOBd3zjJzacfu9nKe66KPR2XC3EeGOyqhqpOOoFVf5Bgkoq +Oh0GjZ5TRVwcxY2CTu1t0tIv9zxPaMfDK541Ex/NKZZaaVjMcyhmtS71LSGfoOSlwwC 2uuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rg/IjMPlPfL33FJPhmbLuem6SioCUK7Z9ZpA4q6dSZA=; b=OwVEjffpuGU0A95mLgezMxfKJUETIu9jG6/CD9QqH4wOAGaWeeBtRq6GS0sE6W1fM5 64tfXOKgMOBZIC0AzDZubeYLozqjf+Zv0wApj6EuhYIvkv0dY4htCM9EXZa+IfsL+eYd AgV5A7SzbxttvgeMRPW/fDZzH/xFxFukhuAWIL5S7cjHXb19aK4iXuWpagKfNoL+eeGZ E8j+ihKsxPDepAQRiVWmEDMr/CICWSsGKcG4CfhOGzQcRV+CW9AQaqMoXgew/+KULR9R 0sctEE6WfN4fnpadNuaF22P+o/aDspK8m9OwyHciq57+XYvXvt7KE9woRpURYAOqz1h7 8sYQ== X-Gm-Message-State: AOAM531qCcVNWOVO98tbH22jpG/0VMnvh1bQeE+Q2hTxbGWkw15FwMaY n3ECJGHcsYnSGZuIXMFCzE7Kx8xQZKwwyA== X-Google-Smtp-Source: ABdhPJxF5OB6Dn2RtqiRsfWR+7jjyncHFT84P2s3ytsyCgRKpTGi3d7I3PHqvxVNcOo+n4METEI7ng== X-Received: by 2002:a05:622a:1905:: with SMTP id w5mr23482484qtc.207.1636145162906; Fri, 05 Nov 2021 13:46:02 -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 v19sm7100556qtk.6.2021.11.05.13.46.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:02 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 07/25] btrfs: remove SANITY_TESTS check form find_parent_nodes Date: Fri, 5 Nov 2021 16:45:33 -0400 Message-Id: <7fec7de2b2142ed5dd4e2a45602c6c68290a51b0.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We define __TRANS_DUMMY always, so this extra ifdef stuff is not needed. Signed-off-by: Josef Bacik --- fs/btrfs/backref.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 17766b7635f9..12276ff08dd4 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1212,12 +1212,8 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, goto out; BUG_ON(ret == 0); -#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS if (trans && likely(trans->type != __TRANS_DUMMY) && time_seq != BTRFS_SEQ_LAST) { -#else - if (trans && time_seq != BTRFS_SEQ_LAST) { -#endif /* * We have a specific time_seq we care about and trans which * means we have the path lock, we need to grab the ref head and From patchwork Fri Nov 5 20:45:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605935 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 950B5C433FE for ; Fri, 5 Nov 2021 20:46:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7F60D61372 for ; Fri, 5 Nov 2021 20:46:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233751AbhKEUsr (ORCPT ); Fri, 5 Nov 2021 16:48:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56342 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233724AbhKEUsp (ORCPT ); Fri, 5 Nov 2021 16:48:45 -0400 Received: from mail-qk1-x72e.google.com (mail-qk1-x72e.google.com [IPv6:2607:f8b0:4864:20::72e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6C31EC061714 for ; Fri, 5 Nov 2021 13:46:05 -0700 (PDT) Received: by mail-qk1-x72e.google.com with SMTP id bj27so8225450qkb.11 for ; Fri, 05 Nov 2021 13:46:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=f0HqbDC5KkXztO3gbBUEK9ah3Vq667HdnflXe5N1lqA=; b=O+xsYroj7UdGg87xsSoz1ySaNFrnyc6oFu9yIUhqTUpz4ob3SE53H8q4qXoBt/lvW5 bGy/9LdXlhIdcpdyFAnrw58g43wRO7SAJ8c3qPHIW9ZGnKA5IVQ5ZxhSIVVGFNZGXujs FX26BlUJJUEGO3xZskEA9IuoUvV8AOP5rge/Eamiso8lSeMy+OXEtFHGqKrv6r++TdUT nH8BWukjNUmMsFs/1CdpFd0FMIxp1zlvNIHpaMYcBYtXargsnXdouM20Z9xSRBzGeI43 LCtN3h3pK+Dn66OXmVt1vftMU4F24gxkae+RQEl25i5AQvgK804F56NOy0xioLDmeDyb UGJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=f0HqbDC5KkXztO3gbBUEK9ah3Vq667HdnflXe5N1lqA=; b=Qz+EYkdHAsmojqpxbEZ3gN0GonYbQiQ2/hETXvrkOlyvkFxBMevGlf3dNba4OFL7hS SRdme4gq4k5j55OHloTWds0wfx2lvE0dqOKtiS0Dkit5NSSEGUKQMm6w1tYgXoaoYDfv K7gHfhazQcE8Zv1BvxVJ6/Wx3CiLAu88cVwLYeQ/eXcafEY6uSSLTVHdFWl/jYvAVtcG Tu8znX7FvWpW64ieRnsRTxvCCpFPO40Yik+NQeTe/MAF6/sRIXfmj/PWcQgeTQLh8SIf jMUTHVYvgKAcx7Wk42NOPB1BIUzFtjfF8AylDiNiifTZJZ40lreG9jD2HoWeM/C7I7mX QL2g== X-Gm-Message-State: AOAM531OSN2HrslZ0vDIpy2oVrftt42ipcHjAZCBSvdCrOqhx/ICrDDU SSGW8QumDIXC9ucgRvws7ngJkbdxR9bZ9g== X-Google-Smtp-Source: ABdhPJz5ZntxW5HVz4/+M/ZV2mWBm1Tw0zEK6CzdSBvcz729s4HZ4qmn1Jli1OlbyS7G8IGOvFTcFQ== X-Received: by 2002:a05:620a:280a:: with SMTP id f10mr48915060qkp.118.1636145164397; Fri, 05 Nov 2021 13:46:04 -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 bq30sm6230673qkb.6.2021.11.05.13.46.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:03 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 08/25] btrfs: remove BUG_ON() in find_parent_nodes() Date: Fri, 5 Nov 2021 16:45:34 -0400 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We search for an extent entry with .offset = -1, which shouldn't be a thing, but corruption happens. Add an ASSERT() for the developers, return -EUCLEAN for mortals. Signed-off-by: Josef Bacik --- fs/btrfs/backref.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 12276ff08dd4..7d942f5d6443 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1210,7 +1210,12 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); if (ret < 0) goto out; - BUG_ON(ret == 0); + if (ret == 0) { + /* This shouldn't happen, indicates a bug or fs corruption. */ + ASSERT(ret != 0); + ret = -EUCLEAN; + goto out; + } if (trans && likely(trans->type != __TRANS_DUMMY) && time_seq != BTRFS_SEQ_LAST) { From patchwork Fri Nov 5 20:45:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605937 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BA428C4332F for ; Fri, 5 Nov 2021 20:46:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A52E66135A for ; Fri, 5 Nov 2021 20:46:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233744AbhKEUsz (ORCPT ); Fri, 5 Nov 2021 16:48:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56350 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233749AbhKEUsr (ORCPT ); Fri, 5 Nov 2021 16:48:47 -0400 Received: from mail-qt1-x836.google.com (mail-qt1-x836.google.com [IPv6:2607:f8b0:4864:20::836]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BACD7C061208 for ; Fri, 5 Nov 2021 13:46:06 -0700 (PDT) Received: by mail-qt1-x836.google.com with SMTP id x10so7898237qta.6 for ; Fri, 05 Nov 2021 13:46:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Sl9rRM8WKYAZdMUVkJ5dq4FI5jhQCExoCrLWbxgbQf8=; b=HlcRSIR1f6xsz87NP5yU48MlxTHa8GYjUFQ77Zj2MOaJ7D8dTkmHy1jS4Az8wqbWWx BlhM0VD+jGYyj8S9So6JPa5SmOuRE/JT8cuFTB9haZ+K2zTfQXZocDTNMVPddxxBQgw+ /R6iPyal2RdpQXlZSYpelvQi9P1Zm/zFPKUla3T0JPM5nL3aCL3DZ1lRP6AW5AxzrWfo 1MSJFKtqGgkZI5cF78HxEReKtHOECnSxw1Fpwcdvk/0bsrHbXvoMxZ+5zoxM9st4OxC+ Ee3qxp+tFm6Alv0PWQgEYmkhBA+Z719zsREaX50n7hekHgL13Z+f/pwAL0iS7rhLfEHs n6jQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Sl9rRM8WKYAZdMUVkJ5dq4FI5jhQCExoCrLWbxgbQf8=; b=GjbCyxdKqnxhJpWHO0wOdfbe0g5eYv6a+ehNgZYgOMfP5Z0iUG1xaCm0AERs5Lwnxe mmFl1lnh6TBwHfJGFQfMIA8KvBzYVYuGXozPUmstsxM6AOPMP0MrUPprlMLG1syIdu2E s3s1sO1EyAF747PvhlCqf8gjNJke37v2oguIaIuZp3HB74DshpRCcQ7U3lC239F3FKV0 RkKcaw04mii8/Esxn3SpqDGRfT3Y5dFev0EjDxZ4DipDaJ9zT0cPuQcwbuHOTeVBmMes bCa7wtdTB/0sMDHwKSFO/P3mPFa3NpP9L9+FvyNI22Mc1XwJnEwPXApwAKllVYnIZ2c6 0j6g== X-Gm-Message-State: AOAM532EHU51y82sTNhLbaP8BmpNzNnCk9oGgsT8HXZv5xHuhmfch38F a7Z9G1GOwvHxj+UPs8LZ6gzGKkL8+b+N1Q== X-Google-Smtp-Source: ABdhPJyeR6JUmtbT78PxhvOgHlexUpiWojkCvJdvFDO9af6fnTiS1DJNBT6SQQlzceMGtoGneGEZDQ== X-Received: by 2002:a05:622a:49:: with SMTP id y9mr64774858qtw.301.1636145165702; Fri, 05 Nov 2021 13:46: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 j22sm6481608qko.121.2021.11.05.13.46.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:05 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 09/25] btrfs: remove BUG_ON(!eie) in find_parent_nodes Date: Fri, 5 Nov 2021 16:45:35 -0400 Message-Id: <21a64e8283e1d7567aff82e07826e8631d6123c1.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org If we're looking for leafs that point to a data extent we want to record the extent items that point at our bytenr. At this point we have the reference and we know for a fact that this leaf should have a reference to our bytenr. However if there's some sort of corruption we may not find any references to our leaf, and thus could end up with eie == NULL. Replace this BUG_ON() with an ASSERT() and then return -EUCLEAN for the mortals. Signed-off-by: Josef Bacik --- fs/btrfs/backref.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 7d942f5d6443..72ca4334186c 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1359,10 +1359,18 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, goto out; if (!ret && extent_item_pos) { /* - * we've recorded that parent, so we must extend - * its inode list here + * We've recorded that parent, so we must extend + * its inode list here. + * + * However if there was corruption we may not + * have found an eie, return an error in this + * case. */ - BUG_ON(!eie); + ASSERT(eie); + if (!eie) { + ret = -EUCLEAN; + goto out; + } while (eie->next) eie = eie->next; eie->next = ref->inode_list; From patchwork Fri Nov 5 20:45:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605941 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8493CC4321E for ; Fri, 5 Nov 2021 20:46:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6D5C361288 for ; Fri, 5 Nov 2021 20:46:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233726AbhKEUs4 (ORCPT ); Fri, 5 Nov 2021 16:48:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56356 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233756AbhKEUss (ORCPT ); Fri, 5 Nov 2021 16:48:48 -0400 Received: from mail-qt1-x836.google.com (mail-qt1-x836.google.com [IPv6:2607:f8b0:4864:20::836]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 19BE3C06120A for ; Fri, 5 Nov 2021 13:46:08 -0700 (PDT) Received: by mail-qt1-x836.google.com with SMTP id w4so7246797qtn.2 for ; Fri, 05 Nov 2021 13:46:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=qFo66iPkSqMDUawfz5gOpd9YXCaqa9bYkfGTO+ClMq0=; b=4EAsi70vHdM6zp0LieTm4x49u8CH9fHK3eurH9kjmMzosXZ3+LKmiQHhFI/fymb1yL sHhGVJzB7ezAun0mJ8XAJGj/zbCc/CLocoP76VXKsG//NZw/LVH2/F+JlQGbWrf9HyG7 iRIxRIGfqqz2o22wMzqEop/S6xwdVguuXsY+EVIQscopG6puMqUDZNjneij1i2zzpcSH ChohvIWxwRTxY+IdWw4MzU802g1hK/ddVN78w4LhiWuThTAixCAwpZ94jOT4Jr2CLin1 FKnw2coLLw1NXIsoba1C3Oy9ZLIyfxsVOiSc4Wzm//rfckMieaAxOQ/PCbE4sYtXNQlW LuIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qFo66iPkSqMDUawfz5gOpd9YXCaqa9bYkfGTO+ClMq0=; b=s2TgG01UG0gwFJAnq7kABZHa+5RGtsVp1Ky0TkTvxbXmijz/bv2+A79BqRyDIZDQkX N9XF4h5e7W9Wym7YXZ4KgxiQRGi6TdXX0uz1QfQncrhwSlG94Y6XpG4/CuFP6F6aImpW wjnGToo7Aq5G3ZMmr7LW7Kz10srP0bDAvHqKSe9Ox9YjN4eliksgdaJSbe50dp9qNvbU xXsQF38ZhmGJpKvBNxkueXY0D7vI//DTEJeEcmuyprY2QMSQCDlYVtev0lhbnVhOCkIY 6j0Lp71Z3016oAycGC0elBwDKdIVEjTi8FWoEZvuXLkYu+m6Hridpzg+WsOVxvEXBqoG b1Wg== X-Gm-Message-State: AOAM533vuMxfWeAXyxqnw7w1XBzMO/hTulJww7G1hVtDi97LBdb1wVWS UAuvMr1M6jkZ/6o4V4fsokM/jXF2McOxdQ== X-Google-Smtp-Source: ABdhPJylxsoVSfpD0LozrbXHug3QSm2lj7s59NiSFUC1vNMIh24KYKo0c+v7xQBmOUdwJ4ztosOFMQ== X-Received: by 2002:ac8:5c92:: with SMTP id r18mr9976758qta.135.1636145167063; Fri, 05 Nov 2021 13:46: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 o14sm6746079qtv.34.2021.11.05.13.46.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:06 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 10/25] btrfs: add a btrfs_block_group_root() helper Date: Fri, 5 Nov 2021 16:45:36 -0400 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org With extent tree v2 we will have a separate root to hold the block group items. Add a btrfs_block_group_root() that will return the appropriate root given the flags of the fs, and convert all functions that need to modify block group items to use the helper. Signed-off-by: Josef Bacik --- fs/btrfs/block-group.c | 19 ++++++++++--------- fs/btrfs/disk-io.h | 5 +++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 2390df7fa345..b5dfb1e3446e 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -841,7 +841,7 @@ static int remove_block_group_item(struct btrfs_trans_handle *trans, struct btrfs_key key; int ret; - root = fs_info->extent_root; + root = btrfs_block_group_root(fs_info); key.objectid = block_group->start; key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; key.offset = block_group->length; @@ -1106,6 +1106,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, struct btrfs_trans_handle *btrfs_start_trans_remove_block_group( struct btrfs_fs_info *fs_info, const u64 chunk_offset) { + struct btrfs_root *root = btrfs_block_group_root(fs_info); struct extent_map_tree *em_tree = &fs_info->mapping_tree; struct extent_map *em; struct map_lookup *map; @@ -1139,8 +1140,7 @@ struct btrfs_trans_handle *btrfs_start_trans_remove_block_group( num_items = 3 + map->num_stripes; free_extent_map(em); - return btrfs_start_transaction_fallback_global_rsv(fs_info->extent_root, - num_items); + return btrfs_start_transaction_fallback_global_rsv(root, num_items); } /* @@ -1678,7 +1678,7 @@ static int find_first_block_group(struct btrfs_fs_info *fs_info, struct btrfs_path *path, struct btrfs_key *key) { - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_block_group_root(fs_info); int ret; struct btrfs_key found_key; struct extent_buffer *leaf; @@ -2165,6 +2165,7 @@ static int fill_dummy_bgs(struct btrfs_fs_info *fs_info) int btrfs_read_block_groups(struct btrfs_fs_info *info) { + struct btrfs_root *root = btrfs_block_group_root(info); struct btrfs_path *path; int ret; struct btrfs_block_group *cache; @@ -2173,7 +2174,7 @@ int btrfs_read_block_groups(struct btrfs_fs_info *info) int need_clear = 0; u64 cache_gen; - if (!info->extent_root) + if (!root) return fill_dummy_bgs(info); key.objectid = 0; @@ -2276,7 +2277,7 @@ static int insert_block_group_item(struct btrfs_trans_handle *trans, { struct btrfs_fs_info *fs_info = trans->fs_info; struct btrfs_block_group_item bgi; - struct btrfs_root *root; + struct btrfs_root *root = btrfs_block_group_root(fs_info); struct btrfs_key key; spin_lock(&block_group->lock); @@ -2289,7 +2290,6 @@ static int insert_block_group_item(struct btrfs_trans_handle *trans, key.offset = block_group->length; spin_unlock(&block_group->lock); - root = fs_info->extent_root; return btrfs_insert_item(trans, root, &key, &bgi, sizeof(bgi)); } @@ -2543,12 +2543,13 @@ int btrfs_inc_block_group_ro(struct btrfs_block_group *cache, { struct btrfs_fs_info *fs_info = cache->fs_info; struct btrfs_trans_handle *trans; + struct btrfs_root *root = btrfs_block_group_root(fs_info); u64 alloc_flags; int ret; bool dirty_bg_running; do { - trans = btrfs_join_transaction(fs_info->extent_root); + trans = btrfs_join_transaction(root); if (IS_ERR(trans)) return PTR_ERR(trans); @@ -2653,7 +2654,7 @@ static int update_block_group_item(struct btrfs_trans_handle *trans, { struct btrfs_fs_info *fs_info = trans->fs_info; int ret; - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_block_group_root(fs_info); unsigned long bi; struct extent_buffer *leaf; struct btrfs_block_group_item bgi; diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index a2b5db4ba262..baca29523d35 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h @@ -103,6 +103,11 @@ static inline struct btrfs_root *btrfs_grab_root(struct btrfs_root *root) return NULL; } +static inline struct btrfs_root *btrfs_block_group_root(struct btrfs_fs_info *fs_info) +{ + return fs_info->extent_root; +} + void btrfs_put_root(struct btrfs_root *root); void btrfs_mark_buffer_dirty(struct extent_buffer *buf); int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid, From patchwork Fri Nov 5 20:45:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605939 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E080EC43217 for ; Fri, 5 Nov 2021 20:46:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CEC3C6135A for ; Fri, 5 Nov 2021 20:46:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233749AbhKEUs5 (ORCPT ); Fri, 5 Nov 2021 16:48:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56366 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233724AbhKEUst (ORCPT ); Fri, 5 Nov 2021 16:48:49 -0400 Received: from mail-qv1-xf36.google.com (mail-qv1-xf36.google.com [IPv6:2607:f8b0:4864:20::f36]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7B9A2C06120B for ; Fri, 5 Nov 2021 13:46:09 -0700 (PDT) Received: by mail-qv1-xf36.google.com with SMTP id u16so8070988qvk.4 for ; Fri, 05 Nov 2021 13:46:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=qi22l4TAYaYOCH//25fd4g9toXBPnCIefzcYDmUrsdA=; b=rbX72g/DzVRcttsa+eu/QiRO1Jt0oLcwUsZwQjmZt32KcM8KN92eftPAzIcnzk/6X9 8Q6WCHhfeQ4hFvmvernGTQo98kdJVFZ38CmNvk12op7Q5kCv1b0PSeW3StFt3j3xITdJ YTVp8KPQFlufq/m0gi0Xxx4+ODR1BhzyQ2oltWdRmWT1gWVrHhbf9WIBVTpH3pndi6oa pmKV0CIrrrVJyPEXWqW765wPaaPi14APR+LuX+b4PoqflqVk7S3Spq+ArBysE9R+hpAN UWpAGgIRCLPnLUrZxogHESpA+7DKNb0nTsuVs0K7PFDvWMKyBjSuw1pD75aXhv7qG0QN 5NIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qi22l4TAYaYOCH//25fd4g9toXBPnCIefzcYDmUrsdA=; b=J7dGG5wEh02LmcQlPiUbfbxnmEM1UGkswfqfgIVTYMxCa1u6/duUCI+lLKq//BiqbC 9Kp/ofvS/57gMRQduKbwwjN8KHl4IPqrmsGHy6Zdf6pq0DYj8/vrnkfvoEEJpFY9DrTv +abVeIrAviZzq6Y355TPYaHjtKJhTd+TX83jNvNSarDl7q7bjzToawo/NhlAfsuZ9s0a RZAeiSxQEJuE/l2Ceh1Sb3aYjX+O+q+QiRYM2dphow7lbAOjGIxMxRcH8hpX4Y9TBTnm RUlwvRHg5DDGKFVMV2XFJySWKWqGPSjK79aRNGpmxJ4T98az0gmtyH1DojFaQU+/Lzw/ K/wg== X-Gm-Message-State: AOAM532X91eqHJ0GJ7X/RZp2go2kUBPhUoClyEB4tWiXtBJHmxXTO+eB 2FwWhwLX53moZ3AFH3ybHgsHivqGxnUnyQ== X-Google-Smtp-Source: ABdhPJwdPIUtJd6BxvjUnWG2PVYTr49C0GGWn0d1o7fLl/LSI3itxZDkSqI4W8I6V9pEeTfkUJJbsA== X-Received: by 2002:a05:6214:ace:: with SMTP id g14mr20359733qvi.12.1636145168447; Fri, 05 Nov 2021 13:46:08 -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 e10sm6398269qte.57.2021.11.05.13.46.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:08 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 11/25] btrfs: make remove_extent_backref pass the root Date: Fri, 5 Nov 2021 16:45:37 -0400 Message-Id: <7424f75366a05ed0660adc5a9330580ceea987e2.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org With extent tree v2 we'll have a different extent root based on where the bytenr is located, so adjust the remove_extent_backref() helper and it's helpers to pass the extent_root around. Signed-off-by: Josef Bacik --- fs/btrfs/extent-tree.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 3fd736a02c1e..c33f3dc6b322 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -593,6 +593,7 @@ static noinline int insert_extent_data_ref(struct btrfs_trans_handle *trans, } static noinline int remove_extent_data_ref(struct btrfs_trans_handle *trans, + struct btrfs_root *root, struct btrfs_path *path, int refs_to_drop, int *last_ref) { @@ -626,7 +627,7 @@ static noinline int remove_extent_data_ref(struct btrfs_trans_handle *trans, num_refs -= refs_to_drop; if (num_refs == 0) { - ret = btrfs_del_item(trans, trans->fs_info->extent_root, path); + ret = btrfs_del_item(trans, root, path); *last_ref = 1; } else { if (key.type == BTRFS_EXTENT_DATA_REF_KEY) @@ -1174,6 +1175,7 @@ int insert_inline_extent_backref(struct btrfs_trans_handle *trans, } static int remove_extent_backref(struct btrfs_trans_handle *trans, + struct btrfs_root *root, struct btrfs_path *path, struct btrfs_extent_inline_ref *iref, int refs_to_drop, int is_data, int *last_ref) @@ -1185,11 +1187,11 @@ static int remove_extent_backref(struct btrfs_trans_handle *trans, update_inline_extent_backref(path, iref, -refs_to_drop, NULL, last_ref); } else if (is_data) { - ret = remove_extent_data_ref(trans, path, refs_to_drop, + ret = remove_extent_data_ref(trans, root, path, refs_to_drop, last_ref); } else { *last_ref = 1; - ret = btrfs_del_item(trans, trans->fs_info->extent_root, path); + ret = btrfs_del_item(trans, root, path); } return ret; } @@ -2996,9 +2998,9 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, goto err_dump; } /* Must be SHARED_* item, remove the backref first */ - ret = remove_extent_backref(trans, path, NULL, - refs_to_drop, - is_data, &last_ref); + ret = remove_extent_backref(trans, extent_root, path, + NULL, refs_to_drop, is_data, + &last_ref); if (ret) { btrfs_abort_transaction(trans, ret); goto out; @@ -3122,8 +3124,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, btrfs_mark_buffer_dirty(leaf); } if (found_extent) { - ret = remove_extent_backref(trans, path, iref, - refs_to_drop, is_data, + ret = remove_extent_backref(trans, extent_root, path, + iref, refs_to_drop, is_data, &last_ref); if (ret) { btrfs_abort_transaction(trans, ret); From patchwork Fri Nov 5 20:45:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605945 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6E47CC4332F for ; Fri, 5 Nov 2021 20:46:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5A3DE61371 for ; Fri, 5 Nov 2021 20:46:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233770AbhKEUs6 (ORCPT ); Fri, 5 Nov 2021 16:48:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56384 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233702AbhKEUsy (ORCPT ); Fri, 5 Nov 2021 16:48:54 -0400 Received: from mail-qv1-xf31.google.com (mail-qv1-xf31.google.com [IPv6:2607:f8b0:4864:20::f31]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C8ADBC06120C for ; Fri, 5 Nov 2021 13:46:10 -0700 (PDT) Received: by mail-qv1-xf31.google.com with SMTP id j9so8035135qvm.10 for ; Fri, 05 Nov 2021 13:46:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Y3EH2S1uEdEQIUVMGMRkKsAHb4F1HDuXnPK5IewSzcE=; b=qV/FxelZvqjtXCDsCzREBbiI1UO0SgoyOax4AOGfzWuQ7WephlFsBiprfjFR9PMcFb byXKepubQEo5v1F1N4W4TQkVPehG7h40toyd1bnM08gfmF7Zlgr2rONFBanV1/quRWqT x9VX6yx3kv3igOBVVqUe5CBVygjSmM1Ki27Ekfo4u7fLpa0KWM1hIFwKV3jCWPNWXbwM RKI9TSECZ2u2ZidNL1iUxwgyh2bsB9Az327LgDy/bGLHY+XMhII/gwYfgff1tOlQ2nwx 9wVo5BobTDg9uqAAUq6hmM9vOBcCu9PjNg3T8tycnbkgTSI9MEShO9ddShcdV32pOyco Guag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Y3EH2S1uEdEQIUVMGMRkKsAHb4F1HDuXnPK5IewSzcE=; b=N9qfhKPojZHeWxBdHGmR9ZTVcp4rydAGMsul9jK/kgWga1qCLk1u8a9/X3DhWehgv/ x2u49rzAjI3kXLLvZTICUqF7IgDu3yl5ZxZkKBonGR/x6Gqmd9VqjDkKYL52Q4GKQPNa Ire6IRn8jSEiR+cAaSil4WGiVDtJhLidXUoK0WdXsuhw3zDlRWZmhY6Py7mzMnXxk8JM HNGZKRB5S5754tHgPeu03w3SN3xAg3oEiyCZ2f1KWA5F25XkR68m+3XBWGMkz7PmKIss sKhes/f+0sEEo7VVE0cSeYuytFrVPGQK//cUO9TTsClLC4rgMUphHQNQ+h8j4XIWJ7Yg Jypg== X-Gm-Message-State: AOAM532bOrB1oMUs7j6ndYiFlb0m1jydy+fEuUFysCjTMTis01k925KT oa6OliIstdRpd+58Fl05fuRQSnzymYCO/Q== X-Google-Smtp-Source: ABdhPJxZEbbjrpWIKPlhLMDWA+GAZNbwrhMPFnOfXaFNBeYpH9GAL1jtoFbKVv/c4e1g+Cd+AusvWA== X-Received: by 2002:a05:6214:e8b:: with SMTP id hf11mr5215148qvb.40.1636145169762; Fri, 05 Nov 2021 13:46:09 -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 h14sm6665758qth.23.2021.11.05.13.46.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:09 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 12/25] btrfs: use chunk_root in find_free_extent_update_loop Date: Fri, 5 Nov 2021 16:45:38 -0400 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We're only using this to start the transaction with to possibly allocate a chunk. It doesn't really matter which root to use, but with extent tree v2 we'll need a bytenr to look up a extent root which makes the usage of the extent_root awkward here. Simply change it to the chunk_root. Signed-off-by: Josef Bacik --- fs/btrfs/extent-tree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index c33f3dc6b322..f40b97072231 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -3977,7 +3977,7 @@ static int find_free_extent_update_loop(struct btrfs_fs_info *fs_info, struct find_free_extent_ctl *ffe_ctl, bool full_search) { - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = fs_info->chunk_root; int ret; if ((ffe_ctl->loop == LOOP_CACHING_NOWAIT) && From patchwork Fri Nov 5 20:45:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605943 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CF276C4167D for ; Fri, 5 Nov 2021 20:46:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BA48E61357 for ; Fri, 5 Nov 2021 20:46:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233764AbhKEUs6 (ORCPT ); Fri, 5 Nov 2021 16:48:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56382 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233692AbhKEUsy (ORCPT ); Fri, 5 Nov 2021 16:48:54 -0400 Received: from mail-qv1-xf2b.google.com (mail-qv1-xf2b.google.com [IPv6:2607:f8b0:4864:20::f2b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6DF42C06120D for ; Fri, 5 Nov 2021 13:46:12 -0700 (PDT) Received: by mail-qv1-xf2b.google.com with SMTP id b17so8061699qvl.9 for ; Fri, 05 Nov 2021 13:46:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=KWqG04N+0b18rI5H3e90yELKXPTBpkvGbJ/cK8Ilj/A=; b=oSW7g/2RTD58nWuo3SwDAhuvT8ae2pSEHwfhXusEAKuuJOmtCOj0DpCACaH1ZVlRwH x4agLYe092mZoamlsg7DaUQ8QpZFFM8HNqqjAnBVHZe2QgvOWiNUVKvfy08z8Q96p7FS JJSCt2qYf0jMmpWdgiYtRimrdisyx/XhPd3PE/4iJ8t07qYp/ufVJcGNxzsfJYzzE8b+ cueI92ZM7f++OarDBM/1RGhFCie2zduN3IegTI+4IlQ9oZWtHgHx4xv+XYu9vQ3ZSB+l 1vl7iXWNOg5wr6VbkicCoq/8qDv50l9RxeB3+BN8SXXsvSkS4uQeMvPKzB90Y6I12IVH REBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=KWqG04N+0b18rI5H3e90yELKXPTBpkvGbJ/cK8Ilj/A=; b=1Fm4ftWxhb95Qgew9mQHM1+eTzdVs1FmqP+pkq3b7BIDis/yS4jA5gC2+MoQ25Z3BZ 5Vzn9PzENTC8JFemGw4MgV/79WrmRQ6ZxYQDBfTMZvWYepT+9ucqFuDttC0V3psTwrI4 afSLPX44kEiBfX7HkdDoQVQjx8o2HR3CZ3TWUU//5NlpMBVsvqO+rZ778pEuYSM8O4Cd a5jzVxZuhOdwwESTwgzMIbVd6Y0XWK3xSP9YwfBksupiLBtG0JS8P8mEyrlwXEMTwswK F17dw1iUNX3vBw36lfwb+TvTuEj4asmyH2bjTx70nenagLHIqLd15dkaIUMUbjlejg7w ZOzw== X-Gm-Message-State: AOAM532zevjEeuMYps8I9X0ODg+ZeHJfOJqQ5UPHCbwfnp88dFY58dnm Jpgk7SlJjZoO9V1rC2Y64+MNWTDvTV/fdg== X-Google-Smtp-Source: ABdhPJwvRJHKUG5jL7lUbS9kDL5Xhlu7F2F65efFw68WzGjfJYYDBsh2Me+mWLkp6cVA4kgsM1Y9jw== X-Received: by 2002:ad4:5de3:: with SMTP id jn3mr1569481qvb.22.1636145171136; Fri, 05 Nov 2021 13:46:11 -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 f66sm5929839qkj.76.2021.11.05.13.46.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:10 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 13/25] btrfs: do not special case the extent root for switch commit roots Date: Fri, 5 Nov 2021 16:45:39 -0400 Message-Id: <1257dfbb2f30bf87f425b8ba3d48d32f2fc0ca1a.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This is a leftover from when we used to independently swap the extent root's commit root and the fs tree commit roots. At the time I simply changed the helper to a list_add. There's actually no reason to not add the extent root to the switch commit root at this point, we don't care about the order we do the switching since it's all done under the commit_root_sem. If we re-mark the extent root dirty after adding it to the switch_commits list we'll see that BTRFS_ROOT_DIRTY isn't set and then list_move it back onto the dirty list, and then we'll redo the tree update and everything will be ok. Signed-off-by: Josef Bacik --- fs/btrfs/transaction.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 451788400e17..9f03c727aa6a 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -1266,9 +1266,8 @@ static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans) root = list_entry(next, struct btrfs_root, dirty_list); clear_bit(BTRFS_ROOT_DIRTY, &root->state); - if (root != fs_info->extent_root) - list_add_tail(&root->dirty_list, - &trans->transaction->switch_commits); + list_add_tail(&root->dirty_list, + &trans->transaction->switch_commits); ret = update_cowonly_root(trans, root); if (ret) return ret; @@ -1298,9 +1297,6 @@ static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans) if (!list_empty(&fs_info->dirty_cowonly_roots)) goto again; - list_add_tail(&fs_info->extent_root->dirty_list, - &trans->transaction->switch_commits); - /* Update dev-replace pointer once everything is committed */ fs_info->dev_replace.committed_cursor_left = fs_info->dev_replace.cursor_left_last_write_of_item; From patchwork Fri Nov 5 20:45:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605947 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E7869C43217 for ; Fri, 5 Nov 2021 20:46:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D6AC861357 for ; Fri, 5 Nov 2021 20:46:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233756AbhKEUs7 (ORCPT ); Fri, 5 Nov 2021 16:48:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56388 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233754AbhKEUsy (ORCPT ); Fri, 5 Nov 2021 16:48:54 -0400 Received: from mail-qt1-x836.google.com (mail-qt1-x836.google.com [IPv6:2607:f8b0:4864:20::836]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9460BC06120E for ; Fri, 5 Nov 2021 13:46:13 -0700 (PDT) Received: by mail-qt1-x836.google.com with SMTP id u7so8336974qtc.1 for ; Fri, 05 Nov 2021 13:46:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=asZdoKSDjmIrE7eQTEkp38011/Esa3FZnRjeOqa44VE=; b=r2Pv+9MrSeRWxDkXA8lPhRaYJG+cBHoqzm5ccxI9thcoaUXVUygE3MhaxeSeYcTXMI 4vE/NiM4cd1/9FLifCUeEUgDElVNLLKmYUzbSsK7+DAKDSIHji5W+bpCcfhXNg1lN2Fv 7sISkCHe8YcXyb6tBNpqlzwxyzXk9CX8iOqxL+X4Rmz8aFcBLdKeUPq/BC/3k+GXHqDR kajbBw+6IdTXcHRjDjYCXGBsFWMEAHZCpkW8le+UPcwj2MbdKRjq6Hp6mGfW3huplFDk EdNhPdjwvGMD56P/5DrgFtO4GR2LGnjFqzp05ADn5lkS+wruTXrtpDkGGRXEpIzGFTUn WiWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=asZdoKSDjmIrE7eQTEkp38011/Esa3FZnRjeOqa44VE=; b=2kGPyG9KPJMo9uEwbA/OxAYZ32U3I1edRjBKvUnbSMDVN5+8XYXBWiL8sqF4t3cz7s +LiyYgHsvsdZWesbbB2EtR/e9P7ZY0oKGhnkLuK9YECYyMaG2IaTfVcj5gTlriO8XLEi 9t7DhpF15uXBKws0JlHt9hCZdyoabAz86u2FPt/5ZoPEGMd2rutnnibzRJuiHTnQaQfA rzoxdQpwUBLEXDz8N2Ssa7IptP3orlIEtGNSUMnnPyICn2vKudF5R/34kP/xh5FW2W4d e+9n580A1DtSQHrYlsxr4FxPHaLJYvD94jTo1uGkj+DtNFihX1G4EiCyYQuTa0Jc8wQp aiZw== X-Gm-Message-State: AOAM532QU3j5nxgaDBFYDSV/LDJVrrwYYqWzIA0P+qK25RGCHR1ovkms Ajnd5Kj0AOhoqA41VIawjP2mUELVIcroAA== X-Google-Smtp-Source: ABdhPJwMtZdutnZ+2xS43q7ektfvX+uXCsJ/6m6ipHQGCCGo6I7D5DSV2rktedIBQXEAcyYrVYezZA== X-Received: by 2002:a05:622a:198a:: with SMTP id u10mr20996519qtc.156.1636145172477; Fri, 05 Nov 2021 13:46:12 -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 i67sm5790887qkd.90.2021.11.05.13.46.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:12 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 14/25] btrfs: remove unnecessary extent root check in btrfs_defrag_leaves Date: Fri, 5 Nov 2021 16:45:40 -0400 Message-Id: <044f71dad030673718c4c888e1df2ca023ff5dbb.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We only defrag leaves on roots that have SHAREABLE set, so we don't need to check if we're the extent root as it doesn't have SHAREABLE set. Signed-off-by: Josef Bacik --- fs/btrfs/tree-defrag.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/fs/btrfs/tree-defrag.c b/fs/btrfs/tree-defrag.c index 7c45d960b53c..b6cf39f4e7e4 100644 --- a/fs/btrfs/tree-defrag.c +++ b/fs/btrfs/tree-defrag.c @@ -27,14 +27,6 @@ int btrfs_defrag_leaves(struct btrfs_trans_handle *trans, int next_key_ret = 0; u64 last_ret = 0; - if (root->fs_info->extent_root == root) { - /* - * there's recursion here right now in the tree locking, - * we can't defrag the extent root without deadlock - */ - goto out; - } - if (!test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) goto out; From patchwork Fri Nov 5 20:45:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605949 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EFF05C433F5 for ; Fri, 5 Nov 2021 20:46:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DFF7E61357 for ; Fri, 5 Nov 2021 20:46:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232810AbhKEUtA (ORCPT ); Fri, 5 Nov 2021 16:49:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233760AbhKEUsz (ORCPT ); Fri, 5 Nov 2021 16:48:55 -0400 Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DFACEC061714 for ; Fri, 5 Nov 2021 13:46:14 -0700 (PDT) Received: by mail-qk1-x72c.google.com with SMTP id bm28so9873434qkb.9 for ; Fri, 05 Nov 2021 13:46:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=O6Js92v4mWwWzxhWJTuiturFVEFfGsnUr+zndkZZRFM=; b=jY5ON/G/rqC6oNZeX9NErxbhAavhSZ0kL1k5MIStIqfpmqkUh9Jtbl9bMxxE1+FWc4 XQ+jjj1VSSA/1iZnU9vRov/RrjVimAyiU8OOQFosWHFJfk5VZ/XS+vcW02yDIyY6PGSL goXcOjtBWevm/6iCkYcXcQbJsm55TcTa2TFi07HqNH2F5PPVGNhdjh2hyHKhi6DXtQu5 00C4ROMBKNUhZYB8gCRVDXGdtaSzjXKuUCPuDRnqeMWpwD2vu3Vky7WTbzK7FhgfdzmB lViJb/M2VCgZdISLz2mfrjmtsYlYF+1K1Cu5TchM2NDEOtzH18nL7/FmkoksYU1LABaF 0S8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=O6Js92v4mWwWzxhWJTuiturFVEFfGsnUr+zndkZZRFM=; b=DJ4wLGMDpnYjIA4QuzjkDV47nVgalfxKrkUIo1CmzHwLKTdd93Myfu8Z4T7C66BDWQ B/JWtExgfQan96qUHRWrvZIbBV/mnURxB/ldEEowSvYxJWdIY2ugkb+LExx20VLZz02Y Mg5sI+NRN+PqVXz7fxm0cpVhVxNeka5T7o9B1OYb155cROte0YsjDmAujT/Ebn3nOGZN h+2K5HwODyLW0BceVg+2UizAZVaq7wERzA4EZSIy5T0OhkPehbUEZNlRt6pMFXoK5KHf AMrHXF9yxTtMEXP6G/LDTRlbFeaVzj96iuCKJ3bcFhckzxCC/xEVTl8MRjwSror0JAqo O4jw== X-Gm-Message-State: AOAM530RiSVO05R886dag7NZAnRT7zqKLV8MxUZi8nWfMteRfQGj1GMx fIuhIKSxqgj3Z5HnNuOsbYRoRl0LGlzxIQ== X-Google-Smtp-Source: ABdhPJwgyzQH4++0kV4x738Vl7/YzZdGpXSH80wCpiokmTebIJlVK49xxdTTmy+bY+mtgrlXO70dGA== X-Received: by 2002:a05:620a:1317:: with SMTP id o23mr2516186qkj.189.1636145173823; Fri, 05 Nov 2021 13:46:13 -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 m68sm5961656qkb.105.2021.11.05.13.46.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:13 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 15/25] btrfs: don't use the extent root in btrfs_chunk_alloc_add_chunk_item Date: Fri, 5 Nov 2021 16:45:41 -0400 Message-Id: <5727e025cd94712c10decf691db251d935a128ed.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We're just using the extent_root to set the chunk owner to root_key->objectid, which is BTRFS_EXTENT_TREE_OBJECTID, so use that directly instead of using the root. Signed-off-by: Josef Bacik --- fs/btrfs/volumes.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 546bf1146b2d..85842eb1f7b1 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5502,7 +5502,6 @@ int btrfs_chunk_alloc_add_chunk_item(struct btrfs_trans_handle *trans, struct btrfs_block_group *bg) { struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *extent_root = fs_info->extent_root; struct btrfs_root *chunk_root = fs_info->chunk_root; struct btrfs_key key; struct btrfs_chunk *chunk; @@ -5574,7 +5573,7 @@ int btrfs_chunk_alloc_add_chunk_item(struct btrfs_trans_handle *trans, } btrfs_set_stack_chunk_length(chunk, bg->length); - btrfs_set_stack_chunk_owner(chunk, extent_root->root_key.objectid); + btrfs_set_stack_chunk_owner(chunk, BTRFS_EXTENT_TREE_OBJECTID); btrfs_set_stack_chunk_stripe_len(chunk, map->stripe_len); btrfs_set_stack_chunk_type(chunk, map->type); btrfs_set_stack_chunk_num_stripes(chunk, map->num_stripes); From patchwork Fri Nov 5 20:45:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605951 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8CF9EC433FE for ; Fri, 5 Nov 2021 20:46:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 793DE6136A for ; Fri, 5 Nov 2021 20:46:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233692AbhKEUtB (ORCPT ); Fri, 5 Nov 2021 16:49:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56382 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233761AbhKEUs4 (ORCPT ); Fri, 5 Nov 2021 16:48:56 -0400 Received: from mail-qk1-x72e.google.com (mail-qk1-x72e.google.com [IPv6:2607:f8b0:4864:20::72e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 54AF4C061205 for ; Fri, 5 Nov 2021 13:46:16 -0700 (PDT) Received: by mail-qk1-x72e.google.com with SMTP id bm28so9873473qkb.9 for ; Fri, 05 Nov 2021 13:46:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=4XzByVSpKV9OqOEh1My2p7NA+CpPZXI4dSUcfK+/bCY=; b=RKy/Gc6FGNPVaEfCjn/FHJaQ6xoKXVV+T1pNN+QLjGQCUZjGOuhG2UaJLIqyeyvZ9K nzxWYmcuDPx6hlHoxB86hHMOi/w9PU6N1fxRcdOwfh8nEkDgBcduHTxJjpR+fguTP6yv Sb35girh1ehiLE6cj4HNTJ3wlpGQqXgyErH7YNBdidhNfjN9NEV032R7ANRE85/4gKMS r8ZCSJVUZ1YBb/hZc+HHXZU2PzeCnxAFxSSLoM0EIDqpsL9oTVT9fScVIAOVPiJkp9WF 9P5dSeJG1GBIfh+ukrLGLo6Ki9kffJlIiZonVpT2zTtXSKuUJ4cnpS/6ga+qd/+Hrk0m o0+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4XzByVSpKV9OqOEh1My2p7NA+CpPZXI4dSUcfK+/bCY=; b=N0PgYt5df5Gbt2RtizfkHs+E78u+Dov/EbXHEFUNi30O2CYNrlkZO8HHQ2H7O9FRKf 9jSl1O0m3JeKIofODeVy8OBcmhVyxw4YBKDeoSg8iqdoaZNWk7LQ6GCT+5es5/Rzl9Zp nMX8EgV7WGQVgAyE3Z9/vSb3Re+ar0x8Fh78jcBw2ALRVRbyGfZARarKttW2K9sw2rk0 M9+SD45V+VJGhkNFIVXrr1ud5ozUTWW2Ud+ihNZWaISgR+0hEDB0yvi/ARxm93G40fOj lWpmljkYakB3NWDx+MTV5bGVEOvrN12QqnJXr6ZhH/QHHyOKDDkLyNNOHBV0/t2MBEiv JVcw== X-Gm-Message-State: AOAM530sqGArcdBheWdlurk69vIAc4yhboa9ZfEa3X3PQgmdRHNmhzgp 08sblztjxtmKGrojiJCI9J13zp/cfeSawA== X-Google-Smtp-Source: ABdhPJwGo33YO+4fa853MxeeJVpv7FrurkTON3M4QX5m9XlTNghdgliRXD00TBA3tIKygjwy8iud7Q== X-Received: by 2002:a37:27cf:: with SMTP id n198mr12023564qkn.146.1636145175291; Fri, 05 Nov 2021 13:46:15 -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 y8sm6826238qtx.0.2021.11.05.13.46.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:14 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 16/25] btrfs: don't use extent_root in iterate_extent_inodes Date: Fri, 5 Nov 2021 16:45:42 -0400 Message-Id: <534f9c43d3a3f2a99d2f0b008c2791982f464b1a.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We are going to have many extent_roots soon, and we don't need a root here necessarily as we're not modifying anything, we're just getting the trans handle so we can have an accurate view of references, so use the tree_root here. Signed-off-by: Josef Bacik --- fs/btrfs/backref.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 72ca4334186c..0c5c7cc14604 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1969,7 +1969,7 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info, extent_item_objectid); if (!search_commit_root) { - trans = btrfs_attach_transaction(fs_info->extent_root); + trans = btrfs_attach_transaction(fs_info->tree_root); if (IS_ERR(trans)) { if (PTR_ERR(trans) != -ENOENT && PTR_ERR(trans) != -EROFS) From patchwork Fri Nov 5 20:45:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605953 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 46BD0C43217 for ; Fri, 5 Nov 2021 20:46:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 347356136F for ; Fri, 5 Nov 2021 20:46:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233761AbhKEUtB (ORCPT ); Fri, 5 Nov 2021 16:49:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56404 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233759AbhKEUs6 (ORCPT ); Fri, 5 Nov 2021 16:48:58 -0400 Received: from mail-qk1-x736.google.com (mail-qk1-x736.google.com [IPv6:2607:f8b0:4864:20::736]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C82DCC061714 for ; Fri, 5 Nov 2021 13:46:17 -0700 (PDT) Received: by mail-qk1-x736.google.com with SMTP id bl12so9828426qkb.13 for ; Fri, 05 Nov 2021 13:46:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=fB/uClHnFKujCxxdBUhejg5H4+7+E8aaLPSCXz7vKhs=; b=RlzwHU2KKI8qRHRV/4vIxFJvaJoA+i0cSsNBFUAqLhxizJw2y/T/QkbqtE9IjBLql/ /UGalUdRiV969jEnnzVvEUrTTjbTnuZo7yYJ67hh6dYJu/gXQvhvR0ixBHHPYSTfBei7 M6CntnyxGuPSQHlm7vXIGq3maqJY5WAepSjLudaXDelKcg2WfSi0V3z6DVupHiIQXaRV eEDXcI1bkZg0/BCIDdaYT8Q309oZqq5X3GXIXKoCIjpqiMUw7oIOItnsXv1AyW9zQYio G2dIXEsNcs8+dH9vtyWQ46upMozex9AZQhJ2KvmO5Kkz/5Hbt6QJOd7dagNbzyMXTnj8 +K0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=fB/uClHnFKujCxxdBUhejg5H4+7+E8aaLPSCXz7vKhs=; b=qR82XUcTkTRzhcFkRxbjteADfcj3gFpy9B15zf6y0IM26D7K94jeoLVbSwQnEKefao Z6PWnMQIftMgpC6kr0NlB+OubQwNuYw5aDS459e8sLN6Tt4D4758nNCFfm3VvRo22Ctc Yy6UAPm/pyhqssJ0b+h6fG9xu0GHuSdJHNkYm940msBFs2NdiwbUAtXk52xqb2ZyLGYF GPjxqrjSu7578aJNQQtV+FDd6ItzI4vFHV5hFuy3QAih24fDO2wYgOYyzZEMATBkOQW1 5tGumOVeq8PDT9xxDnYfRbBIz+skegpD7IwKzfJrNvePgTGwsCbd4loXcoTfZiw30Ci9 Z1FA== X-Gm-Message-State: AOAM533xeDG75NnWbH5OL5BZNF4oBjuaMQa87XucYY4rxx3qZZ4QarU5 0A3SbRiU22G7bykhf7H1OIvmW/cuc09LZw== X-Google-Smtp-Source: ABdhPJy0e9quSgOvwU9TMBdiDOVytyD/+MQgTIu4B9YZ+JvxoPL4AzOanr8A08rnT+95rjwwoikazQ== X-Received: by 2002:a37:2e81:: with SMTP id u123mr49130357qkh.156.1636145176621; Fri, 05 Nov 2021 13:46:16 -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 x16sm6802371qkp.56.2021.11.05.13.46.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:16 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 17/25] btrfs: don't use the extent_root in flush_space Date: Fri, 5 Nov 2021 16:45:43 -0400 Message-Id: <5c324b207e0784926148bf0566b4ca0b2b9f2bfb.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We only need the root to start a transaction, and since it's a global root we can pick anything, change to the tree_root as we'll have a lot of extent roots in the future. Signed-off-by: Josef Bacik --- fs/btrfs/space-info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c index f74b4063772e..f6a1486bb6e5 100644 --- a/fs/btrfs/space-info.c +++ b/fs/btrfs/space-info.c @@ -617,7 +617,7 @@ static void flush_space(struct btrfs_fs_info *fs_info, struct btrfs_space_info *space_info, u64 num_bytes, enum btrfs_flush_state state, bool for_preempt) { - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = fs_info->tree_root; struct btrfs_trans_handle *trans; int nr; int ret = 0; From patchwork Fri Nov 5 20:45:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605955 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EC447C433F5 for ; Fri, 5 Nov 2021 20:46:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D7CD36137A for ; Fri, 5 Nov 2021 20:46:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233775AbhKEUtC (ORCPT ); Fri, 5 Nov 2021 16:49:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56416 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233771AbhKEUs7 (ORCPT ); Fri, 5 Nov 2021 16:48:59 -0400 Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 14979C06120A for ; Fri, 5 Nov 2021 13:46:19 -0700 (PDT) Received: by mail-qk1-x72c.google.com with SMTP id x23so3214540qkf.7 for ; Fri, 05 Nov 2021 13:46:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=MiPE6lCcwo0QHebkl4glhY6h9GVgzjKFtg/m5HDE0VI=; b=XYZDcp15aek708wmlqrCG9p3UZYxxOYqsNmqdG0KhuyCCyhGLcNjKL3m17W4vszmmD SKV4605EEOuqFqXyxucvpurZlNhl54W0wr9DTyT3oQEBGnsqSQkKJeW3LYPs/4jrnhmx NH07yg3undfzIwyNcaBfr766ODetPKTKf2PGUoaemYaDxiGtc21kTndQOX6J88rEq3t3 TOQtPjdzJhqcQUMaD17aCOkr2Uerr2zDA9ipg5DFcAgrD5/7Y+ai6xwDpDjiMx5H1pBU XZ1XyhRutlogTFZOrJLv9Wl0VWJTeoSIFowuzTrRYxebnz89VfshnkwaTlPdyLPdYweU UG8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=MiPE6lCcwo0QHebkl4glhY6h9GVgzjKFtg/m5HDE0VI=; b=UVf7I1jMr4tu1SXX6zOI49LvFicOzQhUVCYem6QFa5t8qb1SueIHWMszMVHiSnA2/x 91f+y5n2vkazqZUHfLR21xggbmpCJG5z5nPSX2LFOqrQl+rhDdlasZa+HA7lkR5eynNj B06KWvV84fBb9xgu/tCo9LQW26tDlpOJNv3beRqI7FzcfqA6oNTvyUmEon2Xs0TKD8pg hnjI2T+uAOP/KLjuukITw66objMX1pgUEqNBe+wmKH8pNq5RmTSBgwKLN84RoIl9SMYd fFHMXzkorNKKuqbmNADBg/finwy1mING5A4CC06xx9g4Sk+UO/v+EIu6eW6cSRSViMIt HrcQ== X-Gm-Message-State: AOAM530GcqQXxP00iMup+EHCoOu1K9Y4CTjlla3EcpTzGdUO8x1wxw8P TE7EQx0HCOz74PT4J0cxHQKOU52uI1vSnA== X-Google-Smtp-Source: ABdhPJz+8eYllNzQDXuYZRPPxtmkjGcWiypbes/UiCV4MwaoAqNTwOSBHJK5r5wIXN/R591WK6JmDg== X-Received: by 2002:a05:620a:b4c:: with SMTP id x12mr42329235qkg.324.1636145177993; Fri, 05 Nov 2021 13:46:17 -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 e10sm6416731qtx.66.2021.11.05.13.46.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:17 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 18/25] btrfs: init root block_rsv at init root time Date: Fri, 5 Nov 2021 16:45:44 -0400 Message-Id: <282080bb71b5386dd398a51d776db8a23ab92e56.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org In the future we're going to have multiple csum and extent root trees, so init the roots block_rsv at setup_root time based on their root key objectid. Signed-off-by: Josef Bacik --- fs/btrfs/block-rsv.c | 39 +++++++++++++++++++++++---------------- fs/btrfs/block-rsv.h | 1 + fs/btrfs/disk-io.c | 15 ++++++++------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/fs/btrfs/block-rsv.c b/fs/btrfs/block-rsv.c index ac6fbe75cace..166f6c74c943 100644 --- a/fs/btrfs/block-rsv.c +++ b/fs/btrfs/block-rsv.c @@ -414,6 +414,29 @@ void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info) spin_unlock(&sinfo->lock); } +void btrfs_init_root_block_rsv(struct btrfs_root *root) +{ + struct btrfs_fs_info *fs_info = root->fs_info; + + switch (root->root_key.objectid) { + case BTRFS_CSUM_TREE_OBJECTID: + case BTRFS_EXTENT_TREE_OBJECTID: + root->block_rsv = &fs_info->delayed_refs_rsv; + break; + case BTRFS_ROOT_TREE_OBJECTID: + case BTRFS_DEV_TREE_OBJECTID: + case BTRFS_QUOTA_TREE_OBJECTID: + root->block_rsv = &fs_info->global_block_rsv; + break; + case BTRFS_CHUNK_TREE_OBJECTID: + root->block_rsv = &fs_info->chunk_block_rsv; + break; + default: + root->block_rsv = NULL; + break; + } +} + void btrfs_init_global_block_rsv(struct btrfs_fs_info *fs_info) { struct btrfs_space_info *space_info; @@ -428,22 +451,6 @@ 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 dereferencing 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; - fs_info->tree_root->block_rsv = &fs_info->global_block_rsv; - if (fs_info->quota_root) - fs_info->quota_root->block_rsv = &fs_info->global_block_rsv; - fs_info->chunk_root->block_rsv = &fs_info->chunk_block_rsv; - btrfs_update_global_block_rsv(fs_info); } diff --git a/fs/btrfs/block-rsv.h b/fs/btrfs/block-rsv.h index 07d61c2c5d28..3b67ff08d434 100644 --- a/fs/btrfs/block-rsv.h +++ b/fs/btrfs/block-rsv.h @@ -50,6 +50,7 @@ struct btrfs_block_rsv { }; void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type); +void btrfs_init_root_block_rsv(struct btrfs_root *root); struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_fs_info *fs_info, unsigned short type); void btrfs_init_metadata_block_rsv(struct btrfs_fs_info *fs_info, diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 3bd3a06a9627..372adb8ec20f 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1140,7 +1140,12 @@ static void __setup_root(struct btrfs_root *root, struct btrfs_fs_info *fs_info, u64 objectid) { bool dummy = test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state); + + memset(&root->root_key, 0, sizeof(root->root_key)); + memset(&root->root_item, 0, sizeof(root->root_item)); + memset(&root->defrag_progress, 0, sizeof(root->defrag_progress)); root->fs_info = fs_info; + root->root_key.objectid = objectid; root->node = NULL; root->commit_root = NULL; root->state = 0; @@ -1151,7 +1156,8 @@ static void __setup_root(struct btrfs_root *root, struct btrfs_fs_info *fs_info, root->nr_ordered_extents = 0; root->inode_tree = RB_ROOT; INIT_RADIX_TREE(&root->delayed_nodes_tree, GFP_ATOMIC); - root->block_rsv = NULL; + + btrfs_init_root_block_rsv(root); INIT_LIST_HEAD(&root->dirty_list); INIT_LIST_HEAD(&root->root_list); @@ -1189,6 +1195,7 @@ static void __setup_root(struct btrfs_root *root, struct btrfs_fs_info *fs_info, root->log_transid = 0; root->log_transid_committed = -1; root->last_log_commit = 0; + root->anon_dev = 0; if (!dummy) { extent_io_tree_init(fs_info, &root->dirty_log_pages, IO_TREE_ROOT_DIRTY_LOG_PAGES, NULL); @@ -1196,12 +1203,6 @@ static void __setup_root(struct btrfs_root *root, struct btrfs_fs_info *fs_info, IO_TREE_LOG_CSUM_RANGE, NULL); } - memset(&root->root_key, 0, sizeof(root->root_key)); - memset(&root->root_item, 0, sizeof(root->root_item)); - memset(&root->defrag_progress, 0, sizeof(root->defrag_progress)); - root->root_key.objectid = objectid; - root->anon_dev = 0; - spin_lock_init(&root->root_item_lock); btrfs_qgroup_init_swapped_blocks(&root->swapped_blocks); #ifdef CONFIG_BTRFS_DEBUG From patchwork Fri Nov 5 20:45:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605957 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 73DCBC433FE for ; Fri, 5 Nov 2021 20:46:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5D27361357 for ; Fri, 5 Nov 2021 20:46:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233783AbhKEUtD (ORCPT ); Fri, 5 Nov 2021 16:49:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56428 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233777AbhKEUtA (ORCPT ); Fri, 5 Nov 2021 16:49:00 -0400 Received: from mail-qt1-x82c.google.com (mail-qt1-x82c.google.com [IPv6:2607:f8b0:4864:20::82c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AC787C061205 for ; Fri, 5 Nov 2021 13:46:20 -0700 (PDT) Received: by mail-qt1-x82c.google.com with SMTP id w9so3234778qtk.13 for ; Fri, 05 Nov 2021 13:46:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=X35N+CYz0/04ZuiZiVkNio97ZqNo54wDOSpWIfIECRo=; b=AnJkBBxrWeURfYkUuQ6c/nuXbZeR78BENILW5keTQtpwtCt+U9FTzQmaP4h2RLfDQw J7EcJG7WR/2R+JAsMlIirwRtAYNc0mc1SkPtAuLIPVeForRmgnsGmfWSQrgtv+KZlehs jJLdUeu0dj8syaPgi6Eks4jzk/cG7rFGJz8Ki4foResv5Jn5S/GK0942s6wdT1eH+k2y twMXR7VNhRwD4VQMwV0ZVRPeLNOH85yA4CXRzkJIyiZW+mOEUBKwnL/1opW94o586Ra7 8aS4GJq6vHsBGjRZV0PGw7k3H2H6mRIIB+6YA1VUOYhv50V9f3ZjhczFKvNRrNoWJFnf fWXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=X35N+CYz0/04ZuiZiVkNio97ZqNo54wDOSpWIfIECRo=; b=B9Msmi60v9/OMa5Y6jiqyKaN3p0oMNoasmyjU0+kY97LC6DCkI/5/hGk8GPCqvKKKo SVY/4G1BwkdmZo6xvRdt/N2fPwVbFvkZlNyhvbeKfIy7krw0bPClBRLQGrHvDXlR2C2I e4PU/gjzFgZTByz6o4bWJnHRwiVY/FHRte+zBtq9T53CM+W6VXsByzj0H7/ne/JGsH7A 3qeRcBf35QqiaQPucUlsEHkZPET3eJp7asd0IvrD9eVzKLuAc8n/cROEFHWXPptfU+IE F2yELNgK+pT3tt2TOvlIr1qi0HM8DMyYEawFXv8hMINHN/QkvP/j5rn6pQtKwCw135eA ecsw== X-Gm-Message-State: AOAM530vpYOWV2pjbhSwUft6JSrIn9Z7ezAiiDP0iU8garRYShRzh7kG /uHKXFY4LEBu7EdbTTmIqqjiWPDFid3IAQ== X-Google-Smtp-Source: ABdhPJx/KZqrxWHKdqLv4ei5/DkxLpZ0KtqXFyKqg/PSpOxXd9JIo/NLUDD1y8mYihaQ1EqSBcNZHg== X-Received: by 2002:ac8:5916:: with SMTP id 22mr38317379qty.288.1636145179418; Fri, 05 Nov 2021 13:46:19 -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 u16sm217085qkp.57.2021.11.05.13.46.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:19 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 19/25] btrfs: stop accessing ->extent_root directly Date: Fri, 5 Nov 2021 16:45:45 -0400 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When we start having multiple extent roots we'll need to use a helper to get to the correct extent_root. Rename fs_info->extent_root to _extent_root and convert all of the users of the extent root to using the btrfs_extent_root() helper. This will allow us to easily clean up the remaining direct accesses in the future. Signed-off-by: Josef Bacik --- fs/btrfs/backref.c | 16 ++++++++----- fs/btrfs/block-group.c | 3 ++- fs/btrfs/block-rsv.c | 4 +++- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 15 ++++++------ fs/btrfs/disk-io.h | 8 ++++++- fs/btrfs/extent-tree.c | 40 +++++++++++++++++++------------ fs/btrfs/free-space-tree.c | 3 ++- fs/btrfs/qgroup.c | 5 +++- fs/btrfs/ref-verify.c | 6 +++-- fs/btrfs/relocation.c | 4 ++-- fs/btrfs/scrub.c | 6 +++-- fs/btrfs/tests/free-space-tests.c | 2 +- fs/btrfs/tests/qgroup-tests.c | 2 +- fs/btrfs/transaction.c | 2 +- fs/btrfs/zoned.c | 3 ++- 16 files changed, 77 insertions(+), 44 deletions(-) diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 0c5c7cc14604..96c520634521 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1170,7 +1170,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, struct ulist *roots, const u64 *extent_item_pos, struct share_check *sc, bool ignore_offset) { - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(fs_info, bytenr); struct btrfs_key key; struct btrfs_path *path; struct btrfs_delayed_ref_root *delayed_refs = NULL; @@ -1747,6 +1747,7 @@ int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical, struct btrfs_path *path, struct btrfs_key *found_key, u64 *flags_ret) { + struct btrfs_root *extent_root = btrfs_extent_root(fs_info, logical); int ret; u64 flags; u64 size = 0; @@ -1762,11 +1763,11 @@ int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical, key.objectid = logical; key.offset = (u64)-1; - ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0); + ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); if (ret < 0) return ret; - ret = btrfs_previous_extent_item(fs_info->extent_root, path, 0); + ret = btrfs_previous_extent_item(extent_root, path, 0); if (ret) { if (ret > 0) ret = -ENOENT; @@ -2337,6 +2338,7 @@ struct btrfs_backref_iter *btrfs_backref_iter_alloc( int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr) { struct btrfs_fs_info *fs_info = iter->fs_info; + struct btrfs_root *extent_root = btrfs_extent_root(fs_info, bytenr); struct btrfs_path *path = iter->path; struct btrfs_extent_item *ei; struct btrfs_key key; @@ -2347,7 +2349,7 @@ int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr) key.offset = (u64)-1; iter->bytenr = bytenr; - ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0); + ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); if (ret < 0) return ret; if (ret == 0) { @@ -2390,7 +2392,7 @@ int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr) /* If there is no inline backref, go search for keyed backref */ if (iter->cur_ptr >= iter->end_ptr) { - ret = btrfs_next_item(fs_info->extent_root, path); + ret = btrfs_next_item(extent_root, path); /* No inline nor keyed ref */ if (ret > 0) { @@ -2434,6 +2436,7 @@ int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr) int btrfs_backref_iter_next(struct btrfs_backref_iter *iter) { struct extent_buffer *eb = btrfs_backref_get_eb(iter); + struct btrfs_root *extent_root; struct btrfs_path *path = iter->path; struct btrfs_extent_inline_ref *iref; int ret; @@ -2464,7 +2467,8 @@ int btrfs_backref_iter_next(struct btrfs_backref_iter *iter) } /* We're at keyed items, there is no inline item, go to the next one */ - ret = btrfs_next_item(iter->fs_info->extent_root, iter->path); + extent_root = btrfs_extent_root(iter->fs_info, iter->bytenr); + ret = btrfs_next_item(extent_root, iter->path); if (ret) return ret; diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index b5dfb1e3446e..7eb0a8632a01 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -514,7 +514,7 @@ static int load_extent_tree_free(struct btrfs_caching_control *caching_ctl) { struct btrfs_block_group *block_group = caching_ctl->block_group; struct btrfs_fs_info *fs_info = block_group->fs_info; - struct btrfs_root *extent_root = fs_info->extent_root; + struct btrfs_root *extent_root; struct btrfs_path *path; struct extent_buffer *leaf; struct btrfs_key key; @@ -529,6 +529,7 @@ static int load_extent_tree_free(struct btrfs_caching_control *caching_ctl) return -ENOMEM; last = max_t(u64, block_group->start, BTRFS_SUPER_INFO_OFFSET); + extent_root = btrfs_extent_root(fs_info, last); #ifdef CONFIG_BTRFS_DEBUG /* diff --git a/fs/btrfs/block-rsv.c b/fs/btrfs/block-rsv.c index 166f6c74c943..7f5c230ea547 100644 --- a/fs/btrfs/block-rsv.c +++ b/fs/btrfs/block-rsv.c @@ -6,6 +6,7 @@ #include "space-info.h" #include "transaction.h" #include "block-group.h" +#include "disk-io.h" /* * HOW DO BLOCK RESERVES WORK @@ -353,6 +354,7 @@ void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info) { struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv; struct btrfs_space_info *sinfo = block_rsv->space_info; + struct btrfs_root *extent_root = btrfs_extent_root(fs_info, 0); u64 num_bytes; unsigned min_items; @@ -361,7 +363,7 @@ void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info) * checksum tree and the root tree. If the fs is empty we want to set * it to a minimal amount for safety. */ - num_bytes = btrfs_root_used(&fs_info->extent_root->root_item) + + num_bytes = btrfs_root_used(&extent_root->root_item) + btrfs_root_used(&fs_info->csum_root->root_item) + btrfs_root_used(&fs_info->tree_root->root_item); diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index fb49162311b9..dac5741cb6fa 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -621,7 +621,7 @@ enum btrfs_exclusive_operation { struct btrfs_fs_info { u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; unsigned long flags; - struct btrfs_root *extent_root; + struct btrfs_root *_extent_root; struct btrfs_root *tree_root; struct btrfs_root *chunk_root; struct btrfs_root *dev_root; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 372adb8ec20f..1ada4c96ef71 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1557,7 +1557,7 @@ static struct btrfs_root *btrfs_get_global_root(struct btrfs_fs_info *fs_info, if (objectid == BTRFS_ROOT_TREE_OBJECTID) return btrfs_grab_root(fs_info->tree_root); if (objectid == BTRFS_EXTENT_TREE_OBJECTID) - return btrfs_grab_root(fs_info->extent_root); + return btrfs_grab_root(fs_info->_extent_root); if (objectid == BTRFS_CHUNK_TREE_OBJECTID) return btrfs_grab_root(fs_info->chunk_root); if (objectid == BTRFS_DEV_TREE_OBJECTID) @@ -1630,7 +1630,7 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) btrfs_free_ref_cache(fs_info); kfree(fs_info->balance_ctl); kfree(fs_info->delayed_root); - btrfs_put_root(fs_info->extent_root); + btrfs_put_root(fs_info->_extent_root); btrfs_put_root(fs_info->tree_root); btrfs_put_root(fs_info->chunk_root); btrfs_put_root(fs_info->dev_root); @@ -2000,6 +2000,7 @@ static void backup_super_roots(struct btrfs_fs_info *info) { const int next_backup = info->backup_root_index; struct btrfs_root_backup *root_backup; + struct btrfs_root *extent_root = btrfs_extent_root(info, 0); root_backup = info->super_for_commit->super_roots + next_backup; @@ -2024,11 +2025,11 @@ static void backup_super_roots(struct btrfs_fs_info *info) btrfs_set_backup_chunk_root_level(root_backup, btrfs_header_level(info->chunk_root->node)); - btrfs_set_backup_extent_root(root_backup, info->extent_root->node->start); + btrfs_set_backup_extent_root(root_backup, extent_root->node->start); btrfs_set_backup_extent_root_gen(root_backup, - btrfs_header_generation(info->extent_root->node)); + btrfs_header_generation(extent_root->node)); btrfs_set_backup_extent_root_level(root_backup, - btrfs_header_level(info->extent_root->node)); + btrfs_header_level(extent_root->node)); /* * we might commit during log recovery, which happens before we set @@ -2158,7 +2159,7 @@ static void free_root_pointers(struct btrfs_fs_info *info, bool free_chunk_root) free_root_extent_buffers(info->tree_root); free_root_extent_buffers(info->dev_root); - free_root_extent_buffers(info->extent_root); + free_root_extent_buffers(info->_extent_root); free_root_extent_buffers(info->csum_root); free_root_extent_buffers(info->quota_root); free_root_extent_buffers(info->uuid_root); @@ -2449,7 +2450,7 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) } } else { set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); - fs_info->extent_root = root; + fs_info->_extent_root = root; } location.objectid = BTRFS_DEV_TREE_OBJECTID; diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index baca29523d35..e2824c6ada72 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h @@ -103,9 +103,15 @@ static inline struct btrfs_root *btrfs_grab_root(struct btrfs_root *root) return NULL; } +static inline struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_info, + u64 bytenr) +{ + return fs_info->_extent_root; +} + static inline struct btrfs_root *btrfs_block_group_root(struct btrfs_fs_info *fs_info) { - return fs_info->extent_root; + return btrfs_extent_root(fs_info, 0); } void btrfs_put_root(struct btrfs_root *root); diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index f40b97072231..de80b7109a08 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -87,6 +87,7 @@ void btrfs_free_excluded_extents(struct btrfs_block_group *cache) /* simple helper to search for an existing data extent at a given offset */ int btrfs_lookup_data_extent(struct btrfs_fs_info *fs_info, u64 start, u64 len) { + struct btrfs_root *root = btrfs_extent_root(fs_info, start); int ret; struct btrfs_key key; struct btrfs_path *path; @@ -98,7 +99,7 @@ int btrfs_lookup_data_extent(struct btrfs_fs_info *fs_info, u64 start, u64 len) key.objectid = start; key.offset = len; key.type = BTRFS_EXTENT_ITEM_KEY; - ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0); + ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); btrfs_free_path(path); return ret; } @@ -116,6 +117,7 @@ int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, u64 bytenr, u64 offset, int metadata, u64 *refs, u64 *flags) { + struct btrfs_root *extent_root; struct btrfs_delayed_ref_head *head; struct btrfs_delayed_ref_root *delayed_refs; struct btrfs_path *path; @@ -153,7 +155,8 @@ int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans, else key.type = BTRFS_EXTENT_ITEM_KEY; - ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0); + extent_root = btrfs_extent_root(fs_info, bytenr); + ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); if (ret < 0) goto out_free; @@ -443,7 +446,7 @@ static noinline int lookup_extent_data_ref(struct btrfs_trans_handle *trans, u64 root_objectid, u64 owner, u64 offset) { - struct btrfs_root *root = trans->fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(trans->fs_info, bytenr); struct btrfs_key key; struct btrfs_extent_data_ref *ref; struct extent_buffer *leaf; @@ -519,7 +522,7 @@ static noinline int insert_extent_data_ref(struct btrfs_trans_handle *trans, u64 root_objectid, u64 owner, u64 offset, int refs_to_add) { - struct btrfs_root *root = trans->fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(trans->fs_info, bytenr); struct btrfs_key key; struct extent_buffer *leaf; u32 size; @@ -686,7 +689,7 @@ static noinline int lookup_tree_block_ref(struct btrfs_trans_handle *trans, u64 bytenr, u64 parent, u64 root_objectid) { - struct btrfs_root *root = trans->fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(trans->fs_info, bytenr); struct btrfs_key key; int ret; @@ -710,6 +713,7 @@ static noinline int insert_tree_block_ref(struct btrfs_trans_handle *trans, u64 bytenr, u64 parent, u64 root_objectid) { + struct btrfs_root *root = btrfs_extent_root(trans->fs_info, bytenr); struct btrfs_key key; int ret; @@ -722,8 +726,7 @@ static noinline int insert_tree_block_ref(struct btrfs_trans_handle *trans, key.offset = root_objectid; } - ret = btrfs_insert_empty_item(trans, trans->fs_info->extent_root, - path, &key, 0); + ret = btrfs_insert_empty_item(trans, root, path, &key, 0); btrfs_release_path(path); return ret; } @@ -788,7 +791,7 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans, u64 owner, u64 offset, int insert) { struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(fs_info, bytenr); struct btrfs_key key; struct extent_buffer *leaf; struct btrfs_extent_item *ei; @@ -1574,6 +1577,7 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans, struct btrfs_delayed_extent_op *extent_op) { struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *root; struct btrfs_key key; struct btrfs_path *path; struct btrfs_extent_item *ei; @@ -1603,8 +1607,9 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans, key.offset = head->num_bytes; } + root = btrfs_extent_root(fs_info, key.objectid); again: - ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 1); + ret = btrfs_search_slot(trans, root, &key, path, 0, 1); if (ret < 0) { err = ret; goto out; @@ -2287,7 +2292,7 @@ static noinline int check_committed_ref(struct btrfs_root *root, bool strict) { struct btrfs_fs_info *fs_info = root->fs_info; - struct btrfs_root *extent_root = fs_info->extent_root; + struct btrfs_root *extent_root = btrfs_extent_root(fs_info, bytenr); struct extent_buffer *leaf; struct btrfs_extent_data_ref *ref; struct btrfs_extent_inline_ref *iref; @@ -2922,7 +2927,7 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_fs_info *info = trans->fs_info; struct btrfs_key key; struct btrfs_path *path; - struct btrfs_root *extent_root = info->extent_root; + struct btrfs_root *extent_root; struct extent_buffer *leaf; struct btrfs_extent_item *ei; struct btrfs_extent_inline_ref *iref; @@ -2938,6 +2943,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, int last_ref = 0; bool skinny_metadata = btrfs_fs_incompat(info, SKINNY_METADATA); + extent_root = btrfs_extent_root(info, bytenr); + path = btrfs_alloc_path(); if (!path) return -ENOMEM; @@ -4572,6 +4579,7 @@ static int alloc_reserved_file_extent(struct btrfs_trans_handle *trans, struct btrfs_key *ins, int ref_mod) { struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *extent_root; int ret; struct btrfs_extent_item *extent_item; struct btrfs_extent_inline_ref *iref; @@ -4591,8 +4599,8 @@ static int alloc_reserved_file_extent(struct btrfs_trans_handle *trans, if (!path) return -ENOMEM; - ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path, - ins, size); + extent_root = btrfs_extent_root(fs_info, ins->objectid); + ret = btrfs_insert_empty_item(trans, extent_root, path, ins, size); if (ret) { btrfs_free_path(path); return ret; @@ -4644,6 +4652,7 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans, struct btrfs_delayed_extent_op *extent_op) { struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *extent_root; int ret; struct btrfs_extent_item *extent_item; struct btrfs_key extent_key; @@ -4675,8 +4684,9 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans, if (!path) return -ENOMEM; - ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path, - &extent_key, size); + extent_root = btrfs_extent_root(fs_info, extent_key.objectid); + ret = btrfs_insert_empty_item(trans, extent_root, path, &extent_key, + size); if (ret) { btrfs_free_path(path); return ret; diff --git a/fs/btrfs/free-space-tree.c b/fs/btrfs/free-space-tree.c index a33bca94d133..968c79d86d72 100644 --- a/fs/btrfs/free-space-tree.c +++ b/fs/btrfs/free-space-tree.c @@ -1046,7 +1046,7 @@ int add_to_free_space_tree(struct btrfs_trans_handle *trans, static int populate_free_space_tree(struct btrfs_trans_handle *trans, struct btrfs_block_group *block_group) { - struct btrfs_root *extent_root = trans->fs_info->extent_root; + struct btrfs_root *extent_root; struct btrfs_path *path, *path2; struct btrfs_key key; u64 start, end; @@ -1080,6 +1080,7 @@ static int populate_free_space_tree(struct btrfs_trans_handle *trans, key.type = BTRFS_EXTENT_ITEM_KEY; key.offset = 0; + extent_root = btrfs_extent_root(trans->fs_info, key.objectid); ret = btrfs_search_slot_for_read(extent_root, &key, path, 1, 0); if (ret < 0) goto out_locked; diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index db680f5be745..be0c6ce3205d 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c @@ -3141,6 +3141,7 @@ static int qgroup_rescan_leaf(struct btrfs_trans_handle *trans, struct btrfs_path *path) { struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *extent_root; struct btrfs_key found; struct extent_buffer *scratch_leaf = NULL; struct ulist *roots = NULL; @@ -3150,7 +3151,9 @@ static int qgroup_rescan_leaf(struct btrfs_trans_handle *trans, int ret; mutex_lock(&fs_info->qgroup_rescan_lock); - ret = btrfs_search_slot_for_read(fs_info->extent_root, + extent_root = btrfs_extent_root(fs_info, + fs_info->qgroup_rescan_progress.objectid); + ret = btrfs_search_slot_for_read(extent_root, &fs_info->qgroup_rescan_progress, path, 1, 0); diff --git a/fs/btrfs/ref-verify.c b/fs/btrfs/ref-verify.c index e2b9f8616501..a1ee19501030 100644 --- a/fs/btrfs/ref-verify.c +++ b/fs/btrfs/ref-verify.c @@ -972,6 +972,7 @@ void btrfs_free_ref_tree_range(struct btrfs_fs_info *fs_info, u64 start, /* Walk down all roots and build the ref tree, meant to be called at mount */ int btrfs_build_ref_tree(struct btrfs_fs_info *fs_info) { + struct btrfs_root *extent_root; struct btrfs_path *path; struct extent_buffer *eb; int tree_block_level = 0; @@ -985,7 +986,8 @@ int btrfs_build_ref_tree(struct btrfs_fs_info *fs_info) if (!path) return -ENOMEM; - eb = btrfs_read_lock_root_node(fs_info->extent_root); + extent_root = btrfs_extent_root(fs_info, 0); + eb = btrfs_read_lock_root_node(extent_root); level = btrfs_header_level(eb); path->nodes[level] = eb; path->slots[level] = 0; @@ -998,7 +1000,7 @@ int btrfs_build_ref_tree(struct btrfs_fs_info *fs_info) * would have had to added a ref key item which may appear on a * different leaf from the original extent item. */ - ret = walk_down_tree(fs_info->extent_root, path, level, + ret = walk_down_tree(extent_root, path, level, &bytenr, &num_bytes, &tree_block_level); if (ret) break; diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index f167ce645016..dc99b4a27d5f 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -3964,7 +3964,7 @@ static const char *stage_to_string(int stage) int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start) { struct btrfs_block_group *bg; - struct btrfs_root *extent_root = fs_info->extent_root; + struct btrfs_root *extent_root = btrfs_extent_root(fs_info, group_start); struct reloc_control *rc; struct inode *inode; struct btrfs_path *path; @@ -4215,7 +4215,7 @@ int btrfs_recover_relocation(struct btrfs_root *root) goto out_end; } - rc->extent_root = fs_info->extent_root; + rc->extent_root = btrfs_extent_root(fs_info, 0); set_reloc_control(rc); diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index cf82ea6f54fb..7c272cfd241f 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -2897,7 +2897,7 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx, u64 logic_end) { struct btrfs_fs_info *fs_info = sctx->fs_info; - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(fs_info, logic_start); struct btrfs_root *csum_root = fs_info->csum_root; struct btrfs_extent_item *extent; struct btrfs_io_context *bioc = NULL; @@ -3168,7 +3168,7 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx, { struct btrfs_path *path, *ppath; struct btrfs_fs_info *fs_info = sctx->fs_info; - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root; struct btrfs_root *csum_root = fs_info->csum_root; struct btrfs_extent_item *extent; struct blk_plug plug; @@ -3262,6 +3262,8 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx, atomic_read(&sctx->bios_in_flight) == 0); scrub_blocked_if_needed(fs_info); + root = btrfs_extent_root(fs_info, logical); + /* FIXME it might be better to start readahead at commit root */ key.objectid = logical; key.type = BTRFS_EXTENT_ITEM_KEY; diff --git a/fs/btrfs/tests/free-space-tests.c b/fs/btrfs/tests/free-space-tests.c index 8f05c1eb833f..c3709138f7cf 100644 --- a/fs/btrfs/tests/free-space-tests.c +++ b/fs/btrfs/tests/free-space-tests.c @@ -858,7 +858,7 @@ int btrfs_test_free_space_cache(u32 sectorsize, u32 nodesize) goto out; } - root->fs_info->extent_root = root; + root->fs_info->_extent_root = root; ret = test_extents(cache); if (ret) diff --git a/fs/btrfs/tests/qgroup-tests.c b/fs/btrfs/tests/qgroup-tests.c index 19ba7d5b7d8f..88e19781e83f 100644 --- a/fs/btrfs/tests/qgroup-tests.c +++ b/fs/btrfs/tests/qgroup-tests.c @@ -455,7 +455,7 @@ int btrfs_test_qgroups(u32 sectorsize, u32 nodesize) } /* We are using this root as our extent root */ - root->fs_info->extent_root = root; + root->fs_info->_extent_root = root; /* * Some of the paths we test assume we have a filled out fs_info, so we diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 9f03c727aa6a..f51edfe3681d 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -413,7 +413,7 @@ static int record_root_in_trans(struct btrfs_trans_handle *trans, if ((test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && root->last_trans < trans->transid) || force) { - WARN_ON(root == fs_info->extent_root); + WARN_ON(root == fs_info->_extent_root); WARN_ON(!force && root->commit_root != root->node); /* diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c index 67d932d70798..90d73e4e1827 100644 --- a/fs/btrfs/zoned.c +++ b/fs/btrfs/zoned.c @@ -1104,7 +1104,7 @@ static int calculate_alloc_pointer(struct btrfs_block_group *cache, u64 *offset_ret) { struct btrfs_fs_info *fs_info = cache->fs_info; - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root; struct btrfs_path *path; struct btrfs_key key; struct btrfs_key found_key; @@ -1119,6 +1119,7 @@ static int calculate_alloc_pointer(struct btrfs_block_group *cache, key.type = 0; key.offset = 0; + root = btrfs_extent_root(fs_info, key.objectid); ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); /* We should not find the exact match */ if (!ret) From patchwork Fri Nov 5 20:45:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605959 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D12EBC4332F for ; Fri, 5 Nov 2021 20:46:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BD7186136F for ; Fri, 5 Nov 2021 20:46:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233785AbhKEUtE (ORCPT ); Fri, 5 Nov 2021 16:49:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56434 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233768AbhKEUtB (ORCPT ); Fri, 5 Nov 2021 16:49:01 -0400 Received: from mail-qk1-x72b.google.com (mail-qk1-x72b.google.com [IPv6:2607:f8b0:4864:20::72b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EC76FC061714 for ; Fri, 5 Nov 2021 13:46:21 -0700 (PDT) Received: by mail-qk1-x72b.google.com with SMTP id br39so9870664qkb.8 for ; Fri, 05 Nov 2021 13:46:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Y0qNrY3DW0nvGwiPS7nrp7Su0O1y6/0J6EOiclGaKHo=; b=A+2U9OI/1LA7VhguvJjdS8g+3RIhx5ifdY5hisxItZ2t26HbSWnUSXu0yyZRxhSwdS dKozbeLNwwI+svgX/MvyKfwe2/gRfyRoDxasYYb7bqpSqGvHN5wHOXVoq5FyE5ML1HCt MsiTuvqjZ/+x30XBbvWxva/mOTxPiCmyEPhKiHM4YnFSUQNyJNXjY7Nt+4C3xIGlHkCu upUGJ+6h83IKHHzMRR28k37ekM1NwiMejn/Je9HUi7Dp4Qaf/f8v7yszhV5FtsZ1ZSim /fRuPpO/CJ5emsmGPjAKG+WVrHTABL8OlbJP9pXDz6eWxKknm9CHH5trj/dF1dsq/C/x b3Wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Y0qNrY3DW0nvGwiPS7nrp7Su0O1y6/0J6EOiclGaKHo=; b=RaYSltdYfgeODLsVGw8buSODKIDxID6tp0wn7azOZ8GjTTJ1qsJjo1WgtNDRapvOml uCW6nlRe1GsCCnO025ZD9EwTgbXLqnggKEjhJvc7f7ZQgcVS235352l7t3YtNQu3x4u5 IlaXv3T48hxPhDTI8mptEAPq0Y1UiKqOp6rdYcxeaI+T9E0qNO8DK8mpziMwMo4JaQrf twOa5dxHOlL9XNab9ZaKP0XyAM2upEKIFvLqD9bdiAK2dc/AVhqZ97s6eNxkga7ky15D VMBQWYwYSGVFlQ76wbQOecJNq+buIfx46tZE5wuWGdjeipUBv6ltuqTUicEeGysXKiRf gIvw== X-Gm-Message-State: AOAM532SjQkx7BuHj3Z0KKsrhRNOt4jAv95bDaVIs57PdxTfLBGnbJCJ ozpMvF+rAhbdWQl3KvdoXr/rcbGzwqMMCg== X-Google-Smtp-Source: ABdhPJyKw4aSZWaGUdUpIprk1UleLot1K+rxYbYNUZqslUzyI4xBgeqP7iVgAdPqSpfLQgZVzMHfSg== X-Received: by 2002:a37:9b17:: with SMTP id d23mr4628719qke.333.1636145180843; Fri, 05 Nov 2021 13:46:20 -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 s7sm6461863qta.3.2021.11.05.13.46.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:20 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 20/25] btrfs: fix csum assert to check objectid of the root Date: Fri, 5 Nov 2021 16:45:46 -0400 Message-Id: <279415dd30710ef468ac51e844c5d8ed8e2d8b45.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org In the future we may have multiple csum roots, so simply check the objectid is for a csum root instead of checking against ->csum_root. Signed-off-by: Josef Bacik --- fs/btrfs/file-item.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index d1cbb64a78f3..359f3a047360 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -801,7 +801,7 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, const u32 csum_size = fs_info->csum_size; u32 blocksize_bits = fs_info->sectorsize_bits; - ASSERT(root == fs_info->csum_root || + ASSERT(root->root_key.objectid == BTRFS_CSUM_TREE_OBJECTID || root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID); path = btrfs_alloc_path(); From patchwork Fri Nov 5 20:45:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605961 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 25975C43217 for ; Fri, 5 Nov 2021 20:46:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 168986135A for ; Fri, 5 Nov 2021 20:46:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233782AbhKEUtF (ORCPT ); Fri, 5 Nov 2021 16:49:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233780AbhKEUtD (ORCPT ); Fri, 5 Nov 2021 16:49:03 -0400 Received: from mail-qt1-x82d.google.com (mail-qt1-x82d.google.com [IPv6:2607:f8b0:4864:20::82d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 352CCC061714 for ; Fri, 5 Nov 2021 13:46:23 -0700 (PDT) Received: by mail-qt1-x82d.google.com with SMTP id x10so7898906qta.6 for ; Fri, 05 Nov 2021 13:46:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=WJv7oHdbm/3jGPHxCCKOpP9ppVEdt53QbnwPt2wirfU=; b=NwNRZMsKum9XXL9KZPmfTdhVS5Nzkbbs9UxKosdojRO+zuz/vIrxg3psLCiGnfBkJq ul/PaetEe7Pf93/mm+HcDP9z4RWmTNEvDEADzpSKHYauuy2bppB9ZN8c6OAlgCc850x6 +fW7vzW1IJfYUoZGDweEAJ7SN1L02uzHgq8HWl0UZWN6dstlRgY9zI0m4+W/deQpHK71 fVLkDMFyb81hYblUpFDbg02lT/XefhRZWeOBcYC1ue9TLRax/wFDuvSGYA+Mz32mnKqz aFDgIPc97+D++jcUBwyKlV4k9Q2dxR8BRfyPlYnhQW90ax+CYvGHr9xjOic/WO4/YgKs x70g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WJv7oHdbm/3jGPHxCCKOpP9ppVEdt53QbnwPt2wirfU=; b=NHQbTVqaBjOuaGfDe1M77wgXkcYRlUo9oaMe5XohIzP9xEc3UosfJgfQcr5QPZQLZa M2kgJqhotJCdNwDqzgnnI57RAANv7FMQv8SKiHfb8ShDYd/bvwmYEX9T/IQpEeh8MJNQ II9S3yyU/rWICaI779OJ3vv1UKSCNpuyLsg1E8G1gDK1Kyr/CbGdWXPDJbXW/oz5wmff tgKAAAVFIvh50UjZHy3vWkJyU8k/NzXotx/2T91uQo0TlGyxAFYuIjQSU/Cys+9Pplob 4+cu2O3YsQ1E5WHmT5ci/905rEia5sfrLLtZi+873G3LurxK9h4Sc4Nv0wWvankuWrc+ l8Ww== X-Gm-Message-State: AOAM532TjQg3IfdWOVLlJyXLNGgr2+AgAItFROv/0jN0hMIa7AWWkU/b 9pz+TP1rWfTZNSF2UmR9nz2ICI6/wX1HEQ== X-Google-Smtp-Source: ABdhPJzWo6C+MuEs/GdzOGjm6uzdggvAXSWDv9VGy8pLK2wGB+3hbN5Glk79dhrr7CTYZqNG8T3vYQ== X-Received: by 2002:ac8:57d2:: with SMTP id w18mr28906450qta.200.1636145182056; Fri, 05 Nov 2021 13:46:22 -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 w22sm6088747qto.15.2021.11.05.13.46.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:21 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 21/25] btrfs: set BTRFS_FS_STATE_NO_CSUMS if we fail to load the csum root Date: Fri, 5 Nov 2021 16:45:47 -0400 Message-Id: <4cc384d51e895b2aaaaf302b909f5eec39a06adb.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We have a few places where we skip doing csums if we mounted with one of the rescue options that ignores bad csum roots. In the future when there are multiple csum roots it'll be costly to check and see if there are any missing csum roots, so simply add a flag to indicate the fs should skip loading csums in case of errors. Signed-off-by: Josef Bacik --- fs/btrfs/compression.c | 3 ++- fs/btrfs/ctree.h | 2 ++ fs/btrfs/disk-io.c | 5 +++++ fs/btrfs/file-item.c | 3 ++- fs/btrfs/inode.c | 4 ++-- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 1d071c8d6fff..a76107d6f7f2 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -156,7 +156,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 (!fs_info->csum_root || (inode->flags & BTRFS_INODE_NODATASUM)) + if ((inode->flags & BTRFS_INODE_NODATASUM) || + test_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state)) return 0; shash->tfm = fs_info->csum_shash; diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index dac5741cb6fa..13bd6fc3901a 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -143,6 +143,8 @@ enum { BTRFS_FS_STATE_DEV_REPLACING, /* The btrfs_fs_info created for self-tests */ BTRFS_FS_STATE_DUMMY_FS_INFO, + + BTRFS_FS_STATE_NO_CSUMS, }; #define BTRFS_BACKREF_REV_MAX 256 diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 1ada4c96ef71..898b4ff83718 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2475,11 +2475,16 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) { ret = PTR_ERR(root); goto out; + } else { + set_bit(BTRFS_FS_STATE_NO_CSUMS, + &fs_info->fs_state); } } else { set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); fs_info->csum_root = root; } + } else { + set_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state); } /* diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 359f3a047360..4904286139bf 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -376,7 +376,8 @@ blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio, u8 *dst const unsigned int nblocks = orig_len >> fs_info->sectorsize_bits; int count = 0; - if (!fs_info->csum_root || (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) + if ((BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) || + test_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state)) return BLK_STS_OK; /* diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 9e81fd94ab09..6d14dd2cf36e 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2516,7 +2516,7 @@ blk_status_t btrfs_submit_data_bio(struct inode *inode, struct bio *bio, int async = !atomic_read(&BTRFS_I(inode)->sync_writers); skip_sum = (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) || - !fs_info->csum_root; + test_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state); if (btrfs_is_free_space_inode(BTRFS_I(inode))) metadata = BTRFS_WQ_ENDIO_FREE_SPACE; @@ -3314,7 +3314,7 @@ unsigned int btrfs_verify_data_csum(struct btrfs_bio *bbio, if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) return 0; - if (!root->fs_info->csum_root) + if (unlikely(test_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state))) return 0; ASSERT(page_offset(page) <= start && From patchwork Fri Nov 5 20:45:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605965 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 518B8C433F5 for ; Fri, 5 Nov 2021 20:46:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 362836135A for ; Fri, 5 Nov 2021 20:46:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233791AbhKEUtG (ORCPT ); Fri, 5 Nov 2021 16:49:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56450 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233786AbhKEUtE (ORCPT ); Fri, 5 Nov 2021 16:49:04 -0400 Received: from mail-qt1-x82b.google.com (mail-qt1-x82b.google.com [IPv6:2607:f8b0:4864:20::82b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 97577C061208 for ; Fri, 5 Nov 2021 13:46:24 -0700 (PDT) Received: by mail-qt1-x82b.google.com with SMTP id d21so8298089qtw.11 for ; Fri, 05 Nov 2021 13:46:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=i7rp3b4P5njvg3O/GnagV1vA+am3TedFEDudIKpe7FQ=; b=rnarlWSHHxyh0tLYdgKsmz08/APQpcR4d4+XE1mJl01gPvIg15SXhK3oEdLLc7tdBv U91hc9fFGONofjAxgzycZSx75xS5hmEZBrWdLycucB43sITQGxw9LZjyRrB9fZx3YL2S lqhLmFozMT1WMis8stJopJoAz3nF8uxP7mNmvAKKhvbbGxblbI+XIpZNHrUE/vlaqq6B iS2nhKaLPCg2HrwP7VbKrsvPTpAXVsspMEfDgKx3NO/1SkLNChFkOwblbU2GIIKP1u4D YXUNdbYoiiC5+ceLCXAgYpfH/jlCUy20WTEhvpxqvF7ySCP+JfaOPmLhHID17WjnCjgf w3ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=i7rp3b4P5njvg3O/GnagV1vA+am3TedFEDudIKpe7FQ=; b=8RvIq6/Zv+PjbBw2PGtwYMZfNPxRnP5c8eZWdC5CmbLGxNxJliBozGz4YqGAfyBwUS OYIZEbFV8/Nr89Ik6lYIp8fJ8yDHu2QWdnVRQfbp8kK1d/FNtS3EiUsIvCE/qUf8iDbD SfTnjhhgyFnB/5uv5zLVyS6iXVUHZuo+eTarYFsIVDnPEw7gMo+K6HcR9/XxKsooZzY+ E0QQIK1sEt5iG92jJdqRAyi9eI8v3nuMPvxOibRbGvoMKaZO2uvi1qQp77V5EACdsGQc lacUK6JF0jiC8XAVteJaMKe+snY+XB80PeKtZSPsrkSVujp+aEXc+6gD7+Dm674CeVwZ obzQ== X-Gm-Message-State: AOAM5329abSqdWsf38KcmSu3OfucU8NQ+M+xxZzH2oJio/0JqJHXSnqg edfcRs6vT/CWgrc8YIec6r3OiFf7ESTbpA== X-Google-Smtp-Source: ABdhPJyuhgoiRrvbr/RAuFajTxMKU0NshXJ6eWc8lsunwlUWCkkjdKO3vCndis7i5pjsDIdvfUORjA== X-Received: by 2002:ac8:5e12:: with SMTP id h18mr44272036qtx.168.1636145183473; Fri, 05 Nov 2021 13:46: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 az39sm6431080qkb.2.2021.11.05.13.46.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:23 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 22/25] btrfs: stop accessing ->csum_root directly Date: Fri, 5 Nov 2021 16:45:48 -0400 Message-Id: <8502fb8b2b46ccbe497691a3d721f015bf95fb19.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We are going to have multiple csum roots in the future, so convert all users of ->csum_root to btrfs_csum_root() and rename ->csum_root to ->_csum_root so we can easily find remaining users in the future. Signed-off-by: Josef Bacik --- fs/btrfs/block-rsv.c | 8 +++++--- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 15 ++++++++------- fs/btrfs/disk-io.h | 6 ++++++ fs/btrfs/extent-tree.c | 11 ++++++++--- fs/btrfs/file-item.c | 4 +++- fs/btrfs/inode.c | 11 ++++++++--- fs/btrfs/relocation.c | 4 +++- fs/btrfs/scrub.c | 7 +++++-- fs/btrfs/tree-log.c | 19 +++++++++++++------ 10 files changed, 60 insertions(+), 27 deletions(-) diff --git a/fs/btrfs/block-rsv.c b/fs/btrfs/block-rsv.c index 7f5c230ea547..7dcbe901b583 100644 --- a/fs/btrfs/block-rsv.c +++ b/fs/btrfs/block-rsv.c @@ -355,6 +355,7 @@ void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info) struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv; struct btrfs_space_info *sinfo = block_rsv->space_info; struct btrfs_root *extent_root = btrfs_extent_root(fs_info, 0); + struct btrfs_root *csum_root = btrfs_csum_root(fs_info, 0); u64 num_bytes; unsigned min_items; @@ -364,7 +365,7 @@ void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info) * it to a minimal amount for safety. */ num_bytes = btrfs_root_used(&extent_root->root_item) + - btrfs_root_used(&fs_info->csum_root->root_item) + + btrfs_root_used(&csum_root->root_item) + btrfs_root_used(&fs_info->tree_root->root_item); /* @@ -478,8 +479,9 @@ static struct btrfs_block_rsv *get_block_rsv( struct btrfs_block_rsv *block_rsv = NULL; if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state) || - (root == fs_info->csum_root && trans->adding_csums) || - (root == fs_info->uuid_root)) + (root == fs_info->uuid_root) || + (trans->adding_csums && + root->root_key.objectid == BTRFS_CSUM_TREE_OBJECTID)) block_rsv = trans->block_rsv; if (!block_rsv) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 13bd6fc3901a..c8bd1abc7b89 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -628,7 +628,7 @@ struct btrfs_fs_info { struct btrfs_root *chunk_root; struct btrfs_root *dev_root; struct btrfs_root *fs_root; - struct btrfs_root *csum_root; + struct btrfs_root *_csum_root; struct btrfs_root *quota_root; struct btrfs_root *uuid_root; struct btrfs_root *free_space_root; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 898b4ff83718..b8a92bb6081d 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1563,7 +1563,7 @@ static struct btrfs_root *btrfs_get_global_root(struct btrfs_fs_info *fs_info, if (objectid == BTRFS_DEV_TREE_OBJECTID) return btrfs_grab_root(fs_info->dev_root); if (objectid == BTRFS_CSUM_TREE_OBJECTID) - return btrfs_grab_root(fs_info->csum_root); + return btrfs_grab_root(fs_info->_csum_root); if (objectid == BTRFS_QUOTA_TREE_OBJECTID) return btrfs_grab_root(fs_info->quota_root) ? fs_info->quota_root : ERR_PTR(-ENOENT); @@ -1634,7 +1634,7 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) btrfs_put_root(fs_info->tree_root); btrfs_put_root(fs_info->chunk_root); btrfs_put_root(fs_info->dev_root); - btrfs_put_root(fs_info->csum_root); + btrfs_put_root(fs_info->_csum_root); btrfs_put_root(fs_info->quota_root); btrfs_put_root(fs_info->uuid_root); btrfs_put_root(fs_info->free_space_root); @@ -2001,6 +2001,7 @@ static void backup_super_roots(struct btrfs_fs_info *info) const int next_backup = info->backup_root_index; struct btrfs_root_backup *root_backup; struct btrfs_root *extent_root = btrfs_extent_root(info, 0); + struct btrfs_root *csum_root = btrfs_csum_root(info, 0); root_backup = info->super_for_commit->super_roots + next_backup; @@ -2050,11 +2051,11 @@ static void backup_super_roots(struct btrfs_fs_info *info) btrfs_set_backup_dev_root_level(root_backup, btrfs_header_level(info->dev_root->node)); - btrfs_set_backup_csum_root(root_backup, info->csum_root->node->start); + btrfs_set_backup_csum_root(root_backup, csum_root->node->start); btrfs_set_backup_csum_root_gen(root_backup, - btrfs_header_generation(info->csum_root->node)); + btrfs_header_generation(csum_root->node)); btrfs_set_backup_csum_root_level(root_backup, - btrfs_header_level(info->csum_root->node)); + btrfs_header_level(csum_root->node)); btrfs_set_backup_total_bytes(root_backup, btrfs_super_total_bytes(info->super_copy)); @@ -2160,7 +2161,7 @@ static void free_root_pointers(struct btrfs_fs_info *info, bool free_chunk_root) free_root_extent_buffers(info->dev_root); free_root_extent_buffers(info->_extent_root); - free_root_extent_buffers(info->csum_root); + free_root_extent_buffers(info->_csum_root); free_root_extent_buffers(info->quota_root); free_root_extent_buffers(info->uuid_root); free_root_extent_buffers(info->fs_root); @@ -2481,7 +2482,7 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) } } else { set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); - fs_info->csum_root = root; + fs_info->_csum_root = root; } } else { set_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state); diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index e2824c6ada72..a4d1788acd24 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h @@ -109,6 +109,12 @@ static inline struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_info return fs_info->_extent_root; } +static inline struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, + u64 bytenr) +{ + return fs_info->_csum_root; +} + static inline struct btrfs_root *btrfs_block_group_root(struct btrfs_fs_info *fs_info) { return btrfs_extent_root(fs_info, 0); diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index de80b7109a08..3cf354223e55 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -1851,8 +1851,11 @@ static int cleanup_ref_head(struct btrfs_trans_handle *trans, if (head->must_insert_reserved) { btrfs_pin_extent(trans, head->bytenr, head->num_bytes, 1); if (head->is_data) { - ret = btrfs_del_csums(trans, fs_info->csum_root, - head->bytenr, head->num_bytes); + struct btrfs_root *csum_root; + + csum_root = btrfs_csum_root(fs_info, head->bytenr); + ret = btrfs_del_csums(trans, csum_root, head->bytenr, + head->num_bytes); } } @@ -3188,7 +3191,9 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, btrfs_release_path(path); if (is_data) { - ret = btrfs_del_csums(trans, info->csum_root, bytenr, + struct btrfs_root *csum_root; + csum_root = btrfs_csum_root(info, bytenr); + ret = btrfs_del_csums(trans, csum_root, bytenr, num_bytes); if (ret) { btrfs_abort_transaction(trans, ret); diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 4904286139bf..be2bd13b34e0 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -257,6 +257,7 @@ static int search_csum_tree(struct btrfs_fs_info *fs_info, struct btrfs_path *path, u64 disk_bytenr, u64 len, u8 *dst) { + struct btrfs_root *csum_root; struct btrfs_csum_item *item = NULL; struct btrfs_key key; const u32 sectorsize = fs_info->sectorsize; @@ -285,7 +286,8 @@ static int search_csum_tree(struct btrfs_fs_info *fs_info, /* Current item doesn't contain the desired range, search again */ btrfs_release_path(path); - item = btrfs_lookup_csum(NULL, fs_info->csum_root, path, disk_bytenr, 0); + csum_root = btrfs_csum_root(fs_info, disk_bytenr); + item = btrfs_lookup_csum(NULL, csum_root, path, disk_bytenr, 0); if (IS_ERR(item)) { ret = PTR_ERR(item); goto out; diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 6d14dd2cf36e..613b4dd13aec 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1530,11 +1530,12 @@ static noinline int run_delalloc_zoned(struct btrfs_inode *inode, static noinline int csum_exist_in_range(struct btrfs_fs_info *fs_info, u64 bytenr, u64 num_bytes) { - int ret; + struct btrfs_root *csum_root = btrfs_csum_root(fs_info, bytenr); struct btrfs_ordered_sum *sums; + int ret; LIST_HEAD(list); - ret = btrfs_lookup_csums_range(fs_info->csum_root, bytenr, + ret = btrfs_lookup_csums_range(csum_root, bytenr, bytenr + num_bytes - 1, &list, 0); if (ret == 0 && list_empty(&list)) return 0; @@ -2584,11 +2585,15 @@ static int add_pending_csums(struct btrfs_trans_handle *trans, struct list_head *list) { struct btrfs_ordered_sum *sum; + struct btrfs_root *csum_root = NULL; int ret; list_for_each_entry(sum, list, list) { trans->adding_csums = true; - ret = btrfs_csum_file_blocks(trans, trans->fs_info->csum_root, sum); + if (!csum_root) + csum_root = btrfs_csum_root(trans->fs_info, + sum->bytenr); + ret = btrfs_csum_file_blocks(trans, csum_root, sum); trans->adding_csums = false; if (ret) return ret; diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index dc99b4a27d5f..1bbe15dfb496 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -4306,6 +4306,7 @@ int btrfs_recover_relocation(struct btrfs_root *root) int btrfs_reloc_clone_csums(struct btrfs_inode *inode, u64 file_pos, u64 len) { struct btrfs_fs_info *fs_info = inode->root->fs_info; + struct btrfs_root *csum_root; struct btrfs_ordered_sum *sums; struct btrfs_ordered_extent *ordered; int ret; @@ -4317,7 +4318,8 @@ int btrfs_reloc_clone_csums(struct btrfs_inode *inode, u64 file_pos, u64 len) BUG_ON(ordered->file_offset != file_pos || ordered->num_bytes != len); disk_bytenr = file_pos + inode->index_cnt; - ret = btrfs_lookup_csums_range(fs_info->csum_root, disk_bytenr, + csum_root = btrfs_csum_root(fs_info, disk_bytenr); + ret = btrfs_lookup_csums_range(csum_root, disk_bytenr, disk_bytenr + len - 1, &list, 0); if (ret) goto out; diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 7c272cfd241f..6b0ee1b17ae5 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -2898,7 +2898,7 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx, { struct btrfs_fs_info *fs_info = sctx->fs_info; struct btrfs_root *root = btrfs_extent_root(fs_info, logic_start); - struct btrfs_root *csum_root = fs_info->csum_root; + struct btrfs_root *csum_root; struct btrfs_extent_item *extent; struct btrfs_io_context *bioc = NULL; u64 flags; @@ -3060,6 +3060,7 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx, extent_dev = bioc->stripes[0].dev; btrfs_put_bioc(bioc); + csum_root = btrfs_csum_root(fs_info, extent_logical); ret = btrfs_lookup_csums_range(csum_root, extent_logical, extent_logical + extent_len - 1, @@ -3169,7 +3170,7 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx, struct btrfs_path *path, *ppath; struct btrfs_fs_info *fs_info = sctx->fs_info; struct btrfs_root *root; - struct btrfs_root *csum_root = fs_info->csum_root; + struct btrfs_root *csum_root; struct btrfs_extent_item *extent; struct blk_plug plug; u64 flags; @@ -3273,6 +3274,8 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx, key_end.offset = (u64)-1; reada1 = btrfs_reada_add(root, &key, &key_end); + csum_root = btrfs_csum_root(fs_info, logical); + if (cache->flags & BTRFS_BLOCK_GROUP_DATA) { key.objectid = BTRFS_EXTENT_CSUM_OBJECTID; key.type = BTRFS_EXTENT_CSUM_KEY; diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 8ab33caf016f..3dcee69299c4 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -872,17 +872,21 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, */ while (!list_empty(&ordered_sums)) { struct btrfs_ordered_sum *sums; + struct btrfs_root *csum_root; + sums = list_entry(ordered_sums.next, struct btrfs_ordered_sum, list); + csum_root = btrfs_csum_root(fs_info, + sums->bytenr); if (!ret) - ret = btrfs_del_csums(trans, - fs_info->csum_root, + ret = btrfs_del_csums(trans, csum_root, sums->bytenr, sums->len); if (!ret) ret = btrfs_csum_file_blocks(trans, - fs_info->csum_root, sums); + csum_root, + sums); list_del(&sums->list); kfree(sums); } @@ -4391,6 +4395,7 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, found_type = btrfs_file_extent_type(src, extent); if (found_type == BTRFS_FILE_EXTENT_REG) { + struct btrfs_root *csum_root; u64 ds, dl, cs, cl; ds = btrfs_file_extent_disk_bytenr(src, extent); @@ -4409,8 +4414,8 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, cl = dl; } - ret = btrfs_lookup_csums_range( - fs_info->csum_root, + csum_root = btrfs_csum_root(fs_info, ds); + ret = btrfs_lookup_csums_range(csum_root, ds + cs, ds + cs + cl - 1, &ordered_sums, 0); if (ret) @@ -4462,6 +4467,7 @@ static int log_extent_csums(struct btrfs_trans_handle *trans, struct btrfs_log_ctx *ctx) { struct btrfs_ordered_extent *ordered; + struct btrfs_root *csum_root; u64 csum_offset; u64 csum_len; u64 mod_start = em->mod_start; @@ -4542,7 +4548,8 @@ static int log_extent_csums(struct btrfs_trans_handle *trans, } /* block start is already adjusted for the file extent offset. */ - ret = btrfs_lookup_csums_range(trans->fs_info->csum_root, + csum_root = btrfs_csum_root(trans->fs_info, em->block_start); + ret = btrfs_lookup_csums_range(csum_root, em->block_start + csum_offset, em->block_start + csum_offset + csum_len - 1, &ordered_sums, 0); From patchwork Fri Nov 5 20:45:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605967 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CF7AAC433FE for ; Fri, 5 Nov 2021 20:46:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BE0F66135A for ; Fri, 5 Nov 2021 20:46:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233792AbhKEUtH (ORCPT ); Fri, 5 Nov 2021 16:49:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56456 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233790AbhKEUtG (ORCPT ); Fri, 5 Nov 2021 16:49:06 -0400 Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 34B31C061714 for ; Fri, 5 Nov 2021 13:46:26 -0700 (PDT) Received: by mail-qt1-x82f.google.com with SMTP id h17so6000312qtx.9 for ; Fri, 05 Nov 2021 13:46:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=qYJ7yyPyl8XAKXikqQkBbgcBgxjvYHqTcLvaieX/Mno=; b=YJ2ib8xL1GaYReWbl2D9w3K7MA/eBa5N66r4ifKPklaimGU/trWu+1vpigZSVv1a8l 5IhYwsmBWet0x78WkYFN4x9Z+iqps4ZtOn+GRi2ZbG30sYR6ByX1C7302oNAqD6Mx54i AzvmgGc3dZ+tpjx+Ir9bTptc75E2JvXPmxLymSucY1k2/2NX+cLNw4r1jofKuljlKk8I LivQpF0Dyd+hr82fHDXAXCtNukXIU6Ns9xeImY1kdQ1VxCbUKFzpltIJe9xCbwi68LeW V93oVDi3k2QlGVFZnfdrxLfOok1AgDnLJ2FNlbrzR+o0yUz3xnLBtfZSXDjfgkZElsen 2P2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qYJ7yyPyl8XAKXikqQkBbgcBgxjvYHqTcLvaieX/Mno=; b=3e2zuRHb/m1K/KosezXyDccBPe8zRfF5LJtTesXX7DAkFETpsIBNz926L1IT6ynIsO BFA6nfQjW2Tqp8AWvp3B/aghw1ijX/0qdSl3uDG5vySLyiDEklzSJ1Bdr3TfIkpucvy0 sEkq7tHV1aoYzCb3h6UKrnTDWFnfEwtOyqNhspm5V3cJhnSu9MXKSNcdA40cZeJ8HYS/ 8d8p4plVUlT2I1ucyRAr7mInTACzm9Q7iogZWVj+rWE89zDvvOqoY+FGRino3sBtsTmL h3aHR8JBZ3AeVxp9J8TCCjxbHe+G+ap7iHdwtc+KkCDU4GHKWxxh8km/Vv/6lr0ZBurq OSYA== X-Gm-Message-State: AOAM531aa1crRT31hDKrMr4BJKo+PCFHKE2wQ84niqwgjDJcfDHH7iZ/ LQ9hIKXChgQn7vLKjMCNskvbJpSAUmx4Gw== X-Google-Smtp-Source: ABdhPJwoML+4xuMnf3g88pM/RHB7KW92YmaDjXWjiA1/+EW8KDdWKz+zOOmIuls56cB1fVcWUaht4A== X-Received: by 2002:ac8:1e0b:: with SMTP id n11mr62837762qtl.274.1636145184956; Fri, 05 Nov 2021 13:46:24 -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 d129sm5770034qkf.136.2021.11.05.13.46.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:24 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 23/25] btrfs: stop accessing ->free_space_root directly Date: Fri, 5 Nov 2021 16:45:49 -0400 Message-Id: X-Mailer: git-send-email 2.26.3 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 multiple free space roots in the future, so adjust all the users of the free space root to use a helper to access the root. Signed-off-by: Josef Bacik --- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 10 ++++---- fs/btrfs/free-space-tree.c | 32 +++++++++++++++----------- fs/btrfs/tests/free-space-tree-tests.c | 2 +- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index c8bd1abc7b89..773a45470610 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -631,7 +631,7 @@ struct btrfs_fs_info { struct btrfs_root *_csum_root; struct btrfs_root *quota_root; struct btrfs_root *uuid_root; - struct btrfs_root *free_space_root; + struct btrfs_root *_free_space_root; struct btrfs_root *data_reloc_root; /* the log root tree is a directory of all the other log roots */ diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index b8a92bb6081d..b0efc9ca9eaa 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1571,8 +1571,8 @@ static struct btrfs_root *btrfs_get_global_root(struct btrfs_fs_info *fs_info, return btrfs_grab_root(fs_info->uuid_root) ? fs_info->uuid_root : ERR_PTR(-ENOENT); if (objectid == BTRFS_FREE_SPACE_TREE_OBJECTID) - return btrfs_grab_root(fs_info->free_space_root) ? - fs_info->free_space_root : ERR_PTR(-ENOENT); + return btrfs_grab_root(fs_info->_free_space_root) ? + fs_info->_free_space_root : ERR_PTR(-ENOENT); return NULL; } @@ -1637,7 +1637,7 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) btrfs_put_root(fs_info->_csum_root); btrfs_put_root(fs_info->quota_root); btrfs_put_root(fs_info->uuid_root); - btrfs_put_root(fs_info->free_space_root); + btrfs_put_root(fs_info->_free_space_root); btrfs_put_root(fs_info->fs_root); btrfs_put_root(fs_info->data_reloc_root); btrfs_check_leaked_roots(fs_info); @@ -2168,7 +2168,7 @@ static void free_root_pointers(struct btrfs_fs_info *info, bool free_chunk_root) free_root_extent_buffers(info->data_reloc_root); if (free_chunk_root) free_root_extent_buffers(info->chunk_root); - free_root_extent_buffers(info->free_space_root); + free_root_extent_buffers(info->_free_space_root); } void btrfs_put_root(struct btrfs_root *root) @@ -2535,7 +2535,7 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) } } else { set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); - fs_info->free_space_root = root; + fs_info->_free_space_root = root; } } diff --git a/fs/btrfs/free-space-tree.c b/fs/btrfs/free-space-tree.c index 968c79d86d72..c0f0ba66b5ae 100644 --- a/fs/btrfs/free-space-tree.c +++ b/fs/btrfs/free-space-tree.c @@ -16,6 +16,12 @@ static int __add_block_group_free_space(struct btrfs_trans_handle *trans, struct btrfs_block_group *block_group, struct btrfs_path *path); +static struct btrfs_root *btrfs_free_space_root( + struct btrfs_block_group *block_group) +{ + return block_group->fs_info->_free_space_root; +} + void set_free_space_tree_thresholds(struct btrfs_block_group *cache) { u32 bitmap_range; @@ -51,7 +57,7 @@ static int add_new_free_space_info(struct btrfs_trans_handle *trans, struct btrfs_block_group *block_group, struct btrfs_path *path) { - struct btrfs_root *root = trans->fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(block_group); struct btrfs_free_space_info *info; struct btrfs_key key; struct extent_buffer *leaf; @@ -85,7 +91,7 @@ struct btrfs_free_space_info *search_free_space_info( struct btrfs_path *path, int cow) { struct btrfs_fs_info *fs_info = block_group->fs_info; - struct btrfs_root *root = fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(block_group); struct btrfs_key key; int ret; @@ -188,7 +194,7 @@ int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans, struct btrfs_path *path) { struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *root = fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(block_group); struct btrfs_free_space_info *info; struct btrfs_key key, found_key; struct extent_buffer *leaf; @@ -326,7 +332,7 @@ int convert_free_space_to_extents(struct btrfs_trans_handle *trans, struct btrfs_path *path) { struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *root = fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(block_group); struct btrfs_free_space_info *info; struct btrfs_key key, found_key; struct extent_buffer *leaf; @@ -586,7 +592,7 @@ static int modify_free_space_bitmap(struct btrfs_trans_handle *trans, struct btrfs_path *path, u64 start, u64 size, int remove) { - struct btrfs_root *root = block_group->fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(block_group); struct btrfs_key key; u64 end = start + size; u64 cur_start, cur_size; @@ -699,7 +705,7 @@ static int remove_free_space_extent(struct btrfs_trans_handle *trans, struct btrfs_path *path, u64 start, u64 size) { - struct btrfs_root *root = trans->fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(block_group); struct btrfs_key key; u64 found_start, found_end; u64 end = start + size; @@ -851,7 +857,7 @@ static int add_free_space_extent(struct btrfs_trans_handle *trans, struct btrfs_path *path, u64 start, u64 size) { - struct btrfs_root *root = trans->fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(block_group); struct btrfs_key key, new_key; u64 found_start, found_end; u64 end = start + size; @@ -1158,7 +1164,7 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info) ret = PTR_ERR(free_space_root); goto abort; } - fs_info->free_space_root = free_space_root; + fs_info->_free_space_root = free_space_root; node = rb_first(&fs_info->block_group_cache_tree); while (node) { @@ -1233,7 +1239,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) { struct btrfs_trans_handle *trans; struct btrfs_root *tree_root = fs_info->tree_root; - struct btrfs_root *free_space_root = fs_info->free_space_root; + struct btrfs_root *free_space_root = fs_info->_free_space_root; int ret; trans = btrfs_start_transaction(tree_root, 0); @@ -1242,7 +1248,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE); btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID); - fs_info->free_space_root = NULL; + fs_info->_free_space_root = NULL; ret = clear_free_space_tree(trans, free_space_root); if (ret) @@ -1320,7 +1326,7 @@ int add_block_group_free_space(struct btrfs_trans_handle *trans, int remove_block_group_free_space(struct btrfs_trans_handle *trans, struct btrfs_block_group *block_group) { - struct btrfs_root *root = trans->fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(block_group); struct btrfs_path *path; struct btrfs_key key, found_key; struct extent_buffer *leaf; @@ -1411,7 +1417,7 @@ static int load_free_space_bitmaps(struct btrfs_caching_control *caching_ctl, block_group = caching_ctl->block_group; fs_info = block_group->fs_info; - root = fs_info->free_space_root; + root = btrfs_free_space_root(block_group); end = block_group->start + block_group->length; @@ -1489,7 +1495,7 @@ static int load_free_space_extents(struct btrfs_caching_control *caching_ctl, block_group = caching_ctl->block_group; fs_info = block_group->fs_info; - root = fs_info->free_space_root; + root = btrfs_free_space_root(block_group); end = block_group->start + block_group->length; diff --git a/fs/btrfs/tests/free-space-tree-tests.c b/fs/btrfs/tests/free-space-tree-tests.c index 2c783d2f5228..7d6de8b53038 100644 --- a/fs/btrfs/tests/free-space-tree-tests.c +++ b/fs/btrfs/tests/free-space-tree-tests.c @@ -446,7 +446,7 @@ static int run_test(test_func_t test_func, int bitmaps, u32 sectorsize, btrfs_set_super_compat_ro_flags(root->fs_info->super_copy, BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE); - root->fs_info->free_space_root = root; + root->fs_info->_free_space_root = root; root->fs_info->tree_root = root; root->node = alloc_test_extent_buffer(root->fs_info, nodesize); From patchwork Fri Nov 5 20:45:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605963 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2C165C4167B for ; Fri, 5 Nov 2021 20:46:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1990D6135A for ; Fri, 5 Nov 2021 20:46:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233793AbhKEUtI (ORCPT ); Fri, 5 Nov 2021 16:49:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56464 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233786AbhKEUtH (ORCPT ); Fri, 5 Nov 2021 16:49:07 -0400 Received: from mail-qv1-xf30.google.com (mail-qv1-xf30.google.com [IPv6:2607:f8b0:4864:20::f30]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7CBC8C061714 for ; Fri, 5 Nov 2021 13:46:27 -0700 (PDT) Received: by mail-qv1-xf30.google.com with SMTP id b11so8067711qvm.7 for ; Fri, 05 Nov 2021 13:46:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=vPq/UKcbHvK4vXnAq91ap2B3tAcpVn3xBp559m5Fwss=; b=RBzsNdvT/1AFgGjybsFVQvZ31/k0TmJ/UCiF41jYrdPG0RzKQoHg38WdTusi0SzY6j aeCM9a5v4xrjnZ31YtWJMD2DLBU+XGU9/ehTBZVtDH5naW4wgNPBhp3IiHLDgPQ52sI8 FecWUXQRZ20N2Fr/OOfbhN7AV3v4+o/ctNRteLbS3AQS3F6zlkYyHAQFPnsKC8PF3mHL I/h7d6rzcRi8cFSaprsgVah0TOMlC3CbFnJuFDojT/4pMPQ/rYKvyHC9ndVwpykalEAI 0oJJ4qjnH8iFbOnpcOlcP0MRLbwK5PzZig7sndNyNfy7cAwdYG97JfbPtI/iTGQK2/Al HpaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vPq/UKcbHvK4vXnAq91ap2B3tAcpVn3xBp559m5Fwss=; b=GE3PdlIHZcCebb+QVcQWGRbEdekEt0dsHwigf6s3siQjhMcroGSFShqdiQAIdVO57T mrQDKg4z8K7eyFnxWXKRfmBmorghsgqFafyxjlzku8Eh+/vS/m5F9ja7tlnlm7EZi/q0 /WCI2PQBBaZbuvYa9bLtIk00/kdtbj5lwM/YQfWK6KGpY5rcNLEx9TFWElsqPPYH29Nb VD3I1/ZfKAg8pU5d12779Qa744HLt9R77rLJqrqBt6HwDlTbMtkDOuBATYooc1kiR0Wh 3+BShm40A7SCAOWr6xNcQT9pXEiiEFaWJNvVWfwQdG12qTzf6y2Cg5qCbYBZzGh4A9h2 Xm/Q== X-Gm-Message-State: AOAM530r4/lziov7nYogKDk3SUpMhVL1iGhePNfNtSPokAwzVjaixOSD lS6Z/S1CUODG9J0fs3j1Ni2VSyGRa4My5Q== X-Google-Smtp-Source: ABdhPJx+z0EQcWt/mmwe0ZTzcQ+1uQZ50ETTDIrtid2gXQ3DFAUC10xxF94nX13TbYPgcXrBRk9+XQ== X-Received: by 2002:a05:6214:5002:: with SMTP id jo2mr1501723qvb.27.1636145186382; Fri, 05 Nov 2021 13:46:26 -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 a3sm6950938qta.58.2021.11.05.13.46.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:25 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 24/25] btrfs: remove useless WARN_ON in record_root_in_trans Date: Fri, 5 Nov 2021 16:45:50 -0400 Message-Id: <3a1c2fbb7b5888617fc84527b35b87488659691b.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We don't set SHAREABLE on the extent root, we don't need to have this safety check here. Signed-off-by: Josef Bacik --- fs/btrfs/transaction.c | 1 - 1 file changed, 1 deletion(-) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index f51edfe3681d..ba8dd90ac3ce 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -413,7 +413,6 @@ static int record_root_in_trans(struct btrfs_trans_handle *trans, if ((test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && root->last_trans < trans->transid) || force) { - WARN_ON(root == fs_info->_extent_root); WARN_ON(!force && root->commit_root != root->node); /* From patchwork Fri Nov 5 20:45:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605969 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8F461C4332F for ; Fri, 5 Nov 2021 20:46:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 78CE16135A for ; Fri, 5 Nov 2021 20:46:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233798AbhKEUtJ (ORCPT ); Fri, 5 Nov 2021 16:49:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56470 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233786AbhKEUtJ (ORCPT ); Fri, 5 Nov 2021 16:49:09 -0400 Received: from mail-qv1-xf2e.google.com (mail-qv1-xf2e.google.com [IPv6:2607:f8b0:4864:20::f2e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EDA6DC061714 for ; Fri, 5 Nov 2021 13:46:28 -0700 (PDT) Received: by mail-qv1-xf2e.google.com with SMTP id bu11so8103764qvb.0 for ; Fri, 05 Nov 2021 13:46:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=WFNOCeYDoaX+M3z7qEDGl+C6JPUokmmYr5vwUr55ews=; b=pzwLmBnPY93G4kdh+BeZ5ij+R+tifCk4rswZ2AswHH0kRv/VkrdBlW3ZqFuNRA8KIO T0WDdtoe56XW9xdLA3KhN25YUcwAonbp6mMYKtqsys2qLH/c18MuOMOGppz/B+cK8oFn tKU7KxsLl6oj4gMuijPHnNwS40lRnzUX2ADFL/ZQkzeXS1F1g4d7gdiBoIQhBxmGEYY6 qdyJKsRGSN6t+nkV0Mh7xT0vlyPMGXfzNQJUw1N24vDvSfETIskhmcXa3rXDqhmowP+n bt/iWOaYcz/PxVvfKf4Kg7PqRXhS7kFw2CI64icmYe4AUqsc9iIHDznGoYgEdVZ+f4PY 2LqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WFNOCeYDoaX+M3z7qEDGl+C6JPUokmmYr5vwUr55ews=; b=tPQ/hg5xkWFHsK4T5650MEAJ1l6MUFDIsk6D+cqbPXnK8p6QBezzc7nxGph/GFghSJ LbK3eOS1zrxN6guBCq57uMqw1ntY4yvXEtJRfc5kpZBQWL9xRqObfiIfG4KjF9QBxX9s 2sSQsqMB0604t+mmEO1Ob5JJkHlNRgJxN1vWzRYRpaSrZoNK5yTRPhLBEPu4m7LLq0jJ cy3RpP5kxiw/z8+3zJyM9fDnofYSTiZXuChlGDhhHKKLRaR8KLi/0OgVeIXNy6qaHwOs RN9GsHDffDgfJWFCdrKnf7lNLMSQL1n9byXVFWpUNZichliFZqUmFHWTT0TVxXQ+QHI+ sSnA== X-Gm-Message-State: AOAM530DI1USwAZ3OswDaeYMxtE1SJVTtQE+IlN171ZOzlEE/aHucYUo oIqx1DgU+kIzCUjfrfBOyHVgY0Lp7HBr9w== X-Google-Smtp-Source: ABdhPJwws4TUtHFr9oZpsXhF0R21A/FmcoW3zASAlMziBCHs3AxiinooLl96yVk6dk3u3o6JaBWdvg== X-Received: by 2002:a0c:b341:: with SMTP id a1mr57086749qvf.21.1636145187661; Fri, 05 Nov 2021 13:46: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 h17sm6650569qtx.64.2021.11.05.13.46.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:46:27 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 25/25] btrfs: track the csum, extent, and free space trees in a rb tree Date: Fri, 5 Nov 2021 16:45:51 -0400 Message-Id: <9b8e6728cf5a0ee5980fa1336ba3e3e8b257076a.1636144971.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org In the future we are going to have multiple copies of these trees. To facilitate this we need a way to lookup the different roots we are looking for. Handle this by adding a global root rb tree that is indexed on the root->root_key. Then instead of loading the roots at mount time with individually targeted keys, simply search the tree_root for anything with the specific objectid we want. This will make it straightforward to support both old style and new style file systems. Signed-off-by: Josef Bacik --- fs/btrfs/ctree.h | 9 +- fs/btrfs/disk-io.c | 276 +++++++++++++++++++------ fs/btrfs/disk-io.h | 20 +- fs/btrfs/extent-tree.c | 1 + fs/btrfs/free-space-tree.c | 22 +- fs/btrfs/tests/btrfs-tests.c | 1 + fs/btrfs/tests/free-space-tests.c | 5 +- fs/btrfs/tests/free-space-tree-tests.c | 5 +- fs/btrfs/tests/qgroup-tests.c | 5 +- 9 files changed, 264 insertions(+), 80 deletions(-) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 773a45470610..d32aa0fe1415 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -623,20 +623,21 @@ enum btrfs_exclusive_operation { struct btrfs_fs_info { u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; unsigned long flags; - struct btrfs_root *_extent_root; struct btrfs_root *tree_root; struct btrfs_root *chunk_root; struct btrfs_root *dev_root; struct btrfs_root *fs_root; - struct btrfs_root *_csum_root; struct btrfs_root *quota_root; struct btrfs_root *uuid_root; - struct btrfs_root *_free_space_root; struct btrfs_root *data_reloc_root; /* the log root tree is a directory of all the other log roots */ struct btrfs_root *log_root_tree; + /* The tree that holds the global roots (csum, extent, etc) */ + rwlock_t global_root_lock; + struct rb_root global_root_tree; + spinlock_t fs_roots_radix_lock; struct radix_tree_root fs_roots_radix; @@ -1129,6 +1130,8 @@ struct btrfs_qgroup_swapped_blocks { * and for the extent tree extent_root root. */ struct btrfs_root { + struct rb_node rb_node; + struct extent_buffer *node; struct extent_buffer *commit_root; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index b0efc9ca9eaa..2a80b9b6d52d 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1149,6 +1149,7 @@ static void __setup_root(struct btrfs_root *root, struct btrfs_fs_info *fs_info, root->node = NULL; root->commit_root = NULL; root->state = 0; + RB_CLEAR_NODE(&root->rb_node); root->last_trans = 0; root->free_objectid = 0; @@ -1242,6 +1243,82 @@ struct btrfs_root *btrfs_alloc_dummy_root(struct btrfs_fs_info *fs_info) } #endif +static int global_root_cmp(struct rb_node *a_node, const struct rb_node *b_node) +{ + struct btrfs_root *a = rb_entry(a_node, struct btrfs_root, rb_node); + struct btrfs_root *b = rb_entry(b_node, struct btrfs_root, rb_node); + return btrfs_comp_cpu_keys(&a->root_key, &b->root_key); +} + +static int global_root_key_cmp(const void *k, const struct rb_node *node) +{ + struct btrfs_key *key = (struct btrfs_key *)k; + struct btrfs_root *root = rb_entry(node, struct btrfs_root, rb_node); + return btrfs_comp_cpu_keys(key, &root->root_key); +} + +int btrfs_global_root_insert(struct btrfs_root *root) +{ + struct btrfs_fs_info *fs_info = root->fs_info; + struct rb_node *tmp; + + write_lock(&fs_info->global_root_lock); + tmp = rb_find_add(&root->rb_node, &fs_info->global_root_tree, + global_root_cmp); + write_unlock(&fs_info->global_root_lock); + ASSERT(!tmp); + + return tmp ? -EEXIST : 0; +} + +void btrfs_global_root_delete(struct btrfs_root *root) +{ + struct btrfs_fs_info *fs_info = root->fs_info; + + write_lock(&fs_info->global_root_lock); + rb_erase(&root->rb_node, &fs_info->global_root_tree); + write_unlock(&fs_info->global_root_lock); +} + +struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, + struct btrfs_key *key) +{ + struct rb_node *node; + struct btrfs_root *root = NULL; + + read_lock(&fs_info->global_root_lock); + node = rb_find(key, &fs_info->global_root_tree, global_root_key_cmp); + if (node) + root = container_of(node, struct btrfs_root, rb_node); + read_unlock(&fs_info->global_root_lock); + + return root; +} + +struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, + u64 bytenr) +{ + struct btrfs_key key = { + .objectid = BTRFS_CSUM_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + + return btrfs_global_root(fs_info, &key); +} + +struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_info, + u64 bytenr) +{ + struct btrfs_key key = { + .objectid = BTRFS_EXTENT_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + + return btrfs_global_root(fs_info, &key); +} + struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, u64 objectid) { @@ -1554,25 +1631,31 @@ static struct btrfs_root *btrfs_lookup_fs_root(struct btrfs_fs_info *fs_info, static struct btrfs_root *btrfs_get_global_root(struct btrfs_fs_info *fs_info, u64 objectid) { + struct btrfs_key key = { + .objectid = objectid, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; if (objectid == BTRFS_ROOT_TREE_OBJECTID) return btrfs_grab_root(fs_info->tree_root); if (objectid == BTRFS_EXTENT_TREE_OBJECTID) - return btrfs_grab_root(fs_info->_extent_root); + return btrfs_grab_root(btrfs_global_root(fs_info, &key)); if (objectid == BTRFS_CHUNK_TREE_OBJECTID) return btrfs_grab_root(fs_info->chunk_root); if (objectid == BTRFS_DEV_TREE_OBJECTID) return btrfs_grab_root(fs_info->dev_root); if (objectid == BTRFS_CSUM_TREE_OBJECTID) - return btrfs_grab_root(fs_info->_csum_root); + return btrfs_grab_root(btrfs_global_root(fs_info, &key)); if (objectid == BTRFS_QUOTA_TREE_OBJECTID) return btrfs_grab_root(fs_info->quota_root) ? fs_info->quota_root : ERR_PTR(-ENOENT); if (objectid == BTRFS_UUID_TREE_OBJECTID) return btrfs_grab_root(fs_info->uuid_root) ? fs_info->uuid_root : ERR_PTR(-ENOENT); - if (objectid == BTRFS_FREE_SPACE_TREE_OBJECTID) - return btrfs_grab_root(fs_info->_free_space_root) ? - fs_info->_free_space_root : ERR_PTR(-ENOENT); + if (objectid == BTRFS_FREE_SPACE_TREE_OBJECTID) { + struct btrfs_root *root = btrfs_global_root(fs_info, &key); + return btrfs_grab_root(root) ? root : ERR_PTR(-ENOENT); + } return NULL; } @@ -1619,6 +1702,18 @@ void btrfs_check_leaked_roots(struct btrfs_fs_info *fs_info) #endif } +static void free_global_roots(struct btrfs_fs_info *fs_info) +{ + struct btrfs_root *root; + struct rb_node *n; + + while ((n = rb_first_postorder(&fs_info->global_root_tree)) != NULL) { + root = rb_entry(n, struct btrfs_root, rb_node); + rb_erase(&root->rb_node, &fs_info->global_root_tree); + btrfs_put_root(root); + } +} + void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) { percpu_counter_destroy(&fs_info->dirty_metadata_bytes); @@ -1630,14 +1725,12 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) btrfs_free_ref_cache(fs_info); kfree(fs_info->balance_ctl); kfree(fs_info->delayed_root); - btrfs_put_root(fs_info->_extent_root); + free_global_roots(fs_info); btrfs_put_root(fs_info->tree_root); btrfs_put_root(fs_info->chunk_root); btrfs_put_root(fs_info->dev_root); - btrfs_put_root(fs_info->_csum_root); btrfs_put_root(fs_info->quota_root); btrfs_put_root(fs_info->uuid_root); - btrfs_put_root(fs_info->_free_space_root); btrfs_put_root(fs_info->fs_root); btrfs_put_root(fs_info->data_reloc_root); btrfs_check_leaked_roots(fs_info); @@ -2154,21 +2247,29 @@ static void free_root_extent_buffers(struct btrfs_root *root) } } +static void free_global_root_pointers(struct btrfs_fs_info *fs_info) +{ + struct btrfs_root *root, *tmp; + + rbtree_postorder_for_each_entry_safe(root, tmp, + &fs_info->global_root_tree, + rb_node) + free_root_extent_buffers(root); +} + /* helper to cleanup tree roots */ static void free_root_pointers(struct btrfs_fs_info *info, bool free_chunk_root) { free_root_extent_buffers(info->tree_root); + free_global_root_pointers(info); free_root_extent_buffers(info->dev_root); - free_root_extent_buffers(info->_extent_root); - free_root_extent_buffers(info->_csum_root); free_root_extent_buffers(info->quota_root); free_root_extent_buffers(info->uuid_root); free_root_extent_buffers(info->fs_root); free_root_extent_buffers(info->data_reloc_root); if (free_chunk_root) free_root_extent_buffers(info->chunk_root); - free_root_extent_buffers(info->_free_space_root); } void btrfs_put_root(struct btrfs_root *root) @@ -2430,6 +2531,105 @@ static int btrfs_replay_log(struct btrfs_fs_info *fs_info, return 0; } +static int load_global_roots_objectid(struct btrfs_root *tree_root, + struct btrfs_path *path, u64 objectid, + const char *name) +{ + struct btrfs_fs_info *fs_info = tree_root->fs_info; + struct btrfs_root *root; + int ret; + struct btrfs_key key = { + .objectid = objectid, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + bool found = false; + + /* If we have IGNOREDATACSUMS skip loading these roots. */ + if (objectid == BTRFS_CSUM_TREE_OBJECTID && + btrfs_test_opt(fs_info, IGNOREDATACSUMS)) { + set_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state); + return 0; + } + + while (1) { + ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0); + if (ret < 0) + break; + + if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { + ret = btrfs_next_leaf(tree_root, path); + if (ret) { + if (ret > 0) + ret = 0; + break; + } + } + ret = 0; + + btrfs_item_key_to_cpu(path->nodes[0], &key, + path->slots[0]); + if (key.objectid != objectid) + break; + btrfs_release_path(path); + + found = true; + root = read_tree_root_path(tree_root, path, &key); + if (IS_ERR(root)) { + if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) + ret = PTR_ERR(root); + break; + } + set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); + ret = btrfs_global_root_insert(root); + if (ret) { + btrfs_put_root(root); + break; + } + key.offset++; + } + btrfs_release_path(path); + + if (!found || ret) { + if (objectid == BTRFS_CSUM_TREE_OBJECTID) + set_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state); + + if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) + ret = ret ? ret : -ENOENT; + else + ret = 0; + btrfs_err(fs_info, "failed to load root %s", name); + } + return ret; +} + +static int load_global_roots(struct btrfs_root *tree_root) +{ + struct btrfs_path *path; + int ret = 0; + + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; + + ret = load_global_roots_objectid(tree_root, path, + BTRFS_EXTENT_TREE_OBJECTID, "extent"); + if (ret) + goto out; + ret = load_global_roots_objectid(tree_root, path, + BTRFS_CSUM_TREE_OBJECTID, "csum"); + if (ret) + goto out; + if (!btrfs_fs_compat_ro(tree_root->fs_info, FREE_SPACE_TREE)) + goto out; + ret = load_global_roots_objectid(tree_root, path, + BTRFS_FREE_SPACE_TREE_OBJECTID, + "free space"); +out: + btrfs_free_path(path); + return ret; +} + static int btrfs_read_roots(struct btrfs_fs_info *fs_info) { struct btrfs_root *tree_root = fs_info->tree_root; @@ -2439,22 +2639,14 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) BUG_ON(!fs_info->tree_root); - location.objectid = BTRFS_EXTENT_TREE_OBJECTID; + ret = load_global_roots(tree_root); + if (ret) + return ret; + + location.objectid = BTRFS_DEV_TREE_OBJECTID; location.type = BTRFS_ROOT_ITEM_KEY; location.offset = 0; - 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->_extent_root = root; - } - - location.objectid = BTRFS_DEV_TREE_OBJECTID; root = btrfs_read_tree_root(tree_root, &location); if (IS_ERR(root)) { if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) { @@ -2468,26 +2660,6 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) /* Initialize fs_info for all devices in any case */ btrfs_init_devices_late(fs_info); - /* If IGNOREDATACSUMS 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_FS_STATE_NO_CSUMS, - &fs_info->fs_state); - } - } else { - set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); - fs_info->_csum_root = root; - } - } else { - set_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state); - } - /* * This tree can share blocks with some other fs tree during relocation * and we need a proper setup by btrfs_get_fs_root @@ -2525,20 +2697,6 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) fs_info->uuid_root = root; } - if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) { - location.objectid = BTRFS_FREE_SPACE_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->_free_space_root = root; - } - } - return 0; out: btrfs_warn(fs_info, "failed to read root (objectid=%llu): %d", @@ -2893,6 +3051,7 @@ void btrfs_init_fs_info(struct btrfs_fs_info *fs_info) spin_lock_init(&fs_info->zone_active_bgs_lock); spin_lock_init(&fs_info->relocation_bg_lock); rwlock_init(&fs_info->tree_mod_log_lock); + rwlock_init(&fs_info->global_root_lock); mutex_init(&fs_info->unused_bg_unpin_mutex); mutex_init(&fs_info->reclaim_bgs_lock); mutex_init(&fs_info->reloc_mutex); @@ -2927,6 +3086,7 @@ void btrfs_init_fs_info(struct btrfs_fs_info *fs_info) atomic_set(&fs_info->reada_works_cnt, 0); atomic_set(&fs_info->nr_delayed_iputs, 0); atomic64_set(&fs_info->tree_mod_seq, 0); + fs_info->global_root_tree = RB_ROOT; fs_info->max_inline = BTRFS_DEFAULT_MAX_INLINE; fs_info->metadata_ratio = 0; fs_info->defrag_inodes = RB_ROOT; diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index a4d1788acd24..80b45fcac72a 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h @@ -71,6 +71,14 @@ struct btrfs_root *btrfs_get_new_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *btrfs_get_fs_root_commit_root(struct btrfs_fs_info *fs_info, struct btrfs_path *path, u64 objectid); +int btrfs_global_root_insert(struct btrfs_root *root); +void btrfs_global_root_delete(struct btrfs_root *root); +struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, + struct btrfs_key *key); +struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, + u64 bytenr); +struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_info, + u64 bytenr); void btrfs_free_fs_info(struct btrfs_fs_info *fs_info); int btrfs_cleanup_fs_roots(struct btrfs_fs_info *fs_info); @@ -103,18 +111,6 @@ static inline struct btrfs_root *btrfs_grab_root(struct btrfs_root *root) return NULL; } -static inline struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_info, - u64 bytenr) -{ - return fs_info->_extent_root; -} - -static inline struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, - u64 bytenr) -{ - return fs_info->_csum_root; -} - static inline struct btrfs_root *btrfs_block_group_root(struct btrfs_fs_info *fs_info) { return btrfs_extent_root(fs_info, 0); diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 3cf354223e55..e080ee72e5bb 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2947,6 +2947,7 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, bool skinny_metadata = btrfs_fs_incompat(info, SKINNY_METADATA); extent_root = btrfs_extent_root(info, bytenr); + ASSERT(extent_root); path = btrfs_alloc_path(); if (!path) diff --git a/fs/btrfs/free-space-tree.c b/fs/btrfs/free-space-tree.c index c0f0ba66b5ae..cf227450f356 100644 --- a/fs/btrfs/free-space-tree.c +++ b/fs/btrfs/free-space-tree.c @@ -19,7 +19,12 @@ static int __add_block_group_free_space(struct btrfs_trans_handle *trans, static struct btrfs_root *btrfs_free_space_root( struct btrfs_block_group *block_group) { - return block_group->fs_info->_free_space_root; + struct btrfs_key key = { + .objectid = BTRFS_FREE_SPACE_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + return btrfs_global_root(block_group->fs_info, &key); } void set_free_space_tree_thresholds(struct btrfs_block_group *cache) @@ -1164,7 +1169,11 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info) ret = PTR_ERR(free_space_root); goto abort; } - fs_info->_free_space_root = free_space_root; + ret = btrfs_global_root_insert(free_space_root); + if (ret) { + btrfs_put_root(free_space_root); + goto abort; + } node = rb_first(&fs_info->block_group_cache_tree); while (node) { @@ -1239,7 +1248,12 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) { struct btrfs_trans_handle *trans; struct btrfs_root *tree_root = fs_info->tree_root; - struct btrfs_root *free_space_root = fs_info->_free_space_root; + struct btrfs_key key = { + .objectid = BTRFS_FREE_SPACE_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + struct btrfs_root *free_space_root = btrfs_global_root(fs_info, &key); int ret; trans = btrfs_start_transaction(tree_root, 0); @@ -1248,7 +1262,6 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE); btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID); - fs_info->_free_space_root = NULL; ret = clear_free_space_tree(trans, free_space_root); if (ret) @@ -1258,6 +1271,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) if (ret) goto abort; + btrfs_global_root_delete(free_space_root); list_del(&free_space_root->dirty_list); btrfs_tree_lock(free_space_root->node); diff --git a/fs/btrfs/tests/btrfs-tests.c b/fs/btrfs/tests/btrfs-tests.c index 3a4099a2bf05..d8e56edd6991 100644 --- a/fs/btrfs/tests/btrfs-tests.c +++ b/fs/btrfs/tests/btrfs-tests.c @@ -204,6 +204,7 @@ void btrfs_free_dummy_root(struct btrfs_root *root) /* Will be freed by btrfs_free_fs_roots */ if (WARN_ON(test_bit(BTRFS_ROOT_IN_RADIX, &root->state))) return; + btrfs_global_root_delete(root); btrfs_put_root(root); } diff --git a/fs/btrfs/tests/free-space-tests.c b/fs/btrfs/tests/free-space-tests.c index c3709138f7cf..ab823adf1192 100644 --- a/fs/btrfs/tests/free-space-tests.c +++ b/fs/btrfs/tests/free-space-tests.c @@ -858,7 +858,10 @@ int btrfs_test_free_space_cache(u32 sectorsize, u32 nodesize) goto out; } - root->fs_info->_extent_root = root; + root->root_key.objectid = BTRFS_EXTENT_TREE_OBJECTID; + root->root_key.type = BTRFS_ROOT_ITEM_KEY; + root->root_key.offset = 0; + btrfs_global_root_insert(root); ret = test_extents(cache); if (ret) diff --git a/fs/btrfs/tests/free-space-tree-tests.c b/fs/btrfs/tests/free-space-tree-tests.c index 7d6de8b53038..13734ed43bfc 100644 --- a/fs/btrfs/tests/free-space-tree-tests.c +++ b/fs/btrfs/tests/free-space-tree-tests.c @@ -446,7 +446,10 @@ static int run_test(test_func_t test_func, int bitmaps, u32 sectorsize, btrfs_set_super_compat_ro_flags(root->fs_info->super_copy, BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE); - root->fs_info->_free_space_root = root; + root->root_key.objectid = BTRFS_FREE_SPACE_TREE_OBJECTID; + root->root_key.type = BTRFS_ROOT_ITEM_KEY; + root->root_key.offset = 0; + btrfs_global_root_insert(root); root->fs_info->tree_root = root; root->node = alloc_test_extent_buffer(root->fs_info, nodesize); diff --git a/fs/btrfs/tests/qgroup-tests.c b/fs/btrfs/tests/qgroup-tests.c index 88e19781e83f..eee1e4459541 100644 --- a/fs/btrfs/tests/qgroup-tests.c +++ b/fs/btrfs/tests/qgroup-tests.c @@ -455,7 +455,10 @@ int btrfs_test_qgroups(u32 sectorsize, u32 nodesize) } /* We are using this root as our extent root */ - root->fs_info->_extent_root = root; + root->root_key.objectid = BTRFS_EXTENT_TREE_OBJECTID; + root->root_key.type = BTRFS_ROOT_ITEM_KEY; + root->root_key.offset = 0; + btrfs_global_root_insert(root); /* * Some of the paths we test assume we have a filled out fs_info, so we