Thanks for posting that patch, Josef.

On Mon, Jul 15, 2013 at 6:59 PM, Josef Bacik <jba...@fusionio.com> wrote:
>
> Alex pointed out a problem and fix that exists in the drop one snapshot at
> a
> time patch.  If we decide we need to exit for whatever reason (umount for
> example) we will just exit the snapshot dropping without updating the drop
> progress.  So the next time we go to resume we will BUG_ON() because we
> can't
> find the extent we left off at because we never updated it.  This patch
> fixes
> the problem.
>
> Cc: sta...@vger.kernel.org
> Reported-by: Alex Lyakas <alex.bt...@zadarastorage.com>
> Signed-off-by: Josef Bacik <jba...@fusionio.com>
> ---
>  fs/btrfs/extent-tree.c |   14 ++++++++------
>  1 files changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index bc00b24..8c204e1 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -7584,11 +7584,6 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
>         wc->reada_count = BTRFS_NODEPTRS_PER_BLOCK(root);
>
>         while (1) {
> -               if (!for_reloc && btrfs_need_cleaner_sleep(root)) {
> -                       pr_debug("btrfs: drop snapshot early exit\n");
> -                       err = -EAGAIN;
> -                       goto out_end_trans;
> -               }
>
>                 ret = walk_down_tree(trans, root, path, wc);
>                 if (ret < 0) {
> @@ -7616,7 +7611,8 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
>                 }
>
>                 BUG_ON(wc->level == 0);
> -               if (btrfs_should_end_transaction(trans, tree_root)) {
> +               if (btrfs_should_end_transaction(trans, tree_root) ||
> +                   (!for_reloc && btrfs_need_cleaner_sleep(root))) {
>                         ret = btrfs_update_root(trans, tree_root,
>                                                 &root->root_key,
>                                                 root_item);
> @@ -7627,6 +7623,12 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
>                         }
>
>                         btrfs_end_transaction_throttle(trans, tree_root);
> +                       if (!for_reloc && btrfs_need_cleaner_sleep(root))
> {
> +                               pr_debug("btrfs: drop snapshot early
> exit\n");
> +                               err = -EAGAIN;
> +                               goto out_free;
> +                       }
> +
>                         trans = btrfs_start_transaction(tree_root, 0);
>                         if (IS_ERR(trans)) {
>                                 err = PTR_ERR(trans);
> --
> 1.7.7.6
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to