xref: /openbmc/qemu/block.c (revision 73176bee9918a3738237b0e06eff72b497283869)
1fc01f7e7Sbellard /*
2fc01f7e7Sbellard  * QEMU System Emulator block driver
3fc01f7e7Sbellard  *
4fc01f7e7Sbellard  * Copyright (c) 2003 Fabrice Bellard
5fc01f7e7Sbellard  *
6fc01f7e7Sbellard  * Permission is hereby granted, free of charge, to any person obtaining a copy
7fc01f7e7Sbellard  * of this software and associated documentation files (the "Software"), to deal
8fc01f7e7Sbellard  * in the Software without restriction, including without limitation the rights
9fc01f7e7Sbellard  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10fc01f7e7Sbellard  * copies of the Software, and to permit persons to whom the Software is
11fc01f7e7Sbellard  * furnished to do so, subject to the following conditions:
12fc01f7e7Sbellard  *
13fc01f7e7Sbellard  * The above copyright notice and this permission notice shall be included in
14fc01f7e7Sbellard  * all copies or substantial portions of the Software.
15fc01f7e7Sbellard  *
16fc01f7e7Sbellard  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17fc01f7e7Sbellard  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18fc01f7e7Sbellard  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19fc01f7e7Sbellard  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20fc01f7e7Sbellard  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21fc01f7e7Sbellard  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22fc01f7e7Sbellard  * THE SOFTWARE.
23fc01f7e7Sbellard  */
24d38ea87aSPeter Maydell #include "qemu/osdep.h"
25faf07963Spbrook #include "qemu-common.h"
266d519a5fSStefan Hajnoczi #include "trace.h"
27737e150eSPaolo Bonzini #include "block/block_int.h"
28737e150eSPaolo Bonzini #include "block/blockjob.h"
29d49b6836SMarkus Armbruster #include "qemu/error-report.h"
301de7afc9SPaolo Bonzini #include "qemu/module.h"
31cc7a8ea7SMarkus Armbruster #include "qapi/qmp/qerror.h"
3291a097e7SKevin Wolf #include "qapi/qmp/qbool.h"
337b1b5d19SPaolo Bonzini #include "qapi/qmp/qjson.h"
34bfb197e0SMarkus Armbruster #include "sysemu/block-backend.h"
359c17d615SPaolo Bonzini #include "sysemu/sysemu.h"
361de7afc9SPaolo Bonzini #include "qemu/notify.h"
3710817bf0SDaniel P. Berrange #include "qemu/coroutine.h"
38c13163fbSBenoît Canet #include "block/qapi.h"
39b2023818SLuiz Capitulino #include "qmp-commands.h"
401de7afc9SPaolo Bonzini #include "qemu/timer.h"
41a5ee7bd4SWenchao Xia #include "qapi-event.h"
42db628338SAlberto Garcia #include "block/throttle-groups.h"
43fc01f7e7Sbellard 
4471e72a19SJuan Quintela #ifdef CONFIG_BSD
457674e7bfSbellard #include <sys/ioctl.h>
4672cf2d4fSBlue Swirl #include <sys/queue.h>
47c5e97233Sblueswir1 #ifndef __DragonFly__
487674e7bfSbellard #include <sys/disk.h>
497674e7bfSbellard #endif
50c5e97233Sblueswir1 #endif
517674e7bfSbellard 
5249dc768dSaliguori #ifdef _WIN32
5349dc768dSaliguori #include <windows.h>
5449dc768dSaliguori #endif
5549dc768dSaliguori 
569bd2b08fSJohn Snow /**
579bd2b08fSJohn Snow  * A BdrvDirtyBitmap can be in three possible states:
589bd2b08fSJohn Snow  * (1) successor is NULL and disabled is false: full r/w mode
599bd2b08fSJohn Snow  * (2) successor is NULL and disabled is true: read only mode ("disabled")
609bd2b08fSJohn Snow  * (3) successor is set: frozen mode.
619bd2b08fSJohn Snow  *     A frozen bitmap cannot be renamed, deleted, anonymized, cleared, set,
629bd2b08fSJohn Snow  *     or enabled. A frozen bitmap can only abdicate() or reclaim().
639bd2b08fSJohn Snow  */
64e4654d2dSFam Zheng struct BdrvDirtyBitmap {
65aa0c7ca5SJohn Snow     HBitmap *bitmap;            /* Dirty sector bitmap implementation */
66aa0c7ca5SJohn Snow     BdrvDirtyBitmap *successor; /* Anonymous child; implies frozen status */
67aa0c7ca5SJohn Snow     char *name;                 /* Optional non-empty unique ID */
68aa0c7ca5SJohn Snow     int64_t size;               /* Size of the bitmap (Number of sectors) */
69aa0c7ca5SJohn Snow     bool disabled;              /* Bitmap is read-only */
70e4654d2dSFam Zheng     QLIST_ENTRY(BdrvDirtyBitmap) list;
71e4654d2dSFam Zheng };
72e4654d2dSFam Zheng 
731c9805a3SStefan Hajnoczi #define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */
741c9805a3SStefan Hajnoczi 
75c69a4dd8SMax Reitz struct BdrvStates bdrv_states = QTAILQ_HEAD_INITIALIZER(bdrv_states);
767ee930d0Sblueswir1 
77dc364f4cSBenoît Canet static QTAILQ_HEAD(, BlockDriverState) graph_bdrv_states =
78dc364f4cSBenoît Canet     QTAILQ_HEAD_INITIALIZER(graph_bdrv_states);
79dc364f4cSBenoît Canet 
802c1d04e0SMax Reitz static QTAILQ_HEAD(, BlockDriverState) all_bdrv_states =
812c1d04e0SMax Reitz     QTAILQ_HEAD_INITIALIZER(all_bdrv_states);
822c1d04e0SMax Reitz 
838a22f02aSStefan Hajnoczi static QLIST_HEAD(, BlockDriver) bdrv_drivers =
848a22f02aSStefan Hajnoczi     QLIST_HEAD_INITIALIZER(bdrv_drivers);
85ea2384d3Sbellard 
86f3930ed0SKevin Wolf static int bdrv_open_inherit(BlockDriverState **pbs, const char *filename,
87f3930ed0SKevin Wolf                              const char *reference, QDict *options, int flags,
88f3930ed0SKevin Wolf                              BlockDriverState *parent,
89ce343771SMax Reitz                              const BdrvChildRole *child_role, Error **errp);
90f3930ed0SKevin Wolf 
91ce1ffea8SJohn Snow static void bdrv_dirty_bitmap_truncate(BlockDriverState *bs);
92c5acdc9aSMax Reitz static void bdrv_release_named_dirty_bitmaps(BlockDriverState *bs);
93c5acdc9aSMax Reitz 
94eb852011SMarkus Armbruster /* If non-zero, use only whitelisted block drivers */
95eb852011SMarkus Armbruster static int use_bdrv_whitelist;
96eb852011SMarkus Armbruster 
9764dff520SMax Reitz static void bdrv_close(BlockDriverState *bs);
9864dff520SMax Reitz 
999e0b22f4SStefan Hajnoczi #ifdef _WIN32
1009e0b22f4SStefan Hajnoczi static int is_windows_drive_prefix(const char *filename)
1019e0b22f4SStefan Hajnoczi {
1029e0b22f4SStefan Hajnoczi     return (((filename[0] >= 'a' && filename[0] <= 'z') ||
1039e0b22f4SStefan Hajnoczi              (filename[0] >= 'A' && filename[0] <= 'Z')) &&
1049e0b22f4SStefan Hajnoczi             filename[1] == ':');
1059e0b22f4SStefan Hajnoczi }
1069e0b22f4SStefan Hajnoczi 
1079e0b22f4SStefan Hajnoczi int is_windows_drive(const char *filename)
1089e0b22f4SStefan Hajnoczi {
1099e0b22f4SStefan Hajnoczi     if (is_windows_drive_prefix(filename) &&
1109e0b22f4SStefan Hajnoczi         filename[2] == '\0')
1119e0b22f4SStefan Hajnoczi         return 1;
1129e0b22f4SStefan Hajnoczi     if (strstart(filename, "\\\\.\\", NULL) ||
1139e0b22f4SStefan Hajnoczi         strstart(filename, "//./", NULL))
1149e0b22f4SStefan Hajnoczi         return 1;
1159e0b22f4SStefan Hajnoczi     return 0;
1169e0b22f4SStefan Hajnoczi }
1179e0b22f4SStefan Hajnoczi #endif
1189e0b22f4SStefan Hajnoczi 
119339064d5SKevin Wolf size_t bdrv_opt_mem_align(BlockDriverState *bs)
120339064d5SKevin Wolf {
121339064d5SKevin Wolf     if (!bs || !bs->drv) {
122459b4e66SDenis V. Lunev         /* page size or 4k (hdd sector size) should be on the safe side */
123459b4e66SDenis V. Lunev         return MAX(4096, getpagesize());
124339064d5SKevin Wolf     }
125339064d5SKevin Wolf 
126339064d5SKevin Wolf     return bs->bl.opt_mem_alignment;
127339064d5SKevin Wolf }
128339064d5SKevin Wolf 
1294196d2f0SDenis V. Lunev size_t bdrv_min_mem_align(BlockDriverState *bs)
1304196d2f0SDenis V. Lunev {
1314196d2f0SDenis V. Lunev     if (!bs || !bs->drv) {
132459b4e66SDenis V. Lunev         /* page size or 4k (hdd sector size) should be on the safe side */
133459b4e66SDenis V. Lunev         return MAX(4096, getpagesize());
1344196d2f0SDenis V. Lunev     }
1354196d2f0SDenis V. Lunev 
1364196d2f0SDenis V. Lunev     return bs->bl.min_mem_alignment;
1374196d2f0SDenis V. Lunev }
1384196d2f0SDenis V. Lunev 
1399e0b22f4SStefan Hajnoczi /* check if the path starts with "<protocol>:" */
1405c98415bSMax Reitz int path_has_protocol(const char *path)
1419e0b22f4SStefan Hajnoczi {
142947995c0SPaolo Bonzini     const char *p;
143947995c0SPaolo Bonzini 
1449e0b22f4SStefan Hajnoczi #ifdef _WIN32
1459e0b22f4SStefan Hajnoczi     if (is_windows_drive(path) ||
1469e0b22f4SStefan Hajnoczi         is_windows_drive_prefix(path)) {
1479e0b22f4SStefan Hajnoczi         return 0;
1489e0b22f4SStefan Hajnoczi     }
149947995c0SPaolo Bonzini     p = path + strcspn(path, ":/\\");
150947995c0SPaolo Bonzini #else
151947995c0SPaolo Bonzini     p = path + strcspn(path, ":/");
1529e0b22f4SStefan Hajnoczi #endif
1539e0b22f4SStefan Hajnoczi 
154947995c0SPaolo Bonzini     return *p == ':';
1559e0b22f4SStefan Hajnoczi }
1569e0b22f4SStefan Hajnoczi 
15783f64091Sbellard int path_is_absolute(const char *path)
15883f64091Sbellard {
15921664424Sbellard #ifdef _WIN32
16021664424Sbellard     /* specific case for names like: "\\.\d:" */
161f53f4da9SPaolo Bonzini     if (is_windows_drive(path) || is_windows_drive_prefix(path)) {
16221664424Sbellard         return 1;
163f53f4da9SPaolo Bonzini     }
164f53f4da9SPaolo Bonzini     return (*path == '/' || *path == '\\');
1653b9f94e1Sbellard #else
166f53f4da9SPaolo Bonzini     return (*path == '/');
1673b9f94e1Sbellard #endif
16883f64091Sbellard }
16983f64091Sbellard 
17083f64091Sbellard /* if filename is absolute, just copy it to dest. Otherwise, build a
17183f64091Sbellard    path to it by considering it is relative to base_path. URL are
17283f64091Sbellard    supported. */
17383f64091Sbellard void path_combine(char *dest, int dest_size,
17483f64091Sbellard                   const char *base_path,
17583f64091Sbellard                   const char *filename)
17683f64091Sbellard {
17783f64091Sbellard     const char *p, *p1;
17883f64091Sbellard     int len;
17983f64091Sbellard 
18083f64091Sbellard     if (dest_size <= 0)
18183f64091Sbellard         return;
18283f64091Sbellard     if (path_is_absolute(filename)) {
18383f64091Sbellard         pstrcpy(dest, dest_size, filename);
18483f64091Sbellard     } else {
18583f64091Sbellard         p = strchr(base_path, ':');
18683f64091Sbellard         if (p)
18783f64091Sbellard             p++;
18883f64091Sbellard         else
18983f64091Sbellard             p = base_path;
1903b9f94e1Sbellard         p1 = strrchr(base_path, '/');
1913b9f94e1Sbellard #ifdef _WIN32
1923b9f94e1Sbellard         {
1933b9f94e1Sbellard             const char *p2;
1943b9f94e1Sbellard             p2 = strrchr(base_path, '\\');
1953b9f94e1Sbellard             if (!p1 || p2 > p1)
1963b9f94e1Sbellard                 p1 = p2;
1973b9f94e1Sbellard         }
1983b9f94e1Sbellard #endif
19983f64091Sbellard         if (p1)
20083f64091Sbellard             p1++;
20183f64091Sbellard         else
20283f64091Sbellard             p1 = base_path;
20383f64091Sbellard         if (p1 > p)
20483f64091Sbellard             p = p1;
20583f64091Sbellard         len = p - base_path;
20683f64091Sbellard         if (len > dest_size - 1)
20783f64091Sbellard             len = dest_size - 1;
20883f64091Sbellard         memcpy(dest, base_path, len);
20983f64091Sbellard         dest[len] = '\0';
21083f64091Sbellard         pstrcat(dest, dest_size, filename);
21183f64091Sbellard     }
21283f64091Sbellard }
21383f64091Sbellard 
2140a82855aSMax Reitz void bdrv_get_full_backing_filename_from_filename(const char *backed,
2150a82855aSMax Reitz                                                   const char *backing,
2169f07429eSMax Reitz                                                   char *dest, size_t sz,
2179f07429eSMax Reitz                                                   Error **errp)
2180a82855aSMax Reitz {
2199f07429eSMax Reitz     if (backing[0] == '\0' || path_has_protocol(backing) ||
2209f07429eSMax Reitz         path_is_absolute(backing))
2219f07429eSMax Reitz     {
2220a82855aSMax Reitz         pstrcpy(dest, sz, backing);
2239f07429eSMax Reitz     } else if (backed[0] == '\0' || strstart(backed, "json:", NULL)) {
2249f07429eSMax Reitz         error_setg(errp, "Cannot use relative backing file names for '%s'",
2259f07429eSMax Reitz                    backed);
2260a82855aSMax Reitz     } else {
2270a82855aSMax Reitz         path_combine(dest, sz, backed, backing);
2280a82855aSMax Reitz     }
2290a82855aSMax Reitz }
2300a82855aSMax Reitz 
2319f07429eSMax Reitz void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz,
2329f07429eSMax Reitz                                     Error **errp)
233dc5a1371SPaolo Bonzini {
2349f07429eSMax Reitz     char *backed = bs->exact_filename[0] ? bs->exact_filename : bs->filename;
2359f07429eSMax Reitz 
2369f07429eSMax Reitz     bdrv_get_full_backing_filename_from_filename(backed, bs->backing_file,
2379f07429eSMax Reitz                                                  dest, sz, errp);
238dc5a1371SPaolo Bonzini }
239dc5a1371SPaolo Bonzini 
2400eb7217eSStefan Hajnoczi void bdrv_register(BlockDriver *bdrv)
2410eb7217eSStefan Hajnoczi {
2420eb7217eSStefan Hajnoczi     bdrv_setup_io_funcs(bdrv);
243b2e12bc6SChristoph Hellwig 
2448a22f02aSStefan Hajnoczi     QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
245ea2384d3Sbellard }
246b338082bSbellard 
2477f06d47eSMarkus Armbruster BlockDriverState *bdrv_new_root(void)
248fc01f7e7Sbellard {
2497f06d47eSMarkus Armbruster     BlockDriverState *bs = bdrv_new();
250e4e9986bSMarkus Armbruster 
251e4e9986bSMarkus Armbruster     QTAILQ_INSERT_TAIL(&bdrv_states, bs, device_list);
252e4e9986bSMarkus Armbruster     return bs;
253e4e9986bSMarkus Armbruster }
254e4e9986bSMarkus Armbruster 
255e4e9986bSMarkus Armbruster BlockDriverState *bdrv_new(void)
256e4e9986bSMarkus Armbruster {
257e4e9986bSMarkus Armbruster     BlockDriverState *bs;
258e4e9986bSMarkus Armbruster     int i;
259e4e9986bSMarkus Armbruster 
2605839e53bSMarkus Armbruster     bs = g_new0(BlockDriverState, 1);
261e4654d2dSFam Zheng     QLIST_INIT(&bs->dirty_bitmaps);
262fbe40ff7SFam Zheng     for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
263fbe40ff7SFam Zheng         QLIST_INIT(&bs->op_blockers[i]);
264fbe40ff7SFam Zheng     }
265d616b224SStefan Hajnoczi     notifier_with_return_list_init(&bs->before_write_notifiers);
266cc0681c4SBenoît Canet     qemu_co_queue_init(&bs->throttled_reqs[0]);
267cc0681c4SBenoît Canet     qemu_co_queue_init(&bs->throttled_reqs[1]);
2689fcb0251SFam Zheng     bs->refcnt = 1;
269dcd04228SStefan Hajnoczi     bs->aio_context = qemu_get_aio_context();
270d7d512f6SPaolo Bonzini 
2712c1d04e0SMax Reitz     QTAILQ_INSERT_TAIL(&all_bdrv_states, bs, bs_list);
2722c1d04e0SMax Reitz 
273b338082bSbellard     return bs;
274b338082bSbellard }
275b338082bSbellard 
276ea2384d3Sbellard BlockDriver *bdrv_find_format(const char *format_name)
277ea2384d3Sbellard {
278ea2384d3Sbellard     BlockDriver *drv1;
2798a22f02aSStefan Hajnoczi     QLIST_FOREACH(drv1, &bdrv_drivers, list) {
2808a22f02aSStefan Hajnoczi         if (!strcmp(drv1->format_name, format_name)) {
281ea2384d3Sbellard             return drv1;
282ea2384d3Sbellard         }
2838a22f02aSStefan Hajnoczi     }
284ea2384d3Sbellard     return NULL;
285ea2384d3Sbellard }
286ea2384d3Sbellard 
287b64ec4e4SFam Zheng static int bdrv_is_whitelisted(BlockDriver *drv, bool read_only)
288eb852011SMarkus Armbruster {
289b64ec4e4SFam Zheng     static const char *whitelist_rw[] = {
290b64ec4e4SFam Zheng         CONFIG_BDRV_RW_WHITELIST
291b64ec4e4SFam Zheng     };
292b64ec4e4SFam Zheng     static const char *whitelist_ro[] = {
293b64ec4e4SFam Zheng         CONFIG_BDRV_RO_WHITELIST
294eb852011SMarkus Armbruster     };
295eb852011SMarkus Armbruster     const char **p;
296eb852011SMarkus Armbruster 
297b64ec4e4SFam Zheng     if (!whitelist_rw[0] && !whitelist_ro[0]) {
298eb852011SMarkus Armbruster         return 1;               /* no whitelist, anything goes */
299b64ec4e4SFam Zheng     }
300eb852011SMarkus Armbruster 
301b64ec4e4SFam Zheng     for (p = whitelist_rw; *p; p++) {
302eb852011SMarkus Armbruster         if (!strcmp(drv->format_name, *p)) {
303eb852011SMarkus Armbruster             return 1;
304eb852011SMarkus Armbruster         }
305eb852011SMarkus Armbruster     }
306b64ec4e4SFam Zheng     if (read_only) {
307b64ec4e4SFam Zheng         for (p = whitelist_ro; *p; p++) {
308b64ec4e4SFam Zheng             if (!strcmp(drv->format_name, *p)) {
309b64ec4e4SFam Zheng                 return 1;
310b64ec4e4SFam Zheng             }
311b64ec4e4SFam Zheng         }
312b64ec4e4SFam Zheng     }
313eb852011SMarkus Armbruster     return 0;
314eb852011SMarkus Armbruster }
315eb852011SMarkus Armbruster 
3165b7e1542SZhi Yong Wu typedef struct CreateCo {
3175b7e1542SZhi Yong Wu     BlockDriver *drv;
3185b7e1542SZhi Yong Wu     char *filename;
31983d0521aSChunyan Liu     QemuOpts *opts;
3205b7e1542SZhi Yong Wu     int ret;
321cc84d90fSMax Reitz     Error *err;
3225b7e1542SZhi Yong Wu } CreateCo;
3235b7e1542SZhi Yong Wu 
3245b7e1542SZhi Yong Wu static void coroutine_fn bdrv_create_co_entry(void *opaque)
3255b7e1542SZhi Yong Wu {
326cc84d90fSMax Reitz     Error *local_err = NULL;
327cc84d90fSMax Reitz     int ret;
328cc84d90fSMax Reitz 
3295b7e1542SZhi Yong Wu     CreateCo *cco = opaque;
3305b7e1542SZhi Yong Wu     assert(cco->drv);
3315b7e1542SZhi Yong Wu 
332c282e1fdSChunyan Liu     ret = cco->drv->bdrv_create(cco->filename, cco->opts, &local_err);
33384d18f06SMarkus Armbruster     if (local_err) {
334cc84d90fSMax Reitz         error_propagate(&cco->err, local_err);
335cc84d90fSMax Reitz     }
336cc84d90fSMax Reitz     cco->ret = ret;
3375b7e1542SZhi Yong Wu }
3385b7e1542SZhi Yong Wu 
3390e7e1989SKevin Wolf int bdrv_create(BlockDriver *drv, const char* filename,
34083d0521aSChunyan Liu                 QemuOpts *opts, Error **errp)
341ea2384d3Sbellard {
3425b7e1542SZhi Yong Wu     int ret;
3430e7e1989SKevin Wolf 
3445b7e1542SZhi Yong Wu     Coroutine *co;
3455b7e1542SZhi Yong Wu     CreateCo cco = {
3465b7e1542SZhi Yong Wu         .drv = drv,
3475b7e1542SZhi Yong Wu         .filename = g_strdup(filename),
34883d0521aSChunyan Liu         .opts = opts,
3495b7e1542SZhi Yong Wu         .ret = NOT_DONE,
350cc84d90fSMax Reitz         .err = NULL,
3515b7e1542SZhi Yong Wu     };
3525b7e1542SZhi Yong Wu 
353c282e1fdSChunyan Liu     if (!drv->bdrv_create) {
354cc84d90fSMax Reitz         error_setg(errp, "Driver '%s' does not support image creation", drv->format_name);
35580168bffSLuiz Capitulino         ret = -ENOTSUP;
35680168bffSLuiz Capitulino         goto out;
3575b7e1542SZhi Yong Wu     }
3585b7e1542SZhi Yong Wu 
3595b7e1542SZhi Yong Wu     if (qemu_in_coroutine()) {
3605b7e1542SZhi Yong Wu         /* Fast-path if already in coroutine context */
3615b7e1542SZhi Yong Wu         bdrv_create_co_entry(&cco);
3625b7e1542SZhi Yong Wu     } else {
3635b7e1542SZhi Yong Wu         co = qemu_coroutine_create(bdrv_create_co_entry);
3645b7e1542SZhi Yong Wu         qemu_coroutine_enter(co, &cco);
3655b7e1542SZhi Yong Wu         while (cco.ret == NOT_DONE) {
366b47ec2c4SPaolo Bonzini             aio_poll(qemu_get_aio_context(), true);
3675b7e1542SZhi Yong Wu         }
3685b7e1542SZhi Yong Wu     }
3695b7e1542SZhi Yong Wu 
3705b7e1542SZhi Yong Wu     ret = cco.ret;
371cc84d90fSMax Reitz     if (ret < 0) {
37284d18f06SMarkus Armbruster         if (cco.err) {
373cc84d90fSMax Reitz             error_propagate(errp, cco.err);
374cc84d90fSMax Reitz         } else {
375cc84d90fSMax Reitz             error_setg_errno(errp, -ret, "Could not create image");
376cc84d90fSMax Reitz         }
377cc84d90fSMax Reitz     }
3785b7e1542SZhi Yong Wu 
37980168bffSLuiz Capitulino out:
38080168bffSLuiz Capitulino     g_free(cco.filename);
3815b7e1542SZhi Yong Wu     return ret;
382ea2384d3Sbellard }
383ea2384d3Sbellard 
384c282e1fdSChunyan Liu int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
38584a12e66SChristoph Hellwig {
38684a12e66SChristoph Hellwig     BlockDriver *drv;
387cc84d90fSMax Reitz     Error *local_err = NULL;
388cc84d90fSMax Reitz     int ret;
38984a12e66SChristoph Hellwig 
390b65a5e12SMax Reitz     drv = bdrv_find_protocol(filename, true, errp);
39184a12e66SChristoph Hellwig     if (drv == NULL) {
39216905d71SStefan Hajnoczi         return -ENOENT;
39384a12e66SChristoph Hellwig     }
39484a12e66SChristoph Hellwig 
395c282e1fdSChunyan Liu     ret = bdrv_create(drv, filename, opts, &local_err);
39684d18f06SMarkus Armbruster     if (local_err) {
397cc84d90fSMax Reitz         error_propagate(errp, local_err);
398cc84d90fSMax Reitz     }
399cc84d90fSMax Reitz     return ret;
40084a12e66SChristoph Hellwig }
40184a12e66SChristoph Hellwig 
402892b7de8SEkaterina Tumanova /**
403892b7de8SEkaterina Tumanova  * Try to get @bs's logical and physical block size.
404892b7de8SEkaterina Tumanova  * On success, store them in @bsz struct and return 0.
405892b7de8SEkaterina Tumanova  * On failure return -errno.
406892b7de8SEkaterina Tumanova  * @bs must not be empty.
407892b7de8SEkaterina Tumanova  */
408892b7de8SEkaterina Tumanova int bdrv_probe_blocksizes(BlockDriverState *bs, BlockSizes *bsz)
409892b7de8SEkaterina Tumanova {
410892b7de8SEkaterina Tumanova     BlockDriver *drv = bs->drv;
411892b7de8SEkaterina Tumanova 
412892b7de8SEkaterina Tumanova     if (drv && drv->bdrv_probe_blocksizes) {
413892b7de8SEkaterina Tumanova         return drv->bdrv_probe_blocksizes(bs, bsz);
414892b7de8SEkaterina Tumanova     }
415892b7de8SEkaterina Tumanova 
416892b7de8SEkaterina Tumanova     return -ENOTSUP;
417892b7de8SEkaterina Tumanova }
418892b7de8SEkaterina Tumanova 
419892b7de8SEkaterina Tumanova /**
420892b7de8SEkaterina Tumanova  * Try to get @bs's geometry (cyls, heads, sectors).
421892b7de8SEkaterina Tumanova  * On success, store them in @geo struct and return 0.
422892b7de8SEkaterina Tumanova  * On failure return -errno.
423892b7de8SEkaterina Tumanova  * @bs must not be empty.
424892b7de8SEkaterina Tumanova  */
425892b7de8SEkaterina Tumanova int bdrv_probe_geometry(BlockDriverState *bs, HDGeometry *geo)
426892b7de8SEkaterina Tumanova {
427892b7de8SEkaterina Tumanova     BlockDriver *drv = bs->drv;
428892b7de8SEkaterina Tumanova 
429892b7de8SEkaterina Tumanova     if (drv && drv->bdrv_probe_geometry) {
430892b7de8SEkaterina Tumanova         return drv->bdrv_probe_geometry(bs, geo);
431892b7de8SEkaterina Tumanova     }
432892b7de8SEkaterina Tumanova 
433892b7de8SEkaterina Tumanova     return -ENOTSUP;
434892b7de8SEkaterina Tumanova }
435892b7de8SEkaterina Tumanova 
436eba25057SJim Meyering /*
437eba25057SJim Meyering  * Create a uniquely-named empty temporary file.
438eba25057SJim Meyering  * Return 0 upon success, otherwise a negative errno value.
439eba25057SJim Meyering  */
440eba25057SJim Meyering int get_tmp_filename(char *filename, int size)
441eba25057SJim Meyering {
442d5249393Sbellard #ifdef _WIN32
4433b9f94e1Sbellard     char temp_dir[MAX_PATH];
444eba25057SJim Meyering     /* GetTempFileName requires that its output buffer (4th param)
445eba25057SJim Meyering        have length MAX_PATH or greater.  */
446eba25057SJim Meyering     assert(size >= MAX_PATH);
447eba25057SJim Meyering     return (GetTempPath(MAX_PATH, temp_dir)
448eba25057SJim Meyering             && GetTempFileName(temp_dir, "qem", 0, filename)
449eba25057SJim Meyering             ? 0 : -GetLastError());
450d5249393Sbellard #else
451ea2384d3Sbellard     int fd;
4527ccfb2ebSblueswir1     const char *tmpdir;
4530badc1eeSaurel32     tmpdir = getenv("TMPDIR");
45469bef793SAmit Shah     if (!tmpdir) {
45569bef793SAmit Shah         tmpdir = "/var/tmp";
45669bef793SAmit Shah     }
457eba25057SJim Meyering     if (snprintf(filename, size, "%s/vl.XXXXXX", tmpdir) >= size) {
458eba25057SJim Meyering         return -EOVERFLOW;
459ea2384d3Sbellard     }
460eba25057SJim Meyering     fd = mkstemp(filename);
461fe235a06SDunrong Huang     if (fd < 0) {
462fe235a06SDunrong Huang         return -errno;
463fe235a06SDunrong Huang     }
464fe235a06SDunrong Huang     if (close(fd) != 0) {
465fe235a06SDunrong Huang         unlink(filename);
466eba25057SJim Meyering         return -errno;
467eba25057SJim Meyering     }
468eba25057SJim Meyering     return 0;
469d5249393Sbellard #endif
470eba25057SJim Meyering }
471ea2384d3Sbellard 
472f3a5d3f8SChristoph Hellwig /*
473f3a5d3f8SChristoph Hellwig  * Detect host devices. By convention, /dev/cdrom[N] is always
474f3a5d3f8SChristoph Hellwig  * recognized as a host CDROM.
475f3a5d3f8SChristoph Hellwig  */
476f3a5d3f8SChristoph Hellwig static BlockDriver *find_hdev_driver(const char *filename)
477f3a5d3f8SChristoph Hellwig {
478508c7cb3SChristoph Hellwig     int score_max = 0, score;
479508c7cb3SChristoph Hellwig     BlockDriver *drv = NULL, *d;
480f3a5d3f8SChristoph Hellwig 
4818a22f02aSStefan Hajnoczi     QLIST_FOREACH(d, &bdrv_drivers, list) {
482508c7cb3SChristoph Hellwig         if (d->bdrv_probe_device) {
483508c7cb3SChristoph Hellwig             score = d->bdrv_probe_device(filename);
484508c7cb3SChristoph Hellwig             if (score > score_max) {
485508c7cb3SChristoph Hellwig                 score_max = score;
486508c7cb3SChristoph Hellwig                 drv = d;
487f3a5d3f8SChristoph Hellwig             }
488508c7cb3SChristoph Hellwig         }
489f3a5d3f8SChristoph Hellwig     }
490f3a5d3f8SChristoph Hellwig 
491508c7cb3SChristoph Hellwig     return drv;
492f3a5d3f8SChristoph Hellwig }
493f3a5d3f8SChristoph Hellwig 
49498289620SKevin Wolf BlockDriver *bdrv_find_protocol(const char *filename,
495b65a5e12SMax Reitz                                 bool allow_protocol_prefix,
496b65a5e12SMax Reitz                                 Error **errp)
49784a12e66SChristoph Hellwig {
49884a12e66SChristoph Hellwig     BlockDriver *drv1;
49984a12e66SChristoph Hellwig     char protocol[128];
50084a12e66SChristoph Hellwig     int len;
50184a12e66SChristoph Hellwig     const char *p;
50284a12e66SChristoph Hellwig 
50366f82ceeSKevin Wolf     /* TODO Drivers without bdrv_file_open must be specified explicitly */
50466f82ceeSKevin Wolf 
50539508e7aSChristoph Hellwig     /*
50639508e7aSChristoph Hellwig      * XXX(hch): we really should not let host device detection
50739508e7aSChristoph Hellwig      * override an explicit protocol specification, but moving this
50839508e7aSChristoph Hellwig      * later breaks access to device names with colons in them.
50939508e7aSChristoph Hellwig      * Thanks to the brain-dead persistent naming schemes on udev-
51039508e7aSChristoph Hellwig      * based Linux systems those actually are quite common.
51139508e7aSChristoph Hellwig      */
51284a12e66SChristoph Hellwig     drv1 = find_hdev_driver(filename);
51339508e7aSChristoph Hellwig     if (drv1) {
51484a12e66SChristoph Hellwig         return drv1;
51584a12e66SChristoph Hellwig     }
51639508e7aSChristoph Hellwig 
51798289620SKevin Wolf     if (!path_has_protocol(filename) || !allow_protocol_prefix) {
518ef810437SMax Reitz         return &bdrv_file;
51939508e7aSChristoph Hellwig     }
52098289620SKevin Wolf 
5219e0b22f4SStefan Hajnoczi     p = strchr(filename, ':');
5229e0b22f4SStefan Hajnoczi     assert(p != NULL);
52384a12e66SChristoph Hellwig     len = p - filename;
52484a12e66SChristoph Hellwig     if (len > sizeof(protocol) - 1)
52584a12e66SChristoph Hellwig         len = sizeof(protocol) - 1;
52684a12e66SChristoph Hellwig     memcpy(protocol, filename, len);
52784a12e66SChristoph Hellwig     protocol[len] = '\0';
52884a12e66SChristoph Hellwig     QLIST_FOREACH(drv1, &bdrv_drivers, list) {
52984a12e66SChristoph Hellwig         if (drv1->protocol_name &&
53084a12e66SChristoph Hellwig             !strcmp(drv1->protocol_name, protocol)) {
53184a12e66SChristoph Hellwig             return drv1;
53284a12e66SChristoph Hellwig         }
53384a12e66SChristoph Hellwig     }
534b65a5e12SMax Reitz 
535b65a5e12SMax Reitz     error_setg(errp, "Unknown protocol '%s'", protocol);
53684a12e66SChristoph Hellwig     return NULL;
53784a12e66SChristoph Hellwig }
53884a12e66SChristoph Hellwig 
539c6684249SMarkus Armbruster /*
540c6684249SMarkus Armbruster  * Guess image format by probing its contents.
541c6684249SMarkus Armbruster  * This is not a good idea when your image is raw (CVE-2008-2004), but
542c6684249SMarkus Armbruster  * we do it anyway for backward compatibility.
543c6684249SMarkus Armbruster  *
544c6684249SMarkus Armbruster  * @buf         contains the image's first @buf_size bytes.
5457cddd372SKevin Wolf  * @buf_size    is the buffer size in bytes (generally BLOCK_PROBE_BUF_SIZE,
5467cddd372SKevin Wolf  *              but can be smaller if the image file is smaller)
547c6684249SMarkus Armbruster  * @filename    is its filename.
548c6684249SMarkus Armbruster  *
549c6684249SMarkus Armbruster  * For all block drivers, call the bdrv_probe() method to get its
550c6684249SMarkus Armbruster  * probing score.
551c6684249SMarkus Armbruster  * Return the first block driver with the highest probing score.
552c6684249SMarkus Armbruster  */
55338f3ef57SKevin Wolf BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size,
554c6684249SMarkus Armbruster                             const char *filename)
555c6684249SMarkus Armbruster {
556c6684249SMarkus Armbruster     int score_max = 0, score;
557c6684249SMarkus Armbruster     BlockDriver *drv = NULL, *d;
558c6684249SMarkus Armbruster 
559c6684249SMarkus Armbruster     QLIST_FOREACH(d, &bdrv_drivers, list) {
560c6684249SMarkus Armbruster         if (d->bdrv_probe) {
561c6684249SMarkus Armbruster             score = d->bdrv_probe(buf, buf_size, filename);
562c6684249SMarkus Armbruster             if (score > score_max) {
563c6684249SMarkus Armbruster                 score_max = score;
564c6684249SMarkus Armbruster                 drv = d;
565c6684249SMarkus Armbruster             }
566c6684249SMarkus Armbruster         }
567c6684249SMarkus Armbruster     }
568c6684249SMarkus Armbruster 
569c6684249SMarkus Armbruster     return drv;
570c6684249SMarkus Armbruster }
571c6684249SMarkus Armbruster 
572f500a6d3SKevin Wolf static int find_image_format(BlockDriverState *bs, const char *filename,
57334b5d2c6SMax Reitz                              BlockDriver **pdrv, Error **errp)
574ea2384d3Sbellard {
575c6684249SMarkus Armbruster     BlockDriver *drv;
5767cddd372SKevin Wolf     uint8_t buf[BLOCK_PROBE_BUF_SIZE];
577f500a6d3SKevin Wolf     int ret = 0;
578f8ea0b00SNicholas Bellinger 
57908a00559SKevin Wolf     /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
580b192af8aSDimitris Aragiorgis     if (bdrv_is_sg(bs) || !bdrv_is_inserted(bs) || bdrv_getlength(bs) == 0) {
581ef810437SMax Reitz         *pdrv = &bdrv_raw;
582c98ac35dSStefan Weil         return ret;
5831a396859SNicholas A. Bellinger     }
584f8ea0b00SNicholas Bellinger 
58583f64091Sbellard     ret = bdrv_pread(bs, 0, buf, sizeof(buf));
586ea2384d3Sbellard     if (ret < 0) {
58734b5d2c6SMax Reitz         error_setg_errno(errp, -ret, "Could not read image for determining its "
58834b5d2c6SMax Reitz                          "format");
589c98ac35dSStefan Weil         *pdrv = NULL;
590c98ac35dSStefan Weil         return ret;
591ea2384d3Sbellard     }
592ea2384d3Sbellard 
593c6684249SMarkus Armbruster     drv = bdrv_probe_all(buf, ret, filename);
594c98ac35dSStefan Weil     if (!drv) {
59534b5d2c6SMax Reitz         error_setg(errp, "Could not determine image format: No compatible "
59634b5d2c6SMax Reitz                    "driver found");
597c98ac35dSStefan Weil         ret = -ENOENT;
598c98ac35dSStefan Weil     }
599c98ac35dSStefan Weil     *pdrv = drv;
600c98ac35dSStefan Weil     return ret;
601ea2384d3Sbellard }
602ea2384d3Sbellard 
60351762288SStefan Hajnoczi /**
60451762288SStefan Hajnoczi  * Set the current 'total_sectors' value
60565a9bb25SMarkus Armbruster  * Return 0 on success, -errno on error.
60651762288SStefan Hajnoczi  */
60751762288SStefan Hajnoczi static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
60851762288SStefan Hajnoczi {
60951762288SStefan Hajnoczi     BlockDriver *drv = bs->drv;
61051762288SStefan Hajnoczi 
611396759adSNicholas Bellinger     /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
612b192af8aSDimitris Aragiorgis     if (bdrv_is_sg(bs))
613396759adSNicholas Bellinger         return 0;
614396759adSNicholas Bellinger 
61551762288SStefan Hajnoczi     /* query actual device if possible, otherwise just trust the hint */
61651762288SStefan Hajnoczi     if (drv->bdrv_getlength) {
61751762288SStefan Hajnoczi         int64_t length = drv->bdrv_getlength(bs);
61851762288SStefan Hajnoczi         if (length < 0) {
61951762288SStefan Hajnoczi             return length;
62051762288SStefan Hajnoczi         }
6217e382003SFam Zheng         hint = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE);
62251762288SStefan Hajnoczi     }
62351762288SStefan Hajnoczi 
62451762288SStefan Hajnoczi     bs->total_sectors = hint;
62551762288SStefan Hajnoczi     return 0;
62651762288SStefan Hajnoczi }
62751762288SStefan Hajnoczi 
628c3993cdcSStefan Hajnoczi /**
629cddff5baSKevin Wolf  * Combines a QDict of new block driver @options with any missing options taken
630cddff5baSKevin Wolf  * from @old_options, so that leaving out an option defaults to its old value.
631cddff5baSKevin Wolf  */
632cddff5baSKevin Wolf static void bdrv_join_options(BlockDriverState *bs, QDict *options,
633cddff5baSKevin Wolf                               QDict *old_options)
634cddff5baSKevin Wolf {
635cddff5baSKevin Wolf     if (bs->drv && bs->drv->bdrv_join_options) {
636cddff5baSKevin Wolf         bs->drv->bdrv_join_options(options, old_options);
637cddff5baSKevin Wolf     } else {
638cddff5baSKevin Wolf         qdict_join(options, old_options, false);
639cddff5baSKevin Wolf     }
640cddff5baSKevin Wolf }
641cddff5baSKevin Wolf 
642cddff5baSKevin Wolf /**
6439e8f1835SPaolo Bonzini  * Set open flags for a given discard mode
6449e8f1835SPaolo Bonzini  *
6459e8f1835SPaolo Bonzini  * Return 0 on success, -1 if the discard mode was invalid.
6469e8f1835SPaolo Bonzini  */
6479e8f1835SPaolo Bonzini int bdrv_parse_discard_flags(const char *mode, int *flags)
6489e8f1835SPaolo Bonzini {
6499e8f1835SPaolo Bonzini     *flags &= ~BDRV_O_UNMAP;
6509e8f1835SPaolo Bonzini 
6519e8f1835SPaolo Bonzini     if (!strcmp(mode, "off") || !strcmp(mode, "ignore")) {
6529e8f1835SPaolo Bonzini         /* do nothing */
6539e8f1835SPaolo Bonzini     } else if (!strcmp(mode, "on") || !strcmp(mode, "unmap")) {
6549e8f1835SPaolo Bonzini         *flags |= BDRV_O_UNMAP;
6559e8f1835SPaolo Bonzini     } else {
6569e8f1835SPaolo Bonzini         return -1;
6579e8f1835SPaolo Bonzini     }
6589e8f1835SPaolo Bonzini 
6599e8f1835SPaolo Bonzini     return 0;
6609e8f1835SPaolo Bonzini }
6619e8f1835SPaolo Bonzini 
6629e8f1835SPaolo Bonzini /**
663c3993cdcSStefan Hajnoczi  * Set open flags for a given cache mode
664c3993cdcSStefan Hajnoczi  *
665c3993cdcSStefan Hajnoczi  * Return 0 on success, -1 if the cache mode was invalid.
666c3993cdcSStefan Hajnoczi  */
667c3993cdcSStefan Hajnoczi int bdrv_parse_cache_flags(const char *mode, int *flags)
668c3993cdcSStefan Hajnoczi {
669c3993cdcSStefan Hajnoczi     *flags &= ~BDRV_O_CACHE_MASK;
670c3993cdcSStefan Hajnoczi 
671c3993cdcSStefan Hajnoczi     if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
672c3993cdcSStefan Hajnoczi         *flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
67392196b2fSStefan Hajnoczi     } else if (!strcmp(mode, "directsync")) {
67492196b2fSStefan Hajnoczi         *flags |= BDRV_O_NOCACHE;
675c3993cdcSStefan Hajnoczi     } else if (!strcmp(mode, "writeback")) {
676c3993cdcSStefan Hajnoczi         *flags |= BDRV_O_CACHE_WB;
677c3993cdcSStefan Hajnoczi     } else if (!strcmp(mode, "unsafe")) {
678c3993cdcSStefan Hajnoczi         *flags |= BDRV_O_CACHE_WB;
679c3993cdcSStefan Hajnoczi         *flags |= BDRV_O_NO_FLUSH;
680c3993cdcSStefan Hajnoczi     } else if (!strcmp(mode, "writethrough")) {
681c3993cdcSStefan Hajnoczi         /* this is the default */
682c3993cdcSStefan Hajnoczi     } else {
683c3993cdcSStefan Hajnoczi         return -1;
684c3993cdcSStefan Hajnoczi     }
685c3993cdcSStefan Hajnoczi 
686c3993cdcSStefan Hajnoczi     return 0;
687c3993cdcSStefan Hajnoczi }
688c3993cdcSStefan Hajnoczi 
6890b50cc88SKevin Wolf /*
690*73176beeSKevin Wolf  * Returns the options and flags that a temporary snapshot should get, based on
691*73176beeSKevin Wolf  * the originally requested flags (the originally requested image will have
692*73176beeSKevin Wolf  * flags like a backing file)
693b1e6fc08SKevin Wolf  */
694*73176beeSKevin Wolf static void bdrv_temp_snapshot_options(int *child_flags, QDict *child_options,
695*73176beeSKevin Wolf                                        int parent_flags, QDict *parent_options)
696b1e6fc08SKevin Wolf {
697*73176beeSKevin Wolf     *child_flags = (parent_flags & ~BDRV_O_SNAPSHOT) | BDRV_O_TEMPORARY;
698*73176beeSKevin Wolf 
699*73176beeSKevin Wolf     /* For temporary files, unconditional cache=unsafe is fine */
700*73176beeSKevin Wolf     qdict_set_default_str(child_options, BDRV_OPT_CACHE_WB, "on");
701*73176beeSKevin Wolf     qdict_set_default_str(child_options, BDRV_OPT_CACHE_DIRECT, "off");
702*73176beeSKevin Wolf     qdict_set_default_str(child_options, BDRV_OPT_CACHE_NO_FLUSH, "on");
703b1e6fc08SKevin Wolf }
704b1e6fc08SKevin Wolf 
705b1e6fc08SKevin Wolf /*
7068e2160e2SKevin Wolf  * Returns the options and flags that bs->file should get if a protocol driver
7078e2160e2SKevin Wolf  * is expected, based on the given options and flags for the parent BDS
7080b50cc88SKevin Wolf  */
7098e2160e2SKevin Wolf static void bdrv_inherited_options(int *child_flags, QDict *child_options,
7108e2160e2SKevin Wolf                                    int parent_flags, QDict *parent_options)
7110b50cc88SKevin Wolf {
7128e2160e2SKevin Wolf     int flags = parent_flags;
7138e2160e2SKevin Wolf 
7140b50cc88SKevin Wolf     /* Enable protocol handling, disable format probing for bs->file */
7150b50cc88SKevin Wolf     flags |= BDRV_O_PROTOCOL;
7160b50cc88SKevin Wolf 
71791a097e7SKevin Wolf     /* If the cache mode isn't explicitly set, inherit direct and no-flush from
71891a097e7SKevin Wolf      * the parent. */
71991a097e7SKevin Wolf     qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
72091a097e7SKevin Wolf     qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
72191a097e7SKevin Wolf 
7220b50cc88SKevin Wolf     /* Our block drivers take care to send flushes and respect unmap policy,
72391a097e7SKevin Wolf      * so we can default to enable both on lower layers regardless of the
72491a097e7SKevin Wolf      * corresponding parent options. */
72591a097e7SKevin Wolf     qdict_set_default_str(child_options, BDRV_OPT_CACHE_WB, "on");
72691a097e7SKevin Wolf     flags |= BDRV_O_UNMAP;
7270b50cc88SKevin Wolf 
7280b50cc88SKevin Wolf     /* Clear flags that only apply to the top layer */
7295669b44dSKevin Wolf     flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ);
7300b50cc88SKevin Wolf 
7318e2160e2SKevin Wolf     *child_flags = flags;
7320b50cc88SKevin Wolf }
7330b50cc88SKevin Wolf 
734f3930ed0SKevin Wolf const BdrvChildRole child_file = {
7358e2160e2SKevin Wolf     .inherit_options = bdrv_inherited_options,
736f3930ed0SKevin Wolf };
737f3930ed0SKevin Wolf 
738f3930ed0SKevin Wolf /*
7398e2160e2SKevin Wolf  * Returns the options and flags that bs->file should get if the use of formats
7408e2160e2SKevin Wolf  * (and not only protocols) is permitted for it, based on the given options and
7418e2160e2SKevin Wolf  * flags for the parent BDS
742f3930ed0SKevin Wolf  */
7438e2160e2SKevin Wolf static void bdrv_inherited_fmt_options(int *child_flags, QDict *child_options,
7448e2160e2SKevin Wolf                                        int parent_flags, QDict *parent_options)
745f3930ed0SKevin Wolf {
7468e2160e2SKevin Wolf     child_file.inherit_options(child_flags, child_options,
7478e2160e2SKevin Wolf                                parent_flags, parent_options);
7488e2160e2SKevin Wolf 
7498e2160e2SKevin Wolf     *child_flags &= ~BDRV_O_PROTOCOL;
750f3930ed0SKevin Wolf }
751f3930ed0SKevin Wolf 
752f3930ed0SKevin Wolf const BdrvChildRole child_format = {
7538e2160e2SKevin Wolf     .inherit_options = bdrv_inherited_fmt_options,
754f3930ed0SKevin Wolf };
755f3930ed0SKevin Wolf 
756317fc44eSKevin Wolf /*
7578e2160e2SKevin Wolf  * Returns the options and flags that bs->backing should get, based on the
7588e2160e2SKevin Wolf  * given options and flags for the parent BDS
759317fc44eSKevin Wolf  */
7608e2160e2SKevin Wolf static void bdrv_backing_options(int *child_flags, QDict *child_options,
7618e2160e2SKevin Wolf                                  int parent_flags, QDict *parent_options)
762317fc44eSKevin Wolf {
7638e2160e2SKevin Wolf     int flags = parent_flags;
7648e2160e2SKevin Wolf 
76591a097e7SKevin Wolf     /* The cache mode is inherited unmodified for backing files */
76691a097e7SKevin Wolf     qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_WB);
76791a097e7SKevin Wolf     qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
76891a097e7SKevin Wolf     qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
76991a097e7SKevin Wolf 
770317fc44eSKevin Wolf     /* backing files always opened read-only */
771317fc44eSKevin Wolf     flags &= ~(BDRV_O_RDWR | BDRV_O_COPY_ON_READ);
772317fc44eSKevin Wolf 
773317fc44eSKevin Wolf     /* snapshot=on is handled on the top layer */
7748bfea15dSKevin Wolf     flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_TEMPORARY);
775317fc44eSKevin Wolf 
7768e2160e2SKevin Wolf     *child_flags = flags;
777317fc44eSKevin Wolf }
778317fc44eSKevin Wolf 
779f3930ed0SKevin Wolf static const BdrvChildRole child_backing = {
7808e2160e2SKevin Wolf     .inherit_options = bdrv_backing_options,
781f3930ed0SKevin Wolf };
782f3930ed0SKevin Wolf 
7837b272452SKevin Wolf static int bdrv_open_flags(BlockDriverState *bs, int flags)
7847b272452SKevin Wolf {
7857b272452SKevin Wolf     int open_flags = flags | BDRV_O_CACHE_WB;
7867b272452SKevin Wolf 
7877b272452SKevin Wolf     /*
7887b272452SKevin Wolf      * Clear flags that are internal to the block layer before opening the
7897b272452SKevin Wolf      * image.
7907b272452SKevin Wolf      */
79120cca275SKevin Wolf     open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_PROTOCOL);
7927b272452SKevin Wolf 
7937b272452SKevin Wolf     /*
7947b272452SKevin Wolf      * Snapshots should be writable.
7957b272452SKevin Wolf      */
7968bfea15dSKevin Wolf     if (flags & BDRV_O_TEMPORARY) {
7977b272452SKevin Wolf         open_flags |= BDRV_O_RDWR;
7987b272452SKevin Wolf     }
7997b272452SKevin Wolf 
8007b272452SKevin Wolf     return open_flags;
8017b272452SKevin Wolf }
8027b272452SKevin Wolf 
80391a097e7SKevin Wolf static void update_flags_from_options(int *flags, QemuOpts *opts)
80491a097e7SKevin Wolf {
80591a097e7SKevin Wolf     *flags &= ~BDRV_O_CACHE_MASK;
80691a097e7SKevin Wolf 
80791a097e7SKevin Wolf     assert(qemu_opt_find(opts, BDRV_OPT_CACHE_WB));
80891a097e7SKevin Wolf     if (qemu_opt_get_bool(opts, BDRV_OPT_CACHE_WB, false)) {
80991a097e7SKevin Wolf         *flags |= BDRV_O_CACHE_WB;
81091a097e7SKevin Wolf     }
81191a097e7SKevin Wolf 
81291a097e7SKevin Wolf     assert(qemu_opt_find(opts, BDRV_OPT_CACHE_NO_FLUSH));
81391a097e7SKevin Wolf     if (qemu_opt_get_bool(opts, BDRV_OPT_CACHE_NO_FLUSH, false)) {
81491a097e7SKevin Wolf         *flags |= BDRV_O_NO_FLUSH;
81591a097e7SKevin Wolf     }
81691a097e7SKevin Wolf 
81791a097e7SKevin Wolf     assert(qemu_opt_find(opts, BDRV_OPT_CACHE_DIRECT));
81891a097e7SKevin Wolf     if (qemu_opt_get_bool(opts, BDRV_OPT_CACHE_DIRECT, false)) {
81991a097e7SKevin Wolf         *flags |= BDRV_O_NOCACHE;
82091a097e7SKevin Wolf     }
82191a097e7SKevin Wolf }
82291a097e7SKevin Wolf 
82391a097e7SKevin Wolf static void update_options_from_flags(QDict *options, int flags)
82491a097e7SKevin Wolf {
82591a097e7SKevin Wolf     if (!qdict_haskey(options, BDRV_OPT_CACHE_WB)) {
82691a097e7SKevin Wolf         qdict_put(options, BDRV_OPT_CACHE_WB,
82791a097e7SKevin Wolf                   qbool_from_bool(flags & BDRV_O_CACHE_WB));
82891a097e7SKevin Wolf     }
82991a097e7SKevin Wolf     if (!qdict_haskey(options, BDRV_OPT_CACHE_DIRECT)) {
83091a097e7SKevin Wolf         qdict_put(options, BDRV_OPT_CACHE_DIRECT,
83191a097e7SKevin Wolf                   qbool_from_bool(flags & BDRV_O_NOCACHE));
83291a097e7SKevin Wolf     }
83391a097e7SKevin Wolf     if (!qdict_haskey(options, BDRV_OPT_CACHE_NO_FLUSH)) {
83491a097e7SKevin Wolf         qdict_put(options, BDRV_OPT_CACHE_NO_FLUSH,
83591a097e7SKevin Wolf                   qbool_from_bool(flags & BDRV_O_NO_FLUSH));
83691a097e7SKevin Wolf     }
83791a097e7SKevin Wolf }
83891a097e7SKevin Wolf 
839636ea370SKevin Wolf static void bdrv_assign_node_name(BlockDriverState *bs,
8406913c0c2SBenoît Canet                                   const char *node_name,
8416913c0c2SBenoît Canet                                   Error **errp)
8426913c0c2SBenoît Canet {
84315489c76SJeff Cody     char *gen_node_name = NULL;
8446913c0c2SBenoît Canet 
84515489c76SJeff Cody     if (!node_name) {
84615489c76SJeff Cody         node_name = gen_node_name = id_generate(ID_BLOCK);
84715489c76SJeff Cody     } else if (!id_wellformed(node_name)) {
84815489c76SJeff Cody         /*
84915489c76SJeff Cody          * Check for empty string or invalid characters, but not if it is
85015489c76SJeff Cody          * generated (generated names use characters not available to the user)
85115489c76SJeff Cody          */
8529aebf3b8SKevin Wolf         error_setg(errp, "Invalid node name");
853636ea370SKevin Wolf         return;
8546913c0c2SBenoît Canet     }
8556913c0c2SBenoît Canet 
8560c5e94eeSBenoît Canet     /* takes care of avoiding namespaces collisions */
8577f06d47eSMarkus Armbruster     if (blk_by_name(node_name)) {
8580c5e94eeSBenoît Canet         error_setg(errp, "node-name=%s is conflicting with a device id",
8590c5e94eeSBenoît Canet                    node_name);
86015489c76SJeff Cody         goto out;
8610c5e94eeSBenoît Canet     }
8620c5e94eeSBenoît Canet 
8636913c0c2SBenoît Canet     /* takes care of avoiding duplicates node names */
8646913c0c2SBenoît Canet     if (bdrv_find_node(node_name)) {
8656913c0c2SBenoît Canet         error_setg(errp, "Duplicate node name");
86615489c76SJeff Cody         goto out;
8676913c0c2SBenoît Canet     }
8686913c0c2SBenoît Canet 
8696913c0c2SBenoît Canet     /* copy node name into the bs and insert it into the graph list */
8706913c0c2SBenoît Canet     pstrcpy(bs->node_name, sizeof(bs->node_name), node_name);
8716913c0c2SBenoît Canet     QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs, node_list);
87215489c76SJeff Cody out:
87315489c76SJeff Cody     g_free(gen_node_name);
8746913c0c2SBenoît Canet }
8756913c0c2SBenoît Canet 
87618edf289SKevin Wolf static QemuOptsList bdrv_runtime_opts = {
87718edf289SKevin Wolf     .name = "bdrv_common",
87818edf289SKevin Wolf     .head = QTAILQ_HEAD_INITIALIZER(bdrv_runtime_opts.head),
87918edf289SKevin Wolf     .desc = {
88018edf289SKevin Wolf         {
88118edf289SKevin Wolf             .name = "node-name",
88218edf289SKevin Wolf             .type = QEMU_OPT_STRING,
88318edf289SKevin Wolf             .help = "Node name of the block device node",
88418edf289SKevin Wolf         },
88562392ebbSKevin Wolf         {
88662392ebbSKevin Wolf             .name = "driver",
88762392ebbSKevin Wolf             .type = QEMU_OPT_STRING,
88862392ebbSKevin Wolf             .help = "Block driver to use for the node",
88962392ebbSKevin Wolf         },
89091a097e7SKevin Wolf         {
89191a097e7SKevin Wolf             .name = BDRV_OPT_CACHE_WB,
89291a097e7SKevin Wolf             .type = QEMU_OPT_BOOL,
89391a097e7SKevin Wolf             .help = "Enable writeback mode",
89491a097e7SKevin Wolf         },
89591a097e7SKevin Wolf         {
89691a097e7SKevin Wolf             .name = BDRV_OPT_CACHE_DIRECT,
89791a097e7SKevin Wolf             .type = QEMU_OPT_BOOL,
89891a097e7SKevin Wolf             .help = "Bypass software writeback cache on the host",
89991a097e7SKevin Wolf         },
90091a097e7SKevin Wolf         {
90191a097e7SKevin Wolf             .name = BDRV_OPT_CACHE_NO_FLUSH,
90291a097e7SKevin Wolf             .type = QEMU_OPT_BOOL,
90391a097e7SKevin Wolf             .help = "Ignore flush requests",
90491a097e7SKevin Wolf         },
90518edf289SKevin Wolf         { /* end of list */ }
90618edf289SKevin Wolf     },
90718edf289SKevin Wolf };
90818edf289SKevin Wolf 
909b6ce07aaSKevin Wolf /*
91057915332SKevin Wolf  * Common part for opening disk images and files
911b6ad491aSKevin Wolf  *
912b6ad491aSKevin Wolf  * Removes all processed options from *options.
91357915332SKevin Wolf  */
9149a4f4c31SKevin Wolf static int bdrv_open_common(BlockDriverState *bs, BdrvChild *file,
91582dc8b41SKevin Wolf                             QDict *options, Error **errp)
91657915332SKevin Wolf {
91757915332SKevin Wolf     int ret, open_flags;
918035fccdfSKevin Wolf     const char *filename;
91962392ebbSKevin Wolf     const char *driver_name = NULL;
9206913c0c2SBenoît Canet     const char *node_name = NULL;
92118edf289SKevin Wolf     QemuOpts *opts;
92262392ebbSKevin Wolf     BlockDriver *drv;
92334b5d2c6SMax Reitz     Error *local_err = NULL;
92457915332SKevin Wolf 
9256405875cSPaolo Bonzini     assert(bs->file == NULL);
926707ff828SKevin Wolf     assert(options != NULL && bs->options != options);
92757915332SKevin Wolf 
92862392ebbSKevin Wolf     opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
92962392ebbSKevin Wolf     qemu_opts_absorb_qdict(opts, options, &local_err);
93062392ebbSKevin Wolf     if (local_err) {
93162392ebbSKevin Wolf         error_propagate(errp, local_err);
93262392ebbSKevin Wolf         ret = -EINVAL;
93362392ebbSKevin Wolf         goto fail_opts;
93462392ebbSKevin Wolf     }
93562392ebbSKevin Wolf 
93662392ebbSKevin Wolf     driver_name = qemu_opt_get(opts, "driver");
93762392ebbSKevin Wolf     drv = bdrv_find_format(driver_name);
93862392ebbSKevin Wolf     assert(drv != NULL);
93962392ebbSKevin Wolf 
94045673671SKevin Wolf     if (file != NULL) {
9419a4f4c31SKevin Wolf         filename = file->bs->filename;
94245673671SKevin Wolf     } else {
94345673671SKevin Wolf         filename = qdict_get_try_str(options, "filename");
94445673671SKevin Wolf     }
94545673671SKevin Wolf 
946765003dbSKevin Wolf     if (drv->bdrv_needs_filename && !filename) {
947765003dbSKevin Wolf         error_setg(errp, "The '%s' block driver requires a file name",
948765003dbSKevin Wolf                    drv->format_name);
94918edf289SKevin Wolf         ret = -EINVAL;
95018edf289SKevin Wolf         goto fail_opts;
95118edf289SKevin Wolf     }
95218edf289SKevin Wolf 
95382dc8b41SKevin Wolf     trace_bdrv_open_common(bs, filename ?: "", bs->open_flags,
95482dc8b41SKevin Wolf                            drv->format_name);
95562392ebbSKevin Wolf 
95618edf289SKevin Wolf     node_name = qemu_opt_get(opts, "node-name");
957636ea370SKevin Wolf     bdrv_assign_node_name(bs, node_name, &local_err);
9580fb6395cSMarkus Armbruster     if (local_err) {
959636ea370SKevin Wolf         error_propagate(errp, local_err);
96018edf289SKevin Wolf         ret = -EINVAL;
96118edf289SKevin Wolf         goto fail_opts;
9625d186eb0SKevin Wolf     }
9635d186eb0SKevin Wolf 
964c25f53b0SPaolo Bonzini     bs->request_alignment = 512;
9650d51b4deSAsias He     bs->zero_beyond_eof = true;
96682dc8b41SKevin Wolf     bs->read_only = !(bs->open_flags & BDRV_O_RDWR);
967b64ec4e4SFam Zheng 
968b64ec4e4SFam Zheng     if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, bs->read_only)) {
9698f94a6e4SKevin Wolf         error_setg(errp,
9708f94a6e4SKevin Wolf                    !bs->read_only && bdrv_is_whitelisted(drv, true)
9718f94a6e4SKevin Wolf                         ? "Driver '%s' can only be used for read-only devices"
9728f94a6e4SKevin Wolf                         : "Driver '%s' is not whitelisted",
9738f94a6e4SKevin Wolf                    drv->format_name);
97418edf289SKevin Wolf         ret = -ENOTSUP;
97518edf289SKevin Wolf         goto fail_opts;
976b64ec4e4SFam Zheng     }
97757915332SKevin Wolf 
97853fec9d3SStefan Hajnoczi     assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */
97982dc8b41SKevin Wolf     if (bs->open_flags & BDRV_O_COPY_ON_READ) {
9800ebd24e0SKevin Wolf         if (!bs->read_only) {
98153fec9d3SStefan Hajnoczi             bdrv_enable_copy_on_read(bs);
9820ebd24e0SKevin Wolf         } else {
9830ebd24e0SKevin Wolf             error_setg(errp, "Can't use copy-on-read on read-only device");
98418edf289SKevin Wolf             ret = -EINVAL;
98518edf289SKevin Wolf             goto fail_opts;
9860ebd24e0SKevin Wolf         }
98753fec9d3SStefan Hajnoczi     }
98853fec9d3SStefan Hajnoczi 
989c2ad1b0cSKevin Wolf     if (filename != NULL) {
99057915332SKevin Wolf         pstrcpy(bs->filename, sizeof(bs->filename), filename);
991c2ad1b0cSKevin Wolf     } else {
992c2ad1b0cSKevin Wolf         bs->filename[0] = '\0';
993c2ad1b0cSKevin Wolf     }
99491af7014SMax Reitz     pstrcpy(bs->exact_filename, sizeof(bs->exact_filename), bs->filename);
99557915332SKevin Wolf 
99657915332SKevin Wolf     bs->drv = drv;
9977267c094SAnthony Liguori     bs->opaque = g_malloc0(drv->instance_size);
99857915332SKevin Wolf 
99991a097e7SKevin Wolf     /* Apply cache mode options */
100091a097e7SKevin Wolf     update_flags_from_options(&bs->open_flags, opts);
100191a097e7SKevin Wolf     bdrv_set_enable_write_cache(bs, bs->open_flags & BDRV_O_CACHE_WB);
1002e7c63796SStefan Hajnoczi 
100366f82ceeSKevin Wolf     /* Open the image, either directly or using a protocol */
100482dc8b41SKevin Wolf     open_flags = bdrv_open_flags(bs, bs->open_flags);
100566f82ceeSKevin Wolf     if (drv->bdrv_file_open) {
10065d186eb0SKevin Wolf         assert(file == NULL);
1007030be321SBenoît Canet         assert(!drv->bdrv_needs_filename || filename != NULL);
100834b5d2c6SMax Reitz         ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
1009f500a6d3SKevin Wolf     } else {
10102af5ef70SKevin Wolf         if (file == NULL) {
101134b5d2c6SMax Reitz             error_setg(errp, "Can't use '%s' as a block driver for the "
101234b5d2c6SMax Reitz                        "protocol level", drv->format_name);
10132af5ef70SKevin Wolf             ret = -EINVAL;
10142af5ef70SKevin Wolf             goto free_and_fail;
10152af5ef70SKevin Wolf         }
1016f500a6d3SKevin Wolf         bs->file = file;
101734b5d2c6SMax Reitz         ret = drv->bdrv_open(bs, options, open_flags, &local_err);
101866f82ceeSKevin Wolf     }
101966f82ceeSKevin Wolf 
102057915332SKevin Wolf     if (ret < 0) {
102184d18f06SMarkus Armbruster         if (local_err) {
102234b5d2c6SMax Reitz             error_propagate(errp, local_err);
10232fa9aa59SDunrong Huang         } else if (bs->filename[0]) {
10242fa9aa59SDunrong Huang             error_setg_errno(errp, -ret, "Could not open '%s'", bs->filename);
102534b5d2c6SMax Reitz         } else {
102634b5d2c6SMax Reitz             error_setg_errno(errp, -ret, "Could not open image");
102734b5d2c6SMax Reitz         }
102857915332SKevin Wolf         goto free_and_fail;
102957915332SKevin Wolf     }
103057915332SKevin Wolf 
1031a1f688f4SMarkus Armbruster     if (bs->encrypted) {
1032a1f688f4SMarkus Armbruster         error_report("Encrypted images are deprecated");
1033a1f688f4SMarkus Armbruster         error_printf("Support for them will be removed in a future release.\n"
1034a1f688f4SMarkus Armbruster                      "You can use 'qemu-img convert' to convert your image"
1035a1f688f4SMarkus Armbruster                      " to an unencrypted one.\n");
1036a1f688f4SMarkus Armbruster     }
1037a1f688f4SMarkus Armbruster 
103851762288SStefan Hajnoczi     ret = refresh_total_sectors(bs, bs->total_sectors);
103951762288SStefan Hajnoczi     if (ret < 0) {
104034b5d2c6SMax Reitz         error_setg_errno(errp, -ret, "Could not refresh total sector count");
104151762288SStefan Hajnoczi         goto free_and_fail;
104257915332SKevin Wolf     }
104351762288SStefan Hajnoczi 
10443baca891SKevin Wolf     bdrv_refresh_limits(bs, &local_err);
10453baca891SKevin Wolf     if (local_err) {
10463baca891SKevin Wolf         error_propagate(errp, local_err);
10473baca891SKevin Wolf         ret = -EINVAL;
10483baca891SKevin Wolf         goto free_and_fail;
10493baca891SKevin Wolf     }
10503baca891SKevin Wolf 
1051c25f53b0SPaolo Bonzini     assert(bdrv_opt_mem_align(bs) != 0);
10524196d2f0SDenis V. Lunev     assert(bdrv_min_mem_align(bs) != 0);
1053b192af8aSDimitris Aragiorgis     assert((bs->request_alignment != 0) || bdrv_is_sg(bs));
105418edf289SKevin Wolf 
105518edf289SKevin Wolf     qemu_opts_del(opts);
105657915332SKevin Wolf     return 0;
105757915332SKevin Wolf 
105857915332SKevin Wolf free_and_fail:
105966f82ceeSKevin Wolf     bs->file = NULL;
10607267c094SAnthony Liguori     g_free(bs->opaque);
106157915332SKevin Wolf     bs->opaque = NULL;
106257915332SKevin Wolf     bs->drv = NULL;
106318edf289SKevin Wolf fail_opts:
106418edf289SKevin Wolf     qemu_opts_del(opts);
106557915332SKevin Wolf     return ret;
106657915332SKevin Wolf }
106757915332SKevin Wolf 
10685e5c4f63SKevin Wolf static QDict *parse_json_filename(const char *filename, Error **errp)
10695e5c4f63SKevin Wolf {
10705e5c4f63SKevin Wolf     QObject *options_obj;
10715e5c4f63SKevin Wolf     QDict *options;
10725e5c4f63SKevin Wolf     int ret;
10735e5c4f63SKevin Wolf 
10745e5c4f63SKevin Wolf     ret = strstart(filename, "json:", &filename);
10755e5c4f63SKevin Wolf     assert(ret);
10765e5c4f63SKevin Wolf 
10775e5c4f63SKevin Wolf     options_obj = qobject_from_json(filename);
10785e5c4f63SKevin Wolf     if (!options_obj) {
10795e5c4f63SKevin Wolf         error_setg(errp, "Could not parse the JSON options");
10805e5c4f63SKevin Wolf         return NULL;
10815e5c4f63SKevin Wolf     }
10825e5c4f63SKevin Wolf 
10835e5c4f63SKevin Wolf     if (qobject_type(options_obj) != QTYPE_QDICT) {
10845e5c4f63SKevin Wolf         qobject_decref(options_obj);
10855e5c4f63SKevin Wolf         error_setg(errp, "Invalid JSON object given");
10865e5c4f63SKevin Wolf         return NULL;
10875e5c4f63SKevin Wolf     }
10885e5c4f63SKevin Wolf 
10895e5c4f63SKevin Wolf     options = qobject_to_qdict(options_obj);
10905e5c4f63SKevin Wolf     qdict_flatten(options);
10915e5c4f63SKevin Wolf 
10925e5c4f63SKevin Wolf     return options;
10935e5c4f63SKevin Wolf }
10945e5c4f63SKevin Wolf 
1095de3b53f0SKevin Wolf static void parse_json_protocol(QDict *options, const char **pfilename,
1096de3b53f0SKevin Wolf                                 Error **errp)
1097de3b53f0SKevin Wolf {
1098de3b53f0SKevin Wolf     QDict *json_options;
1099de3b53f0SKevin Wolf     Error *local_err = NULL;
1100de3b53f0SKevin Wolf 
1101de3b53f0SKevin Wolf     /* Parse json: pseudo-protocol */
1102de3b53f0SKevin Wolf     if (!*pfilename || !g_str_has_prefix(*pfilename, "json:")) {
1103de3b53f0SKevin Wolf         return;
1104de3b53f0SKevin Wolf     }
1105de3b53f0SKevin Wolf 
1106de3b53f0SKevin Wolf     json_options = parse_json_filename(*pfilename, &local_err);
1107de3b53f0SKevin Wolf     if (local_err) {
1108de3b53f0SKevin Wolf         error_propagate(errp, local_err);
1109de3b53f0SKevin Wolf         return;
1110de3b53f0SKevin Wolf     }
1111de3b53f0SKevin Wolf 
1112de3b53f0SKevin Wolf     /* Options given in the filename have lower priority than options
1113de3b53f0SKevin Wolf      * specified directly */
1114de3b53f0SKevin Wolf     qdict_join(options, json_options, false);
1115de3b53f0SKevin Wolf     QDECREF(json_options);
1116de3b53f0SKevin Wolf     *pfilename = NULL;
1117de3b53f0SKevin Wolf }
1118de3b53f0SKevin Wolf 
111957915332SKevin Wolf /*
1120f54120ffSKevin Wolf  * Fills in default options for opening images and converts the legacy
1121f54120ffSKevin Wolf  * filename/flags pair to option QDict entries.
112253a29513SMax Reitz  * The BDRV_O_PROTOCOL flag in *flags will be set or cleared accordingly if a
112353a29513SMax Reitz  * block driver has been specified explicitly.
1124f54120ffSKevin Wolf  */
1125de3b53f0SKevin Wolf static int bdrv_fill_options(QDict **options, const char *filename,
1126053e1578SMax Reitz                              int *flags, Error **errp)
1127f54120ffSKevin Wolf {
1128f54120ffSKevin Wolf     const char *drvname;
112953a29513SMax Reitz     bool protocol = *flags & BDRV_O_PROTOCOL;
1130f54120ffSKevin Wolf     bool parse_filename = false;
1131053e1578SMax Reitz     BlockDriver *drv = NULL;
1132f54120ffSKevin Wolf     Error *local_err = NULL;
1133f54120ffSKevin Wolf 
113453a29513SMax Reitz     drvname = qdict_get_try_str(*options, "driver");
1135053e1578SMax Reitz     if (drvname) {
1136053e1578SMax Reitz         drv = bdrv_find_format(drvname);
1137053e1578SMax Reitz         if (!drv) {
1138053e1578SMax Reitz             error_setg(errp, "Unknown driver '%s'", drvname);
1139053e1578SMax Reitz             return -ENOENT;
1140053e1578SMax Reitz         }
114153a29513SMax Reitz         /* If the user has explicitly specified the driver, this choice should
114253a29513SMax Reitz          * override the BDRV_O_PROTOCOL flag */
1143053e1578SMax Reitz         protocol = drv->bdrv_file_open;
114453a29513SMax Reitz     }
114553a29513SMax Reitz 
114653a29513SMax Reitz     if (protocol) {
114753a29513SMax Reitz         *flags |= BDRV_O_PROTOCOL;
114853a29513SMax Reitz     } else {
114953a29513SMax Reitz         *flags &= ~BDRV_O_PROTOCOL;
115053a29513SMax Reitz     }
115153a29513SMax Reitz 
115291a097e7SKevin Wolf     /* Translate cache options from flags into options */
115391a097e7SKevin Wolf     update_options_from_flags(*options, *flags);
115491a097e7SKevin Wolf 
1155f54120ffSKevin Wolf     /* Fetch the file name from the options QDict if necessary */
115617b005f1SKevin Wolf     if (protocol && filename) {
1157f54120ffSKevin Wolf         if (!qdict_haskey(*options, "filename")) {
1158f54120ffSKevin Wolf             qdict_put(*options, "filename", qstring_from_str(filename));
1159f54120ffSKevin Wolf             parse_filename = true;
1160f54120ffSKevin Wolf         } else {
1161f54120ffSKevin Wolf             error_setg(errp, "Can't specify 'file' and 'filename' options at "
1162f54120ffSKevin Wolf                              "the same time");
1163f54120ffSKevin Wolf             return -EINVAL;
1164f54120ffSKevin Wolf         }
1165f54120ffSKevin Wolf     }
1166f54120ffSKevin Wolf 
1167f54120ffSKevin Wolf     /* Find the right block driver */
1168f54120ffSKevin Wolf     filename = qdict_get_try_str(*options, "filename");
1169f54120ffSKevin Wolf 
117017b005f1SKevin Wolf     if (!drvname && protocol) {
1171f54120ffSKevin Wolf         if (filename) {
1172b65a5e12SMax Reitz             drv = bdrv_find_protocol(filename, parse_filename, errp);
1173f54120ffSKevin Wolf             if (!drv) {
1174f54120ffSKevin Wolf                 return -EINVAL;
1175f54120ffSKevin Wolf             }
1176f54120ffSKevin Wolf 
1177f54120ffSKevin Wolf             drvname = drv->format_name;
1178f54120ffSKevin Wolf             qdict_put(*options, "driver", qstring_from_str(drvname));
1179f54120ffSKevin Wolf         } else {
1180f54120ffSKevin Wolf             error_setg(errp, "Must specify either driver or file");
1181f54120ffSKevin Wolf             return -EINVAL;
1182f54120ffSKevin Wolf         }
118317b005f1SKevin Wolf     }
118417b005f1SKevin Wolf 
118517b005f1SKevin Wolf     assert(drv || !protocol);
1186f54120ffSKevin Wolf 
1187f54120ffSKevin Wolf     /* Driver-specific filename parsing */
118817b005f1SKevin Wolf     if (drv && drv->bdrv_parse_filename && parse_filename) {
1189f54120ffSKevin Wolf         drv->bdrv_parse_filename(filename, *options, &local_err);
1190f54120ffSKevin Wolf         if (local_err) {
1191f54120ffSKevin Wolf             error_propagate(errp, local_err);
1192f54120ffSKevin Wolf             return -EINVAL;
1193f54120ffSKevin Wolf         }
1194f54120ffSKevin Wolf 
1195f54120ffSKevin Wolf         if (!drv->bdrv_needs_filename) {
1196f54120ffSKevin Wolf             qdict_del(*options, "filename");
1197f54120ffSKevin Wolf         }
1198f54120ffSKevin Wolf     }
1199f54120ffSKevin Wolf 
1200f54120ffSKevin Wolf     return 0;
1201f54120ffSKevin Wolf }
1202f54120ffSKevin Wolf 
1203b4b059f6SKevin Wolf static BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
1204df581792SKevin Wolf                                     BlockDriverState *child_bs,
1205260fecf1SKevin Wolf                                     const char *child_name,
1206df581792SKevin Wolf                                     const BdrvChildRole *child_role)
1207df581792SKevin Wolf {
1208df581792SKevin Wolf     BdrvChild *child = g_new(BdrvChild, 1);
1209df581792SKevin Wolf     *child = (BdrvChild) {
1210df581792SKevin Wolf         .bs     = child_bs,
1211260fecf1SKevin Wolf         .name   = g_strdup(child_name),
1212df581792SKevin Wolf         .role   = child_role,
1213df581792SKevin Wolf     };
1214df581792SKevin Wolf 
1215df581792SKevin Wolf     QLIST_INSERT_HEAD(&parent_bs->children, child, next);
1216d42a8a93SKevin Wolf     QLIST_INSERT_HEAD(&child_bs->parents, child, next_parent);
1217b4b059f6SKevin Wolf 
1218b4b059f6SKevin Wolf     return child;
1219df581792SKevin Wolf }
1220df581792SKevin Wolf 
12213f09bfbcSKevin Wolf static void bdrv_detach_child(BdrvChild *child)
122233a60407SKevin Wolf {
122333a60407SKevin Wolf     QLIST_REMOVE(child, next);
1224d42a8a93SKevin Wolf     QLIST_REMOVE(child, next_parent);
1225260fecf1SKevin Wolf     g_free(child->name);
122633a60407SKevin Wolf     g_free(child);
122733a60407SKevin Wolf }
122833a60407SKevin Wolf 
122933a60407SKevin Wolf void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child)
123033a60407SKevin Wolf {
1231779020cbSKevin Wolf     BlockDriverState *child_bs;
1232779020cbSKevin Wolf 
1233779020cbSKevin Wolf     if (child == NULL) {
1234779020cbSKevin Wolf         return;
1235779020cbSKevin Wolf     }
123633a60407SKevin Wolf 
123733a60407SKevin Wolf     if (child->bs->inherits_from == parent) {
123833a60407SKevin Wolf         child->bs->inherits_from = NULL;
123933a60407SKevin Wolf     }
124033a60407SKevin Wolf 
1241779020cbSKevin Wolf     child_bs = child->bs;
124233a60407SKevin Wolf     bdrv_detach_child(child);
124333a60407SKevin Wolf     bdrv_unref(child_bs);
124433a60407SKevin Wolf }
124533a60407SKevin Wolf 
12465db15a57SKevin Wolf /*
12475db15a57SKevin Wolf  * Sets the backing file link of a BDS. A new reference is created; callers
12485db15a57SKevin Wolf  * which don't need their own reference any more must call bdrv_unref().
12495db15a57SKevin Wolf  */
12508d24cce1SFam Zheng void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd)
12518d24cce1SFam Zheng {
12525db15a57SKevin Wolf     if (backing_hd) {
12535db15a57SKevin Wolf         bdrv_ref(backing_hd);
12545db15a57SKevin Wolf     }
12558d24cce1SFam Zheng 
1256760e0063SKevin Wolf     if (bs->backing) {
1257826b6ca0SFam Zheng         assert(bs->backing_blocker);
1258760e0063SKevin Wolf         bdrv_op_unblock_all(bs->backing->bs, bs->backing_blocker);
12595db15a57SKevin Wolf         bdrv_unref_child(bs, bs->backing);
1260826b6ca0SFam Zheng     } else if (backing_hd) {
1261826b6ca0SFam Zheng         error_setg(&bs->backing_blocker,
126281e5f78aSAlberto Garcia                    "node is used as backing hd of '%s'",
126381e5f78aSAlberto Garcia                    bdrv_get_device_or_node_name(bs));
1264826b6ca0SFam Zheng     }
1265826b6ca0SFam Zheng 
12668d24cce1SFam Zheng     if (!backing_hd) {
1267826b6ca0SFam Zheng         error_free(bs->backing_blocker);
1268826b6ca0SFam Zheng         bs->backing_blocker = NULL;
1269760e0063SKevin Wolf         bs->backing = NULL;
12708d24cce1SFam Zheng         goto out;
12718d24cce1SFam Zheng     }
1272260fecf1SKevin Wolf     bs->backing = bdrv_attach_child(bs, backing_hd, "backing", &child_backing);
12738d24cce1SFam Zheng     bs->open_flags &= ~BDRV_O_NO_BACKING;
12748d24cce1SFam Zheng     pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filename);
12758d24cce1SFam Zheng     pstrcpy(bs->backing_format, sizeof(bs->backing_format),
12768d24cce1SFam Zheng             backing_hd->drv ? backing_hd->drv->format_name : "");
1277826b6ca0SFam Zheng 
1278760e0063SKevin Wolf     bdrv_op_block_all(backing_hd, bs->backing_blocker);
1279826b6ca0SFam Zheng     /* Otherwise we won't be able to commit due to check in bdrv_commit */
1280760e0063SKevin Wolf     bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET,
1281826b6ca0SFam Zheng                     bs->backing_blocker);
12828d24cce1SFam Zheng out:
12833baca891SKevin Wolf     bdrv_refresh_limits(bs, NULL);
12848d24cce1SFam Zheng }
12858d24cce1SFam Zheng 
128631ca6d07SKevin Wolf /*
128731ca6d07SKevin Wolf  * Opens the backing file for a BlockDriverState if not yet open
128831ca6d07SKevin Wolf  *
1289d9b7b057SKevin Wolf  * bdref_key specifies the key for the image's BlockdevRef in the options QDict.
1290d9b7b057SKevin Wolf  * That QDict has to be flattened; therefore, if the BlockdevRef is a QDict
1291d9b7b057SKevin Wolf  * itself, all options starting with "${bdref_key}." are considered part of the
1292d9b7b057SKevin Wolf  * BlockdevRef.
1293d9b7b057SKevin Wolf  *
1294d9b7b057SKevin Wolf  * TODO Can this be unified with bdrv_open_image()?
129531ca6d07SKevin Wolf  */
1296d9b7b057SKevin Wolf int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
1297d9b7b057SKevin Wolf                            const char *bdref_key, Error **errp)
12989156df12SPaolo Bonzini {
12991ba4b6a5SBenoît Canet     char *backing_filename = g_malloc0(PATH_MAX);
1300d9b7b057SKevin Wolf     char *bdref_key_dot;
1301d9b7b057SKevin Wolf     const char *reference = NULL;
1302317fc44eSKevin Wolf     int ret = 0;
13038d24cce1SFam Zheng     BlockDriverState *backing_hd;
1304d9b7b057SKevin Wolf     QDict *options;
1305d9b7b057SKevin Wolf     QDict *tmp_parent_options = NULL;
130634b5d2c6SMax Reitz     Error *local_err = NULL;
13079156df12SPaolo Bonzini 
1308760e0063SKevin Wolf     if (bs->backing != NULL) {
13091ba4b6a5SBenoît Canet         goto free_exit;
13109156df12SPaolo Bonzini     }
13119156df12SPaolo Bonzini 
131231ca6d07SKevin Wolf     /* NULL means an empty set of options */
1313d9b7b057SKevin Wolf     if (parent_options == NULL) {
1314d9b7b057SKevin Wolf         tmp_parent_options = qdict_new();
1315d9b7b057SKevin Wolf         parent_options = tmp_parent_options;
131631ca6d07SKevin Wolf     }
131731ca6d07SKevin Wolf 
13189156df12SPaolo Bonzini     bs->open_flags &= ~BDRV_O_NO_BACKING;
1319d9b7b057SKevin Wolf 
1320d9b7b057SKevin Wolf     bdref_key_dot = g_strdup_printf("%s.", bdref_key);
1321d9b7b057SKevin Wolf     qdict_extract_subqdict(parent_options, &options, bdref_key_dot);
1322d9b7b057SKevin Wolf     g_free(bdref_key_dot);
1323d9b7b057SKevin Wolf 
1324d9b7b057SKevin Wolf     reference = qdict_get_try_str(parent_options, bdref_key);
1325d9b7b057SKevin Wolf     if (reference || qdict_haskey(options, "file.filename")) {
13261cb6f506SKevin Wolf         backing_filename[0] = '\0';
13271cb6f506SKevin Wolf     } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
132831ca6d07SKevin Wolf         QDECREF(options);
13291ba4b6a5SBenoît Canet         goto free_exit;
1330dbecebddSFam Zheng     } else {
13319f07429eSMax Reitz         bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX,
13329f07429eSMax Reitz                                        &local_err);
13339f07429eSMax Reitz         if (local_err) {
13349f07429eSMax Reitz             ret = -EINVAL;
13359f07429eSMax Reitz             error_propagate(errp, local_err);
13369f07429eSMax Reitz             QDECREF(options);
13379f07429eSMax Reitz             goto free_exit;
13389f07429eSMax Reitz         }
13399156df12SPaolo Bonzini     }
13409156df12SPaolo Bonzini 
13418ee79e70SKevin Wolf     if (!bs->drv || !bs->drv->supports_backing) {
13428ee79e70SKevin Wolf         ret = -EINVAL;
13438ee79e70SKevin Wolf         error_setg(errp, "Driver doesn't support backing files");
13448ee79e70SKevin Wolf         QDECREF(options);
13458ee79e70SKevin Wolf         goto free_exit;
13468ee79e70SKevin Wolf     }
13478ee79e70SKevin Wolf 
1348c5f6e493SKevin Wolf     if (bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
1349c5f6e493SKevin Wolf         qdict_put(options, "driver", qstring_from_str(bs->backing_format));
13509156df12SPaolo Bonzini     }
13519156df12SPaolo Bonzini 
1352d9b7b057SKevin Wolf     backing_hd = NULL;
1353f3930ed0SKevin Wolf     ret = bdrv_open_inherit(&backing_hd,
1354f3930ed0SKevin Wolf                             *backing_filename ? backing_filename : NULL,
1355d9b7b057SKevin Wolf                             reference, options, 0, bs, &child_backing,
1356e43bfd9cSMarkus Armbruster                             errp);
13579156df12SPaolo Bonzini     if (ret < 0) {
13589156df12SPaolo Bonzini         bs->open_flags |= BDRV_O_NO_BACKING;
1359e43bfd9cSMarkus Armbruster         error_prepend(errp, "Could not open backing file: ");
13601ba4b6a5SBenoît Canet         goto free_exit;
13619156df12SPaolo Bonzini     }
1362df581792SKevin Wolf 
13635db15a57SKevin Wolf     /* Hook up the backing file link; drop our reference, bs owns the
13645db15a57SKevin Wolf      * backing_hd reference now */
13658d24cce1SFam Zheng     bdrv_set_backing_hd(bs, backing_hd);
13665db15a57SKevin Wolf     bdrv_unref(backing_hd);
1367d80ac658SPeter Feiner 
1368d9b7b057SKevin Wolf     qdict_del(parent_options, bdref_key);
1369d9b7b057SKevin Wolf 
13701ba4b6a5SBenoît Canet free_exit:
13711ba4b6a5SBenoît Canet     g_free(backing_filename);
1372d9b7b057SKevin Wolf     QDECREF(tmp_parent_options);
13731ba4b6a5SBenoît Canet     return ret;
13749156df12SPaolo Bonzini }
13759156df12SPaolo Bonzini 
1376b6ce07aaSKevin Wolf /*
1377da557aacSMax Reitz  * Opens a disk image whose options are given as BlockdevRef in another block
1378da557aacSMax Reitz  * device's options.
1379da557aacSMax Reitz  *
1380da557aacSMax Reitz  * If allow_none is true, no image will be opened if filename is false and no
1381b4b059f6SKevin Wolf  * BlockdevRef is given. NULL will be returned, but errp remains unset.
1382da557aacSMax Reitz  *
1383da557aacSMax Reitz  * bdrev_key specifies the key for the image's BlockdevRef in the options QDict.
1384da557aacSMax Reitz  * That QDict has to be flattened; therefore, if the BlockdevRef is a QDict
1385da557aacSMax Reitz  * itself, all options starting with "${bdref_key}." are considered part of the
1386da557aacSMax Reitz  * BlockdevRef.
1387da557aacSMax Reitz  *
1388da557aacSMax Reitz  * The BlockdevRef will be removed from the options QDict.
1389da557aacSMax Reitz  */
1390b4b059f6SKevin Wolf BdrvChild *bdrv_open_child(const char *filename,
1391f3930ed0SKevin Wolf                            QDict *options, const char *bdref_key,
1392b4b059f6SKevin Wolf                            BlockDriverState* parent,
1393b4b059f6SKevin Wolf                            const BdrvChildRole *child_role,
1394f7d9fd8cSMax Reitz                            bool allow_none, Error **errp)
1395da557aacSMax Reitz {
1396b4b059f6SKevin Wolf     BdrvChild *c = NULL;
1397b4b059f6SKevin Wolf     BlockDriverState *bs;
1398da557aacSMax Reitz     QDict *image_options;
1399da557aacSMax Reitz     int ret;
1400da557aacSMax Reitz     char *bdref_key_dot;
1401da557aacSMax Reitz     const char *reference;
1402da557aacSMax Reitz 
1403df581792SKevin Wolf     assert(child_role != NULL);
1404f67503e5SMax Reitz 
1405da557aacSMax Reitz     bdref_key_dot = g_strdup_printf("%s.", bdref_key);
1406da557aacSMax Reitz     qdict_extract_subqdict(options, &image_options, bdref_key_dot);
1407da557aacSMax Reitz     g_free(bdref_key_dot);
1408da557aacSMax Reitz 
1409da557aacSMax Reitz     reference = qdict_get_try_str(options, bdref_key);
1410da557aacSMax Reitz     if (!filename && !reference && !qdict_size(image_options)) {
1411b4b059f6SKevin Wolf         if (!allow_none) {
1412da557aacSMax Reitz             error_setg(errp, "A block device must be specified for \"%s\"",
1413da557aacSMax Reitz                        bdref_key);
1414da557aacSMax Reitz         }
1415b20e61e0SMarkus Armbruster         QDECREF(image_options);
1416da557aacSMax Reitz         goto done;
1417da557aacSMax Reitz     }
1418da557aacSMax Reitz 
1419b4b059f6SKevin Wolf     bs = NULL;
1420b4b059f6SKevin Wolf     ret = bdrv_open_inherit(&bs, filename, reference, image_options, 0,
1421ce343771SMax Reitz                             parent, child_role, errp);
1422df581792SKevin Wolf     if (ret < 0) {
1423df581792SKevin Wolf         goto done;
1424df581792SKevin Wolf     }
1425df581792SKevin Wolf 
1426260fecf1SKevin Wolf     c = bdrv_attach_child(parent, bs, bdref_key, child_role);
1427da557aacSMax Reitz 
1428da557aacSMax Reitz done:
1429da557aacSMax Reitz     qdict_del(options, bdref_key);
1430b4b059f6SKevin Wolf     return c;
1431b4b059f6SKevin Wolf }
1432b4b059f6SKevin Wolf 
1433*73176beeSKevin Wolf static int bdrv_append_temp_snapshot(BlockDriverState *bs, int flags,
1434*73176beeSKevin Wolf                                      QDict *snapshot_options, Error **errp)
1435b998875dSKevin Wolf {
1436b998875dSKevin Wolf     /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
14371ba4b6a5SBenoît Canet     char *tmp_filename = g_malloc0(PATH_MAX + 1);
1438b998875dSKevin Wolf     int64_t total_size;
143983d0521aSChunyan Liu     QemuOpts *opts = NULL;
1440b998875dSKevin Wolf     BlockDriverState *bs_snapshot;
1441c2e0dbbfSFam Zheng     Error *local_err = NULL;
1442b998875dSKevin Wolf     int ret;
1443b998875dSKevin Wolf 
1444b998875dSKevin Wolf     /* if snapshot, we create a temporary backing file and open it
1445b998875dSKevin Wolf        instead of opening 'filename' directly */
1446b998875dSKevin Wolf 
1447b998875dSKevin Wolf     /* Get the required size from the image */
1448f187743aSKevin Wolf     total_size = bdrv_getlength(bs);
1449f187743aSKevin Wolf     if (total_size < 0) {
14506b8aeca5SChen Gang         ret = total_size;
1451f187743aSKevin Wolf         error_setg_errno(errp, -total_size, "Could not get image size");
14521ba4b6a5SBenoît Canet         goto out;
1453f187743aSKevin Wolf     }
1454b998875dSKevin Wolf 
1455b998875dSKevin Wolf     /* Create the temporary image */
14561ba4b6a5SBenoît Canet     ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
1457b998875dSKevin Wolf     if (ret < 0) {
1458b998875dSKevin Wolf         error_setg_errno(errp, -ret, "Could not get temporary filename");
14591ba4b6a5SBenoît Canet         goto out;
1460b998875dSKevin Wolf     }
1461b998875dSKevin Wolf 
1462ef810437SMax Reitz     opts = qemu_opts_create(bdrv_qcow2.create_opts, NULL, 0,
1463c282e1fdSChunyan Liu                             &error_abort);
146439101f25SMarkus Armbruster     qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size, &error_abort);
1465e43bfd9cSMarkus Armbruster     ret = bdrv_create(&bdrv_qcow2, tmp_filename, opts, errp);
146683d0521aSChunyan Liu     qemu_opts_del(opts);
1467b998875dSKevin Wolf     if (ret < 0) {
1468e43bfd9cSMarkus Armbruster         error_prepend(errp, "Could not create temporary overlay '%s': ",
1469e43bfd9cSMarkus Armbruster                       tmp_filename);
14701ba4b6a5SBenoît Canet         goto out;
1471b998875dSKevin Wolf     }
1472b998875dSKevin Wolf 
1473*73176beeSKevin Wolf     /* Prepare options QDict for the temporary file */
1474b998875dSKevin Wolf     qdict_put(snapshot_options, "file.driver",
1475b998875dSKevin Wolf               qstring_from_str("file"));
1476b998875dSKevin Wolf     qdict_put(snapshot_options, "file.filename",
1477b998875dSKevin Wolf               qstring_from_str(tmp_filename));
1478e6641719SMax Reitz     qdict_put(snapshot_options, "driver",
1479e6641719SMax Reitz               qstring_from_str("qcow2"));
1480b998875dSKevin Wolf 
1481e4e9986bSMarkus Armbruster     bs_snapshot = bdrv_new();
1482b998875dSKevin Wolf 
1483b998875dSKevin Wolf     ret = bdrv_open(&bs_snapshot, NULL, NULL, snapshot_options,
14846ebf9aa2SMax Reitz                     flags, &local_err);
1485*73176beeSKevin Wolf     snapshot_options = NULL;
1486b998875dSKevin Wolf     if (ret < 0) {
1487b998875dSKevin Wolf         error_propagate(errp, local_err);
14881ba4b6a5SBenoît Canet         goto out;
1489b998875dSKevin Wolf     }
1490b998875dSKevin Wolf 
1491b998875dSKevin Wolf     bdrv_append(bs_snapshot, bs);
14921ba4b6a5SBenoît Canet 
14931ba4b6a5SBenoît Canet out:
1494*73176beeSKevin Wolf     QDECREF(snapshot_options);
14951ba4b6a5SBenoît Canet     g_free(tmp_filename);
14966b8aeca5SChen Gang     return ret;
1497b998875dSKevin Wolf }
1498b998875dSKevin Wolf 
1499da557aacSMax Reitz /*
1500b6ce07aaSKevin Wolf  * Opens a disk image (raw, qcow2, vmdk, ...)
1501de9c0cecSKevin Wolf  *
1502de9c0cecSKevin Wolf  * options is a QDict of options to pass to the block drivers, or NULL for an
1503de9c0cecSKevin Wolf  * empty set of options. The reference to the QDict belongs to the block layer
1504de9c0cecSKevin Wolf  * after the call (even on failure), so if the caller intends to reuse the
1505de9c0cecSKevin Wolf  * dictionary, it needs to use QINCREF() before calling bdrv_open.
1506f67503e5SMax Reitz  *
1507f67503e5SMax Reitz  * If *pbs is NULL, a new BDS will be created with a pointer to it stored there.
1508f67503e5SMax Reitz  * If it is not NULL, the referenced BDS will be reused.
1509ddf5636dSMax Reitz  *
1510ddf5636dSMax Reitz  * The reference parameter may be used to specify an existing block device which
1511ddf5636dSMax Reitz  * should be opened. If specified, neither options nor a filename may be given,
1512ddf5636dSMax Reitz  * nor can an existing BDS be reused (that is, *pbs has to be NULL).
1513b6ce07aaSKevin Wolf  */
1514f3930ed0SKevin Wolf static int bdrv_open_inherit(BlockDriverState **pbs, const char *filename,
1515ddf5636dSMax Reitz                              const char *reference, QDict *options, int flags,
1516f3930ed0SKevin Wolf                              BlockDriverState *parent,
1517ce343771SMax Reitz                              const BdrvChildRole *child_role, Error **errp)
1518ea2384d3Sbellard {
1519b6ce07aaSKevin Wolf     int ret;
15209a4f4c31SKevin Wolf     BdrvChild *file = NULL;
15219a4f4c31SKevin Wolf     BlockDriverState *bs;
1522ce343771SMax Reitz     BlockDriver *drv = NULL;
152374fe54f2SKevin Wolf     const char *drvname;
15243e8c2e57SAlberto Garcia     const char *backing;
152534b5d2c6SMax Reitz     Error *local_err = NULL;
1526*73176beeSKevin Wolf     QDict *snapshot_options = NULL;
1527b1e6fc08SKevin Wolf     int snapshot_flags = 0;
152833e3963eSbellard 
1529f67503e5SMax Reitz     assert(pbs);
1530f3930ed0SKevin Wolf     assert(!child_role || !flags);
1531f3930ed0SKevin Wolf     assert(!child_role == !parent);
1532f67503e5SMax Reitz 
1533ddf5636dSMax Reitz     if (reference) {
1534ddf5636dSMax Reitz         bool options_non_empty = options ? qdict_size(options) : false;
1535ddf5636dSMax Reitz         QDECREF(options);
1536ddf5636dSMax Reitz 
1537ddf5636dSMax Reitz         if (*pbs) {
1538ddf5636dSMax Reitz             error_setg(errp, "Cannot reuse an existing BDS when referencing "
1539ddf5636dSMax Reitz                        "another block device");
1540ddf5636dSMax Reitz             return -EINVAL;
1541ddf5636dSMax Reitz         }
1542ddf5636dSMax Reitz 
1543ddf5636dSMax Reitz         if (filename || options_non_empty) {
1544ddf5636dSMax Reitz             error_setg(errp, "Cannot reference an existing block device with "
1545ddf5636dSMax Reitz                        "additional options or a new filename");
1546ddf5636dSMax Reitz             return -EINVAL;
1547ddf5636dSMax Reitz         }
1548ddf5636dSMax Reitz 
1549ddf5636dSMax Reitz         bs = bdrv_lookup_bs(reference, reference, errp);
1550ddf5636dSMax Reitz         if (!bs) {
1551ddf5636dSMax Reitz             return -ENODEV;
1552ddf5636dSMax Reitz         }
1553ddf5636dSMax Reitz         bdrv_ref(bs);
1554ddf5636dSMax Reitz         *pbs = bs;
1555ddf5636dSMax Reitz         return 0;
1556ddf5636dSMax Reitz     }
1557ddf5636dSMax Reitz 
1558f67503e5SMax Reitz     if (*pbs) {
1559f67503e5SMax Reitz         bs = *pbs;
1560f67503e5SMax Reitz     } else {
1561e4e9986bSMarkus Armbruster         bs = bdrv_new();
1562f67503e5SMax Reitz     }
1563f67503e5SMax Reitz 
1564de9c0cecSKevin Wolf     /* NULL means an empty set of options */
1565de9c0cecSKevin Wolf     if (options == NULL) {
1566de9c0cecSKevin Wolf         options = qdict_new();
1567de9c0cecSKevin Wolf     }
1568de9c0cecSKevin Wolf 
1569145f598eSKevin Wolf     /* json: syntax counts as explicit options, as if in the QDict */
1570de3b53f0SKevin Wolf     parse_json_protocol(options, &filename, &local_err);
1571de3b53f0SKevin Wolf     if (local_err) {
1572de3b53f0SKevin Wolf         ret = -EINVAL;
1573de3b53f0SKevin Wolf         goto fail;
1574de3b53f0SKevin Wolf     }
1575de3b53f0SKevin Wolf 
1576145f598eSKevin Wolf     bs->explicit_options = qdict_clone_shallow(options);
1577145f598eSKevin Wolf 
1578f3930ed0SKevin Wolf     if (child_role) {
1579bddcec37SKevin Wolf         bs->inherits_from = parent;
15808e2160e2SKevin Wolf         child_role->inherit_options(&flags, options,
15818e2160e2SKevin Wolf                                     parent->open_flags, parent->options);
1582f3930ed0SKevin Wolf     }
1583f3930ed0SKevin Wolf 
1584de3b53f0SKevin Wolf     ret = bdrv_fill_options(&options, filename, &flags, &local_err);
1585462f5bcfSKevin Wolf     if (local_err) {
1586462f5bcfSKevin Wolf         goto fail;
1587462f5bcfSKevin Wolf     }
1588462f5bcfSKevin Wolf 
158962392ebbSKevin Wolf     bs->open_flags = flags;
159062392ebbSKevin Wolf     bs->options = options;
159162392ebbSKevin Wolf     options = qdict_clone_shallow(options);
159262392ebbSKevin Wolf 
159376c591b0SKevin Wolf     /* Find the right image format driver */
159476c591b0SKevin Wolf     drvname = qdict_get_try_str(options, "driver");
159576c591b0SKevin Wolf     if (drvname) {
159676c591b0SKevin Wolf         drv = bdrv_find_format(drvname);
159776c591b0SKevin Wolf         if (!drv) {
159876c591b0SKevin Wolf             error_setg(errp, "Unknown driver: '%s'", drvname);
159976c591b0SKevin Wolf             ret = -EINVAL;
160076c591b0SKevin Wolf             goto fail;
160176c591b0SKevin Wolf         }
160276c591b0SKevin Wolf     }
160376c591b0SKevin Wolf 
160476c591b0SKevin Wolf     assert(drvname || !(flags & BDRV_O_PROTOCOL));
160576c591b0SKevin Wolf 
16063e8c2e57SAlberto Garcia     backing = qdict_get_try_str(options, "backing");
16073e8c2e57SAlberto Garcia     if (backing && *backing == '\0') {
16083e8c2e57SAlberto Garcia         flags |= BDRV_O_NO_BACKING;
16093e8c2e57SAlberto Garcia         qdict_del(options, "backing");
16103e8c2e57SAlberto Garcia     }
16113e8c2e57SAlberto Garcia 
1612f500a6d3SKevin Wolf     /* Open image file without format layer */
1613f4788adcSKevin Wolf     if ((flags & BDRV_O_PROTOCOL) == 0) {
1614be028adcSJeff Cody         if (flags & BDRV_O_RDWR) {
1615be028adcSJeff Cody             flags |= BDRV_O_ALLOW_RDWR;
1616be028adcSJeff Cody         }
1617b1e6fc08SKevin Wolf         if (flags & BDRV_O_SNAPSHOT) {
1618*73176beeSKevin Wolf             snapshot_options = qdict_new();
1619*73176beeSKevin Wolf             bdrv_temp_snapshot_options(&snapshot_flags, snapshot_options,
1620*73176beeSKevin Wolf                                        flags, options);
16218e2160e2SKevin Wolf             bdrv_backing_options(&flags, options, flags, options);
1622b1e6fc08SKevin Wolf         }
1623be028adcSJeff Cody 
1624f3930ed0SKevin Wolf         bs->open_flags = flags;
16251fdd6933SKevin Wolf 
16269a4f4c31SKevin Wolf         file = bdrv_open_child(filename, options, "file", bs,
16271fdd6933SKevin Wolf                                &child_file, true, &local_err);
16281fdd6933SKevin Wolf         if (local_err) {
16291fdd6933SKevin Wolf             ret = -EINVAL;
16308bfea15dSKevin Wolf             goto fail;
1631f500a6d3SKevin Wolf         }
1632f4788adcSKevin Wolf     }
1633f500a6d3SKevin Wolf 
163476c591b0SKevin Wolf     /* Image format probing */
163538f3ef57SKevin Wolf     bs->probed = !drv;
163676c591b0SKevin Wolf     if (!drv && file) {
16379a4f4c31SKevin Wolf         ret = find_image_format(file->bs, filename, &drv, &local_err);
163817b005f1SKevin Wolf         if (ret < 0) {
163917b005f1SKevin Wolf             goto fail;
164017b005f1SKevin Wolf         }
164162392ebbSKevin Wolf         /*
164262392ebbSKevin Wolf          * This option update would logically belong in bdrv_fill_options(),
164362392ebbSKevin Wolf          * but we first need to open bs->file for the probing to work, while
164462392ebbSKevin Wolf          * opening bs->file already requires the (mostly) final set of options
164562392ebbSKevin Wolf          * so that cache mode etc. can be inherited.
164662392ebbSKevin Wolf          *
164762392ebbSKevin Wolf          * Adding the driver later is somewhat ugly, but it's not an option
164862392ebbSKevin Wolf          * that would ever be inherited, so it's correct. We just need to make
164962392ebbSKevin Wolf          * sure to update both bs->options (which has the full effective
165062392ebbSKevin Wolf          * options for bs) and options (which has file.* already removed).
165162392ebbSKevin Wolf          */
165262392ebbSKevin Wolf         qdict_put(bs->options, "driver", qstring_from_str(drv->format_name));
165362392ebbSKevin Wolf         qdict_put(options, "driver", qstring_from_str(drv->format_name));
165476c591b0SKevin Wolf     } else if (!drv) {
16552a05cbe4SMax Reitz         error_setg(errp, "Must specify either driver or file");
16562a05cbe4SMax Reitz         ret = -EINVAL;
16578bfea15dSKevin Wolf         goto fail;
16582a05cbe4SMax Reitz     }
1659f500a6d3SKevin Wolf 
166053a29513SMax Reitz     /* BDRV_O_PROTOCOL must be set iff a protocol BDS is about to be created */
166153a29513SMax Reitz     assert(!!(flags & BDRV_O_PROTOCOL) == !!drv->bdrv_file_open);
166253a29513SMax Reitz     /* file must be NULL if a protocol BDS is about to be created
166353a29513SMax Reitz      * (the inverse results in an error message from bdrv_open_common()) */
166453a29513SMax Reitz     assert(!(flags & BDRV_O_PROTOCOL) || !file);
166553a29513SMax Reitz 
1666b6ce07aaSKevin Wolf     /* Open the image */
166782dc8b41SKevin Wolf     ret = bdrv_open_common(bs, file, options, &local_err);
1668b6ce07aaSKevin Wolf     if (ret < 0) {
16698bfea15dSKevin Wolf         goto fail;
16706987307cSChristoph Hellwig     }
16716987307cSChristoph Hellwig 
16722a05cbe4SMax Reitz     if (file && (bs->file != file)) {
16739a4f4c31SKevin Wolf         bdrv_unref_child(bs, file);
1674f500a6d3SKevin Wolf         file = NULL;
1675f500a6d3SKevin Wolf     }
1676f500a6d3SKevin Wolf 
1677b6ce07aaSKevin Wolf     /* If there is a backing file, use it */
16789156df12SPaolo Bonzini     if ((flags & BDRV_O_NO_BACKING) == 0) {
1679d9b7b057SKevin Wolf         ret = bdrv_open_backing_file(bs, options, "backing", &local_err);
1680b6ce07aaSKevin Wolf         if (ret < 0) {
1681b6ad491aSKevin Wolf             goto close_and_fail;
1682b6ce07aaSKevin Wolf         }
1683b6ce07aaSKevin Wolf     }
1684b6ce07aaSKevin Wolf 
168591af7014SMax Reitz     bdrv_refresh_filename(bs);
168691af7014SMax Reitz 
1687b6ad491aSKevin Wolf     /* Check if any unknown options were used */
16885acd9d81SMax Reitz     if (options && (qdict_size(options) != 0)) {
1689b6ad491aSKevin Wolf         const QDictEntry *entry = qdict_first(options);
16905acd9d81SMax Reitz         if (flags & BDRV_O_PROTOCOL) {
16915acd9d81SMax Reitz             error_setg(errp, "Block protocol '%s' doesn't support the option "
16925acd9d81SMax Reitz                        "'%s'", drv->format_name, entry->key);
16935acd9d81SMax Reitz         } else {
169434b5d2c6SMax Reitz             error_setg(errp, "Block format '%s' used by device '%s' doesn't "
16955acd9d81SMax Reitz                        "support the option '%s'", drv->format_name,
1696bfb197e0SMarkus Armbruster                        bdrv_get_device_name(bs), entry->key);
16975acd9d81SMax Reitz         }
1698b6ad491aSKevin Wolf 
1699b6ad491aSKevin Wolf         ret = -EINVAL;
1700b6ad491aSKevin Wolf         goto close_and_fail;
1701b6ad491aSKevin Wolf     }
1702b6ad491aSKevin Wolf 
1703b6ce07aaSKevin Wolf     if (!bdrv_key_required(bs)) {
1704a7f53e26SMarkus Armbruster         if (bs->blk) {
1705a7f53e26SMarkus Armbruster             blk_dev_change_media_cb(bs->blk, true);
1706a7f53e26SMarkus Armbruster         }
1707c3adb58fSMarkus Armbruster     } else if (!runstate_check(RUN_STATE_PRELAUNCH)
1708c3adb58fSMarkus Armbruster                && !runstate_check(RUN_STATE_INMIGRATE)
1709c3adb58fSMarkus Armbruster                && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
1710c3adb58fSMarkus Armbruster         error_setg(errp,
1711c3adb58fSMarkus Armbruster                    "Guest must be stopped for opening of encrypted image");
1712c3adb58fSMarkus Armbruster         ret = -EBUSY;
1713c3adb58fSMarkus Armbruster         goto close_and_fail;
1714b6ce07aaSKevin Wolf     }
1715b6ce07aaSKevin Wolf 
1716c3adb58fSMarkus Armbruster     QDECREF(options);
1717f67503e5SMax Reitz     *pbs = bs;
1718dd62f1caSKevin Wolf 
1719dd62f1caSKevin Wolf     /* For snapshot=on, create a temporary qcow2 overlay. bs points to the
1720dd62f1caSKevin Wolf      * temporary snapshot afterwards. */
1721dd62f1caSKevin Wolf     if (snapshot_flags) {
1722*73176beeSKevin Wolf         ret = bdrv_append_temp_snapshot(bs, snapshot_flags, snapshot_options,
1723*73176beeSKevin Wolf                                         &local_err);
1724*73176beeSKevin Wolf         snapshot_options = NULL;
1725dd62f1caSKevin Wolf         if (local_err) {
1726dd62f1caSKevin Wolf             goto close_and_fail;
1727dd62f1caSKevin Wolf         }
1728dd62f1caSKevin Wolf     }
1729dd62f1caSKevin Wolf 
1730b6ce07aaSKevin Wolf     return 0;
1731b6ce07aaSKevin Wolf 
17328bfea15dSKevin Wolf fail:
1733f500a6d3SKevin Wolf     if (file != NULL) {
17349a4f4c31SKevin Wolf         bdrv_unref_child(bs, file);
1735f500a6d3SKevin Wolf     }
1736*73176beeSKevin Wolf     QDECREF(snapshot_options);
1737145f598eSKevin Wolf     QDECREF(bs->explicit_options);
1738de9c0cecSKevin Wolf     QDECREF(bs->options);
1739b6ad491aSKevin Wolf     QDECREF(options);
1740de9c0cecSKevin Wolf     bs->options = NULL;
1741f67503e5SMax Reitz     if (!*pbs) {
1742f67503e5SMax Reitz         /* If *pbs is NULL, a new BDS has been created in this function and
1743f67503e5SMax Reitz            needs to be freed now. Otherwise, it does not need to be closed,
1744f67503e5SMax Reitz            since it has not really been opened yet. */
1745f67503e5SMax Reitz         bdrv_unref(bs);
1746f67503e5SMax Reitz     }
174784d18f06SMarkus Armbruster     if (local_err) {
174834b5d2c6SMax Reitz         error_propagate(errp, local_err);
174934b5d2c6SMax Reitz     }
1750b6ad491aSKevin Wolf     return ret;
1751de9c0cecSKevin Wolf 
1752b6ad491aSKevin Wolf close_and_fail:
1753f67503e5SMax Reitz     /* See fail path, but now the BDS has to be always closed */
1754f67503e5SMax Reitz     if (*pbs) {
1755b6ad491aSKevin Wolf         bdrv_close(bs);
1756f67503e5SMax Reitz     } else {
1757f67503e5SMax Reitz         bdrv_unref(bs);
1758f67503e5SMax Reitz     }
1759*73176beeSKevin Wolf     QDECREF(snapshot_options);
1760b6ad491aSKevin Wolf     QDECREF(options);
176184d18f06SMarkus Armbruster     if (local_err) {
176234b5d2c6SMax Reitz         error_propagate(errp, local_err);
176334b5d2c6SMax Reitz     }
1764b6ce07aaSKevin Wolf     return ret;
1765b6ce07aaSKevin Wolf }
1766b6ce07aaSKevin Wolf 
1767f3930ed0SKevin Wolf int bdrv_open(BlockDriverState **pbs, const char *filename,
17686ebf9aa2SMax Reitz               const char *reference, QDict *options, int flags, Error **errp)
1769f3930ed0SKevin Wolf {
1770f3930ed0SKevin Wolf     return bdrv_open_inherit(pbs, filename, reference, options, flags, NULL,
1771ce343771SMax Reitz                              NULL, errp);
1772f3930ed0SKevin Wolf }
1773f3930ed0SKevin Wolf 
1774e971aa12SJeff Cody typedef struct BlockReopenQueueEntry {
1775e971aa12SJeff Cody      bool prepared;
1776e971aa12SJeff Cody      BDRVReopenState state;
1777e971aa12SJeff Cody      QSIMPLEQ_ENTRY(BlockReopenQueueEntry) entry;
1778e971aa12SJeff Cody } BlockReopenQueueEntry;
1779e971aa12SJeff Cody 
1780e971aa12SJeff Cody /*
1781e971aa12SJeff Cody  * Adds a BlockDriverState to a simple queue for an atomic, transactional
1782e971aa12SJeff Cody  * reopen of multiple devices.
1783e971aa12SJeff Cody  *
1784e971aa12SJeff Cody  * bs_queue can either be an existing BlockReopenQueue that has had QSIMPLE_INIT
1785e971aa12SJeff Cody  * already performed, or alternatively may be NULL a new BlockReopenQueue will
1786e971aa12SJeff Cody  * be created and initialized. This newly created BlockReopenQueue should be
1787e971aa12SJeff Cody  * passed back in for subsequent calls that are intended to be of the same
1788e971aa12SJeff Cody  * atomic 'set'.
1789e971aa12SJeff Cody  *
1790e971aa12SJeff Cody  * bs is the BlockDriverState to add to the reopen queue.
1791e971aa12SJeff Cody  *
17924d2cb092SKevin Wolf  * options contains the changed options for the associated bs
17934d2cb092SKevin Wolf  * (the BlockReopenQueue takes ownership)
17944d2cb092SKevin Wolf  *
1795e971aa12SJeff Cody  * flags contains the open flags for the associated bs
1796e971aa12SJeff Cody  *
1797e971aa12SJeff Cody  * returns a pointer to bs_queue, which is either the newly allocated
1798e971aa12SJeff Cody  * bs_queue, or the existing bs_queue being used.
1799e971aa12SJeff Cody  *
1800e971aa12SJeff Cody  */
180128518102SKevin Wolf static BlockReopenQueue *bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
18024d2cb092SKevin Wolf                                                  BlockDriverState *bs,
180328518102SKevin Wolf                                                  QDict *options,
180428518102SKevin Wolf                                                  int flags,
180528518102SKevin Wolf                                                  const BdrvChildRole *role,
180628518102SKevin Wolf                                                  QDict *parent_options,
180728518102SKevin Wolf                                                  int parent_flags)
1808e971aa12SJeff Cody {
1809e971aa12SJeff Cody     assert(bs != NULL);
1810e971aa12SJeff Cody 
1811e971aa12SJeff Cody     BlockReopenQueueEntry *bs_entry;
181267251a31SKevin Wolf     BdrvChild *child;
1813145f598eSKevin Wolf     QDict *old_options, *explicit_options;
181467251a31SKevin Wolf 
1815e971aa12SJeff Cody     if (bs_queue == NULL) {
1816e971aa12SJeff Cody         bs_queue = g_new0(BlockReopenQueue, 1);
1817e971aa12SJeff Cody         QSIMPLEQ_INIT(bs_queue);
1818e971aa12SJeff Cody     }
1819e971aa12SJeff Cody 
18204d2cb092SKevin Wolf     if (!options) {
18214d2cb092SKevin Wolf         options = qdict_new();
18224d2cb092SKevin Wolf     }
18234d2cb092SKevin Wolf 
182428518102SKevin Wolf     /*
182528518102SKevin Wolf      * Precedence of options:
182628518102SKevin Wolf      * 1. Explicitly passed in options (highest)
182791a097e7SKevin Wolf      * 2. Set in flags (only for top level)
1828145f598eSKevin Wolf      * 3. Retained from explicitly set options of bs
18298e2160e2SKevin Wolf      * 4. Inherited from parent node
183028518102SKevin Wolf      * 5. Retained from effective options of bs
183128518102SKevin Wolf      */
183228518102SKevin Wolf 
183391a097e7SKevin Wolf     if (!parent_options) {
183491a097e7SKevin Wolf         /*
183591a097e7SKevin Wolf          * Any setting represented by flags is always updated. If the
183691a097e7SKevin Wolf          * corresponding QDict option is set, it takes precedence. Otherwise
183791a097e7SKevin Wolf          * the flag is translated into a QDict option. The old setting of bs is
183891a097e7SKevin Wolf          * not considered.
183991a097e7SKevin Wolf          */
184091a097e7SKevin Wolf         update_options_from_flags(options, flags);
184191a097e7SKevin Wolf     }
184291a097e7SKevin Wolf 
1843145f598eSKevin Wolf     /* Old explicitly set values (don't overwrite by inherited value) */
1844145f598eSKevin Wolf     old_options = qdict_clone_shallow(bs->explicit_options);
1845145f598eSKevin Wolf     bdrv_join_options(bs, options, old_options);
1846145f598eSKevin Wolf     QDECREF(old_options);
1847145f598eSKevin Wolf 
1848145f598eSKevin Wolf     explicit_options = qdict_clone_shallow(options);
1849145f598eSKevin Wolf 
185028518102SKevin Wolf     /* Inherit from parent node */
185128518102SKevin Wolf     if (parent_options) {
185228518102SKevin Wolf         assert(!flags);
18538e2160e2SKevin Wolf         role->inherit_options(&flags, options, parent_flags, parent_options);
185428518102SKevin Wolf     }
185528518102SKevin Wolf 
185628518102SKevin Wolf     /* Old values are used for options that aren't set yet */
18574d2cb092SKevin Wolf     old_options = qdict_clone_shallow(bs->options);
1858cddff5baSKevin Wolf     bdrv_join_options(bs, options, old_options);
18594d2cb092SKevin Wolf     QDECREF(old_options);
18604d2cb092SKevin Wolf 
1861f1f25a2eSKevin Wolf     /* bdrv_open() masks this flag out */
1862f1f25a2eSKevin Wolf     flags &= ~BDRV_O_PROTOCOL;
1863f1f25a2eSKevin Wolf 
186467251a31SKevin Wolf     QLIST_FOREACH(child, &bs->children, next) {
18654c9dfe5dSKevin Wolf         QDict *new_child_options;
18664c9dfe5dSKevin Wolf         char *child_key_dot;
186767251a31SKevin Wolf 
18684c9dfe5dSKevin Wolf         /* reopen can only change the options of block devices that were
18694c9dfe5dSKevin Wolf          * implicitly created and inherited options. For other (referenced)
18704c9dfe5dSKevin Wolf          * block devices, a syntax like "backing.foo" results in an error. */
187167251a31SKevin Wolf         if (child->bs->inherits_from != bs) {
187267251a31SKevin Wolf             continue;
187367251a31SKevin Wolf         }
187467251a31SKevin Wolf 
18754c9dfe5dSKevin Wolf         child_key_dot = g_strdup_printf("%s.", child->name);
18764c9dfe5dSKevin Wolf         qdict_extract_subqdict(options, &new_child_options, child_key_dot);
18774c9dfe5dSKevin Wolf         g_free(child_key_dot);
18784c9dfe5dSKevin Wolf 
187928518102SKevin Wolf         bdrv_reopen_queue_child(bs_queue, child->bs, new_child_options, 0,
188028518102SKevin Wolf                                 child->role, options, flags);
1881e971aa12SJeff Cody     }
1882e971aa12SJeff Cody 
1883e971aa12SJeff Cody     bs_entry = g_new0(BlockReopenQueueEntry, 1);
1884e971aa12SJeff Cody     QSIMPLEQ_INSERT_TAIL(bs_queue, bs_entry, entry);
1885e971aa12SJeff Cody 
1886e971aa12SJeff Cody     bs_entry->state.bs = bs;
18874d2cb092SKevin Wolf     bs_entry->state.options = options;
1888145f598eSKevin Wolf     bs_entry->state.explicit_options = explicit_options;
1889e971aa12SJeff Cody     bs_entry->state.flags = flags;
1890e971aa12SJeff Cody 
1891e971aa12SJeff Cody     return bs_queue;
1892e971aa12SJeff Cody }
1893e971aa12SJeff Cody 
189428518102SKevin Wolf BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
189528518102SKevin Wolf                                     BlockDriverState *bs,
189628518102SKevin Wolf                                     QDict *options, int flags)
189728518102SKevin Wolf {
189828518102SKevin Wolf     return bdrv_reopen_queue_child(bs_queue, bs, options, flags,
189928518102SKevin Wolf                                    NULL, NULL, 0);
190028518102SKevin Wolf }
190128518102SKevin Wolf 
1902e971aa12SJeff Cody /*
1903e971aa12SJeff Cody  * Reopen multiple BlockDriverStates atomically & transactionally.
1904e971aa12SJeff Cody  *
1905e971aa12SJeff Cody  * The queue passed in (bs_queue) must have been built up previous
1906e971aa12SJeff Cody  * via bdrv_reopen_queue().
1907e971aa12SJeff Cody  *
1908e971aa12SJeff Cody  * Reopens all BDS specified in the queue, with the appropriate
1909e971aa12SJeff Cody  * flags.  All devices are prepared for reopen, and failure of any
1910e971aa12SJeff Cody  * device will cause all device changes to be abandonded, and intermediate
1911e971aa12SJeff Cody  * data cleaned up.
1912e971aa12SJeff Cody  *
1913e971aa12SJeff Cody  * If all devices prepare successfully, then the changes are committed
1914e971aa12SJeff Cody  * to all devices.
1915e971aa12SJeff Cody  *
1916e971aa12SJeff Cody  */
1917e971aa12SJeff Cody int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
1918e971aa12SJeff Cody {
1919e971aa12SJeff Cody     int ret = -1;
1920e971aa12SJeff Cody     BlockReopenQueueEntry *bs_entry, *next;
1921e971aa12SJeff Cody     Error *local_err = NULL;
1922e971aa12SJeff Cody 
1923e971aa12SJeff Cody     assert(bs_queue != NULL);
1924e971aa12SJeff Cody 
1925e971aa12SJeff Cody     bdrv_drain_all();
1926e971aa12SJeff Cody 
1927e971aa12SJeff Cody     QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1928e971aa12SJeff Cody         if (bdrv_reopen_prepare(&bs_entry->state, bs_queue, &local_err)) {
1929e971aa12SJeff Cody             error_propagate(errp, local_err);
1930e971aa12SJeff Cody             goto cleanup;
1931e971aa12SJeff Cody         }
1932e971aa12SJeff Cody         bs_entry->prepared = true;
1933e971aa12SJeff Cody     }
1934e971aa12SJeff Cody 
1935e971aa12SJeff Cody     /* If we reach this point, we have success and just need to apply the
1936e971aa12SJeff Cody      * changes
1937e971aa12SJeff Cody      */
1938e971aa12SJeff Cody     QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1939e971aa12SJeff Cody         bdrv_reopen_commit(&bs_entry->state);
1940e971aa12SJeff Cody     }
1941e971aa12SJeff Cody 
1942e971aa12SJeff Cody     ret = 0;
1943e971aa12SJeff Cody 
1944e971aa12SJeff Cody cleanup:
1945e971aa12SJeff Cody     QSIMPLEQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
1946e971aa12SJeff Cody         if (ret && bs_entry->prepared) {
1947e971aa12SJeff Cody             bdrv_reopen_abort(&bs_entry->state);
1948145f598eSKevin Wolf         } else if (ret) {
1949145f598eSKevin Wolf             QDECREF(bs_entry->state.explicit_options);
1950e971aa12SJeff Cody         }
19514d2cb092SKevin Wolf         QDECREF(bs_entry->state.options);
1952e971aa12SJeff Cody         g_free(bs_entry);
1953e971aa12SJeff Cody     }
1954e971aa12SJeff Cody     g_free(bs_queue);
1955e971aa12SJeff Cody     return ret;
1956e971aa12SJeff Cody }
1957e971aa12SJeff Cody 
1958e971aa12SJeff Cody 
1959e971aa12SJeff Cody /* Reopen a single BlockDriverState with the specified flags. */
1960e971aa12SJeff Cody int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp)
1961e971aa12SJeff Cody {
1962e971aa12SJeff Cody     int ret = -1;
1963e971aa12SJeff Cody     Error *local_err = NULL;
19644d2cb092SKevin Wolf     BlockReopenQueue *queue = bdrv_reopen_queue(NULL, bs, NULL, bdrv_flags);
1965e971aa12SJeff Cody 
1966e971aa12SJeff Cody     ret = bdrv_reopen_multiple(queue, &local_err);
1967e971aa12SJeff Cody     if (local_err != NULL) {
1968e971aa12SJeff Cody         error_propagate(errp, local_err);
1969e971aa12SJeff Cody     }
1970e971aa12SJeff Cody     return ret;
1971e971aa12SJeff Cody }
1972e971aa12SJeff Cody 
1973e971aa12SJeff Cody 
1974e971aa12SJeff Cody /*
1975e971aa12SJeff Cody  * Prepares a BlockDriverState for reopen. All changes are staged in the
1976e971aa12SJeff Cody  * 'opaque' field of the BDRVReopenState, which is used and allocated by
1977e971aa12SJeff Cody  * the block driver layer .bdrv_reopen_prepare()
1978e971aa12SJeff Cody  *
1979e971aa12SJeff Cody  * bs is the BlockDriverState to reopen
1980e971aa12SJeff Cody  * flags are the new open flags
1981e971aa12SJeff Cody  * queue is the reopen queue
1982e971aa12SJeff Cody  *
1983e971aa12SJeff Cody  * Returns 0 on success, non-zero on error.  On error errp will be set
1984e971aa12SJeff Cody  * as well.
1985e971aa12SJeff Cody  *
1986e971aa12SJeff Cody  * On failure, bdrv_reopen_abort() will be called to clean up any data.
1987e971aa12SJeff Cody  * It is the responsibility of the caller to then call the abort() or
1988e971aa12SJeff Cody  * commit() for any other BDS that have been left in a prepare() state
1989e971aa12SJeff Cody  *
1990e971aa12SJeff Cody  */
1991e971aa12SJeff Cody int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
1992e971aa12SJeff Cody                         Error **errp)
1993e971aa12SJeff Cody {
1994e971aa12SJeff Cody     int ret = -1;
1995e971aa12SJeff Cody     Error *local_err = NULL;
1996e971aa12SJeff Cody     BlockDriver *drv;
1997ccf9dc07SKevin Wolf     QemuOpts *opts;
1998ccf9dc07SKevin Wolf     const char *value;
1999e971aa12SJeff Cody 
2000e971aa12SJeff Cody     assert(reopen_state != NULL);
2001e971aa12SJeff Cody     assert(reopen_state->bs->drv != NULL);
2002e971aa12SJeff Cody     drv = reopen_state->bs->drv;
2003e971aa12SJeff Cody 
2004ccf9dc07SKevin Wolf     /* Process generic block layer options */
2005ccf9dc07SKevin Wolf     opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
2006ccf9dc07SKevin Wolf     qemu_opts_absorb_qdict(opts, reopen_state->options, &local_err);
2007ccf9dc07SKevin Wolf     if (local_err) {
2008ccf9dc07SKevin Wolf         error_propagate(errp, local_err);
2009ccf9dc07SKevin Wolf         ret = -EINVAL;
2010ccf9dc07SKevin Wolf         goto error;
2011ccf9dc07SKevin Wolf     }
2012ccf9dc07SKevin Wolf 
201391a097e7SKevin Wolf     update_flags_from_options(&reopen_state->flags, opts);
201491a097e7SKevin Wolf 
201591a097e7SKevin Wolf     /* If a guest device is attached, it owns WCE */
201691a097e7SKevin Wolf     if (reopen_state->bs->blk && blk_get_attached_dev(reopen_state->bs->blk)) {
201791a097e7SKevin Wolf         bool old_wce = bdrv_enable_write_cache(reopen_state->bs);
201891a097e7SKevin Wolf         bool new_wce = (reopen_state->flags & BDRV_O_CACHE_WB);
201991a097e7SKevin Wolf         if (old_wce != new_wce) {
202091a097e7SKevin Wolf             error_setg(errp, "Cannot change cache.writeback: Device attached");
202191a097e7SKevin Wolf             ret = -EINVAL;
202291a097e7SKevin Wolf             goto error;
202391a097e7SKevin Wolf         }
202491a097e7SKevin Wolf     }
202591a097e7SKevin Wolf 
2026ccf9dc07SKevin Wolf     /* node-name and driver must be unchanged. Put them back into the QDict, so
2027ccf9dc07SKevin Wolf      * that they are checked at the end of this function. */
2028ccf9dc07SKevin Wolf     value = qemu_opt_get(opts, "node-name");
2029ccf9dc07SKevin Wolf     if (value) {
2030ccf9dc07SKevin Wolf         qdict_put(reopen_state->options, "node-name", qstring_from_str(value));
2031ccf9dc07SKevin Wolf     }
2032ccf9dc07SKevin Wolf 
2033ccf9dc07SKevin Wolf     value = qemu_opt_get(opts, "driver");
2034ccf9dc07SKevin Wolf     if (value) {
2035ccf9dc07SKevin Wolf         qdict_put(reopen_state->options, "driver", qstring_from_str(value));
2036ccf9dc07SKevin Wolf     }
2037ccf9dc07SKevin Wolf 
2038e971aa12SJeff Cody     /* if we are to stay read-only, do not allow permission change
2039e971aa12SJeff Cody      * to r/w */
2040e971aa12SJeff Cody     if (!(reopen_state->bs->open_flags & BDRV_O_ALLOW_RDWR) &&
2041e971aa12SJeff Cody         reopen_state->flags & BDRV_O_RDWR) {
204281e5f78aSAlberto Garcia         error_setg(errp, "Node '%s' is read only",
204381e5f78aSAlberto Garcia                    bdrv_get_device_or_node_name(reopen_state->bs));
2044e971aa12SJeff Cody         goto error;
2045e971aa12SJeff Cody     }
2046e971aa12SJeff Cody 
2047e971aa12SJeff Cody 
2048e971aa12SJeff Cody     ret = bdrv_flush(reopen_state->bs);
2049e971aa12SJeff Cody     if (ret) {
2050455b0fdeSEric Blake         error_setg_errno(errp, -ret, "Error flushing drive");
2051e971aa12SJeff Cody         goto error;
2052e971aa12SJeff Cody     }
2053e971aa12SJeff Cody 
2054e971aa12SJeff Cody     if (drv->bdrv_reopen_prepare) {
2055e971aa12SJeff Cody         ret = drv->bdrv_reopen_prepare(reopen_state, queue, &local_err);
2056e971aa12SJeff Cody         if (ret) {
2057e971aa12SJeff Cody             if (local_err != NULL) {
2058e971aa12SJeff Cody                 error_propagate(errp, local_err);
2059e971aa12SJeff Cody             } else {
2060d8b6895fSLuiz Capitulino                 error_setg(errp, "failed while preparing to reopen image '%s'",
2061e971aa12SJeff Cody                            reopen_state->bs->filename);
2062e971aa12SJeff Cody             }
2063e971aa12SJeff Cody             goto error;
2064e971aa12SJeff Cody         }
2065e971aa12SJeff Cody     } else {
2066e971aa12SJeff Cody         /* It is currently mandatory to have a bdrv_reopen_prepare()
2067e971aa12SJeff Cody          * handler for each supported drv. */
206881e5f78aSAlberto Garcia         error_setg(errp, "Block format '%s' used by node '%s' "
206981e5f78aSAlberto Garcia                    "does not support reopening files", drv->format_name,
207081e5f78aSAlberto Garcia                    bdrv_get_device_or_node_name(reopen_state->bs));
2071e971aa12SJeff Cody         ret = -1;
2072e971aa12SJeff Cody         goto error;
2073e971aa12SJeff Cody     }
2074e971aa12SJeff Cody 
20754d2cb092SKevin Wolf     /* Options that are not handled are only okay if they are unchanged
20764d2cb092SKevin Wolf      * compared to the old state. It is expected that some options are only
20774d2cb092SKevin Wolf      * used for the initial open, but not reopen (e.g. filename) */
20784d2cb092SKevin Wolf     if (qdict_size(reopen_state->options)) {
20794d2cb092SKevin Wolf         const QDictEntry *entry = qdict_first(reopen_state->options);
20804d2cb092SKevin Wolf 
20814d2cb092SKevin Wolf         do {
20824d2cb092SKevin Wolf             QString *new_obj = qobject_to_qstring(entry->value);
20834d2cb092SKevin Wolf             const char *new = qstring_get_str(new_obj);
20844d2cb092SKevin Wolf             const char *old = qdict_get_try_str(reopen_state->bs->options,
20854d2cb092SKevin Wolf                                                 entry->key);
20864d2cb092SKevin Wolf 
20874d2cb092SKevin Wolf             if (!old || strcmp(new, old)) {
20884d2cb092SKevin Wolf                 error_setg(errp, "Cannot change the option '%s'", entry->key);
20894d2cb092SKevin Wolf                 ret = -EINVAL;
20904d2cb092SKevin Wolf                 goto error;
20914d2cb092SKevin Wolf             }
20924d2cb092SKevin Wolf         } while ((entry = qdict_next(reopen_state->options, entry)));
20934d2cb092SKevin Wolf     }
20944d2cb092SKevin Wolf 
2095e971aa12SJeff Cody     ret = 0;
2096e971aa12SJeff Cody 
2097e971aa12SJeff Cody error:
2098ccf9dc07SKevin Wolf     qemu_opts_del(opts);
2099e971aa12SJeff Cody     return ret;
2100e971aa12SJeff Cody }
2101e971aa12SJeff Cody 
2102e971aa12SJeff Cody /*
2103e971aa12SJeff Cody  * Takes the staged changes for the reopen from bdrv_reopen_prepare(), and
2104e971aa12SJeff Cody  * makes them final by swapping the staging BlockDriverState contents into
2105e971aa12SJeff Cody  * the active BlockDriverState contents.
2106e971aa12SJeff Cody  */
2107e971aa12SJeff Cody void bdrv_reopen_commit(BDRVReopenState *reopen_state)
2108e971aa12SJeff Cody {
2109e971aa12SJeff Cody     BlockDriver *drv;
2110e971aa12SJeff Cody 
2111e971aa12SJeff Cody     assert(reopen_state != NULL);
2112e971aa12SJeff Cody     drv = reopen_state->bs->drv;
2113e971aa12SJeff Cody     assert(drv != NULL);
2114e971aa12SJeff Cody 
2115e971aa12SJeff Cody     /* If there are any driver level actions to take */
2116e971aa12SJeff Cody     if (drv->bdrv_reopen_commit) {
2117e971aa12SJeff Cody         drv->bdrv_reopen_commit(reopen_state);
2118e971aa12SJeff Cody     }
2119e971aa12SJeff Cody 
2120e971aa12SJeff Cody     /* set BDS specific flags now */
2121145f598eSKevin Wolf     QDECREF(reopen_state->bs->explicit_options);
2122145f598eSKevin Wolf 
2123145f598eSKevin Wolf     reopen_state->bs->explicit_options   = reopen_state->explicit_options;
2124e971aa12SJeff Cody     reopen_state->bs->open_flags         = reopen_state->flags;
2125e971aa12SJeff Cody     reopen_state->bs->enable_write_cache = !!(reopen_state->flags &
2126e971aa12SJeff Cody                                               BDRV_O_CACHE_WB);
2127e971aa12SJeff Cody     reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
2128355ef4acSKevin Wolf 
21293baca891SKevin Wolf     bdrv_refresh_limits(reopen_state->bs, NULL);
2130e971aa12SJeff Cody }
2131e971aa12SJeff Cody 
2132e971aa12SJeff Cody /*
2133e971aa12SJeff Cody  * Abort the reopen, and delete and free the staged changes in
2134e971aa12SJeff Cody  * reopen_state
2135e971aa12SJeff Cody  */
2136e971aa12SJeff Cody void bdrv_reopen_abort(BDRVReopenState *reopen_state)
2137e971aa12SJeff Cody {
2138e971aa12SJeff Cody     BlockDriver *drv;
2139e971aa12SJeff Cody 
2140e971aa12SJeff Cody     assert(reopen_state != NULL);
2141e971aa12SJeff Cody     drv = reopen_state->bs->drv;
2142e971aa12SJeff Cody     assert(drv != NULL);
2143e971aa12SJeff Cody 
2144e971aa12SJeff Cody     if (drv->bdrv_reopen_abort) {
2145e971aa12SJeff Cody         drv->bdrv_reopen_abort(reopen_state);
2146e971aa12SJeff Cody     }
2147145f598eSKevin Wolf 
2148145f598eSKevin Wolf     QDECREF(reopen_state->explicit_options);
2149e971aa12SJeff Cody }
2150e971aa12SJeff Cody 
2151e971aa12SJeff Cody 
215264dff520SMax Reitz static void bdrv_close(BlockDriverState *bs)
2153fc01f7e7Sbellard {
215433384421SMax Reitz     BdrvAioNotifier *ban, *ban_next;
215533384421SMax Reitz 
2156ca9bd24cSMax Reitz     assert(!bs->job);
215799b7e775SAlberto Garcia 
215899b7e775SAlberto Garcia     /* Disable I/O limits and drain all pending throttled requests */
2159a0d64a61SAlberto Garcia     if (bs->throttle_state) {
216099b7e775SAlberto Garcia         bdrv_io_limits_disable(bs);
216199b7e775SAlberto Garcia     }
216299b7e775SAlberto Garcia 
2163fc27291dSPaolo Bonzini     bdrv_drained_begin(bs); /* complete I/O */
216458fda173SStefan Hajnoczi     bdrv_flush(bs);
216553ec73e2SFam Zheng     bdrv_drain(bs); /* in case flush left pending I/O */
2166fc27291dSPaolo Bonzini 
2167c5acdc9aSMax Reitz     bdrv_release_named_dirty_bitmaps(bs);
2168c5acdc9aSMax Reitz     assert(QLIST_EMPTY(&bs->dirty_bitmaps));
2169c5acdc9aSMax Reitz 
2170b4d02820SMax Reitz     if (bs->blk) {
2171b4d02820SMax Reitz         blk_dev_change_media_cb(bs->blk, false);
2172b4d02820SMax Reitz     }
2173b4d02820SMax Reitz 
21743cbc002cSPaolo Bonzini     if (bs->drv) {
21756e93e7c4SKevin Wolf         BdrvChild *child, *next;
21766e93e7c4SKevin Wolf 
21779a7dedbcSKevin Wolf         bs->drv->bdrv_close(bs);
21789a4f4c31SKevin Wolf         bs->drv = NULL;
21799a7dedbcSKevin Wolf 
21809a7dedbcSKevin Wolf         bdrv_set_backing_hd(bs, NULL);
21819a7dedbcSKevin Wolf 
21829a4f4c31SKevin Wolf         if (bs->file != NULL) {
21839a4f4c31SKevin Wolf             bdrv_unref_child(bs, bs->file);
21849a4f4c31SKevin Wolf             bs->file = NULL;
21859a4f4c31SKevin Wolf         }
21869a4f4c31SKevin Wolf 
21876e93e7c4SKevin Wolf         QLIST_FOREACH_SAFE(child, &bs->children, next, next) {
218833a60407SKevin Wolf             /* TODO Remove bdrv_unref() from drivers' close function and use
218933a60407SKevin Wolf              * bdrv_unref_child() here */
2190bddcec37SKevin Wolf             if (child->bs->inherits_from == bs) {
2191bddcec37SKevin Wolf                 child->bs->inherits_from = NULL;
2192bddcec37SKevin Wolf             }
219333a60407SKevin Wolf             bdrv_detach_child(child);
21946e93e7c4SKevin Wolf         }
21956e93e7c4SKevin Wolf 
21967267c094SAnthony Liguori         g_free(bs->opaque);
2197ea2384d3Sbellard         bs->opaque = NULL;
219853fec9d3SStefan Hajnoczi         bs->copy_on_read = 0;
2199a275fa42SPaolo Bonzini         bs->backing_file[0] = '\0';
2200a275fa42SPaolo Bonzini         bs->backing_format[0] = '\0';
22016405875cSPaolo Bonzini         bs->total_sectors = 0;
22026405875cSPaolo Bonzini         bs->encrypted = 0;
22036405875cSPaolo Bonzini         bs->valid_key = 0;
22046405875cSPaolo Bonzini         bs->sg = 0;
22050d51b4deSAsias He         bs->zero_beyond_eof = false;
2206de9c0cecSKevin Wolf         QDECREF(bs->options);
2207145f598eSKevin Wolf         QDECREF(bs->explicit_options);
2208de9c0cecSKevin Wolf         bs->options = NULL;
220991af7014SMax Reitz         QDECREF(bs->full_open_options);
221091af7014SMax Reitz         bs->full_open_options = NULL;
22119ca11154SPavel Hrdina     }
221266f82ceeSKevin Wolf 
221333384421SMax Reitz     QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
221433384421SMax Reitz         g_free(ban);
221533384421SMax Reitz     }
221633384421SMax Reitz     QLIST_INIT(&bs->aio_notifiers);
2217fc27291dSPaolo Bonzini     bdrv_drained_end(bs);
2218b338082bSbellard }
2219b338082bSbellard 
22202bc93fedSMORITA Kazutaka void bdrv_close_all(void)
22212bc93fedSMORITA Kazutaka {
22222bc93fedSMORITA Kazutaka     BlockDriverState *bs;
2223ca9bd24cSMax Reitz     AioContext *aio_context;
22242bc93fedSMORITA Kazutaka 
2225ca9bd24cSMax Reitz     /* Drop references from requests still in flight, such as canceled block
2226ca9bd24cSMax Reitz      * jobs whose AIO context has not been polled yet */
2227ca9bd24cSMax Reitz     bdrv_drain_all();
2228ca9bd24cSMax Reitz 
2229ca9bd24cSMax Reitz     blk_remove_all_bs();
2230ca9bd24cSMax Reitz     blockdev_close_all_bdrv_states();
2231ca9bd24cSMax Reitz 
2232ca9bd24cSMax Reitz     /* Cancel all block jobs */
2233ca9bd24cSMax Reitz     while (!QTAILQ_EMPTY(&all_bdrv_states)) {
2234ca9bd24cSMax Reitz         QTAILQ_FOREACH(bs, &all_bdrv_states, bs_list) {
2235ca9bd24cSMax Reitz             aio_context = bdrv_get_aio_context(bs);
2236ed78cda3SStefan Hajnoczi 
2237ed78cda3SStefan Hajnoczi             aio_context_acquire(aio_context);
2238ca9bd24cSMax Reitz             if (bs->job) {
2239ca9bd24cSMax Reitz                 block_job_cancel_sync(bs->job);
2240ed78cda3SStefan Hajnoczi                 aio_context_release(aio_context);
2241ca9bd24cSMax Reitz                 break;
2242ca9bd24cSMax Reitz             }
2243ca9bd24cSMax Reitz             aio_context_release(aio_context);
2244ca9bd24cSMax Reitz         }
2245ca9bd24cSMax Reitz 
2246ca9bd24cSMax Reitz         /* All the remaining BlockDriverStates are referenced directly or
2247ca9bd24cSMax Reitz          * indirectly from block jobs, so there needs to be at least one BDS
2248ca9bd24cSMax Reitz          * directly used by a block job */
2249ca9bd24cSMax Reitz         assert(bs);
22502bc93fedSMORITA Kazutaka     }
22512bc93fedSMORITA Kazutaka }
22522bc93fedSMORITA Kazutaka 
2253f8aa905aSJeff Cody /* Note that bs->device_list.tqe_prev is initially null,
2254f8aa905aSJeff Cody  * and gets set to non-null by QTAILQ_INSERT_TAIL().  Establish
2255f8aa905aSJeff Cody  * the useful invariant "bs in bdrv_states iff bs->tqe_prev" by
2256f8aa905aSJeff Cody  * resetting it to null on remove.  */
2257f8aa905aSJeff Cody void bdrv_device_remove(BlockDriverState *bs)
2258f8aa905aSJeff Cody {
2259f8aa905aSJeff Cody     QTAILQ_REMOVE(&bdrv_states, bs, device_list);
2260f8aa905aSJeff Cody     bs->device_list.tqe_prev = NULL;
2261f8aa905aSJeff Cody }
2262f8aa905aSJeff Cody 
2263dc364f4cSBenoît Canet /* make a BlockDriverState anonymous by removing from bdrv_state and
2264dc364f4cSBenoît Canet  * graph_bdrv_state list.
2265d22b2f41SRyan Harper    Also, NULL terminate the device_name to prevent double remove */
2266d22b2f41SRyan Harper void bdrv_make_anon(BlockDriverState *bs)
2267d22b2f41SRyan Harper {
2268f8aa905aSJeff Cody     /* Take care to remove bs from bdrv_states only when it's actually
2269f8aa905aSJeff Cody      * in it. */
2270bfb197e0SMarkus Armbruster     if (bs->device_list.tqe_prev) {
2271f8aa905aSJeff Cody         bdrv_device_remove(bs);
2272d22b2f41SRyan Harper     }
2273dc364f4cSBenoît Canet     if (bs->node_name[0] != '\0') {
2274dc364f4cSBenoît Canet         QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
2275dc364f4cSBenoît Canet     }
2276dc364f4cSBenoît Canet     bs->node_name[0] = '\0';
2277d22b2f41SRyan Harper }
2278d22b2f41SRyan Harper 
22798e419aefSKevin Wolf /* Fields that need to stay with the top-level BDS */
22804ddc07caSPaolo Bonzini static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
22814ddc07caSPaolo Bonzini                                      BlockDriverState *bs_src)
22824ddc07caSPaolo Bonzini {
22834ddc07caSPaolo Bonzini     /* move some fields that need to stay attached to the device */
22844ddc07caSPaolo Bonzini 
22854ddc07caSPaolo Bonzini     /* dev info */
22864ddc07caSPaolo Bonzini     bs_dest->copy_on_read       = bs_src->copy_on_read;
22874ddc07caSPaolo Bonzini 
22884ddc07caSPaolo Bonzini     bs_dest->enable_write_cache = bs_src->enable_write_cache;
22894ddc07caSPaolo Bonzini 
2290dd62f1caSKevin Wolf     /* dirty bitmap */
2291dd62f1caSKevin Wolf     bs_dest->dirty_bitmaps      = bs_src->dirty_bitmaps;
2292dd62f1caSKevin Wolf }
2293dd62f1caSKevin Wolf 
2294dd62f1caSKevin Wolf static void change_parent_backing_link(BlockDriverState *from,
2295dd62f1caSKevin Wolf                                        BlockDriverState *to)
2296dd62f1caSKevin Wolf {
2297dd62f1caSKevin Wolf     BdrvChild *c, *next;
2298dd62f1caSKevin Wolf 
2299dd62f1caSKevin Wolf     QLIST_FOREACH_SAFE(c, &from->parents, next_parent, next) {
2300dd62f1caSKevin Wolf         assert(c->role != &child_backing);
2301dd62f1caSKevin Wolf         c->bs = to;
2302dd62f1caSKevin Wolf         QLIST_REMOVE(c, next_parent);
2303dd62f1caSKevin Wolf         QLIST_INSERT_HEAD(&to->parents, c, next_parent);
2304dd62f1caSKevin Wolf         bdrv_ref(to);
2305dd62f1caSKevin Wolf         bdrv_unref(from);
2306dd62f1caSKevin Wolf     }
2307dd62f1caSKevin Wolf     if (from->blk) {
2308dd62f1caSKevin Wolf         blk_set_bs(from->blk, to);
2309dd62f1caSKevin Wolf         if (!to->device_list.tqe_prev) {
2310dd62f1caSKevin Wolf             QTAILQ_INSERT_BEFORE(from, to, device_list);
2311dd62f1caSKevin Wolf         }
2312f8aa905aSJeff Cody         bdrv_device_remove(from);
2313dd62f1caSKevin Wolf     }
2314dd62f1caSKevin Wolf }
2315dd62f1caSKevin Wolf 
2316dd62f1caSKevin Wolf static void swap_feature_fields(BlockDriverState *bs_top,
2317dd62f1caSKevin Wolf                                 BlockDriverState *bs_new)
2318dd62f1caSKevin Wolf {
2319dd62f1caSKevin Wolf     BlockDriverState tmp;
2320dd62f1caSKevin Wolf 
2321dd62f1caSKevin Wolf     bdrv_move_feature_fields(&tmp, bs_top);
2322dd62f1caSKevin Wolf     bdrv_move_feature_fields(bs_top, bs_new);
2323dd62f1caSKevin Wolf     bdrv_move_feature_fields(bs_new, &tmp);
2324dd62f1caSKevin Wolf 
2325dd62f1caSKevin Wolf     assert(!bs_new->throttle_state);
2326dd62f1caSKevin Wolf     if (bs_top->throttle_state) {
2327dd62f1caSKevin Wolf         assert(bs_top->io_limits_enabled);
2328dd62f1caSKevin Wolf         bdrv_io_limits_enable(bs_new, throttle_group_get_name(bs_top));
2329dd62f1caSKevin Wolf         bdrv_io_limits_disable(bs_top);
2330dd62f1caSKevin Wolf     }
2331dd62f1caSKevin Wolf }
2332dd62f1caSKevin Wolf 
23338802d1fdSJeff Cody /*
23348802d1fdSJeff Cody  * Add new bs contents at the top of an image chain while the chain is
23358802d1fdSJeff Cody  * live, while keeping required fields on the top layer.
23368802d1fdSJeff Cody  *
23378802d1fdSJeff Cody  * This will modify the BlockDriverState fields, and swap contents
23388802d1fdSJeff Cody  * between bs_new and bs_top. Both bs_new and bs_top are modified.
23398802d1fdSJeff Cody  *
2340bfb197e0SMarkus Armbruster  * bs_new must not be attached to a BlockBackend.
2341f6801b83SJeff Cody  *
23428802d1fdSJeff Cody  * This function does not create any image files.
2343dd62f1caSKevin Wolf  *
2344dd62f1caSKevin Wolf  * bdrv_append() takes ownership of a bs_new reference and unrefs it because
2345dd62f1caSKevin Wolf  * that's what the callers commonly need. bs_new will be referenced by the old
2346dd62f1caSKevin Wolf  * parents of bs_top after bdrv_append() returns. If the caller needs to keep a
2347dd62f1caSKevin Wolf  * reference of its own, it must call bdrv_ref().
23488802d1fdSJeff Cody  */
23498802d1fdSJeff Cody void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
23508802d1fdSJeff Cody {
2351dd62f1caSKevin Wolf     assert(!bdrv_requests_pending(bs_top));
2352dd62f1caSKevin Wolf     assert(!bdrv_requests_pending(bs_new));
23538802d1fdSJeff Cody 
2354dd62f1caSKevin Wolf     bdrv_ref(bs_top);
2355dd62f1caSKevin Wolf     change_parent_backing_link(bs_top, bs_new);
2356dd62f1caSKevin Wolf 
2357dd62f1caSKevin Wolf     /* Some fields always stay on top of the backing file chain */
2358dd62f1caSKevin Wolf     swap_feature_fields(bs_top, bs_new);
2359dd62f1caSKevin Wolf 
2360dd62f1caSKevin Wolf     bdrv_set_backing_hd(bs_new, bs_top);
2361dd62f1caSKevin Wolf     bdrv_unref(bs_top);
2362dd62f1caSKevin Wolf 
2363dd62f1caSKevin Wolf     /* bs_new is now referenced by its new parents, we don't need the
2364dd62f1caSKevin Wolf      * additional reference any more. */
2365dd62f1caSKevin Wolf     bdrv_unref(bs_new);
23668802d1fdSJeff Cody }
23678802d1fdSJeff Cody 
23683f09bfbcSKevin Wolf void bdrv_replace_in_backing_chain(BlockDriverState *old, BlockDriverState *new)
23693f09bfbcSKevin Wolf {
23703f09bfbcSKevin Wolf     assert(!bdrv_requests_pending(old));
23713f09bfbcSKevin Wolf     assert(!bdrv_requests_pending(new));
23723f09bfbcSKevin Wolf 
23733f09bfbcSKevin Wolf     bdrv_ref(old);
23743f09bfbcSKevin Wolf 
23753f09bfbcSKevin Wolf     if (old->blk) {
23763f09bfbcSKevin Wolf         /* As long as these fields aren't in BlockBackend, but in the top-level
23773f09bfbcSKevin Wolf          * BlockDriverState, it's not possible for a BDS to have two BBs.
23783f09bfbcSKevin Wolf          *
23793f09bfbcSKevin Wolf          * We really want to copy the fields from old to new, but we go for a
23803f09bfbcSKevin Wolf          * swap instead so that pointers aren't duplicated and cause trouble.
23813f09bfbcSKevin Wolf          * (Also, bdrv_swap() used to do the same.) */
23823f09bfbcSKevin Wolf         assert(!new->blk);
23833f09bfbcSKevin Wolf         swap_feature_fields(old, new);
23843f09bfbcSKevin Wolf     }
23853f09bfbcSKevin Wolf     change_parent_backing_link(old, new);
23863f09bfbcSKevin Wolf 
23873f09bfbcSKevin Wolf     /* Change backing files if a previously independent node is added to the
23883f09bfbcSKevin Wolf      * chain. For active commit, we replace top by its own (indirect) backing
23893f09bfbcSKevin Wolf      * file and don't do anything here so we don't build a loop. */
23903f09bfbcSKevin Wolf     if (new->backing == NULL && !bdrv_chain_contains(backing_bs(old), new)) {
23913f09bfbcSKevin Wolf         bdrv_set_backing_hd(new, backing_bs(old));
23923f09bfbcSKevin Wolf         bdrv_set_backing_hd(old, NULL);
23933f09bfbcSKevin Wolf     }
23943f09bfbcSKevin Wolf 
23953f09bfbcSKevin Wolf     bdrv_unref(old);
23963f09bfbcSKevin Wolf }
23973f09bfbcSKevin Wolf 
23984f6fd349SFam Zheng static void bdrv_delete(BlockDriverState *bs)
2399b338082bSbellard {
24003e914655SPaolo Bonzini     assert(!bs->job);
24013718d8abSFam Zheng     assert(bdrv_op_blocker_is_empty(bs));
24024f6fd349SFam Zheng     assert(!bs->refcnt);
240318846deeSMarkus Armbruster 
2404e1b5c52eSStefan Hajnoczi     bdrv_close(bs);
2405e1b5c52eSStefan Hajnoczi 
24061b7bdbc1SStefan Hajnoczi     /* remove from list, if necessary */
2407d22b2f41SRyan Harper     bdrv_make_anon(bs);
240834c6f050Saurel32 
24092c1d04e0SMax Reitz     QTAILQ_REMOVE(&all_bdrv_states, bs, bs_list);
24102c1d04e0SMax Reitz 
24117267c094SAnthony Liguori     g_free(bs);
2412fc01f7e7Sbellard }
2413fc01f7e7Sbellard 
2414e97fc193Saliguori /*
2415e97fc193Saliguori  * Run consistency checks on an image
2416e97fc193Saliguori  *
2417e076f338SKevin Wolf  * Returns 0 if the check could be completed (it doesn't mean that the image is
2418a1c7273bSStefan Weil  * free of errors) or -errno when an internal error occurred. The results of the
2419e076f338SKevin Wolf  * check are stored in res.
2420e97fc193Saliguori  */
24214534ff54SKevin Wolf int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix)
2422e97fc193Saliguori {
2423908bcd54SMax Reitz     if (bs->drv == NULL) {
2424908bcd54SMax Reitz         return -ENOMEDIUM;
2425908bcd54SMax Reitz     }
2426e97fc193Saliguori     if (bs->drv->bdrv_check == NULL) {
2427e97fc193Saliguori         return -ENOTSUP;
2428e97fc193Saliguori     }
2429e97fc193Saliguori 
2430e076f338SKevin Wolf     memset(res, 0, sizeof(*res));
24314534ff54SKevin Wolf     return bs->drv->bdrv_check(bs, res, fix);
2432e97fc193Saliguori }
2433e97fc193Saliguori 
24348a426614SKevin Wolf #define COMMIT_BUF_SECTORS 2048
24358a426614SKevin Wolf 
243633e3963eSbellard /* commit COW file into the raw image */
243733e3963eSbellard int bdrv_commit(BlockDriverState *bs)
243833e3963eSbellard {
243919cb3738Sbellard     BlockDriver *drv = bs->drv;
244072706ea4SJeff Cody     int64_t sector, total_sectors, length, backing_length;
24418a426614SKevin Wolf     int n, ro, open_flags;
24420bce597dSJeff Cody     int ret = 0;
244372706ea4SJeff Cody     uint8_t *buf = NULL;
244433e3963eSbellard 
244519cb3738Sbellard     if (!drv)
244619cb3738Sbellard         return -ENOMEDIUM;
244733e3963eSbellard 
2448760e0063SKevin Wolf     if (!bs->backing) {
24494dca4b63SNaphtali Sprei         return -ENOTSUP;
24504dca4b63SNaphtali Sprei     }
24514dca4b63SNaphtali Sprei 
2452bb00021dSFam Zheng     if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, NULL) ||
2453760e0063SKevin Wolf         bdrv_op_is_blocked(bs->backing->bs, BLOCK_OP_TYPE_COMMIT_TARGET, NULL)) {
24542d3735d3SStefan Hajnoczi         return -EBUSY;
24552d3735d3SStefan Hajnoczi     }
24562d3735d3SStefan Hajnoczi 
2457760e0063SKevin Wolf     ro = bs->backing->bs->read_only;
2458760e0063SKevin Wolf     open_flags =  bs->backing->bs->open_flags;
24594dca4b63SNaphtali Sprei 
24604dca4b63SNaphtali Sprei     if (ro) {
2461760e0063SKevin Wolf         if (bdrv_reopen(bs->backing->bs, open_flags | BDRV_O_RDWR, NULL)) {
24620bce597dSJeff Cody             return -EACCES;
24634dca4b63SNaphtali Sprei         }
2464ea2384d3Sbellard     }
2465ea2384d3Sbellard 
246672706ea4SJeff Cody     length = bdrv_getlength(bs);
246772706ea4SJeff Cody     if (length < 0) {
246872706ea4SJeff Cody         ret = length;
246972706ea4SJeff Cody         goto ro_cleanup;
247072706ea4SJeff Cody     }
247172706ea4SJeff Cody 
2472760e0063SKevin Wolf     backing_length = bdrv_getlength(bs->backing->bs);
247372706ea4SJeff Cody     if (backing_length < 0) {
247472706ea4SJeff Cody         ret = backing_length;
247572706ea4SJeff Cody         goto ro_cleanup;
247672706ea4SJeff Cody     }
247772706ea4SJeff Cody 
247872706ea4SJeff Cody     /* If our top snapshot is larger than the backing file image,
247972706ea4SJeff Cody      * grow the backing file image if possible.  If not possible,
248072706ea4SJeff Cody      * we must return an error */
248172706ea4SJeff Cody     if (length > backing_length) {
2482760e0063SKevin Wolf         ret = bdrv_truncate(bs->backing->bs, length);
248372706ea4SJeff Cody         if (ret < 0) {
248472706ea4SJeff Cody             goto ro_cleanup;
248572706ea4SJeff Cody         }
248672706ea4SJeff Cody     }
248772706ea4SJeff Cody 
248872706ea4SJeff Cody     total_sectors = length >> BDRV_SECTOR_BITS;
2489857d4f46SKevin Wolf 
2490857d4f46SKevin Wolf     /* qemu_try_blockalign() for bs will choose an alignment that works for
2491760e0063SKevin Wolf      * bs->backing->bs as well, so no need to compare the alignment manually. */
2492857d4f46SKevin Wolf     buf = qemu_try_blockalign(bs, COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
2493857d4f46SKevin Wolf     if (buf == NULL) {
2494857d4f46SKevin Wolf         ret = -ENOMEM;
2495857d4f46SKevin Wolf         goto ro_cleanup;
2496857d4f46SKevin Wolf     }
24978a426614SKevin Wolf 
24988a426614SKevin Wolf     for (sector = 0; sector < total_sectors; sector += n) {
2499d663640cSPaolo Bonzini         ret = bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n);
2500d663640cSPaolo Bonzini         if (ret < 0) {
2501d663640cSPaolo Bonzini             goto ro_cleanup;
2502d663640cSPaolo Bonzini         }
2503d663640cSPaolo Bonzini         if (ret) {
2504dabfa6ccSKevin Wolf             ret = bdrv_read(bs, sector, buf, n);
2505dabfa6ccSKevin Wolf             if (ret < 0) {
25064dca4b63SNaphtali Sprei                 goto ro_cleanup;
250733e3963eSbellard             }
250833e3963eSbellard 
2509760e0063SKevin Wolf             ret = bdrv_write(bs->backing->bs, sector, buf, n);
2510dabfa6ccSKevin Wolf             if (ret < 0) {
25114dca4b63SNaphtali Sprei                 goto ro_cleanup;
251233e3963eSbellard             }
251333e3963eSbellard         }
251433e3963eSbellard     }
251595389c86Sbellard 
25161d44952fSChristoph Hellwig     if (drv->bdrv_make_empty) {
25171d44952fSChristoph Hellwig         ret = drv->bdrv_make_empty(bs);
2518dabfa6ccSKevin Wolf         if (ret < 0) {
2519dabfa6ccSKevin Wolf             goto ro_cleanup;
2520dabfa6ccSKevin Wolf         }
25211d44952fSChristoph Hellwig         bdrv_flush(bs);
25221d44952fSChristoph Hellwig     }
252395389c86Sbellard 
25243f5075aeSChristoph Hellwig     /*
25253f5075aeSChristoph Hellwig      * Make sure all data we wrote to the backing device is actually
25263f5075aeSChristoph Hellwig      * stable on disk.
25273f5075aeSChristoph Hellwig      */
2528760e0063SKevin Wolf     if (bs->backing) {
2529760e0063SKevin Wolf         bdrv_flush(bs->backing->bs);
2530dabfa6ccSKevin Wolf     }
25314dca4b63SNaphtali Sprei 
2532dabfa6ccSKevin Wolf     ret = 0;
25334dca4b63SNaphtali Sprei ro_cleanup:
2534857d4f46SKevin Wolf     qemu_vfree(buf);
25354dca4b63SNaphtali Sprei 
25364dca4b63SNaphtali Sprei     if (ro) {
25370bce597dSJeff Cody         /* ignoring error return here */
2538760e0063SKevin Wolf         bdrv_reopen(bs->backing->bs, open_flags & ~BDRV_O_RDWR, NULL);
25394dca4b63SNaphtali Sprei     }
25404dca4b63SNaphtali Sprei 
25411d44952fSChristoph Hellwig     return ret;
254233e3963eSbellard }
254333e3963eSbellard 
2544e8877497SStefan Hajnoczi int bdrv_commit_all(void)
25456ab4b5abSMarkus Armbruster {
25466ab4b5abSMarkus Armbruster     BlockDriverState *bs;
25476ab4b5abSMarkus Armbruster 
2548dc364f4cSBenoît Canet     QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
2549ed78cda3SStefan Hajnoczi         AioContext *aio_context = bdrv_get_aio_context(bs);
2550ed78cda3SStefan Hajnoczi 
2551ed78cda3SStefan Hajnoczi         aio_context_acquire(aio_context);
2552760e0063SKevin Wolf         if (bs->drv && bs->backing) {
2553e8877497SStefan Hajnoczi             int ret = bdrv_commit(bs);
2554e8877497SStefan Hajnoczi             if (ret < 0) {
2555ed78cda3SStefan Hajnoczi                 aio_context_release(aio_context);
2556e8877497SStefan Hajnoczi                 return ret;
25576ab4b5abSMarkus Armbruster             }
25586ab4b5abSMarkus Armbruster         }
2559ed78cda3SStefan Hajnoczi         aio_context_release(aio_context);
2560272d2d8eSJeff Cody     }
2561e8877497SStefan Hajnoczi     return 0;
2562e8877497SStefan Hajnoczi }
25636ab4b5abSMarkus Armbruster 
2564756e6736SKevin Wolf /*
2565756e6736SKevin Wolf  * Return values:
2566756e6736SKevin Wolf  * 0        - success
2567756e6736SKevin Wolf  * -EINVAL  - backing format specified, but no file
2568756e6736SKevin Wolf  * -ENOSPC  - can't update the backing file because no space is left in the
2569756e6736SKevin Wolf  *            image file header
2570756e6736SKevin Wolf  * -ENOTSUP - format driver doesn't support changing the backing file
2571756e6736SKevin Wolf  */
2572756e6736SKevin Wolf int bdrv_change_backing_file(BlockDriverState *bs,
2573756e6736SKevin Wolf     const char *backing_file, const char *backing_fmt)
2574756e6736SKevin Wolf {
2575756e6736SKevin Wolf     BlockDriver *drv = bs->drv;
2576469ef350SPaolo Bonzini     int ret;
2577756e6736SKevin Wolf 
25785f377794SPaolo Bonzini     /* Backing file format doesn't make sense without a backing file */
25795f377794SPaolo Bonzini     if (backing_fmt && !backing_file) {
25805f377794SPaolo Bonzini         return -EINVAL;
25815f377794SPaolo Bonzini     }
25825f377794SPaolo Bonzini 
2583756e6736SKevin Wolf     if (drv->bdrv_change_backing_file != NULL) {
2584469ef350SPaolo Bonzini         ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
2585756e6736SKevin Wolf     } else {
2586469ef350SPaolo Bonzini         ret = -ENOTSUP;
2587756e6736SKevin Wolf     }
2588469ef350SPaolo Bonzini 
2589469ef350SPaolo Bonzini     if (ret == 0) {
2590469ef350SPaolo Bonzini         pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_file ?: "");
2591469ef350SPaolo Bonzini         pstrcpy(bs->backing_format, sizeof(bs->backing_format), backing_fmt ?: "");
2592469ef350SPaolo Bonzini     }
2593469ef350SPaolo Bonzini     return ret;
2594756e6736SKevin Wolf }
2595756e6736SKevin Wolf 
25966ebdcee2SJeff Cody /*
25976ebdcee2SJeff Cody  * Finds the image layer in the chain that has 'bs' as its backing file.
25986ebdcee2SJeff Cody  *
25996ebdcee2SJeff Cody  * active is the current topmost image.
26006ebdcee2SJeff Cody  *
26016ebdcee2SJeff Cody  * Returns NULL if bs is not found in active's image chain,
26026ebdcee2SJeff Cody  * or if active == bs.
26034caf0fcdSJeff Cody  *
26044caf0fcdSJeff Cody  * Returns the bottommost base image if bs == NULL.
26056ebdcee2SJeff Cody  */
26066ebdcee2SJeff Cody BlockDriverState *bdrv_find_overlay(BlockDriverState *active,
26076ebdcee2SJeff Cody                                     BlockDriverState *bs)
26086ebdcee2SJeff Cody {
2609760e0063SKevin Wolf     while (active && bs != backing_bs(active)) {
2610760e0063SKevin Wolf         active = backing_bs(active);
26116ebdcee2SJeff Cody     }
26126ebdcee2SJeff Cody 
26134caf0fcdSJeff Cody     return active;
26146ebdcee2SJeff Cody }
26156ebdcee2SJeff Cody 
26164caf0fcdSJeff Cody /* Given a BDS, searches for the base layer. */
26174caf0fcdSJeff Cody BlockDriverState *bdrv_find_base(BlockDriverState *bs)
26184caf0fcdSJeff Cody {
26194caf0fcdSJeff Cody     return bdrv_find_overlay(bs, NULL);
26206ebdcee2SJeff Cody }
26216ebdcee2SJeff Cody 
26226ebdcee2SJeff Cody /*
26236ebdcee2SJeff Cody  * Drops images above 'base' up to and including 'top', and sets the image
26246ebdcee2SJeff Cody  * above 'top' to have base as its backing file.
26256ebdcee2SJeff Cody  *
26266ebdcee2SJeff Cody  * Requires that the overlay to 'top' is opened r/w, so that the backing file
26276ebdcee2SJeff Cody  * information in 'bs' can be properly updated.
26286ebdcee2SJeff Cody  *
26296ebdcee2SJeff Cody  * E.g., this will convert the following chain:
26306ebdcee2SJeff Cody  * bottom <- base <- intermediate <- top <- active
26316ebdcee2SJeff Cody  *
26326ebdcee2SJeff Cody  * to
26336ebdcee2SJeff Cody  *
26346ebdcee2SJeff Cody  * bottom <- base <- active
26356ebdcee2SJeff Cody  *
26366ebdcee2SJeff Cody  * It is allowed for bottom==base, in which case it converts:
26376ebdcee2SJeff Cody  *
26386ebdcee2SJeff Cody  * base <- intermediate <- top <- active
26396ebdcee2SJeff Cody  *
26406ebdcee2SJeff Cody  * to
26416ebdcee2SJeff Cody  *
26426ebdcee2SJeff Cody  * base <- active
26436ebdcee2SJeff Cody  *
264454e26900SJeff Cody  * If backing_file_str is non-NULL, it will be used when modifying top's
264554e26900SJeff Cody  * overlay image metadata.
264654e26900SJeff Cody  *
26476ebdcee2SJeff Cody  * Error conditions:
26486ebdcee2SJeff Cody  *  if active == top, that is considered an error
26496ebdcee2SJeff Cody  *
26506ebdcee2SJeff Cody  */
26516ebdcee2SJeff Cody int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
265254e26900SJeff Cody                            BlockDriverState *base, const char *backing_file_str)
26536ebdcee2SJeff Cody {
26546ebdcee2SJeff Cody     BlockDriverState *new_top_bs = NULL;
26556ebdcee2SJeff Cody     int ret = -EIO;
26566ebdcee2SJeff Cody 
26576ebdcee2SJeff Cody     if (!top->drv || !base->drv) {
26586ebdcee2SJeff Cody         goto exit;
26596ebdcee2SJeff Cody     }
26606ebdcee2SJeff Cody 
26616ebdcee2SJeff Cody     new_top_bs = bdrv_find_overlay(active, top);
26626ebdcee2SJeff Cody 
26636ebdcee2SJeff Cody     if (new_top_bs == NULL) {
26646ebdcee2SJeff Cody         /* we could not find the image above 'top', this is an error */
26656ebdcee2SJeff Cody         goto exit;
26666ebdcee2SJeff Cody     }
26676ebdcee2SJeff Cody 
2668760e0063SKevin Wolf     /* special case of new_top_bs->backing->bs already pointing to base - nothing
26696ebdcee2SJeff Cody      * to do, no intermediate images */
2670760e0063SKevin Wolf     if (backing_bs(new_top_bs) == base) {
26716ebdcee2SJeff Cody         ret = 0;
26726ebdcee2SJeff Cody         goto exit;
26736ebdcee2SJeff Cody     }
26746ebdcee2SJeff Cody 
26755db15a57SKevin Wolf     /* Make sure that base is in the backing chain of top */
26765db15a57SKevin Wolf     if (!bdrv_chain_contains(top, base)) {
26776ebdcee2SJeff Cody         goto exit;
26786ebdcee2SJeff Cody     }
26796ebdcee2SJeff Cody 
26806ebdcee2SJeff Cody     /* success - we can delete the intermediate states, and link top->base */
26815db15a57SKevin Wolf     backing_file_str = backing_file_str ? backing_file_str : base->filename;
268254e26900SJeff Cody     ret = bdrv_change_backing_file(new_top_bs, backing_file_str,
26835db15a57SKevin Wolf                                    base->drv ? base->drv->format_name : "");
26846ebdcee2SJeff Cody     if (ret) {
26856ebdcee2SJeff Cody         goto exit;
26866ebdcee2SJeff Cody     }
26875db15a57SKevin Wolf     bdrv_set_backing_hd(new_top_bs, base);
26886ebdcee2SJeff Cody 
26896ebdcee2SJeff Cody     ret = 0;
26906ebdcee2SJeff Cody exit:
26916ebdcee2SJeff Cody     return ret;
26926ebdcee2SJeff Cody }
26936ebdcee2SJeff Cody 
269483f64091Sbellard /**
269583f64091Sbellard  * Truncate file to 'offset' bytes (needed only for file protocols)
269683f64091Sbellard  */
269783f64091Sbellard int bdrv_truncate(BlockDriverState *bs, int64_t offset)
269883f64091Sbellard {
269983f64091Sbellard     BlockDriver *drv = bs->drv;
270051762288SStefan Hajnoczi     int ret;
270183f64091Sbellard     if (!drv)
270219cb3738Sbellard         return -ENOMEDIUM;
270383f64091Sbellard     if (!drv->bdrv_truncate)
270483f64091Sbellard         return -ENOTSUP;
270559f2689dSNaphtali Sprei     if (bs->read_only)
270659f2689dSNaphtali Sprei         return -EACCES;
27079c75e168SJeff Cody 
270851762288SStefan Hajnoczi     ret = drv->bdrv_truncate(bs, offset);
270951762288SStefan Hajnoczi     if (ret == 0) {
271051762288SStefan Hajnoczi         ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
2711ce1ffea8SJohn Snow         bdrv_dirty_bitmap_truncate(bs);
2712a7f53e26SMarkus Armbruster         if (bs->blk) {
2713a7f53e26SMarkus Armbruster             blk_dev_resize_cb(bs->blk);
2714a7f53e26SMarkus Armbruster         }
271551762288SStefan Hajnoczi     }
271651762288SStefan Hajnoczi     return ret;
271783f64091Sbellard }
271883f64091Sbellard 
271983f64091Sbellard /**
27204a1d5e1fSFam Zheng  * Length of a allocated file in bytes. Sparse files are counted by actual
27214a1d5e1fSFam Zheng  * allocated space. Return < 0 if error or unknown.
27224a1d5e1fSFam Zheng  */
27234a1d5e1fSFam Zheng int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
27244a1d5e1fSFam Zheng {
27254a1d5e1fSFam Zheng     BlockDriver *drv = bs->drv;
27264a1d5e1fSFam Zheng     if (!drv) {
27274a1d5e1fSFam Zheng         return -ENOMEDIUM;
27284a1d5e1fSFam Zheng     }
27294a1d5e1fSFam Zheng     if (drv->bdrv_get_allocated_file_size) {
27304a1d5e1fSFam Zheng         return drv->bdrv_get_allocated_file_size(bs);
27314a1d5e1fSFam Zheng     }
27324a1d5e1fSFam Zheng     if (bs->file) {
27339a4f4c31SKevin Wolf         return bdrv_get_allocated_file_size(bs->file->bs);
27344a1d5e1fSFam Zheng     }
27354a1d5e1fSFam Zheng     return -ENOTSUP;
27364a1d5e1fSFam Zheng }
27374a1d5e1fSFam Zheng 
27384a1d5e1fSFam Zheng /**
273965a9bb25SMarkus Armbruster  * Return number of sectors on success, -errno on error.
274083f64091Sbellard  */
274165a9bb25SMarkus Armbruster int64_t bdrv_nb_sectors(BlockDriverState *bs)
274283f64091Sbellard {
274383f64091Sbellard     BlockDriver *drv = bs->drv;
274465a9bb25SMarkus Armbruster 
274583f64091Sbellard     if (!drv)
274619cb3738Sbellard         return -ENOMEDIUM;
274751762288SStefan Hajnoczi 
2748b94a2610SKevin Wolf     if (drv->has_variable_length) {
2749b94a2610SKevin Wolf         int ret = refresh_total_sectors(bs, bs->total_sectors);
2750b94a2610SKevin Wolf         if (ret < 0) {
2751b94a2610SKevin Wolf             return ret;
2752fc01f7e7Sbellard         }
275346a4e4e6SStefan Hajnoczi     }
275465a9bb25SMarkus Armbruster     return bs->total_sectors;
275565a9bb25SMarkus Armbruster }
275665a9bb25SMarkus Armbruster 
275765a9bb25SMarkus Armbruster /**
275865a9bb25SMarkus Armbruster  * Return length in bytes on success, -errno on error.
275965a9bb25SMarkus Armbruster  * The length is always a multiple of BDRV_SECTOR_SIZE.
276065a9bb25SMarkus Armbruster  */
276165a9bb25SMarkus Armbruster int64_t bdrv_getlength(BlockDriverState *bs)
276265a9bb25SMarkus Armbruster {
276365a9bb25SMarkus Armbruster     int64_t ret = bdrv_nb_sectors(bs);
276465a9bb25SMarkus Armbruster 
27654a9c9ea0SFam Zheng     ret = ret > INT64_MAX / BDRV_SECTOR_SIZE ? -EFBIG : ret;
276665a9bb25SMarkus Armbruster     return ret < 0 ? ret : ret * BDRV_SECTOR_SIZE;
276746a4e4e6SStefan Hajnoczi }
2768fc01f7e7Sbellard 
276919cb3738Sbellard /* return 0 as number of sectors if no device present or error */
277096b8f136Sths void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
2771fc01f7e7Sbellard {
277265a9bb25SMarkus Armbruster     int64_t nb_sectors = bdrv_nb_sectors(bs);
277365a9bb25SMarkus Armbruster 
277465a9bb25SMarkus Armbruster     *nb_sectors_ptr = nb_sectors < 0 ? 0 : nb_sectors;
2775fc01f7e7Sbellard }
2776cf98951bSbellard 
2777b338082bSbellard int bdrv_is_read_only(BlockDriverState *bs)
2778b338082bSbellard {
2779b338082bSbellard     return bs->read_only;
2780b338082bSbellard }
2781b338082bSbellard 
2782985a03b0Sths int bdrv_is_sg(BlockDriverState *bs)
2783985a03b0Sths {
2784985a03b0Sths     return bs->sg;
2785985a03b0Sths }
2786985a03b0Sths 
2787e900a7b7SChristoph Hellwig int bdrv_enable_write_cache(BlockDriverState *bs)
2788e900a7b7SChristoph Hellwig {
2789e900a7b7SChristoph Hellwig     return bs->enable_write_cache;
2790e900a7b7SChristoph Hellwig }
2791e900a7b7SChristoph Hellwig 
2792425b0148SPaolo Bonzini void bdrv_set_enable_write_cache(BlockDriverState *bs, bool wce)
2793425b0148SPaolo Bonzini {
2794425b0148SPaolo Bonzini     bs->enable_write_cache = wce;
279555b110f2SJeff Cody 
279655b110f2SJeff Cody     /* so a reopen() will preserve wce */
279755b110f2SJeff Cody     if (wce) {
279855b110f2SJeff Cody         bs->open_flags |= BDRV_O_CACHE_WB;
279955b110f2SJeff Cody     } else {
280055b110f2SJeff Cody         bs->open_flags &= ~BDRV_O_CACHE_WB;
280155b110f2SJeff Cody     }
2802425b0148SPaolo Bonzini }
2803425b0148SPaolo Bonzini 
2804ea2384d3Sbellard int bdrv_is_encrypted(BlockDriverState *bs)
2805ea2384d3Sbellard {
2806760e0063SKevin Wolf     if (bs->backing && bs->backing->bs->encrypted) {
2807ea2384d3Sbellard         return 1;
2808760e0063SKevin Wolf     }
2809ea2384d3Sbellard     return bs->encrypted;
2810ea2384d3Sbellard }
2811ea2384d3Sbellard 
2812c0f4ce77Saliguori int bdrv_key_required(BlockDriverState *bs)
2813c0f4ce77Saliguori {
2814760e0063SKevin Wolf     BdrvChild *backing = bs->backing;
2815c0f4ce77Saliguori 
2816760e0063SKevin Wolf     if (backing && backing->bs->encrypted && !backing->bs->valid_key) {
2817c0f4ce77Saliguori         return 1;
2818760e0063SKevin Wolf     }
2819c0f4ce77Saliguori     return (bs->encrypted && !bs->valid_key);
2820c0f4ce77Saliguori }
2821c0f4ce77Saliguori 
2822ea2384d3Sbellard int bdrv_set_key(BlockDriverState *bs, const char *key)
2823ea2384d3Sbellard {
2824ea2384d3Sbellard     int ret;
2825760e0063SKevin Wolf     if (bs->backing && bs->backing->bs->encrypted) {
2826760e0063SKevin Wolf         ret = bdrv_set_key(bs->backing->bs, key);
2827ea2384d3Sbellard         if (ret < 0)
2828ea2384d3Sbellard             return ret;
2829ea2384d3Sbellard         if (!bs->encrypted)
2830ea2384d3Sbellard             return 0;
2831ea2384d3Sbellard     }
2832fd04a2aeSShahar Havivi     if (!bs->encrypted) {
2833fd04a2aeSShahar Havivi         return -EINVAL;
2834fd04a2aeSShahar Havivi     } else if (!bs->drv || !bs->drv->bdrv_set_key) {
2835fd04a2aeSShahar Havivi         return -ENOMEDIUM;
2836fd04a2aeSShahar Havivi     }
2837c0f4ce77Saliguori     ret = bs->drv->bdrv_set_key(bs, key);
2838bb5fc20fSaliguori     if (ret < 0) {
2839bb5fc20fSaliguori         bs->valid_key = 0;
2840bb5fc20fSaliguori     } else if (!bs->valid_key) {
2841bb5fc20fSaliguori         bs->valid_key = 1;
2842a7f53e26SMarkus Armbruster         if (bs->blk) {
2843bb5fc20fSaliguori             /* call the change callback now, we skipped it on open */
2844a7f53e26SMarkus Armbruster             blk_dev_change_media_cb(bs->blk, true);
2845a7f53e26SMarkus Armbruster         }
2846bb5fc20fSaliguori     }
2847c0f4ce77Saliguori     return ret;
2848ea2384d3Sbellard }
2849ea2384d3Sbellard 
28504d2855a3SMarkus Armbruster /*
28514d2855a3SMarkus Armbruster  * Provide an encryption key for @bs.
28524d2855a3SMarkus Armbruster  * If @key is non-null:
28534d2855a3SMarkus Armbruster  *     If @bs is not encrypted, fail.
28544d2855a3SMarkus Armbruster  *     Else if the key is invalid, fail.
28554d2855a3SMarkus Armbruster  *     Else set @bs's key to @key, replacing the existing key, if any.
28564d2855a3SMarkus Armbruster  * If @key is null:
28574d2855a3SMarkus Armbruster  *     If @bs is encrypted and still lacks a key, fail.
28584d2855a3SMarkus Armbruster  *     Else do nothing.
28594d2855a3SMarkus Armbruster  * On failure, store an error object through @errp if non-null.
28604d2855a3SMarkus Armbruster  */
28614d2855a3SMarkus Armbruster void bdrv_add_key(BlockDriverState *bs, const char *key, Error **errp)
28624d2855a3SMarkus Armbruster {
28634d2855a3SMarkus Armbruster     if (key) {
28644d2855a3SMarkus Armbruster         if (!bdrv_is_encrypted(bs)) {
286581e5f78aSAlberto Garcia             error_setg(errp, "Node '%s' is not encrypted",
286681e5f78aSAlberto Garcia                       bdrv_get_device_or_node_name(bs));
28674d2855a3SMarkus Armbruster         } else if (bdrv_set_key(bs, key) < 0) {
2868c6bd8c70SMarkus Armbruster             error_setg(errp, QERR_INVALID_PASSWORD);
28694d2855a3SMarkus Armbruster         }
28704d2855a3SMarkus Armbruster     } else {
28714d2855a3SMarkus Armbruster         if (bdrv_key_required(bs)) {
2872b1ca6391SMarkus Armbruster             error_set(errp, ERROR_CLASS_DEVICE_ENCRYPTED,
2873b1ca6391SMarkus Armbruster                       "'%s' (%s) is encrypted",
287481e5f78aSAlberto Garcia                       bdrv_get_device_or_node_name(bs),
28754d2855a3SMarkus Armbruster                       bdrv_get_encrypted_filename(bs));
28764d2855a3SMarkus Armbruster         }
28774d2855a3SMarkus Armbruster     }
28784d2855a3SMarkus Armbruster }
28794d2855a3SMarkus Armbruster 
2880f8d6bba1SMarkus Armbruster const char *bdrv_get_format_name(BlockDriverState *bs)
2881ea2384d3Sbellard {
2882f8d6bba1SMarkus Armbruster     return bs->drv ? bs->drv->format_name : NULL;
2883ea2384d3Sbellard }
2884ea2384d3Sbellard 
2885ada42401SStefan Hajnoczi static int qsort_strcmp(const void *a, const void *b)
2886ada42401SStefan Hajnoczi {
2887ada42401SStefan Hajnoczi     return strcmp(a, b);
2888ada42401SStefan Hajnoczi }
2889ada42401SStefan Hajnoczi 
2890ea2384d3Sbellard void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
2891ea2384d3Sbellard                          void *opaque)
2892ea2384d3Sbellard {
2893ea2384d3Sbellard     BlockDriver *drv;
2894e855e4fbSJeff Cody     int count = 0;
2895ada42401SStefan Hajnoczi     int i;
2896e855e4fbSJeff Cody     const char **formats = NULL;
2897ea2384d3Sbellard 
28988a22f02aSStefan Hajnoczi     QLIST_FOREACH(drv, &bdrv_drivers, list) {
2899e855e4fbSJeff Cody         if (drv->format_name) {
2900e855e4fbSJeff Cody             bool found = false;
2901e855e4fbSJeff Cody             int i = count;
2902e855e4fbSJeff Cody             while (formats && i && !found) {
2903e855e4fbSJeff Cody                 found = !strcmp(formats[--i], drv->format_name);
2904e855e4fbSJeff Cody             }
2905e855e4fbSJeff Cody 
2906e855e4fbSJeff Cody             if (!found) {
29075839e53bSMarkus Armbruster                 formats = g_renew(const char *, formats, count + 1);
2908e855e4fbSJeff Cody                 formats[count++] = drv->format_name;
2909ea2384d3Sbellard             }
2910ea2384d3Sbellard         }
2911e855e4fbSJeff Cody     }
2912ada42401SStefan Hajnoczi 
2913ada42401SStefan Hajnoczi     qsort(formats, count, sizeof(formats[0]), qsort_strcmp);
2914ada42401SStefan Hajnoczi 
2915ada42401SStefan Hajnoczi     for (i = 0; i < count; i++) {
2916ada42401SStefan Hajnoczi         it(opaque, formats[i]);
2917ada42401SStefan Hajnoczi     }
2918ada42401SStefan Hajnoczi 
2919e855e4fbSJeff Cody     g_free(formats);
2920e855e4fbSJeff Cody }
2921ea2384d3Sbellard 
2922dc364f4cSBenoît Canet /* This function is to find a node in the bs graph */
2923dc364f4cSBenoît Canet BlockDriverState *bdrv_find_node(const char *node_name)
2924dc364f4cSBenoît Canet {
2925dc364f4cSBenoît Canet     BlockDriverState *bs;
2926dc364f4cSBenoît Canet 
2927dc364f4cSBenoît Canet     assert(node_name);
2928dc364f4cSBenoît Canet 
2929dc364f4cSBenoît Canet     QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
2930dc364f4cSBenoît Canet         if (!strcmp(node_name, bs->node_name)) {
2931dc364f4cSBenoît Canet             return bs;
2932dc364f4cSBenoît Canet         }
2933dc364f4cSBenoît Canet     }
2934dc364f4cSBenoît Canet     return NULL;
2935dc364f4cSBenoît Canet }
2936dc364f4cSBenoît Canet 
2937c13163fbSBenoît Canet /* Put this QMP function here so it can access the static graph_bdrv_states. */
2938d5a8ee60SAlberto Garcia BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp)
2939c13163fbSBenoît Canet {
2940c13163fbSBenoît Canet     BlockDeviceInfoList *list, *entry;
2941c13163fbSBenoît Canet     BlockDriverState *bs;
2942c13163fbSBenoît Canet 
2943c13163fbSBenoît Canet     list = NULL;
2944c13163fbSBenoît Canet     QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
2945d5a8ee60SAlberto Garcia         BlockDeviceInfo *info = bdrv_block_device_info(bs, errp);
2946d5a8ee60SAlberto Garcia         if (!info) {
2947d5a8ee60SAlberto Garcia             qapi_free_BlockDeviceInfoList(list);
2948d5a8ee60SAlberto Garcia             return NULL;
2949d5a8ee60SAlberto Garcia         }
2950c13163fbSBenoît Canet         entry = g_malloc0(sizeof(*entry));
2951d5a8ee60SAlberto Garcia         entry->value = info;
2952c13163fbSBenoît Canet         entry->next = list;
2953c13163fbSBenoît Canet         list = entry;
2954c13163fbSBenoît Canet     }
2955c13163fbSBenoît Canet 
2956c13163fbSBenoît Canet     return list;
2957c13163fbSBenoît Canet }
2958c13163fbSBenoît Canet 
295912d3ba82SBenoît Canet BlockDriverState *bdrv_lookup_bs(const char *device,
296012d3ba82SBenoît Canet                                  const char *node_name,
296112d3ba82SBenoît Canet                                  Error **errp)
296212d3ba82SBenoît Canet {
29637f06d47eSMarkus Armbruster     BlockBackend *blk;
29647f06d47eSMarkus Armbruster     BlockDriverState *bs;
296512d3ba82SBenoît Canet 
296612d3ba82SBenoît Canet     if (device) {
29677f06d47eSMarkus Armbruster         blk = blk_by_name(device);
296812d3ba82SBenoît Canet 
29697f06d47eSMarkus Armbruster         if (blk) {
29709f4ed6fbSAlberto Garcia             bs = blk_bs(blk);
29719f4ed6fbSAlberto Garcia             if (!bs) {
29725433c24fSMax Reitz                 error_setg(errp, "Device '%s' has no medium", device);
29735433c24fSMax Reitz             }
29745433c24fSMax Reitz 
29759f4ed6fbSAlberto Garcia             return bs;
297612d3ba82SBenoît Canet         }
2977dd67fa50SBenoît Canet     }
297812d3ba82SBenoît Canet 
2979dd67fa50SBenoît Canet     if (node_name) {
298012d3ba82SBenoît Canet         bs = bdrv_find_node(node_name);
298112d3ba82SBenoît Canet 
2982dd67fa50SBenoît Canet         if (bs) {
2983dd67fa50SBenoît Canet             return bs;
2984dd67fa50SBenoît Canet         }
298512d3ba82SBenoît Canet     }
298612d3ba82SBenoît Canet 
2987dd67fa50SBenoît Canet     error_setg(errp, "Cannot find device=%s nor node_name=%s",
2988dd67fa50SBenoît Canet                      device ? device : "",
2989dd67fa50SBenoît Canet                      node_name ? node_name : "");
2990dd67fa50SBenoît Canet     return NULL;
299112d3ba82SBenoît Canet }
299212d3ba82SBenoît Canet 
29935a6684d2SJeff Cody /* If 'base' is in the same chain as 'top', return true. Otherwise,
29945a6684d2SJeff Cody  * return false.  If either argument is NULL, return false. */
29955a6684d2SJeff Cody bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
29965a6684d2SJeff Cody {
29975a6684d2SJeff Cody     while (top && top != base) {
2998760e0063SKevin Wolf         top = backing_bs(top);
29995a6684d2SJeff Cody     }
30005a6684d2SJeff Cody 
30015a6684d2SJeff Cody     return top != NULL;
30025a6684d2SJeff Cody }
30035a6684d2SJeff Cody 
300404df765aSFam Zheng BlockDriverState *bdrv_next_node(BlockDriverState *bs)
300504df765aSFam Zheng {
300604df765aSFam Zheng     if (!bs) {
300704df765aSFam Zheng         return QTAILQ_FIRST(&graph_bdrv_states);
300804df765aSFam Zheng     }
300904df765aSFam Zheng     return QTAILQ_NEXT(bs, node_list);
301004df765aSFam Zheng }
301104df765aSFam Zheng 
30122f399b0aSMarkus Armbruster BlockDriverState *bdrv_next(BlockDriverState *bs)
30132f399b0aSMarkus Armbruster {
30142f399b0aSMarkus Armbruster     if (!bs) {
30152f399b0aSMarkus Armbruster         return QTAILQ_FIRST(&bdrv_states);
30162f399b0aSMarkus Armbruster     }
3017dc364f4cSBenoît Canet     return QTAILQ_NEXT(bs, device_list);
30182f399b0aSMarkus Armbruster }
30192f399b0aSMarkus Armbruster 
302020a9e77dSFam Zheng const char *bdrv_get_node_name(const BlockDriverState *bs)
302120a9e77dSFam Zheng {
302220a9e77dSFam Zheng     return bs->node_name;
302320a9e77dSFam Zheng }
302420a9e77dSFam Zheng 
30257f06d47eSMarkus Armbruster /* TODO check what callers really want: bs->node_name or blk_name() */
3026bfb197e0SMarkus Armbruster const char *bdrv_get_device_name(const BlockDriverState *bs)
3027ea2384d3Sbellard {
3028bfb197e0SMarkus Armbruster     return bs->blk ? blk_name(bs->blk) : "";
3029ea2384d3Sbellard }
3030ea2384d3Sbellard 
30319b2aa84fSAlberto Garcia /* This can be used to identify nodes that might not have a device
30329b2aa84fSAlberto Garcia  * name associated. Since node and device names live in the same
30339b2aa84fSAlberto Garcia  * namespace, the result is unambiguous. The exception is if both are
30349b2aa84fSAlberto Garcia  * absent, then this returns an empty (non-null) string. */
30359b2aa84fSAlberto Garcia const char *bdrv_get_device_or_node_name(const BlockDriverState *bs)
30369b2aa84fSAlberto Garcia {
30379b2aa84fSAlberto Garcia     return bs->blk ? blk_name(bs->blk) : bs->node_name;
30389b2aa84fSAlberto Garcia }
30399b2aa84fSAlberto Garcia 
3040c8433287SMarkus Armbruster int bdrv_get_flags(BlockDriverState *bs)
3041c8433287SMarkus Armbruster {
3042c8433287SMarkus Armbruster     return bs->open_flags;
3043c8433287SMarkus Armbruster }
3044c8433287SMarkus Armbruster 
30453ac21627SPeter Lieven int bdrv_has_zero_init_1(BlockDriverState *bs)
30463ac21627SPeter Lieven {
30473ac21627SPeter Lieven     return 1;
30483ac21627SPeter Lieven }
30493ac21627SPeter Lieven 
3050f2feebbdSKevin Wolf int bdrv_has_zero_init(BlockDriverState *bs)
3051f2feebbdSKevin Wolf {
3052f2feebbdSKevin Wolf     assert(bs->drv);
3053f2feebbdSKevin Wolf 
305411212d8fSPaolo Bonzini     /* If BS is a copy on write image, it is initialized to
305511212d8fSPaolo Bonzini        the contents of the base image, which may not be zeroes.  */
3056760e0063SKevin Wolf     if (bs->backing) {
305711212d8fSPaolo Bonzini         return 0;
305811212d8fSPaolo Bonzini     }
3059336c1c12SKevin Wolf     if (bs->drv->bdrv_has_zero_init) {
3060336c1c12SKevin Wolf         return bs->drv->bdrv_has_zero_init(bs);
3061f2feebbdSKevin Wolf     }
3062f2feebbdSKevin Wolf 
30633ac21627SPeter Lieven     /* safe default */
30643ac21627SPeter Lieven     return 0;
3065f2feebbdSKevin Wolf }
3066f2feebbdSKevin Wolf 
30674ce78691SPeter Lieven bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs)
30684ce78691SPeter Lieven {
30694ce78691SPeter Lieven     BlockDriverInfo bdi;
30704ce78691SPeter Lieven 
3071760e0063SKevin Wolf     if (bs->backing) {
30724ce78691SPeter Lieven         return false;
30734ce78691SPeter Lieven     }
30744ce78691SPeter Lieven 
30754ce78691SPeter Lieven     if (bdrv_get_info(bs, &bdi) == 0) {
30764ce78691SPeter Lieven         return bdi.unallocated_blocks_are_zero;
30774ce78691SPeter Lieven     }
30784ce78691SPeter Lieven 
30794ce78691SPeter Lieven     return false;
30804ce78691SPeter Lieven }
30814ce78691SPeter Lieven 
30824ce78691SPeter Lieven bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs)
30834ce78691SPeter Lieven {
30844ce78691SPeter Lieven     BlockDriverInfo bdi;
30854ce78691SPeter Lieven 
3086760e0063SKevin Wolf     if (bs->backing || !(bs->open_flags & BDRV_O_UNMAP)) {
30874ce78691SPeter Lieven         return false;
30884ce78691SPeter Lieven     }
30894ce78691SPeter Lieven 
30904ce78691SPeter Lieven     if (bdrv_get_info(bs, &bdi) == 0) {
30914ce78691SPeter Lieven         return bdi.can_write_zeroes_with_unmap;
30924ce78691SPeter Lieven     }
30934ce78691SPeter Lieven 
30944ce78691SPeter Lieven     return false;
30954ce78691SPeter Lieven }
30964ce78691SPeter Lieven 
3097045df330Saliguori const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
3098045df330Saliguori {
3099760e0063SKevin Wolf     if (bs->backing && bs->backing->bs->encrypted)
3100045df330Saliguori         return bs->backing_file;
3101045df330Saliguori     else if (bs->encrypted)
3102045df330Saliguori         return bs->filename;
3103045df330Saliguori     else
3104045df330Saliguori         return NULL;
3105045df330Saliguori }
3106045df330Saliguori 
310783f64091Sbellard void bdrv_get_backing_filename(BlockDriverState *bs,
310883f64091Sbellard                                char *filename, int filename_size)
310983f64091Sbellard {
311083f64091Sbellard     pstrcpy(filename, filename_size, bs->backing_file);
311183f64091Sbellard }
311283f64091Sbellard 
3113faea38e7Sbellard int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
3114faea38e7Sbellard {
3115faea38e7Sbellard     BlockDriver *drv = bs->drv;
3116faea38e7Sbellard     if (!drv)
311719cb3738Sbellard         return -ENOMEDIUM;
3118faea38e7Sbellard     if (!drv->bdrv_get_info)
3119faea38e7Sbellard         return -ENOTSUP;
3120faea38e7Sbellard     memset(bdi, 0, sizeof(*bdi));
3121faea38e7Sbellard     return drv->bdrv_get_info(bs, bdi);
3122faea38e7Sbellard }
3123faea38e7Sbellard 
3124eae041feSMax Reitz ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs)
3125eae041feSMax Reitz {
3126eae041feSMax Reitz     BlockDriver *drv = bs->drv;
3127eae041feSMax Reitz     if (drv && drv->bdrv_get_specific_info) {
3128eae041feSMax Reitz         return drv->bdrv_get_specific_info(bs);
3129eae041feSMax Reitz     }
3130eae041feSMax Reitz     return NULL;
3131eae041feSMax Reitz }
3132eae041feSMax Reitz 
3133a31939e6SEric Blake void bdrv_debug_event(BlockDriverState *bs, BlkdebugEvent event)
31348b9b0cc2SKevin Wolf {
3135bf736fe3SKevin Wolf     if (!bs || !bs->drv || !bs->drv->bdrv_debug_event) {
31368b9b0cc2SKevin Wolf         return;
31378b9b0cc2SKevin Wolf     }
31388b9b0cc2SKevin Wolf 
3139bf736fe3SKevin Wolf     bs->drv->bdrv_debug_event(bs, event);
314041c695c7SKevin Wolf }
31418b9b0cc2SKevin Wolf 
314241c695c7SKevin Wolf int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
314341c695c7SKevin Wolf                           const char *tag)
314441c695c7SKevin Wolf {
314541c695c7SKevin Wolf     while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) {
31469a4f4c31SKevin Wolf         bs = bs->file ? bs->file->bs : NULL;
314741c695c7SKevin Wolf     }
314841c695c7SKevin Wolf 
314941c695c7SKevin Wolf     if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) {
315041c695c7SKevin Wolf         return bs->drv->bdrv_debug_breakpoint(bs, event, tag);
315141c695c7SKevin Wolf     }
315241c695c7SKevin Wolf 
315341c695c7SKevin Wolf     return -ENOTSUP;
315441c695c7SKevin Wolf }
315541c695c7SKevin Wolf 
31564cc70e93SFam Zheng int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag)
31574cc70e93SFam Zheng {
31584cc70e93SFam Zheng     while (bs && bs->drv && !bs->drv->bdrv_debug_remove_breakpoint) {
31599a4f4c31SKevin Wolf         bs = bs->file ? bs->file->bs : NULL;
31604cc70e93SFam Zheng     }
31614cc70e93SFam Zheng 
31624cc70e93SFam Zheng     if (bs && bs->drv && bs->drv->bdrv_debug_remove_breakpoint) {
31634cc70e93SFam Zheng         return bs->drv->bdrv_debug_remove_breakpoint(bs, tag);
31644cc70e93SFam Zheng     }
31654cc70e93SFam Zheng 
31664cc70e93SFam Zheng     return -ENOTSUP;
31674cc70e93SFam Zheng }
31684cc70e93SFam Zheng 
316941c695c7SKevin Wolf int bdrv_debug_resume(BlockDriverState *bs, const char *tag)
317041c695c7SKevin Wolf {
3171938789eaSMax Reitz     while (bs && (!bs->drv || !bs->drv->bdrv_debug_resume)) {
31729a4f4c31SKevin Wolf         bs = bs->file ? bs->file->bs : NULL;
317341c695c7SKevin Wolf     }
317441c695c7SKevin Wolf 
317541c695c7SKevin Wolf     if (bs && bs->drv && bs->drv->bdrv_debug_resume) {
317641c695c7SKevin Wolf         return bs->drv->bdrv_debug_resume(bs, tag);
317741c695c7SKevin Wolf     }
317841c695c7SKevin Wolf 
317941c695c7SKevin Wolf     return -ENOTSUP;
318041c695c7SKevin Wolf }
318141c695c7SKevin Wolf 
318241c695c7SKevin Wolf bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag)
318341c695c7SKevin Wolf {
318441c695c7SKevin Wolf     while (bs && bs->drv && !bs->drv->bdrv_debug_is_suspended) {
31859a4f4c31SKevin Wolf         bs = bs->file ? bs->file->bs : NULL;
318641c695c7SKevin Wolf     }
318741c695c7SKevin Wolf 
318841c695c7SKevin Wolf     if (bs && bs->drv && bs->drv->bdrv_debug_is_suspended) {
318941c695c7SKevin Wolf         return bs->drv->bdrv_debug_is_suspended(bs, tag);
319041c695c7SKevin Wolf     }
319141c695c7SKevin Wolf 
319241c695c7SKevin Wolf     return false;
31938b9b0cc2SKevin Wolf }
31948b9b0cc2SKevin Wolf 
3195199630b6SBlue Swirl int bdrv_is_snapshot(BlockDriverState *bs)
3196199630b6SBlue Swirl {
3197199630b6SBlue Swirl     return !!(bs->open_flags & BDRV_O_SNAPSHOT);
3198199630b6SBlue Swirl }
3199199630b6SBlue Swirl 
3200b1b1d783SJeff Cody /* backing_file can either be relative, or absolute, or a protocol.  If it is
3201b1b1d783SJeff Cody  * relative, it must be relative to the chain.  So, passing in bs->filename
3202b1b1d783SJeff Cody  * from a BDS as backing_file should not be done, as that may be relative to
3203b1b1d783SJeff Cody  * the CWD rather than the chain. */
3204e8a6bb9cSMarcelo Tosatti BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
3205e8a6bb9cSMarcelo Tosatti         const char *backing_file)
3206e8a6bb9cSMarcelo Tosatti {
3207b1b1d783SJeff Cody     char *filename_full = NULL;
3208b1b1d783SJeff Cody     char *backing_file_full = NULL;
3209b1b1d783SJeff Cody     char *filename_tmp = NULL;
3210b1b1d783SJeff Cody     int is_protocol = 0;
3211b1b1d783SJeff Cody     BlockDriverState *curr_bs = NULL;
3212b1b1d783SJeff Cody     BlockDriverState *retval = NULL;
3213b1b1d783SJeff Cody 
3214b1b1d783SJeff Cody     if (!bs || !bs->drv || !backing_file) {
3215e8a6bb9cSMarcelo Tosatti         return NULL;
3216e8a6bb9cSMarcelo Tosatti     }
3217e8a6bb9cSMarcelo Tosatti 
3218b1b1d783SJeff Cody     filename_full     = g_malloc(PATH_MAX);
3219b1b1d783SJeff Cody     backing_file_full = g_malloc(PATH_MAX);
3220b1b1d783SJeff Cody     filename_tmp      = g_malloc(PATH_MAX);
3221b1b1d783SJeff Cody 
3222b1b1d783SJeff Cody     is_protocol = path_has_protocol(backing_file);
3223b1b1d783SJeff Cody 
3224760e0063SKevin Wolf     for (curr_bs = bs; curr_bs->backing; curr_bs = curr_bs->backing->bs) {
3225b1b1d783SJeff Cody 
3226b1b1d783SJeff Cody         /* If either of the filename paths is actually a protocol, then
3227b1b1d783SJeff Cody          * compare unmodified paths; otherwise make paths relative */
3228b1b1d783SJeff Cody         if (is_protocol || path_has_protocol(curr_bs->backing_file)) {
3229b1b1d783SJeff Cody             if (strcmp(backing_file, curr_bs->backing_file) == 0) {
3230760e0063SKevin Wolf                 retval = curr_bs->backing->bs;
3231b1b1d783SJeff Cody                 break;
3232b1b1d783SJeff Cody             }
3233e8a6bb9cSMarcelo Tosatti         } else {
3234b1b1d783SJeff Cody             /* If not an absolute filename path, make it relative to the current
3235b1b1d783SJeff Cody              * image's filename path */
3236b1b1d783SJeff Cody             path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
3237b1b1d783SJeff Cody                          backing_file);
3238b1b1d783SJeff Cody 
3239b1b1d783SJeff Cody             /* We are going to compare absolute pathnames */
3240b1b1d783SJeff Cody             if (!realpath(filename_tmp, filename_full)) {
3241b1b1d783SJeff Cody                 continue;
3242b1b1d783SJeff Cody             }
3243b1b1d783SJeff Cody 
3244b1b1d783SJeff Cody             /* We need to make sure the backing filename we are comparing against
3245b1b1d783SJeff Cody              * is relative to the current image filename (or absolute) */
3246b1b1d783SJeff Cody             path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
3247b1b1d783SJeff Cody                          curr_bs->backing_file);
3248b1b1d783SJeff Cody 
3249b1b1d783SJeff Cody             if (!realpath(filename_tmp, backing_file_full)) {
3250b1b1d783SJeff Cody                 continue;
3251b1b1d783SJeff Cody             }
3252b1b1d783SJeff Cody 
3253b1b1d783SJeff Cody             if (strcmp(backing_file_full, filename_full) == 0) {
3254760e0063SKevin Wolf                 retval = curr_bs->backing->bs;
3255b1b1d783SJeff Cody                 break;
3256b1b1d783SJeff Cody             }
3257e8a6bb9cSMarcelo Tosatti         }
3258e8a6bb9cSMarcelo Tosatti     }
3259e8a6bb9cSMarcelo Tosatti 
3260b1b1d783SJeff Cody     g_free(filename_full);
3261b1b1d783SJeff Cody     g_free(backing_file_full);
3262b1b1d783SJeff Cody     g_free(filename_tmp);
3263b1b1d783SJeff Cody     return retval;
3264e8a6bb9cSMarcelo Tosatti }
3265e8a6bb9cSMarcelo Tosatti 
3266f198fd1cSBenoît Canet int bdrv_get_backing_file_depth(BlockDriverState *bs)
3267f198fd1cSBenoît Canet {
3268f198fd1cSBenoît Canet     if (!bs->drv) {
3269f198fd1cSBenoît Canet         return 0;
3270f198fd1cSBenoît Canet     }
3271f198fd1cSBenoît Canet 
3272760e0063SKevin Wolf     if (!bs->backing) {
3273f198fd1cSBenoît Canet         return 0;
3274f198fd1cSBenoît Canet     }
3275f198fd1cSBenoît Canet 
3276760e0063SKevin Wolf     return 1 + bdrv_get_backing_file_depth(bs->backing->bs);
3277f198fd1cSBenoît Canet }
3278f198fd1cSBenoît Canet 
3279ea2384d3Sbellard void bdrv_init(void)
3280ea2384d3Sbellard {
32815efa9d5aSAnthony Liguori     module_call_init(MODULE_INIT_BLOCK);
3282ea2384d3Sbellard }
3283ce1a14dcSpbrook 
3284eb852011SMarkus Armbruster void bdrv_init_with_whitelist(void)
3285eb852011SMarkus Armbruster {
3286eb852011SMarkus Armbruster     use_bdrv_whitelist = 1;
3287eb852011SMarkus Armbruster     bdrv_init();
3288eb852011SMarkus Armbruster }
3289eb852011SMarkus Armbruster 
32905a8a30dbSKevin Wolf void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
32910f15423cSAnthony Liguori {
32925a8a30dbSKevin Wolf     Error *local_err = NULL;
32935a8a30dbSKevin Wolf     int ret;
32945a8a30dbSKevin Wolf 
32953456a8d1SKevin Wolf     if (!bs->drv)  {
32963456a8d1SKevin Wolf         return;
32970f15423cSAnthony Liguori     }
32983456a8d1SKevin Wolf 
329904c01a5cSKevin Wolf     if (!(bs->open_flags & BDRV_O_INACTIVE)) {
33007ea2d269SAlexey Kardashevskiy         return;
33017ea2d269SAlexey Kardashevskiy     }
330204c01a5cSKevin Wolf     bs->open_flags &= ~BDRV_O_INACTIVE;
33037ea2d269SAlexey Kardashevskiy 
33043456a8d1SKevin Wolf     if (bs->drv->bdrv_invalidate_cache) {
33055a8a30dbSKevin Wolf         bs->drv->bdrv_invalidate_cache(bs, &local_err);
33063456a8d1SKevin Wolf     } else if (bs->file) {
33079a4f4c31SKevin Wolf         bdrv_invalidate_cache(bs->file->bs, &local_err);
33085a8a30dbSKevin Wolf     }
33095a8a30dbSKevin Wolf     if (local_err) {
331004c01a5cSKevin Wolf         bs->open_flags |= BDRV_O_INACTIVE;
33115a8a30dbSKevin Wolf         error_propagate(errp, local_err);
33125a8a30dbSKevin Wolf         return;
33133456a8d1SKevin Wolf     }
33143456a8d1SKevin Wolf 
33155a8a30dbSKevin Wolf     ret = refresh_total_sectors(bs, bs->total_sectors);
33165a8a30dbSKevin Wolf     if (ret < 0) {
331704c01a5cSKevin Wolf         bs->open_flags |= BDRV_O_INACTIVE;
33185a8a30dbSKevin Wolf         error_setg_errno(errp, -ret, "Could not refresh total sector count");
33195a8a30dbSKevin Wolf         return;
33205a8a30dbSKevin Wolf     }
33210f15423cSAnthony Liguori }
33220f15423cSAnthony Liguori 
33235a8a30dbSKevin Wolf void bdrv_invalidate_cache_all(Error **errp)
33240f15423cSAnthony Liguori {
33250f15423cSAnthony Liguori     BlockDriverState *bs;
33265a8a30dbSKevin Wolf     Error *local_err = NULL;
33270f15423cSAnthony Liguori 
3328dc364f4cSBenoît Canet     QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
3329ed78cda3SStefan Hajnoczi         AioContext *aio_context = bdrv_get_aio_context(bs);
3330ed78cda3SStefan Hajnoczi 
3331ed78cda3SStefan Hajnoczi         aio_context_acquire(aio_context);
33325a8a30dbSKevin Wolf         bdrv_invalidate_cache(bs, &local_err);
3333ed78cda3SStefan Hajnoczi         aio_context_release(aio_context);
33345a8a30dbSKevin Wolf         if (local_err) {
33355a8a30dbSKevin Wolf             error_propagate(errp, local_err);
33365a8a30dbSKevin Wolf             return;
33375a8a30dbSKevin Wolf         }
33380f15423cSAnthony Liguori     }
33390f15423cSAnthony Liguori }
33400f15423cSAnthony Liguori 
334176b1c7feSKevin Wolf static int bdrv_inactivate(BlockDriverState *bs)
334276b1c7feSKevin Wolf {
334376b1c7feSKevin Wolf     int ret;
334476b1c7feSKevin Wolf 
334576b1c7feSKevin Wolf     if (bs->drv->bdrv_inactivate) {
334676b1c7feSKevin Wolf         ret = bs->drv->bdrv_inactivate(bs);
334776b1c7feSKevin Wolf         if (ret < 0) {
334876b1c7feSKevin Wolf             return ret;
334976b1c7feSKevin Wolf         }
335076b1c7feSKevin Wolf     }
335176b1c7feSKevin Wolf 
335276b1c7feSKevin Wolf     bs->open_flags |= BDRV_O_INACTIVE;
335376b1c7feSKevin Wolf     return 0;
335476b1c7feSKevin Wolf }
335576b1c7feSKevin Wolf 
335676b1c7feSKevin Wolf int bdrv_inactivate_all(void)
335776b1c7feSKevin Wolf {
335876b1c7feSKevin Wolf     BlockDriverState *bs;
335976b1c7feSKevin Wolf     int ret;
336076b1c7feSKevin Wolf 
336176b1c7feSKevin Wolf     QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
336276b1c7feSKevin Wolf         AioContext *aio_context = bdrv_get_aio_context(bs);
336376b1c7feSKevin Wolf 
336476b1c7feSKevin Wolf         aio_context_acquire(aio_context);
336576b1c7feSKevin Wolf         ret = bdrv_inactivate(bs);
336676b1c7feSKevin Wolf         aio_context_release(aio_context);
336776b1c7feSKevin Wolf         if (ret < 0) {
336876b1c7feSKevin Wolf             return ret;
336976b1c7feSKevin Wolf         }
337076b1c7feSKevin Wolf     }
337176b1c7feSKevin Wolf 
337276b1c7feSKevin Wolf     return 0;
337376b1c7feSKevin Wolf }
337476b1c7feSKevin Wolf 
3375f9f05dc5SKevin Wolf /**************************************************************/
337619cb3738Sbellard /* removable device support */
337719cb3738Sbellard 
337819cb3738Sbellard /**
337919cb3738Sbellard  * Return TRUE if the media is present
338019cb3738Sbellard  */
3381e031f750SMax Reitz bool bdrv_is_inserted(BlockDriverState *bs)
338219cb3738Sbellard {
338319cb3738Sbellard     BlockDriver *drv = bs->drv;
338428d7a789SMax Reitz     BdrvChild *child;
3385a1aff5bfSMarkus Armbruster 
3386e031f750SMax Reitz     if (!drv) {
3387e031f750SMax Reitz         return false;
3388e031f750SMax Reitz     }
338928d7a789SMax Reitz     if (drv->bdrv_is_inserted) {
3390a1aff5bfSMarkus Armbruster         return drv->bdrv_is_inserted(bs);
339119cb3738Sbellard     }
339228d7a789SMax Reitz     QLIST_FOREACH(child, &bs->children, next) {
339328d7a789SMax Reitz         if (!bdrv_is_inserted(child->bs)) {
339428d7a789SMax Reitz             return false;
339528d7a789SMax Reitz         }
339628d7a789SMax Reitz     }
339728d7a789SMax Reitz     return true;
339828d7a789SMax Reitz }
339919cb3738Sbellard 
340019cb3738Sbellard /**
34018e49ca46SMarkus Armbruster  * Return whether the media changed since the last call to this
34028e49ca46SMarkus Armbruster  * function, or -ENOTSUP if we don't know.  Most drivers don't know.
340319cb3738Sbellard  */
340419cb3738Sbellard int bdrv_media_changed(BlockDriverState *bs)
340519cb3738Sbellard {
340619cb3738Sbellard     BlockDriver *drv = bs->drv;
340719cb3738Sbellard 
34088e49ca46SMarkus Armbruster     if (drv && drv->bdrv_media_changed) {
34098e49ca46SMarkus Armbruster         return drv->bdrv_media_changed(bs);
34108e49ca46SMarkus Armbruster     }
34118e49ca46SMarkus Armbruster     return -ENOTSUP;
341219cb3738Sbellard }
341319cb3738Sbellard 
341419cb3738Sbellard /**
341519cb3738Sbellard  * If eject_flag is TRUE, eject the media. Otherwise, close the tray
341619cb3738Sbellard  */
3417f36f3949SLuiz Capitulino void bdrv_eject(BlockDriverState *bs, bool eject_flag)
341819cb3738Sbellard {
341919cb3738Sbellard     BlockDriver *drv = bs->drv;
3420bfb197e0SMarkus Armbruster     const char *device_name;
342119cb3738Sbellard 
3422822e1cd1SMarkus Armbruster     if (drv && drv->bdrv_eject) {
3423822e1cd1SMarkus Armbruster         drv->bdrv_eject(bs, eject_flag);
342419cb3738Sbellard     }
34256f382ed2SLuiz Capitulino 
3426bfb197e0SMarkus Armbruster     device_name = bdrv_get_device_name(bs);
3427bfb197e0SMarkus Armbruster     if (device_name[0] != '\0') {
3428bfb197e0SMarkus Armbruster         qapi_event_send_device_tray_moved(device_name,
3429a5ee7bd4SWenchao Xia                                           eject_flag, &error_abort);
34306f382ed2SLuiz Capitulino     }
343119cb3738Sbellard }
343219cb3738Sbellard 
343319cb3738Sbellard /**
343419cb3738Sbellard  * Lock or unlock the media (if it is locked, the user won't be able
343519cb3738Sbellard  * to eject it manually).
343619cb3738Sbellard  */
3437025e849aSMarkus Armbruster void bdrv_lock_medium(BlockDriverState *bs, bool locked)
343819cb3738Sbellard {
343919cb3738Sbellard     BlockDriver *drv = bs->drv;
344019cb3738Sbellard 
3441025e849aSMarkus Armbruster     trace_bdrv_lock_medium(bs, locked);
3442b8c6d095SStefan Hajnoczi 
3443025e849aSMarkus Armbruster     if (drv && drv->bdrv_lock_medium) {
3444025e849aSMarkus Armbruster         drv->bdrv_lock_medium(bs, locked);
344519cb3738Sbellard     }
344619cb3738Sbellard }
3447985a03b0Sths 
34480db6e54aSFam Zheng BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs, const char *name)
34490db6e54aSFam Zheng {
34500db6e54aSFam Zheng     BdrvDirtyBitmap *bm;
34510db6e54aSFam Zheng 
34520db6e54aSFam Zheng     assert(name);
34530db6e54aSFam Zheng     QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
34540db6e54aSFam Zheng         if (bm->name && !strcmp(name, bm->name)) {
34550db6e54aSFam Zheng             return bm;
34560db6e54aSFam Zheng         }
34570db6e54aSFam Zheng     }
34580db6e54aSFam Zheng     return NULL;
34590db6e54aSFam Zheng }
34600db6e54aSFam Zheng 
346120dca810SJohn Snow void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap)
34620db6e54aSFam Zheng {
34639bd2b08fSJohn Snow     assert(!bdrv_dirty_bitmap_frozen(bitmap));
34640db6e54aSFam Zheng     g_free(bitmap->name);
34650db6e54aSFam Zheng     bitmap->name = NULL;
34660db6e54aSFam Zheng }
34670db6e54aSFam Zheng 
34680db6e54aSFam Zheng BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
34695fba6c0eSJohn Snow                                           uint32_t granularity,
34700db6e54aSFam Zheng                                           const char *name,
3471b8afb520SFam Zheng                                           Error **errp)
34727cd1e32aSlirans@il.ibm.com {
34737cd1e32aSlirans@il.ibm.com     int64_t bitmap_size;
3474e4654d2dSFam Zheng     BdrvDirtyBitmap *bitmap;
34755fba6c0eSJohn Snow     uint32_t sector_granularity;
3476a55eb92cSJan Kiszka 
347750717e94SPaolo Bonzini     assert((granularity & (granularity - 1)) == 0);
347850717e94SPaolo Bonzini 
34790db6e54aSFam Zheng     if (name && bdrv_find_dirty_bitmap(bs, name)) {
34800db6e54aSFam Zheng         error_setg(errp, "Bitmap already exists: %s", name);
34810db6e54aSFam Zheng         return NULL;
34820db6e54aSFam Zheng     }
34835fba6c0eSJohn Snow     sector_granularity = granularity >> BDRV_SECTOR_BITS;
34845fba6c0eSJohn Snow     assert(sector_granularity);
348557322b78SMarkus Armbruster     bitmap_size = bdrv_nb_sectors(bs);
3486b8afb520SFam Zheng     if (bitmap_size < 0) {
3487b8afb520SFam Zheng         error_setg_errno(errp, -bitmap_size, "could not get length of device");
3488b8afb520SFam Zheng         errno = -bitmap_size;
3489b8afb520SFam Zheng         return NULL;
3490b8afb520SFam Zheng     }
34915839e53bSMarkus Armbruster     bitmap = g_new0(BdrvDirtyBitmap, 1);
34925fba6c0eSJohn Snow     bitmap->bitmap = hbitmap_alloc(bitmap_size, ctz32(sector_granularity));
3493e74e6b78SJohn Snow     bitmap->size = bitmap_size;
34940db6e54aSFam Zheng     bitmap->name = g_strdup(name);
3495b8e6fb75SJohn Snow     bitmap->disabled = false;
3496e4654d2dSFam Zheng     QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
3497e4654d2dSFam Zheng     return bitmap;
3498e4654d2dSFam Zheng }
3499e4654d2dSFam Zheng 
35009bd2b08fSJohn Snow bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
35019bd2b08fSJohn Snow {
35029bd2b08fSJohn Snow     return bitmap->successor;
35039bd2b08fSJohn Snow }
35049bd2b08fSJohn Snow 
3505b8e6fb75SJohn Snow bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
3506b8e6fb75SJohn Snow {
35079bd2b08fSJohn Snow     return !(bitmap->disabled || bitmap->successor);
35089bd2b08fSJohn Snow }
35099bd2b08fSJohn Snow 
35109abe3bdcSJohn Snow DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap)
35119abe3bdcSJohn Snow {
35129abe3bdcSJohn Snow     if (bdrv_dirty_bitmap_frozen(bitmap)) {
35139abe3bdcSJohn Snow         return DIRTY_BITMAP_STATUS_FROZEN;
35149abe3bdcSJohn Snow     } else if (!bdrv_dirty_bitmap_enabled(bitmap)) {
35159abe3bdcSJohn Snow         return DIRTY_BITMAP_STATUS_DISABLED;
35169abe3bdcSJohn Snow     } else {
35179abe3bdcSJohn Snow         return DIRTY_BITMAP_STATUS_ACTIVE;
35189abe3bdcSJohn Snow     }
35199abe3bdcSJohn Snow }
35209abe3bdcSJohn Snow 
35219bd2b08fSJohn Snow /**
35229bd2b08fSJohn Snow  * Create a successor bitmap destined to replace this bitmap after an operation.
35239bd2b08fSJohn Snow  * Requires that the bitmap is not frozen and has no successor.
35249bd2b08fSJohn Snow  */
35259bd2b08fSJohn Snow int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
35269bd2b08fSJohn Snow                                        BdrvDirtyBitmap *bitmap, Error **errp)
35279bd2b08fSJohn Snow {
35289bd2b08fSJohn Snow     uint64_t granularity;
35299bd2b08fSJohn Snow     BdrvDirtyBitmap *child;
35309bd2b08fSJohn Snow 
35319bd2b08fSJohn Snow     if (bdrv_dirty_bitmap_frozen(bitmap)) {
35329bd2b08fSJohn Snow         error_setg(errp, "Cannot create a successor for a bitmap that is "
35339bd2b08fSJohn Snow                    "currently frozen");
35349bd2b08fSJohn Snow         return -1;
35359bd2b08fSJohn Snow     }
35369bd2b08fSJohn Snow     assert(!bitmap->successor);
35379bd2b08fSJohn Snow 
35389bd2b08fSJohn Snow     /* Create an anonymous successor */
35399bd2b08fSJohn Snow     granularity = bdrv_dirty_bitmap_granularity(bitmap);
35409bd2b08fSJohn Snow     child = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
35419bd2b08fSJohn Snow     if (!child) {
35429bd2b08fSJohn Snow         return -1;
35439bd2b08fSJohn Snow     }
35449bd2b08fSJohn Snow 
35459bd2b08fSJohn Snow     /* Successor will be on or off based on our current state. */
35469bd2b08fSJohn Snow     child->disabled = bitmap->disabled;
35479bd2b08fSJohn Snow 
35489bd2b08fSJohn Snow     /* Install the successor and freeze the parent */
35499bd2b08fSJohn Snow     bitmap->successor = child;
35509bd2b08fSJohn Snow     return 0;
35519bd2b08fSJohn Snow }
35529bd2b08fSJohn Snow 
35539bd2b08fSJohn Snow /**
35549bd2b08fSJohn Snow  * For a bitmap with a successor, yield our name to the successor,
35559bd2b08fSJohn Snow  * delete the old bitmap, and return a handle to the new bitmap.
35569bd2b08fSJohn Snow  */
35579bd2b08fSJohn Snow BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
35589bd2b08fSJohn Snow                                             BdrvDirtyBitmap *bitmap,
35599bd2b08fSJohn Snow                                             Error **errp)
35609bd2b08fSJohn Snow {
35619bd2b08fSJohn Snow     char *name;
35629bd2b08fSJohn Snow     BdrvDirtyBitmap *successor = bitmap->successor;
35639bd2b08fSJohn Snow 
35649bd2b08fSJohn Snow     if (successor == NULL) {
35659bd2b08fSJohn Snow         error_setg(errp, "Cannot relinquish control if "
35669bd2b08fSJohn Snow                    "there's no successor present");
35679bd2b08fSJohn Snow         return NULL;
35689bd2b08fSJohn Snow     }
35699bd2b08fSJohn Snow 
35709bd2b08fSJohn Snow     name = bitmap->name;
35719bd2b08fSJohn Snow     bitmap->name = NULL;
35729bd2b08fSJohn Snow     successor->name = name;
35739bd2b08fSJohn Snow     bitmap->successor = NULL;
35749bd2b08fSJohn Snow     bdrv_release_dirty_bitmap(bs, bitmap);
35759bd2b08fSJohn Snow 
35769bd2b08fSJohn Snow     return successor;
35779bd2b08fSJohn Snow }
35789bd2b08fSJohn Snow 
35799bd2b08fSJohn Snow /**
35809bd2b08fSJohn Snow  * In cases of failure where we can no longer safely delete the parent,
35819bd2b08fSJohn Snow  * we may wish to re-join the parent and child/successor.
35829bd2b08fSJohn Snow  * The merged parent will be un-frozen, but not explicitly re-enabled.
35839bd2b08fSJohn Snow  */
35849bd2b08fSJohn Snow BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
35859bd2b08fSJohn Snow                                            BdrvDirtyBitmap *parent,
35869bd2b08fSJohn Snow                                            Error **errp)
35879bd2b08fSJohn Snow {
35889bd2b08fSJohn Snow     BdrvDirtyBitmap *successor = parent->successor;
35899bd2b08fSJohn Snow 
35909bd2b08fSJohn Snow     if (!successor) {
35919bd2b08fSJohn Snow         error_setg(errp, "Cannot reclaim a successor when none is present");
35929bd2b08fSJohn Snow         return NULL;
35939bd2b08fSJohn Snow     }
35949bd2b08fSJohn Snow 
35959bd2b08fSJohn Snow     if (!hbitmap_merge(parent->bitmap, successor->bitmap)) {
35969bd2b08fSJohn Snow         error_setg(errp, "Merging of parent and successor bitmap failed");
35979bd2b08fSJohn Snow         return NULL;
35989bd2b08fSJohn Snow     }
35999bd2b08fSJohn Snow     bdrv_release_dirty_bitmap(bs, successor);
36009bd2b08fSJohn Snow     parent->successor = NULL;
36019bd2b08fSJohn Snow 
36029bd2b08fSJohn Snow     return parent;
3603b8e6fb75SJohn Snow }
3604b8e6fb75SJohn Snow 
3605ce1ffea8SJohn Snow /**
3606ce1ffea8SJohn Snow  * Truncates _all_ bitmaps attached to a BDS.
3607ce1ffea8SJohn Snow  */
3608ce1ffea8SJohn Snow static void bdrv_dirty_bitmap_truncate(BlockDriverState *bs)
3609ce1ffea8SJohn Snow {
3610ce1ffea8SJohn Snow     BdrvDirtyBitmap *bitmap;
3611ce1ffea8SJohn Snow     uint64_t size = bdrv_nb_sectors(bs);
3612ce1ffea8SJohn Snow 
3613ce1ffea8SJohn Snow     QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
361406207b0fSJohn Snow         assert(!bdrv_dirty_bitmap_frozen(bitmap));
3615ce1ffea8SJohn Snow         hbitmap_truncate(bitmap->bitmap, size);
36165270b6a0SJohn Snow         bitmap->size = size;
3617ce1ffea8SJohn Snow     }
3618ce1ffea8SJohn Snow }
3619ce1ffea8SJohn Snow 
3620c5acdc9aSMax Reitz static void bdrv_do_release_matching_dirty_bitmap(BlockDriverState *bs,
3621c5acdc9aSMax Reitz                                                   BdrvDirtyBitmap *bitmap,
3622c5acdc9aSMax Reitz                                                   bool only_named)
3623e4654d2dSFam Zheng {
3624e4654d2dSFam Zheng     BdrvDirtyBitmap *bm, *next;
3625e4654d2dSFam Zheng     QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
3626c5acdc9aSMax Reitz         if ((!bitmap || bm == bitmap) && (!only_named || bm->name)) {
36279bd2b08fSJohn Snow             assert(!bdrv_dirty_bitmap_frozen(bm));
3628c5acdc9aSMax Reitz             QLIST_REMOVE(bm, list);
3629c5acdc9aSMax Reitz             hbitmap_free(bm->bitmap);
3630c5acdc9aSMax Reitz             g_free(bm->name);
3631c5acdc9aSMax Reitz             g_free(bm);
3632c5acdc9aSMax Reitz 
3633c5acdc9aSMax Reitz             if (bitmap) {
3634e4654d2dSFam Zheng                 return;
36357cd1e32aSlirans@il.ibm.com             }
36367cd1e32aSlirans@il.ibm.com         }
36377cd1e32aSlirans@il.ibm.com     }
3638c5acdc9aSMax Reitz }
3639c5acdc9aSMax Reitz 
3640c5acdc9aSMax Reitz void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
3641c5acdc9aSMax Reitz {
3642c5acdc9aSMax Reitz     bdrv_do_release_matching_dirty_bitmap(bs, bitmap, false);
3643c5acdc9aSMax Reitz }
3644c5acdc9aSMax Reitz 
3645c5acdc9aSMax Reitz /**
3646c5acdc9aSMax Reitz  * Release all named dirty bitmaps attached to a BDS (for use in bdrv_close()).
3647c5acdc9aSMax Reitz  * There must not be any frozen bitmaps attached.
3648c5acdc9aSMax Reitz  */
3649c5acdc9aSMax Reitz static void bdrv_release_named_dirty_bitmaps(BlockDriverState *bs)
3650c5acdc9aSMax Reitz {
3651c5acdc9aSMax Reitz     bdrv_do_release_matching_dirty_bitmap(bs, NULL, true);
3652c5acdc9aSMax Reitz }
36537cd1e32aSlirans@il.ibm.com 
3654b8e6fb75SJohn Snow void bdrv_disable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3655b8e6fb75SJohn Snow {
36569bd2b08fSJohn Snow     assert(!bdrv_dirty_bitmap_frozen(bitmap));
3657b8e6fb75SJohn Snow     bitmap->disabled = true;
3658b8e6fb75SJohn Snow }
3659b8e6fb75SJohn Snow 
3660b8e6fb75SJohn Snow void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3661b8e6fb75SJohn Snow {
36629bd2b08fSJohn Snow     assert(!bdrv_dirty_bitmap_frozen(bitmap));
3663b8e6fb75SJohn Snow     bitmap->disabled = false;
3664b8e6fb75SJohn Snow }
3665b8e6fb75SJohn Snow 
366621b56835SFam Zheng BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
366721b56835SFam Zheng {
366821b56835SFam Zheng     BdrvDirtyBitmap *bm;
366921b56835SFam Zheng     BlockDirtyInfoList *list = NULL;
367021b56835SFam Zheng     BlockDirtyInfoList **plist = &list;
367121b56835SFam Zheng 
367221b56835SFam Zheng     QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
36735839e53bSMarkus Armbruster         BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
36745839e53bSMarkus Armbruster         BlockDirtyInfoList *entry = g_new0(BlockDirtyInfoList, 1);
367520dca810SJohn Snow         info->count = bdrv_get_dirty_count(bm);
3676592fdd02SJohn Snow         info->granularity = bdrv_dirty_bitmap_granularity(bm);
36770db6e54aSFam Zheng         info->has_name = !!bm->name;
36780db6e54aSFam Zheng         info->name = g_strdup(bm->name);
36799abe3bdcSJohn Snow         info->status = bdrv_dirty_bitmap_status(bm);
368021b56835SFam Zheng         entry->value = info;
368121b56835SFam Zheng         *plist = entry;
368221b56835SFam Zheng         plist = &entry->next;
368321b56835SFam Zheng     }
368421b56835SFam Zheng 
368521b56835SFam Zheng     return list;
368621b56835SFam Zheng }
368721b56835SFam Zheng 
3688e4654d2dSFam Zheng int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector)
36897cd1e32aSlirans@il.ibm.com {
3690e4654d2dSFam Zheng     if (bitmap) {
3691e4654d2dSFam Zheng         return hbitmap_get(bitmap->bitmap, sector);
36927cd1e32aSlirans@il.ibm.com     } else {
36937cd1e32aSlirans@il.ibm.com         return 0;
36947cd1e32aSlirans@il.ibm.com     }
36957cd1e32aSlirans@il.ibm.com }
36967cd1e32aSlirans@il.ibm.com 
3697341ebc2fSJohn Snow /**
3698341ebc2fSJohn Snow  * Chooses a default granularity based on the existing cluster size,
3699341ebc2fSJohn Snow  * but clamped between [4K, 64K]. Defaults to 64K in the case that there
3700341ebc2fSJohn Snow  * is no cluster size information available.
3701341ebc2fSJohn Snow  */
3702341ebc2fSJohn Snow uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs)
3703341ebc2fSJohn Snow {
3704341ebc2fSJohn Snow     BlockDriverInfo bdi;
3705341ebc2fSJohn Snow     uint32_t granularity;
3706341ebc2fSJohn Snow 
3707341ebc2fSJohn Snow     if (bdrv_get_info(bs, &bdi) >= 0 && bdi.cluster_size > 0) {
3708341ebc2fSJohn Snow         granularity = MAX(4096, bdi.cluster_size);
3709341ebc2fSJohn Snow         granularity = MIN(65536, granularity);
3710341ebc2fSJohn Snow     } else {
3711341ebc2fSJohn Snow         granularity = 65536;
3712341ebc2fSJohn Snow     }
3713341ebc2fSJohn Snow 
3714341ebc2fSJohn Snow     return granularity;
3715341ebc2fSJohn Snow }
3716341ebc2fSJohn Snow 
3717592fdd02SJohn Snow uint32_t bdrv_dirty_bitmap_granularity(BdrvDirtyBitmap *bitmap)
3718592fdd02SJohn Snow {
3719592fdd02SJohn Snow     return BDRV_SECTOR_SIZE << hbitmap_granularity(bitmap->bitmap);
3720592fdd02SJohn Snow }
3721592fdd02SJohn Snow 
372220dca810SJohn Snow void bdrv_dirty_iter_init(BdrvDirtyBitmap *bitmap, HBitmapIter *hbi)
37231755da16SPaolo Bonzini {
3724e4654d2dSFam Zheng     hbitmap_iter_init(hbi, bitmap->bitmap, 0);
37251755da16SPaolo Bonzini }
37261755da16SPaolo Bonzini 
372720dca810SJohn Snow void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
3728c4237dfaSVladimir Sementsov-Ogievskiy                            int64_t cur_sector, int nr_sectors)
3729c4237dfaSVladimir Sementsov-Ogievskiy {
3730b8e6fb75SJohn Snow     assert(bdrv_dirty_bitmap_enabled(bitmap));
3731c4237dfaSVladimir Sementsov-Ogievskiy     hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
3732c4237dfaSVladimir Sementsov-Ogievskiy }
3733c4237dfaSVladimir Sementsov-Ogievskiy 
373420dca810SJohn Snow void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
3735c4237dfaSVladimir Sementsov-Ogievskiy                              int64_t cur_sector, int nr_sectors)
3736c4237dfaSVladimir Sementsov-Ogievskiy {
3737b8e6fb75SJohn Snow     assert(bdrv_dirty_bitmap_enabled(bitmap));
3738c4237dfaSVladimir Sementsov-Ogievskiy     hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
3739c4237dfaSVladimir Sementsov-Ogievskiy }
3740c4237dfaSVladimir Sementsov-Ogievskiy 
3741df9a681dSFam Zheng void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap **out)
3742e74e6b78SJohn Snow {
3743e74e6b78SJohn Snow     assert(bdrv_dirty_bitmap_enabled(bitmap));
3744df9a681dSFam Zheng     if (!out) {
3745c6a8c328SWen Congyang         hbitmap_reset_all(bitmap->bitmap);
3746df9a681dSFam Zheng     } else {
3747df9a681dSFam Zheng         HBitmap *backup = bitmap->bitmap;
3748df9a681dSFam Zheng         bitmap->bitmap = hbitmap_alloc(bitmap->size,
3749df9a681dSFam Zheng                                        hbitmap_granularity(backup));
3750df9a681dSFam Zheng         *out = backup;
3751df9a681dSFam Zheng     }
3752df9a681dSFam Zheng }
3753df9a681dSFam Zheng 
3754df9a681dSFam Zheng void bdrv_undo_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap *in)
3755df9a681dSFam Zheng {
3756df9a681dSFam Zheng     HBitmap *tmp = bitmap->bitmap;
3757df9a681dSFam Zheng     assert(bdrv_dirty_bitmap_enabled(bitmap));
3758df9a681dSFam Zheng     bitmap->bitmap = in;
3759df9a681dSFam Zheng     hbitmap_free(tmp);
3760e74e6b78SJohn Snow }
3761e74e6b78SJohn Snow 
3762e0c47b6cSStefan Hajnoczi void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,
37631755da16SPaolo Bonzini                     int nr_sectors)
37641755da16SPaolo Bonzini {
3765e4654d2dSFam Zheng     BdrvDirtyBitmap *bitmap;
3766e4654d2dSFam Zheng     QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
3767b8e6fb75SJohn Snow         if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3768b8e6fb75SJohn Snow             continue;
3769b8e6fb75SJohn Snow         }
3770e4654d2dSFam Zheng         hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
3771e4654d2dSFam Zheng     }
37721755da16SPaolo Bonzini }
37731755da16SPaolo Bonzini 
3774d58d8453SJohn Snow /**
3775d58d8453SJohn Snow  * Advance an HBitmapIter to an arbitrary offset.
3776d58d8453SJohn Snow  */
3777d58d8453SJohn Snow void bdrv_set_dirty_iter(HBitmapIter *hbi, int64_t offset)
3778d58d8453SJohn Snow {
3779d58d8453SJohn Snow     assert(hbi->hb);
3780d58d8453SJohn Snow     hbitmap_iter_init(hbi, hbi->hb, offset);
3781d58d8453SJohn Snow }
3782d58d8453SJohn Snow 
378320dca810SJohn Snow int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
3784aaa0eb75SLiran Schour {
3785e4654d2dSFam Zheng     return hbitmap_count(bitmap->bitmap);
3786aaa0eb75SLiran Schour }
3787f88e1a42SJes Sorensen 
37889fcb0251SFam Zheng /* Get a reference to bs */
37899fcb0251SFam Zheng void bdrv_ref(BlockDriverState *bs)
37909fcb0251SFam Zheng {
37919fcb0251SFam Zheng     bs->refcnt++;
37929fcb0251SFam Zheng }
37939fcb0251SFam Zheng 
37949fcb0251SFam Zheng /* Release a previously grabbed reference to bs.
37959fcb0251SFam Zheng  * If after releasing, reference count is zero, the BlockDriverState is
37969fcb0251SFam Zheng  * deleted. */
37979fcb0251SFam Zheng void bdrv_unref(BlockDriverState *bs)
37989fcb0251SFam Zheng {
37999a4d5ca6SJeff Cody     if (!bs) {
38009a4d5ca6SJeff Cody         return;
38019a4d5ca6SJeff Cody     }
38029fcb0251SFam Zheng     assert(bs->refcnt > 0);
38039fcb0251SFam Zheng     if (--bs->refcnt == 0) {
38049fcb0251SFam Zheng         bdrv_delete(bs);
38059fcb0251SFam Zheng     }
38069fcb0251SFam Zheng }
38079fcb0251SFam Zheng 
3808fbe40ff7SFam Zheng struct BdrvOpBlocker {
3809fbe40ff7SFam Zheng     Error *reason;
3810fbe40ff7SFam Zheng     QLIST_ENTRY(BdrvOpBlocker) list;
3811fbe40ff7SFam Zheng };
3812fbe40ff7SFam Zheng 
3813fbe40ff7SFam Zheng bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
3814fbe40ff7SFam Zheng {
3815fbe40ff7SFam Zheng     BdrvOpBlocker *blocker;
3816fbe40ff7SFam Zheng     assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3817fbe40ff7SFam Zheng     if (!QLIST_EMPTY(&bs->op_blockers[op])) {
3818fbe40ff7SFam Zheng         blocker = QLIST_FIRST(&bs->op_blockers[op]);
3819fbe40ff7SFam Zheng         if (errp) {
3820e43bfd9cSMarkus Armbruster             *errp = error_copy(blocker->reason);
3821e43bfd9cSMarkus Armbruster             error_prepend(errp, "Node '%s' is busy: ",
3822e43bfd9cSMarkus Armbruster                           bdrv_get_device_or_node_name(bs));
3823fbe40ff7SFam Zheng         }
3824fbe40ff7SFam Zheng         return true;
3825fbe40ff7SFam Zheng     }
3826fbe40ff7SFam Zheng     return false;
3827fbe40ff7SFam Zheng }
3828fbe40ff7SFam Zheng 
3829fbe40ff7SFam Zheng void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason)
3830fbe40ff7SFam Zheng {
3831fbe40ff7SFam Zheng     BdrvOpBlocker *blocker;
3832fbe40ff7SFam Zheng     assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3833fbe40ff7SFam Zheng 
38345839e53bSMarkus Armbruster     blocker = g_new0(BdrvOpBlocker, 1);
3835fbe40ff7SFam Zheng     blocker->reason = reason;
3836fbe40ff7SFam Zheng     QLIST_INSERT_HEAD(&bs->op_blockers[op], blocker, list);
3837fbe40ff7SFam Zheng }
3838fbe40ff7SFam Zheng 
3839fbe40ff7SFam Zheng void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason)
3840fbe40ff7SFam Zheng {
3841fbe40ff7SFam Zheng     BdrvOpBlocker *blocker, *next;
3842fbe40ff7SFam Zheng     assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3843fbe40ff7SFam Zheng     QLIST_FOREACH_SAFE(blocker, &bs->op_blockers[op], list, next) {
3844fbe40ff7SFam Zheng         if (blocker->reason == reason) {
3845fbe40ff7SFam Zheng             QLIST_REMOVE(blocker, list);
3846fbe40ff7SFam Zheng             g_free(blocker);
3847fbe40ff7SFam Zheng         }
3848fbe40ff7SFam Zheng     }
3849fbe40ff7SFam Zheng }
3850fbe40ff7SFam Zheng 
3851fbe40ff7SFam Zheng void bdrv_op_block_all(BlockDriverState *bs, Error *reason)
3852fbe40ff7SFam Zheng {
3853fbe40ff7SFam Zheng     int i;
3854fbe40ff7SFam Zheng     for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3855fbe40ff7SFam Zheng         bdrv_op_block(bs, i, reason);
3856fbe40ff7SFam Zheng     }
3857fbe40ff7SFam Zheng }
3858fbe40ff7SFam Zheng 
3859fbe40ff7SFam Zheng void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason)
3860fbe40ff7SFam Zheng {
3861fbe40ff7SFam Zheng     int i;
3862fbe40ff7SFam Zheng     for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3863fbe40ff7SFam Zheng         bdrv_op_unblock(bs, i, reason);
3864fbe40ff7SFam Zheng     }
3865fbe40ff7SFam Zheng }
3866fbe40ff7SFam Zheng 
3867fbe40ff7SFam Zheng bool bdrv_op_blocker_is_empty(BlockDriverState *bs)
3868fbe40ff7SFam Zheng {
3869fbe40ff7SFam Zheng     int i;
3870fbe40ff7SFam Zheng 
3871fbe40ff7SFam Zheng     for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3872fbe40ff7SFam Zheng         if (!QLIST_EMPTY(&bs->op_blockers[i])) {
3873fbe40ff7SFam Zheng             return false;
3874fbe40ff7SFam Zheng         }
3875fbe40ff7SFam Zheng     }
3876fbe40ff7SFam Zheng     return true;
3877fbe40ff7SFam Zheng }
3878fbe40ff7SFam Zheng 
3879d92ada22SLuiz Capitulino void bdrv_img_create(const char *filename, const char *fmt,
3880f88e1a42SJes Sorensen                      const char *base_filename, const char *base_fmt,
3881f382d43aSMiroslav Rezanina                      char *options, uint64_t img_size, int flags,
3882f382d43aSMiroslav Rezanina                      Error **errp, bool quiet)
3883f88e1a42SJes Sorensen {
388483d0521aSChunyan Liu     QemuOptsList *create_opts = NULL;
388583d0521aSChunyan Liu     QemuOpts *opts = NULL;
388683d0521aSChunyan Liu     const char *backing_fmt, *backing_file;
388783d0521aSChunyan Liu     int64_t size;
3888f88e1a42SJes Sorensen     BlockDriver *drv, *proto_drv;
3889cc84d90fSMax Reitz     Error *local_err = NULL;
3890f88e1a42SJes Sorensen     int ret = 0;
3891f88e1a42SJes Sorensen 
3892f88e1a42SJes Sorensen     /* Find driver and parse its options */
3893f88e1a42SJes Sorensen     drv = bdrv_find_format(fmt);
3894f88e1a42SJes Sorensen     if (!drv) {
389571c79813SLuiz Capitulino         error_setg(errp, "Unknown file format '%s'", fmt);
3896d92ada22SLuiz Capitulino         return;
3897f88e1a42SJes Sorensen     }
3898f88e1a42SJes Sorensen 
3899b65a5e12SMax Reitz     proto_drv = bdrv_find_protocol(filename, true, errp);
3900f88e1a42SJes Sorensen     if (!proto_drv) {
3901d92ada22SLuiz Capitulino         return;
3902f88e1a42SJes Sorensen     }
3903f88e1a42SJes Sorensen 
3904c6149724SMax Reitz     if (!drv->create_opts) {
3905c6149724SMax Reitz         error_setg(errp, "Format driver '%s' does not support image creation",
3906c6149724SMax Reitz                    drv->format_name);
3907c6149724SMax Reitz         return;
3908c6149724SMax Reitz     }
3909c6149724SMax Reitz 
3910c6149724SMax Reitz     if (!proto_drv->create_opts) {
3911c6149724SMax Reitz         error_setg(errp, "Protocol driver '%s' does not support image creation",
3912c6149724SMax Reitz                    proto_drv->format_name);
3913c6149724SMax Reitz         return;
3914c6149724SMax Reitz     }
3915c6149724SMax Reitz 
3916c282e1fdSChunyan Liu     create_opts = qemu_opts_append(create_opts, drv->create_opts);
3917c282e1fdSChunyan Liu     create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
3918f88e1a42SJes Sorensen 
3919f88e1a42SJes Sorensen     /* Create parameter list with default values */
392083d0521aSChunyan Liu     opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
392139101f25SMarkus Armbruster     qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
3922f88e1a42SJes Sorensen 
3923f88e1a42SJes Sorensen     /* Parse -o options */
3924f88e1a42SJes Sorensen     if (options) {
3925dc523cd3SMarkus Armbruster         qemu_opts_do_parse(opts, options, NULL, &local_err);
3926dc523cd3SMarkus Armbruster         if (local_err) {
3927dc523cd3SMarkus Armbruster             error_report_err(local_err);
3928dc523cd3SMarkus Armbruster             local_err = NULL;
392983d0521aSChunyan Liu             error_setg(errp, "Invalid options for file format '%s'", fmt);
3930f88e1a42SJes Sorensen             goto out;
3931f88e1a42SJes Sorensen         }
3932f88e1a42SJes Sorensen     }
3933f88e1a42SJes Sorensen 
3934f88e1a42SJes Sorensen     if (base_filename) {
3935f43e47dbSMarkus Armbruster         qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
39366be4194bSMarkus Armbruster         if (local_err) {
393771c79813SLuiz Capitulino             error_setg(errp, "Backing file not supported for file format '%s'",
393871c79813SLuiz Capitulino                        fmt);
3939f88e1a42SJes Sorensen             goto out;
3940f88e1a42SJes Sorensen         }
3941f88e1a42SJes Sorensen     }
3942f88e1a42SJes Sorensen 
3943f88e1a42SJes Sorensen     if (base_fmt) {
3944f43e47dbSMarkus Armbruster         qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
39456be4194bSMarkus Armbruster         if (local_err) {
394671c79813SLuiz Capitulino             error_setg(errp, "Backing file format not supported for file "
394771c79813SLuiz Capitulino                              "format '%s'", fmt);
3948f88e1a42SJes Sorensen             goto out;
3949f88e1a42SJes Sorensen         }
3950f88e1a42SJes Sorensen     }
3951f88e1a42SJes Sorensen 
395283d0521aSChunyan Liu     backing_file = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
395383d0521aSChunyan Liu     if (backing_file) {
395483d0521aSChunyan Liu         if (!strcmp(filename, backing_file)) {
395571c79813SLuiz Capitulino             error_setg(errp, "Error: Trying to create an image with the "
395671c79813SLuiz Capitulino                              "same filename as the backing file");
3957792da93aSJes Sorensen             goto out;
3958792da93aSJes Sorensen         }
3959792da93aSJes Sorensen     }
3960792da93aSJes Sorensen 
396183d0521aSChunyan Liu     backing_fmt = qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT);
3962f88e1a42SJes Sorensen 
3963f88e1a42SJes Sorensen     // The size for the image must always be specified, with one exception:
3964f88e1a42SJes Sorensen     // If we are using a backing file, we can obtain the size from there
396583d0521aSChunyan Liu     size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, 0);
396683d0521aSChunyan Liu     if (size == -1) {
396783d0521aSChunyan Liu         if (backing_file) {
396866f6b814SMax Reitz             BlockDriverState *bs;
396929168018SMax Reitz             char *full_backing = g_new0(char, PATH_MAX);
397052bf1e72SMarkus Armbruster             int64_t size;
397163090dacSPaolo Bonzini             int back_flags;
3972e6641719SMax Reitz             QDict *backing_options = NULL;
397363090dacSPaolo Bonzini 
397429168018SMax Reitz             bdrv_get_full_backing_filename_from_filename(filename, backing_file,
397529168018SMax Reitz                                                          full_backing, PATH_MAX,
397629168018SMax Reitz                                                          &local_err);
397729168018SMax Reitz             if (local_err) {
397829168018SMax Reitz                 g_free(full_backing);
397929168018SMax Reitz                 goto out;
398029168018SMax Reitz             }
398129168018SMax Reitz 
398263090dacSPaolo Bonzini             /* backing files always opened read-only */
398363090dacSPaolo Bonzini             back_flags =
398463090dacSPaolo Bonzini                 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
3985f88e1a42SJes Sorensen 
3986e6641719SMax Reitz             if (backing_fmt) {
3987e6641719SMax Reitz                 backing_options = qdict_new();
3988e6641719SMax Reitz                 qdict_put(backing_options, "driver",
3989e6641719SMax Reitz                           qstring_from_str(backing_fmt));
3990e6641719SMax Reitz             }
3991e6641719SMax Reitz 
3992f67503e5SMax Reitz             bs = NULL;
3993e6641719SMax Reitz             ret = bdrv_open(&bs, full_backing, NULL, backing_options,
39946ebf9aa2SMax Reitz                             back_flags, &local_err);
399529168018SMax Reitz             g_free(full_backing);
3996f88e1a42SJes Sorensen             if (ret < 0) {
3997f88e1a42SJes Sorensen                 goto out;
3998f88e1a42SJes Sorensen             }
399952bf1e72SMarkus Armbruster             size = bdrv_getlength(bs);
400052bf1e72SMarkus Armbruster             if (size < 0) {
400152bf1e72SMarkus Armbruster                 error_setg_errno(errp, -size, "Could not get size of '%s'",
400252bf1e72SMarkus Armbruster                                  backing_file);
400352bf1e72SMarkus Armbruster                 bdrv_unref(bs);
400452bf1e72SMarkus Armbruster                 goto out;
400552bf1e72SMarkus Armbruster             }
4006f88e1a42SJes Sorensen 
400739101f25SMarkus Armbruster             qemu_opt_set_number(opts, BLOCK_OPT_SIZE, size, &error_abort);
400866f6b814SMax Reitz 
400966f6b814SMax Reitz             bdrv_unref(bs);
4010f88e1a42SJes Sorensen         } else {
401171c79813SLuiz Capitulino             error_setg(errp, "Image creation needs a size parameter");
4012f88e1a42SJes Sorensen             goto out;
4013f88e1a42SJes Sorensen         }
4014f88e1a42SJes Sorensen     }
4015f88e1a42SJes Sorensen 
4016f382d43aSMiroslav Rezanina     if (!quiet) {
4017f88e1a42SJes Sorensen         printf("Formatting '%s', fmt=%s ", filename, fmt);
401843c5d8f8SFam Zheng         qemu_opts_print(opts, " ");
4019f88e1a42SJes Sorensen         puts("");
4020f382d43aSMiroslav Rezanina     }
402183d0521aSChunyan Liu 
4022c282e1fdSChunyan Liu     ret = bdrv_create(drv, filename, opts, &local_err);
402383d0521aSChunyan Liu 
4024cc84d90fSMax Reitz     if (ret == -EFBIG) {
4025cc84d90fSMax Reitz         /* This is generally a better message than whatever the driver would
4026cc84d90fSMax Reitz          * deliver (especially because of the cluster_size_hint), since that
4027cc84d90fSMax Reitz          * is most probably not much different from "image too large". */
4028f3f4d2c0SKevin Wolf         const char *cluster_size_hint = "";
402983d0521aSChunyan Liu         if (qemu_opt_get_size(opts, BLOCK_OPT_CLUSTER_SIZE, 0)) {
4030f3f4d2c0SKevin Wolf             cluster_size_hint = " (try using a larger cluster size)";
4031f3f4d2c0SKevin Wolf         }
4032cc84d90fSMax Reitz         error_setg(errp, "The image size is too large for file format '%s'"
4033cc84d90fSMax Reitz                    "%s", fmt, cluster_size_hint);
4034cc84d90fSMax Reitz         error_free(local_err);
4035cc84d90fSMax Reitz         local_err = NULL;
4036f88e1a42SJes Sorensen     }
4037f88e1a42SJes Sorensen 
4038f88e1a42SJes Sorensen out:
403983d0521aSChunyan Liu     qemu_opts_del(opts);
404083d0521aSChunyan Liu     qemu_opts_free(create_opts);
404184d18f06SMarkus Armbruster     if (local_err) {
4042cc84d90fSMax Reitz         error_propagate(errp, local_err);
4043cc84d90fSMax Reitz     }
4044f88e1a42SJes Sorensen }
404585d126f3SStefan Hajnoczi 
404685d126f3SStefan Hajnoczi AioContext *bdrv_get_aio_context(BlockDriverState *bs)
404785d126f3SStefan Hajnoczi {
4048dcd04228SStefan Hajnoczi     return bs->aio_context;
4049dcd04228SStefan Hajnoczi }
4050dcd04228SStefan Hajnoczi 
4051dcd04228SStefan Hajnoczi void bdrv_detach_aio_context(BlockDriverState *bs)
4052dcd04228SStefan Hajnoczi {
405333384421SMax Reitz     BdrvAioNotifier *baf;
405433384421SMax Reitz 
4055dcd04228SStefan Hajnoczi     if (!bs->drv) {
4056dcd04228SStefan Hajnoczi         return;
4057dcd04228SStefan Hajnoczi     }
4058dcd04228SStefan Hajnoczi 
405933384421SMax Reitz     QLIST_FOREACH(baf, &bs->aio_notifiers, list) {
406033384421SMax Reitz         baf->detach_aio_context(baf->opaque);
406133384421SMax Reitz     }
406233384421SMax Reitz 
4063a0d64a61SAlberto Garcia     if (bs->throttle_state) {
40640e5b0a2dSBenoît Canet         throttle_timers_detach_aio_context(&bs->throttle_timers);
406513af91ebSStefan Hajnoczi     }
4066dcd04228SStefan Hajnoczi     if (bs->drv->bdrv_detach_aio_context) {
4067dcd04228SStefan Hajnoczi         bs->drv->bdrv_detach_aio_context(bs);
4068dcd04228SStefan Hajnoczi     }
4069dcd04228SStefan Hajnoczi     if (bs->file) {
40709a4f4c31SKevin Wolf         bdrv_detach_aio_context(bs->file->bs);
4071dcd04228SStefan Hajnoczi     }
4072760e0063SKevin Wolf     if (bs->backing) {
4073760e0063SKevin Wolf         bdrv_detach_aio_context(bs->backing->bs);
4074dcd04228SStefan Hajnoczi     }
4075dcd04228SStefan Hajnoczi 
4076dcd04228SStefan Hajnoczi     bs->aio_context = NULL;
4077dcd04228SStefan Hajnoczi }
4078dcd04228SStefan Hajnoczi 
4079dcd04228SStefan Hajnoczi void bdrv_attach_aio_context(BlockDriverState *bs,
4080dcd04228SStefan Hajnoczi                              AioContext *new_context)
4081dcd04228SStefan Hajnoczi {
408233384421SMax Reitz     BdrvAioNotifier *ban;
408333384421SMax Reitz 
4084dcd04228SStefan Hajnoczi     if (!bs->drv) {
4085dcd04228SStefan Hajnoczi         return;
4086dcd04228SStefan Hajnoczi     }
4087dcd04228SStefan Hajnoczi 
4088dcd04228SStefan Hajnoczi     bs->aio_context = new_context;
4089dcd04228SStefan Hajnoczi 
4090760e0063SKevin Wolf     if (bs->backing) {
4091760e0063SKevin Wolf         bdrv_attach_aio_context(bs->backing->bs, new_context);
4092dcd04228SStefan Hajnoczi     }
4093dcd04228SStefan Hajnoczi     if (bs->file) {
40949a4f4c31SKevin Wolf         bdrv_attach_aio_context(bs->file->bs, new_context);
4095dcd04228SStefan Hajnoczi     }
4096dcd04228SStefan Hajnoczi     if (bs->drv->bdrv_attach_aio_context) {
4097dcd04228SStefan Hajnoczi         bs->drv->bdrv_attach_aio_context(bs, new_context);
4098dcd04228SStefan Hajnoczi     }
4099a0d64a61SAlberto Garcia     if (bs->throttle_state) {
41000e5b0a2dSBenoît Canet         throttle_timers_attach_aio_context(&bs->throttle_timers, new_context);
410113af91ebSStefan Hajnoczi     }
410233384421SMax Reitz 
410333384421SMax Reitz     QLIST_FOREACH(ban, &bs->aio_notifiers, list) {
410433384421SMax Reitz         ban->attached_aio_context(new_context, ban->opaque);
410533384421SMax Reitz     }
4106dcd04228SStefan Hajnoczi }
4107dcd04228SStefan Hajnoczi 
4108dcd04228SStefan Hajnoczi void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
4109dcd04228SStefan Hajnoczi {
411053ec73e2SFam Zheng     bdrv_drain(bs); /* ensure there are no in-flight requests */
4111dcd04228SStefan Hajnoczi 
4112dcd04228SStefan Hajnoczi     bdrv_detach_aio_context(bs);
4113dcd04228SStefan Hajnoczi 
4114dcd04228SStefan Hajnoczi     /* This function executes in the old AioContext so acquire the new one in
4115dcd04228SStefan Hajnoczi      * case it runs in a different thread.
4116dcd04228SStefan Hajnoczi      */
4117dcd04228SStefan Hajnoczi     aio_context_acquire(new_context);
4118dcd04228SStefan Hajnoczi     bdrv_attach_aio_context(bs, new_context);
4119dcd04228SStefan Hajnoczi     aio_context_release(new_context);
412085d126f3SStefan Hajnoczi }
4121d616b224SStefan Hajnoczi 
412233384421SMax Reitz void bdrv_add_aio_context_notifier(BlockDriverState *bs,
412333384421SMax Reitz         void (*attached_aio_context)(AioContext *new_context, void *opaque),
412433384421SMax Reitz         void (*detach_aio_context)(void *opaque), void *opaque)
412533384421SMax Reitz {
412633384421SMax Reitz     BdrvAioNotifier *ban = g_new(BdrvAioNotifier, 1);
412733384421SMax Reitz     *ban = (BdrvAioNotifier){
412833384421SMax Reitz         .attached_aio_context = attached_aio_context,
412933384421SMax Reitz         .detach_aio_context   = detach_aio_context,
413033384421SMax Reitz         .opaque               = opaque
413133384421SMax Reitz     };
413233384421SMax Reitz 
413333384421SMax Reitz     QLIST_INSERT_HEAD(&bs->aio_notifiers, ban, list);
413433384421SMax Reitz }
413533384421SMax Reitz 
413633384421SMax Reitz void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
413733384421SMax Reitz                                       void (*attached_aio_context)(AioContext *,
413833384421SMax Reitz                                                                    void *),
413933384421SMax Reitz                                       void (*detach_aio_context)(void *),
414033384421SMax Reitz                                       void *opaque)
414133384421SMax Reitz {
414233384421SMax Reitz     BdrvAioNotifier *ban, *ban_next;
414333384421SMax Reitz 
414433384421SMax Reitz     QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
414533384421SMax Reitz         if (ban->attached_aio_context == attached_aio_context &&
414633384421SMax Reitz             ban->detach_aio_context   == detach_aio_context   &&
414733384421SMax Reitz             ban->opaque               == opaque)
414833384421SMax Reitz         {
414933384421SMax Reitz             QLIST_REMOVE(ban, list);
415033384421SMax Reitz             g_free(ban);
415133384421SMax Reitz 
415233384421SMax Reitz             return;
415333384421SMax Reitz         }
415433384421SMax Reitz     }
415533384421SMax Reitz 
415633384421SMax Reitz     abort();
415733384421SMax Reitz }
415833384421SMax Reitz 
415977485434SMax Reitz int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
41608b13976dSMax Reitz                        BlockDriverAmendStatusCB *status_cb, void *cb_opaque)
41616f176b48SMax Reitz {
4162c282e1fdSChunyan Liu     if (!bs->drv->bdrv_amend_options) {
41636f176b48SMax Reitz         return -ENOTSUP;
41646f176b48SMax Reitz     }
41658b13976dSMax Reitz     return bs->drv->bdrv_amend_options(bs, opts, status_cb, cb_opaque);
41666f176b48SMax Reitz }
4167f6186f49SBenoît Canet 
4168b5042a36SBenoît Canet /* This function will be called by the bdrv_recurse_is_first_non_filter method
4169b5042a36SBenoît Canet  * of block filter and by bdrv_is_first_non_filter.
4170b5042a36SBenoît Canet  * It is used to test if the given bs is the candidate or recurse more in the
4171b5042a36SBenoît Canet  * node graph.
4172212a5a8fSBenoît Canet  */
4173212a5a8fSBenoît Canet bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
4174212a5a8fSBenoît Canet                                       BlockDriverState *candidate)
4175f6186f49SBenoît Canet {
4176b5042a36SBenoît Canet     /* return false if basic checks fails */
4177b5042a36SBenoît Canet     if (!bs || !bs->drv) {
4178b5042a36SBenoît Canet         return false;
4179b5042a36SBenoît Canet     }
4180b5042a36SBenoît Canet 
4181b5042a36SBenoît Canet     /* the code reached a non block filter driver -> check if the bs is
4182b5042a36SBenoît Canet      * the same as the candidate. It's the recursion termination condition.
4183b5042a36SBenoît Canet      */
4184b5042a36SBenoît Canet     if (!bs->drv->is_filter) {
4185b5042a36SBenoît Canet         return bs == candidate;
4186b5042a36SBenoît Canet     }
4187b5042a36SBenoît Canet     /* Down this path the driver is a block filter driver */
4188b5042a36SBenoît Canet 
4189b5042a36SBenoît Canet     /* If the block filter recursion method is defined use it to recurse down
4190b5042a36SBenoît Canet      * the node graph.
4191b5042a36SBenoît Canet      */
4192b5042a36SBenoît Canet     if (bs->drv->bdrv_recurse_is_first_non_filter) {
4193212a5a8fSBenoît Canet         return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate);
4194212a5a8fSBenoît Canet     }
4195212a5a8fSBenoît Canet 
4196b5042a36SBenoît Canet     /* the driver is a block filter but don't allow to recurse -> return false
4197b5042a36SBenoît Canet      */
4198b5042a36SBenoît Canet     return false;
4199212a5a8fSBenoît Canet }
4200212a5a8fSBenoît Canet 
4201212a5a8fSBenoît Canet /* This function checks if the candidate is the first non filter bs down it's
4202212a5a8fSBenoît Canet  * bs chain. Since we don't have pointers to parents it explore all bs chains
4203212a5a8fSBenoît Canet  * from the top. Some filters can choose not to pass down the recursion.
4204212a5a8fSBenoît Canet  */
4205212a5a8fSBenoît Canet bool bdrv_is_first_non_filter(BlockDriverState *candidate)
4206212a5a8fSBenoît Canet {
4207212a5a8fSBenoît Canet     BlockDriverState *bs;
4208212a5a8fSBenoît Canet 
4209212a5a8fSBenoît Canet     /* walk down the bs forest recursively */
4210212a5a8fSBenoît Canet     QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
4211212a5a8fSBenoît Canet         bool perm;
4212212a5a8fSBenoît Canet 
4213b5042a36SBenoît Canet         /* try to recurse in this top level bs */
4214e6dc8a1fSKevin Wolf         perm = bdrv_recurse_is_first_non_filter(bs, candidate);
4215212a5a8fSBenoît Canet 
4216212a5a8fSBenoît Canet         /* candidate is the first non filter */
4217212a5a8fSBenoît Canet         if (perm) {
4218212a5a8fSBenoît Canet             return true;
4219212a5a8fSBenoît Canet         }
4220212a5a8fSBenoît Canet     }
4221212a5a8fSBenoît Canet 
4222212a5a8fSBenoît Canet     return false;
4223f6186f49SBenoît Canet }
422409158f00SBenoît Canet 
4225e12f3784SWen Congyang BlockDriverState *check_to_replace_node(BlockDriverState *parent_bs,
4226e12f3784SWen Congyang                                         const char *node_name, Error **errp)
422709158f00SBenoît Canet {
422809158f00SBenoît Canet     BlockDriverState *to_replace_bs = bdrv_find_node(node_name);
42295a7e7a0bSStefan Hajnoczi     AioContext *aio_context;
42305a7e7a0bSStefan Hajnoczi 
423109158f00SBenoît Canet     if (!to_replace_bs) {
423209158f00SBenoît Canet         error_setg(errp, "Node name '%s' not found", node_name);
423309158f00SBenoît Canet         return NULL;
423409158f00SBenoît Canet     }
423509158f00SBenoît Canet 
42365a7e7a0bSStefan Hajnoczi     aio_context = bdrv_get_aio_context(to_replace_bs);
42375a7e7a0bSStefan Hajnoczi     aio_context_acquire(aio_context);
42385a7e7a0bSStefan Hajnoczi 
423909158f00SBenoît Canet     if (bdrv_op_is_blocked(to_replace_bs, BLOCK_OP_TYPE_REPLACE, errp)) {
42405a7e7a0bSStefan Hajnoczi         to_replace_bs = NULL;
42415a7e7a0bSStefan Hajnoczi         goto out;
424209158f00SBenoît Canet     }
424309158f00SBenoît Canet 
424409158f00SBenoît Canet     /* We don't want arbitrary node of the BDS chain to be replaced only the top
424509158f00SBenoît Canet      * most non filter in order to prevent data corruption.
424609158f00SBenoît Canet      * Another benefit is that this tests exclude backing files which are
424709158f00SBenoît Canet      * blocked by the backing blockers.
424809158f00SBenoît Canet      */
4249e12f3784SWen Congyang     if (!bdrv_recurse_is_first_non_filter(parent_bs, to_replace_bs)) {
425009158f00SBenoît Canet         error_setg(errp, "Only top most non filter can be replaced");
42515a7e7a0bSStefan Hajnoczi         to_replace_bs = NULL;
42525a7e7a0bSStefan Hajnoczi         goto out;
425309158f00SBenoît Canet     }
425409158f00SBenoît Canet 
42555a7e7a0bSStefan Hajnoczi out:
42565a7e7a0bSStefan Hajnoczi     aio_context_release(aio_context);
425709158f00SBenoît Canet     return to_replace_bs;
425809158f00SBenoît Canet }
4259448ad91dSMing Lei 
426091af7014SMax Reitz static bool append_open_options(QDict *d, BlockDriverState *bs)
426191af7014SMax Reitz {
426291af7014SMax Reitz     const QDictEntry *entry;
42639e700c1aSKevin Wolf     QemuOptDesc *desc;
4264260fecf1SKevin Wolf     BdrvChild *child;
426591af7014SMax Reitz     bool found_any = false;
4266260fecf1SKevin Wolf     const char *p;
426791af7014SMax Reitz 
426891af7014SMax Reitz     for (entry = qdict_first(bs->options); entry;
426991af7014SMax Reitz          entry = qdict_next(bs->options, entry))
427091af7014SMax Reitz     {
4271260fecf1SKevin Wolf         /* Exclude options for children */
4272260fecf1SKevin Wolf         QLIST_FOREACH(child, &bs->children, next) {
4273260fecf1SKevin Wolf             if (strstart(qdict_entry_key(entry), child->name, &p)
4274260fecf1SKevin Wolf                 && (!*p || *p == '.'))
4275260fecf1SKevin Wolf             {
4276260fecf1SKevin Wolf                 break;
4277260fecf1SKevin Wolf             }
4278260fecf1SKevin Wolf         }
4279260fecf1SKevin Wolf         if (child) {
42809e700c1aSKevin Wolf             continue;
42819e700c1aSKevin Wolf         }
42829e700c1aSKevin Wolf 
42839e700c1aSKevin Wolf         /* And exclude all non-driver-specific options */
42849e700c1aSKevin Wolf         for (desc = bdrv_runtime_opts.desc; desc->name; desc++) {
42859e700c1aSKevin Wolf             if (!strcmp(qdict_entry_key(entry), desc->name)) {
42869e700c1aSKevin Wolf                 break;
42879e700c1aSKevin Wolf             }
42889e700c1aSKevin Wolf         }
42899e700c1aSKevin Wolf         if (desc->name) {
42909e700c1aSKevin Wolf             continue;
42919e700c1aSKevin Wolf         }
42929e700c1aSKevin Wolf 
429391af7014SMax Reitz         qobject_incref(qdict_entry_value(entry));
429491af7014SMax Reitz         qdict_put_obj(d, qdict_entry_key(entry), qdict_entry_value(entry));
429591af7014SMax Reitz         found_any = true;
429691af7014SMax Reitz     }
429791af7014SMax Reitz 
429891af7014SMax Reitz     return found_any;
429991af7014SMax Reitz }
430091af7014SMax Reitz 
430191af7014SMax Reitz /* Updates the following BDS fields:
430291af7014SMax Reitz  *  - exact_filename: A filename which may be used for opening a block device
430391af7014SMax Reitz  *                    which (mostly) equals the given BDS (even without any
430491af7014SMax Reitz  *                    other options; so reading and writing must return the same
430591af7014SMax Reitz  *                    results, but caching etc. may be different)
430691af7014SMax Reitz  *  - full_open_options: Options which, when given when opening a block device
430791af7014SMax Reitz  *                       (without a filename), result in a BDS (mostly)
430891af7014SMax Reitz  *                       equalling the given one
430991af7014SMax Reitz  *  - filename: If exact_filename is set, it is copied here. Otherwise,
431091af7014SMax Reitz  *              full_open_options is converted to a JSON object, prefixed with
431191af7014SMax Reitz  *              "json:" (for use through the JSON pseudo protocol) and put here.
431291af7014SMax Reitz  */
431391af7014SMax Reitz void bdrv_refresh_filename(BlockDriverState *bs)
431491af7014SMax Reitz {
431591af7014SMax Reitz     BlockDriver *drv = bs->drv;
431691af7014SMax Reitz     QDict *opts;
431791af7014SMax Reitz 
431891af7014SMax Reitz     if (!drv) {
431991af7014SMax Reitz         return;
432091af7014SMax Reitz     }
432191af7014SMax Reitz 
432291af7014SMax Reitz     /* This BDS's file name will most probably depend on its file's name, so
432391af7014SMax Reitz      * refresh that first */
432491af7014SMax Reitz     if (bs->file) {
43259a4f4c31SKevin Wolf         bdrv_refresh_filename(bs->file->bs);
432691af7014SMax Reitz     }
432791af7014SMax Reitz 
432891af7014SMax Reitz     if (drv->bdrv_refresh_filename) {
432991af7014SMax Reitz         /* Obsolete information is of no use here, so drop the old file name
433091af7014SMax Reitz          * information before refreshing it */
433191af7014SMax Reitz         bs->exact_filename[0] = '\0';
433291af7014SMax Reitz         if (bs->full_open_options) {
433391af7014SMax Reitz             QDECREF(bs->full_open_options);
433491af7014SMax Reitz             bs->full_open_options = NULL;
433591af7014SMax Reitz         }
433691af7014SMax Reitz 
43374cdd01d3SKevin Wolf         opts = qdict_new();
43384cdd01d3SKevin Wolf         append_open_options(opts, bs);
43394cdd01d3SKevin Wolf         drv->bdrv_refresh_filename(bs, opts);
43404cdd01d3SKevin Wolf         QDECREF(opts);
434191af7014SMax Reitz     } else if (bs->file) {
434291af7014SMax Reitz         /* Try to reconstruct valid information from the underlying file */
434391af7014SMax Reitz         bool has_open_options;
434491af7014SMax Reitz 
434591af7014SMax Reitz         bs->exact_filename[0] = '\0';
434691af7014SMax Reitz         if (bs->full_open_options) {
434791af7014SMax Reitz             QDECREF(bs->full_open_options);
434891af7014SMax Reitz             bs->full_open_options = NULL;
434991af7014SMax Reitz         }
435091af7014SMax Reitz 
435191af7014SMax Reitz         opts = qdict_new();
435291af7014SMax Reitz         has_open_options = append_open_options(opts, bs);
435391af7014SMax Reitz 
435491af7014SMax Reitz         /* If no specific options have been given for this BDS, the filename of
435591af7014SMax Reitz          * the underlying file should suffice for this one as well */
43569a4f4c31SKevin Wolf         if (bs->file->bs->exact_filename[0] && !has_open_options) {
43579a4f4c31SKevin Wolf             strcpy(bs->exact_filename, bs->file->bs->exact_filename);
435891af7014SMax Reitz         }
435991af7014SMax Reitz         /* Reconstructing the full options QDict is simple for most format block
436091af7014SMax Reitz          * drivers, as long as the full options are known for the underlying
436191af7014SMax Reitz          * file BDS. The full options QDict of that file BDS should somehow
436291af7014SMax Reitz          * contain a representation of the filename, therefore the following
436391af7014SMax Reitz          * suffices without querying the (exact_)filename of this BDS. */
43649a4f4c31SKevin Wolf         if (bs->file->bs->full_open_options) {
436591af7014SMax Reitz             qdict_put_obj(opts, "driver",
436691af7014SMax Reitz                           QOBJECT(qstring_from_str(drv->format_name)));
43679a4f4c31SKevin Wolf             QINCREF(bs->file->bs->full_open_options);
43689a4f4c31SKevin Wolf             qdict_put_obj(opts, "file",
43699a4f4c31SKevin Wolf                           QOBJECT(bs->file->bs->full_open_options));
437091af7014SMax Reitz 
437191af7014SMax Reitz             bs->full_open_options = opts;
437291af7014SMax Reitz         } else {
437391af7014SMax Reitz             QDECREF(opts);
437491af7014SMax Reitz         }
437591af7014SMax Reitz     } else if (!bs->full_open_options && qdict_size(bs->options)) {
437691af7014SMax Reitz         /* There is no underlying file BDS (at least referenced by BDS.file),
437791af7014SMax Reitz          * so the full options QDict should be equal to the options given
437891af7014SMax Reitz          * specifically for this block device when it was opened (plus the
437991af7014SMax Reitz          * driver specification).
438091af7014SMax Reitz          * Because those options don't change, there is no need to update
438191af7014SMax Reitz          * full_open_options when it's already set. */
438291af7014SMax Reitz 
438391af7014SMax Reitz         opts = qdict_new();
438491af7014SMax Reitz         append_open_options(opts, bs);
438591af7014SMax Reitz         qdict_put_obj(opts, "driver",
438691af7014SMax Reitz                       QOBJECT(qstring_from_str(drv->format_name)));
438791af7014SMax Reitz 
438891af7014SMax Reitz         if (bs->exact_filename[0]) {
438991af7014SMax Reitz             /* This may not work for all block protocol drivers (some may
439091af7014SMax Reitz              * require this filename to be parsed), but we have to find some
439191af7014SMax Reitz              * default solution here, so just include it. If some block driver
439291af7014SMax Reitz              * does not support pure options without any filename at all or
439391af7014SMax Reitz              * needs some special format of the options QDict, it needs to
439491af7014SMax Reitz              * implement the driver-specific bdrv_refresh_filename() function.
439591af7014SMax Reitz              */
439691af7014SMax Reitz             qdict_put_obj(opts, "filename",
439791af7014SMax Reitz                           QOBJECT(qstring_from_str(bs->exact_filename)));
439891af7014SMax Reitz         }
439991af7014SMax Reitz 
440091af7014SMax Reitz         bs->full_open_options = opts;
440191af7014SMax Reitz     }
440291af7014SMax Reitz 
440391af7014SMax Reitz     if (bs->exact_filename[0]) {
440491af7014SMax Reitz         pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename);
440591af7014SMax Reitz     } else if (bs->full_open_options) {
440691af7014SMax Reitz         QString *json = qobject_to_json(QOBJECT(bs->full_open_options));
440791af7014SMax Reitz         snprintf(bs->filename, sizeof(bs->filename), "json:%s",
440891af7014SMax Reitz                  qstring_get_str(json));
440991af7014SMax Reitz         QDECREF(json);
441091af7014SMax Reitz     }
441191af7014SMax Reitz }
4412