On 27.09.18 18:58, Max Reitz wrote:
> On 07.08.18 19:43, Vladimir Sementsov-Ogievskiy wrote:
>> From: "Denis V. Lunev" <d...@openvz.org>
>>
>> We are not working with a shared state data in the decruption code and

(*decryption)

>> thus this operation is safe. On the other hand this significantly
>> reduces the scope of the lock.
> 
> Sure, but does it have any effect?  This is a coroutine lock and I don't
> see any yield points besides the bdrv_co_preadv() that was executed
> outside of the lock anyway.

I think it makes sense to move the qemu_co_mutex_lock() down below the
decryption, as the commit title suggests.  Because then we can decrypt
while another coroutine that uses the lock is blocking.

But I don't see the point of moving the qemu_co_mutex_unlock() up.
(That is non-trivial movement because it means I'd have to find out
whether anything that could modify the cluster offset is serialized by
the generic block layer.  Or, well, not really, because there is no
yield point, so it doesn't actually matter.  But it doesn't give us any
benefit either, I think.)

Max

> Max
> 
>> Signed-off-by: Denis V. Lunev <d...@openvz.org>
>> ---
>>  block/qcow2.c | 14 ++++++++------
>>  1 file changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/block/qcow2.c b/block/qcow2.c
>> index ec9e6238a0..41def07c67 100644
>> --- a/block/qcow2.c
>> +++ b/block/qcow2.c
>> @@ -1880,9 +1880,11 @@ static coroutine_fn int 
>> qcow2_co_preadv(BlockDriverState *bs, uint64_t offset,
>>              break;
>>  
>>          case QCOW2_CLUSTER_NORMAL:
>> +            qemu_co_mutex_unlock(&s->lock);
>> +
>>              if ((cluster_offset & 511) != 0) {
>>                  ret = -EIO;
>> -                goto fail;
>> +                goto fail_nolock;
>>              }
>>  
>>              if (bs->encrypted) {
>> @@ -1899,7 +1901,7 @@ static coroutine_fn int 
>> qcow2_co_preadv(BlockDriverState *bs, uint64_t offset,
>>                                              * s->cluster_size);
>>                      if (cluster_data == NULL) {
>>                          ret = -ENOMEM;
>> -                        goto fail;
>> +                        goto fail_nolock;
>>                      }
>>                  }
>>  
>> @@ -1909,13 +1911,11 @@ static coroutine_fn int 
>> qcow2_co_preadv(BlockDriverState *bs, uint64_t offset,
>>              }
>>  
>>              BLKDBG_EVENT(bs->file, BLKDBG_READ_AIO);
>> -            qemu_co_mutex_unlock(&s->lock);
>>              ret = bdrv_co_preadv(bs->file,
>>                                   cluster_offset + offset_in_cluster,
>>                                   cur_bytes, &hd_qiov, 0);
>> -            qemu_co_mutex_lock(&s->lock);
>>              if (ret < 0) {
>> -                goto fail;
>> +                goto fail_nolock;
>>              }
>>              if (bs->encrypted) {
>>                  assert(s->crypto);
>> @@ -1929,10 +1929,11 @@ static coroutine_fn int 
>> qcow2_co_preadv(BlockDriverState *bs, uint64_t offset,
>>                                            cur_bytes,
>>                                            NULL) < 0) {
>>                      ret = -EIO;
>> -                    goto fail;
>> +                    goto fail_nolock;
>>                  }
>>                  qemu_iovec_from_buf(qiov, bytes_done, cluster_data, 
>> cur_bytes);
>>              }
>> +            qemu_co_mutex_lock(&s->lock);
>>              break;
>>  
>>          default:
>> @@ -1950,6 +1951,7 @@ static coroutine_fn int 
>> qcow2_co_preadv(BlockDriverState *bs, uint64_t offset,
>>  fail:
>>      qemu_co_mutex_unlock(&s->lock);
>>  
>> +fail_nolock:
>>      qemu_iovec_destroy(&hd_qiov);
>>      qemu_vfree(cluster_data);
>>  
>>
> 
> 


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to