From: Qu Wenruo <quwenruo@cn.fujitsu.com>
To: Josef Bacik <jbacik@fb.com>, <linux-btrfs@vger.kernel.org>,
<kernel-team@fb.com>, <mfasheh@suse.de>
Subject: Re: [PATCH] Btrfs: keep dropped roots in cache until transaciton commit
Date: Fri, 11 Sep 2015 09:25:25 +0800 [thread overview]
Message-ID: <55F22D85.8010004@cn.fujitsu.com> (raw)
In-Reply-To: <1441916850-19021-1-git-send-email-jbacik@fb.com>
Josef Bacik wrote on 2015/09/10 16:27 -0400:
> When dropping a snapshot we need to account for the qgroup changes. If we drop
> the snapshot in all one go then the backref code will fail to find blocks from
> the snapshot we dropped since it won't be able to find the root in the fs root
> cache. This can lead to us failing to find refs from other roots that pointed
> at blocks in the now deleted root. To handle this we need to not remove the fs
> roots from the cache until after we process the qgroup operations. Do this by
> adding dropped roots to a list on the transaction, and letting the transaction
> remove the roots at the same time it drops the commit roots. This will keep all
> of the backref searching code in sync properly, and fixes a problem Mark was
> seeing with snapshot delete and qgroups. Thanks,Btrfs: keep dropped roots in
> cache until transaciton commit
>
> When dropping a snapshot we need to account for the qgroup changes. If we drop
> the snapshot in all one go then the backref code will fail to find blocks from
> the snapshot we dropped since it won't be able to find the root in the fs root
> cache. This can lead to us failing to find refs from other roots that pointed
> at blocks in the now deleted root. To handle this we need to not remove the fs
> roots from the cache until after we process the qgroup operations. Do this by
> adding dropped roots to a list on the transaction, and letting the transaction
> remove the roots at the same time it drops the commit roots. This will keep all
> of the backref searching code in sync properly, and fixes a problem Mark was
> seeing with snapshot delete and qgroups. Thanks,
Mark will definitely be happy with this patch, as quite a good basis for
snapshot deletion.
BTW, the commit message seems to be repeating itself.
Thanks,
Qu
>
> Signed-off-by: Josef Bacik <jbacik@fb.com>
> ---
> fs/btrfs/extent-tree.c | 2 +-
> fs/btrfs/transaction.c | 12 ++++++++++++
> fs/btrfs/transaction.h | 10 ++++++++++
> 3 files changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index ab81135..2327d4c 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -8596,7 +8596,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
> }
>
> if (test_bit(BTRFS_ROOT_IN_RADIX, &root->state)) {
> - btrfs_drop_and_free_fs_root(tree_root->fs_info, root);
> + btrfs_add_dropped_root(trans, root);
> } else {
> free_extent_buffer(root->node);
> free_extent_buffer(root->commit_root);
> diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
> index f5021fc..df1e61e 100644
> --- a/fs/btrfs/transaction.c
> +++ b/fs/btrfs/transaction.c
> @@ -117,6 +117,16 @@ static noinline void switch_commit_roots(struct btrfs_transaction *trans,
> btrfs_unpin_free_ino(root);
> clear_btree_io_tree(&root->dirty_log_pages);
> }
> +
> + /* We can free old roots now. */
> + spin_lock(&trans->dropped_roots_lock);
> + while (!list_empty(&trans->dropped_roots)) {
> + root = list_first_entry(&trans->dropped_roots,
> + struct btrfs_root, root_list);
> + list_del_init(&root->root_list);
> + btrfs_drop_and_free_fs_root(fs_info, root);
> + }
> + spin_unlock(&trans->dropped_roots_lock);
> up_write(&fs_info->commit_root_sem);
> }
>
> @@ -255,9 +265,11 @@ loop:
> INIT_LIST_HEAD(&cur_trans->pending_ordered);
> INIT_LIST_HEAD(&cur_trans->dirty_bgs);
> INIT_LIST_HEAD(&cur_trans->io_bgs);
> + INIT_LIST_HEAD(&cur_trans->dropped_roots);
> mutex_init(&cur_trans->cache_write_mutex);
> cur_trans->num_dirty_bgs = 0;
> spin_lock_init(&cur_trans->dirty_bgs_lock);
> + spin_lock_init(&cur_trans->dropped_roots_lock);
> list_add_tail(&cur_trans->list, &fs_info->trans_list);
> extent_io_tree_init(&cur_trans->dirty_pages,
> fs_info->btree_inode->i_mapping);
> diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h
> index eb09c20..f158ab4 100644
> --- a/fs/btrfs/transaction.h
> +++ b/fs/btrfs/transaction.h
> @@ -65,6 +65,7 @@ struct btrfs_transaction {
> struct list_head switch_commits;
> struct list_head dirty_bgs;
> struct list_head io_bgs;
> + struct list_head dropped_roots;
> u64 num_dirty_bgs;
>
> /*
> @@ -74,6 +75,7 @@ struct btrfs_transaction {
> */
> struct mutex cache_write_mutex;
> spinlock_t dirty_bgs_lock;
> + spinlock_t dropped_roots_lock;
> struct btrfs_delayed_ref_root delayed_refs;
> int aborted;
> int dirty_bg_run;
> @@ -215,4 +217,12 @@ int btrfs_transaction_in_commit(struct btrfs_fs_info *info);
> void btrfs_put_transaction(struct btrfs_transaction *transaction);
> void btrfs_apply_pending_changes(struct btrfs_fs_info *fs_info);
>
> +static inline void btrfs_add_dropped_root(struct btrfs_trans_handle *trans,
> + struct btrfs_root *root)
> +{
> + struct btrfs_transaction *cur_trans = trans->transaction;
> + spin_lock(&cur_trans->dropped_roots_lock);
> + list_add_tail(&root->root_list, &cur_trans->dropped_roots);
> + spin_unlock(&cur_trans->dropped_roots_lock);
> +}
> #endif
>
next prev parent reply other threads:[~2015-09-11 1:25 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-10 20:27 [PATCH] Btrfs: keep dropped roots in cache until transaciton commit Josef Bacik
2015-09-11 1:25 ` Qu Wenruo [this message]
2015-09-11 20:43 ` Mark Fasheh
2015-09-11 1:25 ` Qu Wenruo
2015-09-11 15:44 ` Josef Bacik
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55F22D85.8010004@cn.fujitsu.com \
--to=quwenruo@cn.fujitsu.com \
--cc=jbacik@fb.com \
--cc=kernel-team@fb.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=mfasheh@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).