|
@@ -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;
|
|
|
|