diff options
-rw-r--r-- | block/monitor/block-hmp-cmds.c | 2 | ||||
-rw-r--r-- | block/snapshot.c | 19 | ||||
-rw-r--r-- | include/block/snapshot.h | 6 | ||||
-rw-r--r-- | migration/savevm.c | 7 | ||||
-rw-r--r-- | replay/replay-debugging.c | 6 |
5 files changed, 27 insertions, 13 deletions
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index 9cc5d4b..75d7fa9 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -954,7 +954,7 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict) total = 0; for (i = 0; i < nb_sns; i++) { SnapshotEntry *next_sn; - if (bdrv_all_find_snapshot(sn_tab[i].name, false, NULL, NULL) == 0) { + if (bdrv_all_has_snapshot(sn_tab[i].name, false, NULL, NULL) == 1) { global_snapshots[total] = i; total++; QTAILQ_FOREACH(image_entry, &image_list, next) { diff --git a/block/snapshot.c b/block/snapshot.c index 0b129be..e8ae9a2 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -603,9 +603,9 @@ int bdrv_all_goto_snapshot(const char *name, return 0; } -int bdrv_all_find_snapshot(const char *name, - bool has_devices, strList *devices, - Error **errp) +int bdrv_all_has_snapshot(const char *name, + bool has_devices, strList *devices, + Error **errp) { g_autoptr(GList) bdrvs = NULL; GList *iterbdrvs; @@ -627,15 +627,20 @@ int bdrv_all_find_snapshot(const char *name, } aio_context_release(ctx); if (ret < 0) { - error_setg(errp, "Could not find snapshot '%s' on '%s'", - name, bdrv_get_device_or_node_name(bs)); - return -1; + if (ret == -ENOENT) { + return 0; + } else { + error_setg_errno(errp, errno, + "Could not check snapshot '%s' on '%s'", + name, bdrv_get_device_or_node_name(bs)); + return -1; + } } iterbdrvs = iterbdrvs->next; } - return 0; + return 1; } int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn, diff --git a/include/block/snapshot.h b/include/block/snapshot.h index 8a6a372..9403456 100644 --- a/include/block/snapshot.h +++ b/include/block/snapshot.h @@ -85,9 +85,9 @@ int bdrv_all_delete_snapshot(const char *name, int bdrv_all_goto_snapshot(const char *name, bool has_devices, strList *devices, Error **errp); -int bdrv_all_find_snapshot(const char *name, - bool has_devices, strList *devices, - Error **errp); +int bdrv_all_has_snapshot(const char *name, + bool has_devices, strList *devices, + Error **errp); int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn, BlockDriverState *vm_state_bs, uint64_t vm_state_size, diff --git a/migration/savevm.c b/migration/savevm.c index cdd201e..a2a842d 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2977,10 +2977,15 @@ bool load_snapshot(const char *name, Error **errp) if (!bdrv_all_can_snapshot(false, NULL, errp)) { return false; } - ret = bdrv_all_find_snapshot(name, false, NULL, errp); + ret = bdrv_all_has_snapshot(name, false, NULL, errp); if (ret < 0) { return false; } + if (ret == 0) { + error_setg(errp, "Snapshot '%s' does not exist in one or more devices", + name); + return false; + } bs_vm_state = bdrv_all_find_vmstate_bs(NULL, false, NULL, errp); if (!bs_vm_state) { diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c index ca37cf4..098ef8e 100644 --- a/replay/replay-debugging.c +++ b/replay/replay-debugging.c @@ -143,6 +143,7 @@ static char *replay_find_nearest_snapshot(int64_t icount, QEMUSnapshotInfo *sn_tab; QEMUSnapshotInfo *nearest = NULL; char *ret = NULL; + int rv; int nb_sns, i; AioContext *aio_context; @@ -159,7 +160,10 @@ static char *replay_find_nearest_snapshot(int64_t icount, aio_context_release(aio_context); for (i = 0; i < nb_sns; i++) { - if (bdrv_all_find_snapshot(sn_tab[i].name, false, NULL, NULL) == 0) { + rv = bdrv_all_has_snapshot(sn_tab[i].name, false, NULL, NULL); + if (rv < 0) + goto fail; + if (rv == 1) { if (sn_tab[i].icount != -1ULL && sn_tab[i].icount <= icount && (!nearest || nearest->icount < sn_tab[i].icount)) { |