qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

snapshot.c (22791B)


      1 /*
      2  * Block layer snapshot related functions
      3  *
      4  * Copyright (c) 2003-2008 Fabrice Bellard
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a copy
      7  * of this software and associated documentation files (the "Software"), to deal
      8  * in the Software without restriction, including without limitation the rights
      9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     10  * copies of the Software, and to permit persons to whom the Software is
     11  * furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included in
     14  * all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     22  * THE SOFTWARE.
     23  */
     24 
     25 #include "qemu/osdep.h"
     26 #include "block/snapshot.h"
     27 #include "block/block_int.h"
     28 #include "block/qdict.h"
     29 #include "qapi/error.h"
     30 #include "qapi/qmp/qdict.h"
     31 #include "qapi/qmp/qerror.h"
     32 #include "qapi/qmp/qstring.h"
     33 #include "qemu/option.h"
     34 #include "sysemu/block-backend.h"
     35 
     36 QemuOptsList internal_snapshot_opts = {
     37     .name = "snapshot",
     38     .head = QTAILQ_HEAD_INITIALIZER(internal_snapshot_opts.head),
     39     .desc = {
     40         {
     41             .name = SNAPSHOT_OPT_ID,
     42             .type = QEMU_OPT_STRING,
     43             .help = "snapshot id"
     44         },{
     45             .name = SNAPSHOT_OPT_NAME,
     46             .type = QEMU_OPT_STRING,
     47             .help = "snapshot name"
     48         },{
     49             /* end of list */
     50         }
     51     },
     52 };
     53 
     54 int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
     55                        const char *name)
     56 {
     57     QEMUSnapshotInfo *sn_tab, *sn;
     58     int nb_sns, i, ret;
     59 
     60     GLOBAL_STATE_CODE();
     61 
     62     ret = -ENOENT;
     63     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
     64     if (nb_sns < 0) {
     65         return ret;
     66     }
     67     for (i = 0; i < nb_sns; i++) {
     68         sn = &sn_tab[i];
     69         if (!strcmp(sn->name, name)) {
     70             *sn_info = *sn;
     71             ret = 0;
     72             break;
     73         }
     74     }
     75     g_free(sn_tab);
     76     return ret;
     77 }
     78 
     79 /**
     80  * Look up an internal snapshot by @id and @name.
     81  * @bs: block device to search
     82  * @id: unique snapshot ID, or NULL
     83  * @name: snapshot name, or NULL
     84  * @sn_info: location to store information on the snapshot found
     85  * @errp: location to store error, will be set only for exception
     86  *
     87  * This function will traverse snapshot list in @bs to search the matching
     88  * one, @id and @name are the matching condition:
     89  * If both @id and @name are specified, find the first one with id @id and
     90  * name @name.
     91  * If only @id is specified, find the first one with id @id.
     92  * If only @name is specified, find the first one with name @name.
     93  * if none is specified, abort().
     94  *
     95  * Returns: true when a snapshot is found and @sn_info will be filled, false
     96  * when error or not found. If all operation succeed but no matching one is
     97  * found, @errp will NOT be set.
     98  */
     99 bool bdrv_snapshot_find_by_id_and_name(BlockDriverState *bs,
    100                                        const char *id,
    101                                        const char *name,
    102                                        QEMUSnapshotInfo *sn_info,
    103                                        Error **errp)
    104 {
    105     QEMUSnapshotInfo *sn_tab, *sn;
    106     int nb_sns, i;
    107     bool ret = false;
    108 
    109     assert(id || name);
    110     GLOBAL_STATE_CODE();
    111 
    112     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
    113     if (nb_sns < 0) {
    114         error_setg_errno(errp, -nb_sns, "Failed to get a snapshot list");
    115         return false;
    116     } else if (nb_sns == 0) {
    117         return false;
    118     }
    119 
    120     if (id && name) {
    121         for (i = 0; i < nb_sns; i++) {
    122             sn = &sn_tab[i];
    123             if (!strcmp(sn->id_str, id) && !strcmp(sn->name, name)) {
    124                 *sn_info = *sn;
    125                 ret = true;
    126                 break;
    127             }
    128         }
    129     } else if (id) {
    130         for (i = 0; i < nb_sns; i++) {
    131             sn = &sn_tab[i];
    132             if (!strcmp(sn->id_str, id)) {
    133                 *sn_info = *sn;
    134                 ret = true;
    135                 break;
    136             }
    137         }
    138     } else if (name) {
    139         for (i = 0; i < nb_sns; i++) {
    140             sn = &sn_tab[i];
    141             if (!strcmp(sn->name, name)) {
    142                 *sn_info = *sn;
    143                 ret = true;
    144                 break;
    145             }
    146         }
    147     }
    148 
    149     g_free(sn_tab);
    150     return ret;
    151 }
    152 
    153 /**
    154  * Return a pointer to child of given BDS to which we can fall
    155  * back if the given BDS does not support snapshots.
    156  * Return NULL if there is no BDS to (safely) fall back to.
    157  */
    158 static BdrvChild *bdrv_snapshot_fallback_child(BlockDriverState *bs)
    159 {
    160     BdrvChild *fallback = bdrv_primary_child(bs);
    161     BdrvChild *child;
    162 
    163     /* We allow fallback only to primary child */
    164     if (!fallback) {
    165         return NULL;
    166     }
    167 
    168     /*
    169      * Check that there are no other children that would need to be
    170      * snapshotted.  If there are, it is not safe to fall back to
    171      * fallback.
    172      */
    173     QLIST_FOREACH(child, &bs->children, next) {
    174         if (child->role & (BDRV_CHILD_DATA | BDRV_CHILD_METADATA |
    175                            BDRV_CHILD_FILTERED) &&
    176             child != fallback)
    177         {
    178             return NULL;
    179         }
    180     }
    181 
    182     return fallback;
    183 }
    184 
    185 static BlockDriverState *bdrv_snapshot_fallback(BlockDriverState *bs)
    186 {
    187     return child_bs(bdrv_snapshot_fallback_child(bs));
    188 }
    189 
    190 int bdrv_can_snapshot(BlockDriverState *bs)
    191 {
    192     BlockDriver *drv = bs->drv;
    193     GLOBAL_STATE_CODE();
    194     if (!drv || !bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
    195         return 0;
    196     }
    197 
    198     if (!drv->bdrv_snapshot_create) {
    199         BlockDriverState *fallback_bs = bdrv_snapshot_fallback(bs);
    200         if (fallback_bs) {
    201             return bdrv_can_snapshot(fallback_bs);
    202         }
    203         return 0;
    204     }
    205 
    206     return 1;
    207 }
    208 
    209 int bdrv_snapshot_create(BlockDriverState *bs,
    210                          QEMUSnapshotInfo *sn_info)
    211 {
    212     BlockDriver *drv = bs->drv;
    213     BlockDriverState *fallback_bs = bdrv_snapshot_fallback(bs);
    214 
    215     GLOBAL_STATE_CODE();
    216 
    217     if (!drv) {
    218         return -ENOMEDIUM;
    219     }
    220     if (drv->bdrv_snapshot_create) {
    221         return drv->bdrv_snapshot_create(bs, sn_info);
    222     }
    223     if (fallback_bs) {
    224         return bdrv_snapshot_create(fallback_bs, sn_info);
    225     }
    226     return -ENOTSUP;
    227 }
    228 
    229 int bdrv_snapshot_goto(BlockDriverState *bs,
    230                        const char *snapshot_id,
    231                        Error **errp)
    232 {
    233     BlockDriver *drv = bs->drv;
    234     BdrvChild *fallback;
    235     int ret, open_ret;
    236 
    237     GLOBAL_STATE_CODE();
    238 
    239     if (!drv) {
    240         error_setg(errp, "Block driver is closed");
    241         return -ENOMEDIUM;
    242     }
    243 
    244     if (!QLIST_EMPTY(&bs->dirty_bitmaps)) {
    245         error_setg(errp, "Device has active dirty bitmaps");
    246         return -EBUSY;
    247     }
    248 
    249     if (drv->bdrv_snapshot_goto) {
    250         ret = drv->bdrv_snapshot_goto(bs, snapshot_id);
    251         if (ret < 0) {
    252             error_setg_errno(errp, -ret, "Failed to load snapshot");
    253         }
    254         return ret;
    255     }
    256 
    257     fallback = bdrv_snapshot_fallback_child(bs);
    258     if (fallback) {
    259         QDict *options;
    260         QDict *file_options;
    261         Error *local_err = NULL;
    262         BlockDriverState *fallback_bs = fallback->bs;
    263         char *subqdict_prefix = g_strdup_printf("%s.", fallback->name);
    264 
    265         options = qdict_clone_shallow(bs->options);
    266 
    267         /* Prevent it from getting deleted when detached from bs */
    268         bdrv_ref(fallback_bs);
    269 
    270         qdict_extract_subqdict(options, &file_options, subqdict_prefix);
    271         qobject_unref(file_options);
    272         g_free(subqdict_prefix);
    273 
    274         /* Force .bdrv_open() below to re-attach fallback_bs on fallback */
    275         qdict_put_str(options, fallback->name,
    276                       bdrv_get_node_name(fallback_bs));
    277 
    278         /* Now close bs, apply the snapshot on fallback_bs, and re-open bs */
    279         if (drv->bdrv_close) {
    280             drv->bdrv_close(bs);
    281         }
    282 
    283         /* .bdrv_open() will re-attach it */
    284         bdrv_unref_child(bs, fallback);
    285 
    286         ret = bdrv_snapshot_goto(fallback_bs, snapshot_id, errp);
    287         open_ret = drv->bdrv_open(bs, options, bs->open_flags, &local_err);
    288         qobject_unref(options);
    289         if (open_ret < 0) {
    290             bdrv_unref(fallback_bs);
    291             bs->drv = NULL;
    292             /* A bdrv_snapshot_goto() error takes precedence */
    293             error_propagate(errp, local_err);
    294             return ret < 0 ? ret : open_ret;
    295         }
    296 
    297         /*
    298          * fallback was a primary child. It was closed above and set to NULL,
    299          * but the .bdrv_open() call has opened it again, because we set the
    300          * respective option (with the qdict_put_str() call above).
    301          * Assert that .bdrv_open() has attached the right BDS as primary child.
    302          */
    303         assert(bdrv_primary_bs(bs) == fallback_bs);
    304         bdrv_unref(fallback_bs);
    305         return ret;
    306     }
    307 
    308     error_setg(errp, "Block driver does not support snapshots");
    309     return -ENOTSUP;
    310 }
    311 
    312 /**
    313  * Delete an internal snapshot by @snapshot_id and @name.
    314  * @bs: block device used in the operation
    315  * @snapshot_id: unique snapshot ID, or NULL
    316  * @name: snapshot name, or NULL
    317  * @errp: location to store error
    318  *
    319  * If both @snapshot_id and @name are specified, delete the first one with
    320  * id @snapshot_id and name @name.
    321  * If only @snapshot_id is specified, delete the first one with id
    322  * @snapshot_id.
    323  * If only @name is specified, delete the first one with name @name.
    324  * if none is specified, return -EINVAL.
    325  *
    326  * Returns: 0 on success, -errno on failure. If @bs is not inserted, return
    327  * -ENOMEDIUM. If @snapshot_id and @name are both NULL, return -EINVAL. If @bs
    328  * does not support internal snapshot deletion, return -ENOTSUP. If @bs does
    329  * not support parameter @snapshot_id or @name, or one of them is not correctly
    330  * specified, return -EINVAL. If @bs can't find one matching @id and @name,
    331  * return -ENOENT. If @errp != NULL, it will always be filled with error
    332  * message on failure.
    333  */
    334 int bdrv_snapshot_delete(BlockDriverState *bs,
    335                          const char *snapshot_id,
    336                          const char *name,
    337                          Error **errp)
    338 {
    339     BlockDriver *drv = bs->drv;
    340     BlockDriverState *fallback_bs = bdrv_snapshot_fallback(bs);
    341     int ret;
    342 
    343     GLOBAL_STATE_CODE();
    344 
    345     if (!drv) {
    346         error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, bdrv_get_device_name(bs));
    347         return -ENOMEDIUM;
    348     }
    349     if (!snapshot_id && !name) {
    350         error_setg(errp, "snapshot_id and name are both NULL");
    351         return -EINVAL;
    352     }
    353 
    354     /* drain all pending i/o before deleting snapshot */
    355     bdrv_drained_begin(bs);
    356 
    357     if (drv->bdrv_snapshot_delete) {
    358         ret = drv->bdrv_snapshot_delete(bs, snapshot_id, name, errp);
    359     } else if (fallback_bs) {
    360         ret = bdrv_snapshot_delete(fallback_bs, snapshot_id, name, errp);
    361     } else {
    362         error_setg(errp, "Block format '%s' used by device '%s' "
    363                    "does not support internal snapshot deletion",
    364                    drv->format_name, bdrv_get_device_name(bs));
    365         ret = -ENOTSUP;
    366     }
    367 
    368     bdrv_drained_end(bs);
    369     return ret;
    370 }
    371 
    372 int bdrv_snapshot_list(BlockDriverState *bs,
    373                        QEMUSnapshotInfo **psn_info)
    374 {
    375     BlockDriver *drv = bs->drv;
    376     BlockDriverState *fallback_bs = bdrv_snapshot_fallback(bs);
    377 
    378     GLOBAL_STATE_CODE();
    379     if (!drv) {
    380         return -ENOMEDIUM;
    381     }
    382     if (drv->bdrv_snapshot_list) {
    383         return drv->bdrv_snapshot_list(bs, psn_info);
    384     }
    385     if (fallback_bs) {
    386         return bdrv_snapshot_list(fallback_bs, psn_info);
    387     }
    388     return -ENOTSUP;
    389 }
    390 
    391 /**
    392  * Temporarily load an internal snapshot by @snapshot_id and @name.
    393  * @bs: block device used in the operation
    394  * @snapshot_id: unique snapshot ID, or NULL
    395  * @name: snapshot name, or NULL
    396  * @errp: location to store error
    397  *
    398  * If both @snapshot_id and @name are specified, load the first one with
    399  * id @snapshot_id and name @name.
    400  * If only @snapshot_id is specified, load the first one with id
    401  * @snapshot_id.
    402  * If only @name is specified, load the first one with name @name.
    403  * if none is specified, return -EINVAL.
    404  *
    405  * Returns: 0 on success, -errno on fail. If @bs is not inserted, return
    406  * -ENOMEDIUM. If @bs is not readonly, return -EINVAL. If @bs did not support
    407  * internal snapshot, return -ENOTSUP. If qemu can't find a matching @id and
    408  * @name, return -ENOENT. If @errp != NULL, it will always be filled on
    409  * failure.
    410  */
    411 int bdrv_snapshot_load_tmp(BlockDriverState *bs,
    412                            const char *snapshot_id,
    413                            const char *name,
    414                            Error **errp)
    415 {
    416     BlockDriver *drv = bs->drv;
    417 
    418     GLOBAL_STATE_CODE();
    419 
    420     if (!drv) {
    421         error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, bdrv_get_device_name(bs));
    422         return -ENOMEDIUM;
    423     }
    424     if (!snapshot_id && !name) {
    425         error_setg(errp, "snapshot_id and name are both NULL");
    426         return -EINVAL;
    427     }
    428     if (!bdrv_is_read_only(bs)) {
    429         error_setg(errp, "Device is not readonly");
    430         return -EINVAL;
    431     }
    432     if (drv->bdrv_snapshot_load_tmp) {
    433         return drv->bdrv_snapshot_load_tmp(bs, snapshot_id, name, errp);
    434     }
    435     error_setg(errp, "Block format '%s' used by device '%s' "
    436                "does not support temporarily loading internal snapshots",
    437                drv->format_name, bdrv_get_device_name(bs));
    438     return -ENOTSUP;
    439 }
    440 
    441 int bdrv_snapshot_load_tmp_by_id_or_name(BlockDriverState *bs,
    442                                          const char *id_or_name,
    443                                          Error **errp)
    444 {
    445     int ret;
    446     Error *local_err = NULL;
    447 
    448     GLOBAL_STATE_CODE();
    449 
    450     ret = bdrv_snapshot_load_tmp(bs, id_or_name, NULL, &local_err);
    451     if (ret == -ENOENT || ret == -EINVAL) {
    452         error_free(local_err);
    453         local_err = NULL;
    454         ret = bdrv_snapshot_load_tmp(bs, NULL, id_or_name, &local_err);
    455     }
    456 
    457     error_propagate(errp, local_err);
    458 
    459     return ret;
    460 }
    461 
    462 
    463 static int bdrv_all_get_snapshot_devices(bool has_devices, strList *devices,
    464                                          GList **all_bdrvs,
    465                                          Error **errp)
    466 {
    467     g_autoptr(GList) bdrvs = NULL;
    468 
    469     if (has_devices) {
    470         if (!devices) {
    471             error_setg(errp, "At least one device is required for snapshot");
    472             return -1;
    473         }
    474 
    475         while (devices) {
    476             BlockDriverState *bs = bdrv_find_node(devices->value);
    477             if (!bs) {
    478                 error_setg(errp, "No block device node '%s'", devices->value);
    479                 return -1;
    480             }
    481             bdrvs = g_list_append(bdrvs, bs);
    482             devices = devices->next;
    483         }
    484     } else {
    485         BlockDriverState *bs;
    486         BdrvNextIterator it;
    487         for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
    488             bdrvs = g_list_append(bdrvs, bs);
    489         }
    490     }
    491 
    492     *all_bdrvs = g_steal_pointer(&bdrvs);
    493     return 0;
    494 }
    495 
    496 
    497 static bool bdrv_all_snapshots_includes_bs(BlockDriverState *bs)
    498 {
    499     if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
    500         return false;
    501     }
    502 
    503     /* Include all nodes that are either in use by a BlockBackend, or that
    504      * aren't attached to any node, but owned by the monitor. */
    505     return bdrv_has_blk(bs) || QLIST_EMPTY(&bs->parents);
    506 }
    507 
    508 /* Group operations. All block drivers are involved.
    509  * These functions will properly handle dataplane (take aio_context_acquire
    510  * when appropriate for appropriate block drivers) */
    511 
    512 bool bdrv_all_can_snapshot(bool has_devices, strList *devices,
    513                            Error **errp)
    514 {
    515     g_autoptr(GList) bdrvs = NULL;
    516     GList *iterbdrvs;
    517 
    518     GLOBAL_STATE_CODE();
    519 
    520     if (bdrv_all_get_snapshot_devices(has_devices, devices, &bdrvs, errp) < 0) {
    521         return false;
    522     }
    523 
    524     iterbdrvs = bdrvs;
    525     while (iterbdrvs) {
    526         BlockDriverState *bs = iterbdrvs->data;
    527         AioContext *ctx = bdrv_get_aio_context(bs);
    528         bool ok = true;
    529 
    530         aio_context_acquire(ctx);
    531         if (devices || bdrv_all_snapshots_includes_bs(bs)) {
    532             ok = bdrv_can_snapshot(bs);
    533         }
    534         aio_context_release(ctx);
    535         if (!ok) {
    536             error_setg(errp, "Device '%s' is writable but does not support "
    537                        "snapshots", bdrv_get_device_or_node_name(bs));
    538             return false;
    539         }
    540 
    541         iterbdrvs = iterbdrvs->next;
    542     }
    543 
    544     return true;
    545 }
    546 
    547 int bdrv_all_delete_snapshot(const char *name,
    548                              bool has_devices, strList *devices,
    549                              Error **errp)
    550 {
    551     g_autoptr(GList) bdrvs = NULL;
    552     GList *iterbdrvs;
    553 
    554     GLOBAL_STATE_CODE();
    555 
    556     if (bdrv_all_get_snapshot_devices(has_devices, devices, &bdrvs, errp) < 0) {
    557         return -1;
    558     }
    559 
    560     iterbdrvs = bdrvs;
    561     while (iterbdrvs) {
    562         BlockDriverState *bs = iterbdrvs->data;
    563         AioContext *ctx = bdrv_get_aio_context(bs);
    564         QEMUSnapshotInfo sn1, *snapshot = &sn1;
    565         int ret = 0;
    566 
    567         aio_context_acquire(ctx);
    568         if ((devices || bdrv_all_snapshots_includes_bs(bs)) &&
    569             bdrv_snapshot_find(bs, snapshot, name) >= 0)
    570         {
    571             ret = bdrv_snapshot_delete(bs, snapshot->id_str,
    572                                        snapshot->name, errp);
    573         }
    574         aio_context_release(ctx);
    575         if (ret < 0) {
    576             error_prepend(errp, "Could not delete snapshot '%s' on '%s': ",
    577                           name, bdrv_get_device_or_node_name(bs));
    578             return -1;
    579         }
    580 
    581         iterbdrvs = iterbdrvs->next;
    582     }
    583 
    584     return 0;
    585 }
    586 
    587 
    588 int bdrv_all_goto_snapshot(const char *name,
    589                            bool has_devices, strList *devices,
    590                            Error **errp)
    591 {
    592     g_autoptr(GList) bdrvs = NULL;
    593     GList *iterbdrvs;
    594 
    595     GLOBAL_STATE_CODE();
    596 
    597     if (bdrv_all_get_snapshot_devices(has_devices, devices, &bdrvs, errp) < 0) {
    598         return -1;
    599     }
    600 
    601     iterbdrvs = bdrvs;
    602     while (iterbdrvs) {
    603         BlockDriverState *bs = iterbdrvs->data;
    604         AioContext *ctx = bdrv_get_aio_context(bs);
    605         int ret = 0;
    606 
    607         aio_context_acquire(ctx);
    608         if (devices || bdrv_all_snapshots_includes_bs(bs)) {
    609             ret = bdrv_snapshot_goto(bs, name, errp);
    610         }
    611         aio_context_release(ctx);
    612         if (ret < 0) {
    613             error_prepend(errp, "Could not load snapshot '%s' on '%s': ",
    614                           name, bdrv_get_device_or_node_name(bs));
    615             return -1;
    616         }
    617 
    618         iterbdrvs = iterbdrvs->next;
    619     }
    620 
    621     return 0;
    622 }
    623 
    624 int bdrv_all_has_snapshot(const char *name,
    625                           bool has_devices, strList *devices,
    626                           Error **errp)
    627 {
    628     g_autoptr(GList) bdrvs = NULL;
    629     GList *iterbdrvs;
    630 
    631     GLOBAL_STATE_CODE();
    632 
    633     if (bdrv_all_get_snapshot_devices(has_devices, devices, &bdrvs, errp) < 0) {
    634         return -1;
    635     }
    636 
    637     iterbdrvs = bdrvs;
    638     while (iterbdrvs) {
    639         BlockDriverState *bs = iterbdrvs->data;
    640         AioContext *ctx = bdrv_get_aio_context(bs);
    641         QEMUSnapshotInfo sn;
    642         int ret = 0;
    643 
    644         aio_context_acquire(ctx);
    645         if (devices || bdrv_all_snapshots_includes_bs(bs)) {
    646             ret = bdrv_snapshot_find(bs, &sn, name);
    647         }
    648         aio_context_release(ctx);
    649         if (ret < 0) {
    650             if (ret == -ENOENT) {
    651                 return 0;
    652             } else {
    653                 error_setg_errno(errp, errno,
    654                                  "Could not check snapshot '%s' on '%s'",
    655                                  name, bdrv_get_device_or_node_name(bs));
    656                 return -1;
    657             }
    658         }
    659 
    660         iterbdrvs = iterbdrvs->next;
    661     }
    662 
    663     return 1;
    664 }
    665 
    666 int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn,
    667                              BlockDriverState *vm_state_bs,
    668                              uint64_t vm_state_size,
    669                              bool has_devices, strList *devices,
    670                              Error **errp)
    671 {
    672     g_autoptr(GList) bdrvs = NULL;
    673     GList *iterbdrvs;
    674     GLOBAL_STATE_CODE();
    675 
    676     if (bdrv_all_get_snapshot_devices(has_devices, devices, &bdrvs, errp) < 0) {
    677         return -1;
    678     }
    679 
    680     iterbdrvs = bdrvs;
    681     while (iterbdrvs) {
    682         BlockDriverState *bs = iterbdrvs->data;
    683         AioContext *ctx = bdrv_get_aio_context(bs);
    684         int ret = 0;
    685 
    686         aio_context_acquire(ctx);
    687         if (bs == vm_state_bs) {
    688             sn->vm_state_size = vm_state_size;
    689             ret = bdrv_snapshot_create(bs, sn);
    690         } else if (devices || bdrv_all_snapshots_includes_bs(bs)) {
    691             sn->vm_state_size = 0;
    692             ret = bdrv_snapshot_create(bs, sn);
    693         }
    694         aio_context_release(ctx);
    695         if (ret < 0) {
    696             error_setg(errp, "Could not create snapshot '%s' on '%s'",
    697                        sn->name, bdrv_get_device_or_node_name(bs));
    698             return -1;
    699         }
    700 
    701         iterbdrvs = iterbdrvs->next;
    702     }
    703 
    704     return 0;
    705 }
    706 
    707 
    708 BlockDriverState *bdrv_all_find_vmstate_bs(const char *vmstate_bs,
    709                                            bool has_devices, strList *devices,
    710                                            Error **errp)
    711 {
    712     g_autoptr(GList) bdrvs = NULL;
    713     GList *iterbdrvs;
    714 
    715     GLOBAL_STATE_CODE();
    716 
    717     if (bdrv_all_get_snapshot_devices(has_devices, devices, &bdrvs, errp) < 0) {
    718         return NULL;
    719     }
    720 
    721     iterbdrvs = bdrvs;
    722     while (iterbdrvs) {
    723         BlockDriverState *bs = iterbdrvs->data;
    724         AioContext *ctx = bdrv_get_aio_context(bs);
    725         bool found = false;
    726 
    727         aio_context_acquire(ctx);
    728         found = (devices || bdrv_all_snapshots_includes_bs(bs)) &&
    729             bdrv_can_snapshot(bs);
    730         aio_context_release(ctx);
    731 
    732         if (vmstate_bs) {
    733             if (g_str_equal(vmstate_bs,
    734                             bdrv_get_node_name(bs))) {
    735                 if (found) {
    736                     return bs;
    737                 } else {
    738                     error_setg(errp,
    739                                "vmstate block device '%s' does not support snapshots",
    740                                vmstate_bs);
    741                     return NULL;
    742                 }
    743             }
    744         } else if (found) {
    745             return bs;
    746         }
    747 
    748         iterbdrvs = iterbdrvs->next;
    749     }
    750 
    751     if (vmstate_bs) {
    752         error_setg(errp,
    753                    "vmstate block device '%s' does not exist", vmstate_bs);
    754     } else {
    755         error_setg(errp,
    756                    "no block device can store vmstate for snapshot");
    757     }
    758     return NULL;
    759 }