[Devel] [PATCH v4 VZ9 3/5] dm-qcow2: make merge_backward command asyncronous

Alexander Atanasov alexander.atanasov at virtuozzo.com
Wed Mar 5 11:36:36 MSK 2025


On 5.03.25 5:53, Pavel Tikhomirov wrote:
> 
>>> @@ -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.

Ok. Makes sense. Note - If merge can not be stopped with SIGKILL, then 
stop/cancelation should be implemented somewhere in userspace unless 
that change of behaviour is acceptable.

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

Agree. for array it can used as a hint to preserve specific values 
and/o/ order when it is changed and it is required. Either zero init or 
a comment can be used.



-- 
Regards,
Alexander Atanasov


More information about the Devel mailing list