On Sat, Nov 07, 2015 at 06:54:55PM +0300, Denis V. Lunev wrote: This: > +int bdrv_all_find_snapshot(const char *name, BlockDriverState **first_bad_bs) > +{ > + QEMUSnapshotInfo sn; > + int err = 0; > + BlockDriverState *bs = NULL; > + > + while (err == 0 && (bs = bdrv_next(bs))) { > + AioContext *ctx = bdrv_get_aio_context(bs); > + > + aio_context_acquire(ctx); > + if (bdrv_is_inserted(bs) && !bdrv_is_read_only(bs)) { > + err = bdrv_snapshot_find(bs, &sn, name); > + } > + aio_context_release(ctx); > + } > + > + *first_bad_bs = bs; > + return err; > +} and this: > @@ -1500,21 +1489,7 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict) > available_snapshots = g_new0(int, nb_sns); > total = 0; > for (i = 0; i < nb_sns; i++) { > - sn = &sn_tab[i]; > - available = 1; > - bs1 = NULL; > - > - while ((bs1 = bdrv_next(bs1))) { > - if (bdrv_can_snapshot(bs1) && bs1 != bs) { > - ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str); > - if (ret < 0) { > - available = 0; > - break; > - } > - } > - } > - > - if (available) { > + if (bdrv_all_find_snapshot(sn_tab[i].id_str, &bs1) == 0) { > available_snapshots[total] = i; > total++; > } is not equivalent. hmp_info_snapshots() skips devices that are inserted and writeable but do not support snapshots. The new code will fail in that case.