- }
- next = rcu_dereference(iter->next);
- if (!flagged) {
- if (is_removed(next)) {
- ret = -ENOENT;
- goto end;
- }
- /* set deletion flag */
- if ((old = uatomic_cmpxchg(&iter->next, next,
- flag_removed(next))) != next) {
- if (old == flag_removed(next)) {
- ret = -ENOENT;
- goto end;
- } else {
- goto retry;
- }
- }
- flagged = 1;
- }
- /*
- * Remove the element from the list. Retry if there has been a
- * concurrent add (there cannot be a concurrent delete, because
- * we won the deletion flag cmpxchg).
- */
- if (uatomic_cmpxchg(&iter_prev->next, iter, clear_flag(next)) != iter)
+ if (uatomic_cmpxchg(&iter_prev->next, iter_prev_next,
+ clear_flag(next)) != iter_prev_next)