diff options
Diffstat (limited to 'fs/btrfs/send.c')
| -rw-r--r-- | fs/btrfs/send.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 094cc1444a90..5be83b5a1b43 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c @@ -3340,7 +3340,8 @@ static void free_pending_move(struct send_ctx *sctx, struct pending_dir_move *m)  	kfree(m);  } -static void tail_append_pending_moves(struct pending_dir_move *moves, +static void tail_append_pending_moves(struct send_ctx *sctx, +				      struct pending_dir_move *moves,  				      struct list_head *stack)  {  	if (list_empty(&moves->list)) { @@ -3351,6 +3352,10 @@ static void tail_append_pending_moves(struct pending_dir_move *moves,  		list_add_tail(&moves->list, stack);  		list_splice_tail(&list, stack);  	} +	if (!RB_EMPTY_NODE(&moves->node)) { +		rb_erase(&moves->node, &sctx->pending_dir_moves); +		RB_CLEAR_NODE(&moves->node); +	}  }  static int apply_children_dir_moves(struct send_ctx *sctx) @@ -3365,7 +3370,7 @@ static int apply_children_dir_moves(struct send_ctx *sctx)  		return 0;  	INIT_LIST_HEAD(&stack); -	tail_append_pending_moves(pm, &stack); +	tail_append_pending_moves(sctx, pm, &stack);  	while (!list_empty(&stack)) {  		pm = list_first_entry(&stack, struct pending_dir_move, list); @@ -3376,7 +3381,7 @@ static int apply_children_dir_moves(struct send_ctx *sctx)  			goto out;  		pm = get_pending_dir_moves(sctx, parent_ino);  		if (pm) -			tail_append_pending_moves(pm, &stack); +			tail_append_pending_moves(sctx, pm, &stack);  	}  	return 0;  | 
