@@ -63,7 +65,7 @@ static int qcow2_service_iter(struct qcow2_target
*tgt, struct qcow2 *qcow2,
WRITE_ONCE(service_status, BLK_STS_OK);
for (pos = 0; pos < end; pos += step) {
- if (fatal_signal_pending(current)) {
+ if (qcow2_backward_merge_should_stop(tgt)) {
ret = -EINTR;
break;
}
Is it okay to remove termination on signal - here and the killable
mutex? Without signal handling it can prevent clean shutdown or leave it
stuck if something goes wrong in the code.
Sorry, I should've probably explained it in commit message as a note.
Yes, it's ok, and it is intentional:
1) Now this code always runs in workqueue, so we change the way how it
can be interrupted to checking the state variable. Sending signal to
workqueue worker thread does not have much sense as when signal comes
worker may have already switched to execute different work.
2) Now the ctl_mutex is not held for a long time anymore, so there is no
point in taking it with interruptible primitive as we won't wait long
for mutex.
@@ -494,6 +497,9 @@ static struct qcow2_target
*alloc_qcow2_target(struct dm_target *ti)
timer_setup(&tgt->enospc_timer, qcow2_enospc_timer, 0);
ti->private = tgt;
tgt->ti = ti;
+
+ INIT_WORK(&tgt->backward_merge.work, qcow2_merge_backward_work);
+
qcow2_set_service_operations(ti, false);
return tgt;
diff --git a/drivers/md/dm-qcow2.h b/drivers/md/dm-qcow2.h
index a89fe3db2196d..bebfdc50ed6d4 100644
--- a/drivers/md/dm-qcow2.h
+++ b/drivers/md/dm-qcow2.h
@@ -149,6 +149,20 @@ struct md_page {
struct list_head wpc_readers_wait_list;
};
+enum qcow2_backward_merge_state {
+ BACKWARD_MERGE_STOPPED = 0,
nit: this init is excess
Agreed. I will remove it here.
Note: that in case of same thing in qcow2_backward_merge_stage it is
intentional to identify that the enum values are used as an array index,
and starting from 0 is important.
+ BACKWARD_MERGE_START,
+ BACKWARD_MERGE_RUN,
+ BACKWARD_MERGE_WAIT_COMPLETION,
+ BACKWARD_MERGE_STOP,
+};
+
+struct qcow2_backward_merge {
+ struct work_struct work;
+ enum qcow2_backward_merge_state state;
+ int error;
+};
May be add merge error to values returned in qcow2_get_errors,
for the users that use dm events interface.
Ok, will do.
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel