diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
index db76c43cc2..81d1b52262 100644
--- a/block/monitor/block-hmp-cmds.c
+++ b/block/monitor/block-hmp-cmds.c
@@ -900,7 +900,7 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
     SnapshotEntry *snapshot_entry;
     Error *err = NULL;
 
-    bs = bdrv_all_find_vmstate_bs(NULL, &err);
+    bs = bdrv_all_find_vmstate_bs(NULL, NULL, &err);
     if (!bs) {
         error_report_err(err);
         return;
diff --git a/block/snapshot.c b/block/snapshot.c
index f2600a8c7f..b1ad70e278 100644
--- a/block/snapshot.c
+++ b/block/snapshot.c
@@ -551,27 +551,63 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn,
     return 0;
 }
 
-BlockDriverState *bdrv_all_find_vmstate_bs(strList *devices, Error **errp)
+BlockDriverState *bdrv_all_find_vmstate_bs(const char *vmstate_bs,
+                                           strList *devices,
+                                           Error **errp)
 {
     BlockDriverState *bs;
     BdrvNextIterator it;
 
-    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
-        AioContext *ctx = bdrv_get_aio_context(bs);
-        bool found;
+    if (vmstate_bs) {
+        bool usable = false;
+        for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
+            AioContext *ctx = bdrv_get_aio_context(bs);
+            bool match;
 
-        aio_context_acquire(ctx);
-        found = bdrv_all_snapshots_includes_bs(bs, devices) &&
-            bdrv_can_snapshot(bs);
-        aio_context_release(ctx);
+            aio_context_acquire(ctx);
+            if (g_str_equal(vmstate_bs, bdrv_get_node_name(bs))) {
+                match = true;
+                usable = bdrv_can_snapshot(bs);
+            }
+            aio_context_release(ctx);
+            if (match) {
+                bdrv_next_cleanup(&it);
+                break;
+            }
+        }
+        if (!bs) {
+            error_setg(errp,
+                       "block device '%s' does not exist",
+                       vmstate_bs);
+            return NULL;
+        }
 
-        if (found) {
-            bdrv_next_cleanup(&it);
-            break;
+        if (!usable) {
+            error_setg(errp,
+                       "block device '%s' does not support snapshots",
+                       vmstate_bs);
+            return NULL;
+        }
+    } else {
+        for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
+            AioContext *ctx = bdrv_get_aio_context(bs);
+            bool found;
+
+            aio_context_acquire(ctx);
+            found = bdrv_all_snapshots_includes_bs(bs, devices) &&
+                bdrv_can_snapshot(bs);
+            aio_context_release(ctx);
+
+            if (found) {
+                bdrv_next_cleanup(&it);
+                break;
+            }
+        }
+
+        if (!bs) {
+            error_setg(errp, "No block device supports snapshots");
+            return NULL;
         }
-    }
-    if (!bs) {
-        error_setg(errp, "No block device supports snapshots");
     }
     return bs;
 }
diff --git a/include/block/snapshot.h b/include/block/snapshot.h
index 1c5b0705a9..05550e5da1 100644
--- a/include/block/snapshot.h
+++ b/include/block/snapshot.h
@@ -86,6 +86,8 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn,
                              strList *devices,
                              Error **errp);
 
-BlockDriverState *bdrv_all_find_vmstate_bs(strList *devices, Error **errp);
+BlockDriverState *bdrv_all_find_vmstate_bs(const char *vmstate_bs,
+                                           strList *devices,
+                                           Error **errp);
 
 #endif
diff --git a/migration/savevm.c b/migration/savevm.c
index cdc1f2f2d8..1707fa30db 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -2664,7 +2664,7 @@ int save_snapshot(const char *name, Error **errp)
         }
     }
 
-    bs = bdrv_all_find_vmstate_bs(NULL, errp);
+    bs = bdrv_all_find_vmstate_bs(NULL, NULL, errp);
     if (bs == NULL) {
         return ret;
     }
@@ -2854,7 +2854,7 @@ int load_snapshot(const char *name, Error **errp)
         return -1;
     }
 
-    bs_vm_state = bdrv_all_find_vmstate_bs(NULL, errp);
+    bs_vm_state = bdrv_all_find_vmstate_bs(NULL, NULL, errp);
     if (!bs_vm_state) {
         return -1;
     }
