@@ -152,25 +151,35 @@ static int qcow2_break_l1cow(struct qcow2_target *tgt)
static void set_backward_merge_in_process(struct qcow2_target *tgt,
struct qcow2 *qcow2, bool set)
{
+ struct qcow2 *top = tgt->top;
LIST_HEAD(list);
+ /*
+ * There are no writes if it is not the top qcow2 image.
+ * so we do not need to stop and flush requests when setting
+ */
+ if (qcow2 != top && set) {
+ qcow2->backward_merge_in_process = set;
+ return;
+ }
+
Below hunks in this function feel excess to me. Why replace s/qcow2/top/
where qcow2 == top was just explicitly checked?
In that light, I would've removed top variable all together and used
"qcow2 != tgt->top" directly, to simplify the code.
/*
* To avoid race between allocations and COWS
* we completely stop queueing qios and wait
* for pending qios. Lock is for visability.
*/
- spin_lock_irq(&qcow2->deferred_lock);
- qcow2->pause_submitting_qios = true;
- spin_unlock_irq(&qcow2->deferred_lock);
+ spin_lock_irq(&top->deferred_lock);
+ top->pause_submitting_qios = true;
+ spin_unlock_irq(&top->deferred_lock);
qcow2_inflight_ref_switch(tgt);
/* queue is stopped */
- spin_lock_irq(&qcow2->deferred_lock);
+ spin_lock_irq(&top->deferred_lock);
WARN_ON_ONCE(qcow2->backward_merge_in_process == set);
qcow2->backward_merge_in_process = set;
- qcow2->pause_submitting_qios = false;
- list_splice_init(&qcow2->paused_qios, &list);
- spin_unlock_irq(&qcow2->deferred_lock);
+ top->pause_submitting_qios = false;
+ list_splice_init(&top->paused_qios, &list);
+ spin_unlock_irq(&top->deferred_lock);
qcow2_submit_embedded_qios(tgt, &list);
}
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel