qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] blockdev: loosen restrictions on drive-backup s


From: Vladimir Sementsov-Ogievskiy
Subject: Re: [Qemu-devel] [PATCH] blockdev: loosen restrictions on drive-backup source node
Date: Tue, 21 May 2019 09:54:34 +0000

21.05.2019 1:38, John Snow wrote:
> 
> 
> On 5/10/19 5:11 PM, John Snow wrote:
>> We mandate that the source node must be a root node; but there's no reason
>> I am aware of that it needs to be restricted to such. In some cases, we need
>> to make sure that there's a medium present, but in the general case we can
>> allow the backup job itself to do the graph checking.
>>
>> This patch helps improve the error message when you try to backup from
>> the same node more than once, which is reflected in the change to test
>> 056.
>>
>> For backups with bitmaps, it will also show a better error message that
>> the bitmap is in use instead of giving you something cryptic like "need
>> a root node."
>>
>> Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1707303
>> Signed-off-by: John Snow <address@hidden>
>> ---
>>   blockdev.c             | 6 +++++-
>>   tests/qemu-iotests/056 | 2 +-
>>   2 files changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/blockdev.c b/blockdev.c
>> index 79fbac8450..27cb72f7aa 100644
>> --- a/blockdev.c
>> +++ b/blockdev.c
>> @@ -3450,7 +3450,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup, 
>> JobTxn *txn,
>>           backup->compress = false;
>>       }
>>   
>> -    bs = qmp_get_root_bs(backup->device, errp);
>> +    bs = bdrv_lookup_bs(backup->device, backup->device, errp);
>>       if (!bs) {
>>           return NULL;
>>       }
>> @@ -3459,6 +3459,10 @@ static BlockJob *do_drive_backup(DriveBackup *backup, 
>> JobTxn *txn,
>>       aio_context_acquire(aio_context);
>>   
>>       if (!backup->has_format) {
>> +        if (!bs->drv) {
>> +            error_setg(errp, "Device has no medium");
>> +            return NULL;
>> +        }
> 
> Pinging my own patch with a review comment. It is weird that I shuffled
> the error checking down below a conditional, but it's the only case
> where we directly need do access bs->drv now.

not the only: it's accessed in following
     if (backup->mode != NEW_IMAGE_MODE_EXISTING) {
         assert(backup->format);
         if (source) {
as well.

> 
> Otherwise, block/backup already checks for this in its own routine and I
> felt like it was best to let the job handle if it had the right type of
> arguments instead of splitting that out up here.
> 
> Still, it probably looks weird to see the "Device has no medium" error
> in a conditional here, so if this patch looks okay otherwise, I can send
> a v2 with that error checking shuffled back up to top-level to maintain
> some consistency with how the error checking used to be handled.
> 
>>           backup->format = backup->mode == NEW_IMAGE_MODE_EXISTING ?
>>                            NULL : (char*) bs->drv->format_name;
>>       }
>> diff --git a/tests/qemu-iotests/056 b/tests/qemu-iotests/056
>> index 3df323984d..f40fc11a09 100755
>> --- a/tests/qemu-iotests/056
>> +++ b/tests/qemu-iotests/056
>> @@ -214,7 +214,7 @@ class BackupTest(iotests.QMPTestCase):
>>           res = self.vm.qmp('query-block-jobs')
>>           self.assert_qmp(res, 'return[0]/status', 'concluded')
>>           # Leave zombie job un-dismissed, observe a failure:
>> -        res = self.qmp_backup_and_wait(serror='Need a root block node',
>> +        res = self.qmp_backup_and_wait(serror="Node 'drive0' is busy: block 
>> device is in use by block job: backup",
>>                                          device='drive0', 
>> format=iotests.imgfmt,
>>                                          sync='full', target=self.dest_img,
>>                                          auto_dismiss=False)
>>
> 


-- 
Best regards,
Vladimir

reply via email to

[Prev in Thread] Current Thread [Next in Thread]