qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] monitor: make 'info snapshots' show only fully


From: Miguel Di Ciurcio Filho
Subject: Re: [Qemu-devel] [PATCH] monitor: make 'info snapshots' show only fully available snapshots
Date: Wed, 28 Jul 2010 13:37:25 -0300

On Wed, Jul 28, 2010 at 12:38 PM, Markus Armbruster <address@hidden> wrote:
> Miguel Di Ciurcio Filho <address@hidden> writes:
>
>> The output generated by 'info snapshots' shows only snapshots that exist on 
>> the
>> block device that saves the VM state. This output can cause an user to
>> erroneously try to load an snapshot that is not available on all block 
>> devices.
>
> What happens when you try that?
>

I've sent a patch that will protect that from happening [1]. With that
patch, the VM stays stopped, without it the VM keeps running with a
failed bdrv_snapshot_goto().

>
>> ---
>>  savevm.c |   65 
>> ++++++++++++++++++++++++++++++++++++++++++-------------------
>>  1 files changed, 45 insertions(+), 20 deletions(-)
>>
>> diff --git a/savevm.c b/savevm.c
>> index 7a1de3c..be83878 100644
>> --- a/savevm.c
>> +++ b/savevm.c
>> @@ -1997,37 +1997,62 @@ void do_delvm(Monitor *mon, const QDict *qdict)
>>
>>  void do_info_snapshots(Monitor *mon)
>>  {
>> -    BlockDriverState *bs, *bs1;
>> -    QEMUSnapshotInfo *sn_tab, *sn;
>> -    int nb_sns, i;
>> +    BlockDriverState *bs_vm_state, *bs;
>> +    QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s;
>> +    int nb_sns, i, ret, available;
>> +    int total;
>> +    int *available_snapshots;
>>      char buf[256];
>>
>> -    bs = bdrv_snapshots();
>> -    if (!bs) {
>> +    bs_vm_state = bdrv_snapshots();
>> +    if (!bs_vm_state) {
>>          monitor_printf(mon, "No available block device supports 
>> snapshots\n");
>>          return;
>>      }
>> -    monitor_printf(mon, "Snapshot devices:");
>> -    bs1 = NULL;
>> -    while ((bs1 = bdrv_next(bs1))) {
>> -        if (bdrv_can_snapshot(bs1)) {
>> -            if (bs == bs1)
>> -                monitor_printf(mon, " %s", bdrv_get_device_name(bs1));
>> -        }
>> -    }
>> -    monitor_printf(mon, "\n");
>>
>> -    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
>> +    nb_sns = bdrv_snapshot_list(bs_vm_state, &sn_tab);
>>      if (nb_sns < 0) {
>>          monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
>>          return;
>> +    } else if (nb_sns == 0) {
>> +        monitor_printf(mon, "There is no snapshot available.\n");
>>      }
>
> This changes output for the "no snapshots available" case from the empty
> table
>
>    ID        TAG                 VM SIZE                DATE       VM CLOCK
>
> to
>
>    There is no snapshot available.
>
> I'd prefer that as separate patch, if at all.

I think a clear message saying "there is nothing" is better than an
empty table. I'm already changing the output to something more
reasonable, so.

>
> Nitpick: I don't like "return; else".
>

Yeah, kinda ugly. I will fix it.

>> -    monitor_printf(mon, "Snapshot list (from %s):\n",
>> -                   bdrv_get_device_name(bs));
>> -    monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
>> -    for(i = 0; i < nb_sns; i++) {
>> +
>> +    available_snapshots = qemu_mallocz(sizeof(int) * nb_sns);
>
> This can die due to the nonsensical semantics of qemu_mallocz(0).
>

Will fix that, so this code will be reached only if  nb_sns > 0 and
qemu_mallocz(0) will never be executed.

>> +    total = 0;
>> +    for (i = 0; i < nb_sns; i++) {
>>          sn = &sn_tab[i];
>> -        monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), 
>> sn));
>> +        available = 1;
>> +        bs = NULL;
>> +
>> +        while ((bs = bdrv_next(bs))) {
>> +            if (bdrv_can_snapshot(bs) && bs != bs_vm_state) {
>> +                ret = bdrv_snapshot_find(bs, sn_info, sn->id_str);
>> +                if (ret < 0) {
>> +                    available = 0;
>> +                    break;
>> +                }
>> +            }
>> +        }
>> +
>> +        if (available) {
>> +            available_snapshots[total] = i;
>> +            total++;
>> +        }
>>      }
>> +
>> +    if (total > 0) {
>> +        monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), 
>> NULL));
>> +        for (i = 0; i < total; i++) {
>> +            sn = &sn_tab[available_snapshots[i]];
>> +            monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, 
>> sizeof(buf), sn));
>> +        }
>> +
>> +        qemu_free(available_snapshots);
>> +
>> +    } else {
>> +        monitor_printf(mon, "There is no suitable snapshot available to be 
>> loaded.\n");
>
> Where is available_snapshots freed when control flows through this point?
>

Oops. I will fix that too.

Thanks for the feedback.

Regards,

Miguel

[1] http://lists.gnu.org/archive/html/qemu-devel/2010-07/msg01065.html
(Kevin has applied it to this block branch)



reply via email to

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