xref: /openbmc/qemu/block.c (revision 27ccdd52598290f0f8b58be56e235aff7aebfaf3)
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"
256d519a5fSStefan Hajnoczi #include "trace.h"
26737e150eSPaolo Bonzini #include "block/block_int.h"
27737e150eSPaolo Bonzini #include "block/blockjob.h"
28d49b6836SMarkus Armbruster #include "qemu/error-report.h"
291de7afc9SPaolo Bonzini #include "qemu/module.h"
30cc7a8ea7SMarkus Armbruster #include "qapi/qmp/qerror.h"
3191a097e7SKevin Wolf #include "qapi/qmp/qbool.h"
327b1b5d19SPaolo Bonzini #include "qapi/qmp/qjson.h"
33bfb197e0SMarkus Armbruster #include "sysemu/block-backend.h"
349c17d615SPaolo Bonzini #include "sysemu/sysemu.h"
351de7afc9SPaolo Bonzini #include "qemu/notify.h"
3610817bf0SDaniel P. Berrange #include "qemu/coroutine.h"
37c13163fbSBenoît Canet #include "block/qapi.h"
38b2023818SLuiz Capitulino #include "qmp-commands.h"
391de7afc9SPaolo Bonzini #include "qemu/timer.h"
40a5ee7bd4SWenchao Xia #include "qapi-event.h"
41db628338SAlberto Garcia #include "block/throttle-groups.h"
42f348b6d1SVeronia Bahaa #include "qemu/cutils.h"
43f348b6d1SVeronia Bahaa #include "qemu/id.h"
44fc01f7e7Sbellard 
4571e72a19SJuan Quintela #ifdef CONFIG_BSD
467674e7bfSbellard #include <sys/ioctl.h>
4772cf2d4fSBlue Swirl #include <sys/queue.h>
48c5e97233Sblueswir1 #ifndef __DragonFly__
497674e7bfSbellard #include <sys/disk.h>
507674e7bfSbellard #endif
51c5e97233Sblueswir1 #endif
527674e7bfSbellard 
5349dc768dSaliguori #ifdef _WIN32
5449dc768dSaliguori #include <windows.h>
5549dc768dSaliguori #endif
5649dc768dSaliguori 
571c9805a3SStefan Hajnoczi #define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */
581c9805a3SStefan Hajnoczi 
59dc364f4cSBenoît Canet static QTAILQ_HEAD(, BlockDriverState) graph_bdrv_states =
60dc364f4cSBenoît Canet     QTAILQ_HEAD_INITIALIZER(graph_bdrv_states);
61dc364f4cSBenoît Canet 
622c1d04e0SMax Reitz static QTAILQ_HEAD(, BlockDriverState) all_bdrv_states =
632c1d04e0SMax Reitz     QTAILQ_HEAD_INITIALIZER(all_bdrv_states);
642c1d04e0SMax Reitz 
658a22f02aSStefan Hajnoczi static QLIST_HEAD(, BlockDriver) bdrv_drivers =
668a22f02aSStefan Hajnoczi     QLIST_HEAD_INITIALIZER(bdrv_drivers);
67ea2384d3Sbellard 
68f3930ed0SKevin Wolf static int bdrv_open_inherit(BlockDriverState **pbs, const char *filename,
69f3930ed0SKevin Wolf                              const char *reference, QDict *options, int flags,
70f3930ed0SKevin Wolf                              BlockDriverState *parent,
71ce343771SMax Reitz                              const BdrvChildRole *child_role, Error **errp);
72f3930ed0SKevin Wolf 
73eb852011SMarkus Armbruster /* If non-zero, use only whitelisted block drivers */
74eb852011SMarkus Armbruster static int use_bdrv_whitelist;
75eb852011SMarkus Armbruster 
7664dff520SMax Reitz static void bdrv_close(BlockDriverState *bs);
7764dff520SMax Reitz 
789e0b22f4SStefan Hajnoczi #ifdef _WIN32
799e0b22f4SStefan Hajnoczi static int is_windows_drive_prefix(const char *filename)
809e0b22f4SStefan Hajnoczi {
819e0b22f4SStefan Hajnoczi     return (((filename[0] >= 'a' && filename[0] <= 'z') ||
829e0b22f4SStefan Hajnoczi              (filename[0] >= 'A' && filename[0] <= 'Z')) &&
839e0b22f4SStefan Hajnoczi             filename[1] == ':');
849e0b22f4SStefan Hajnoczi }
859e0b22f4SStefan Hajnoczi 
869e0b22f4SStefan Hajnoczi int is_windows_drive(const char *filename)
879e0b22f4SStefan Hajnoczi {
889e0b22f4SStefan Hajnoczi     if (is_windows_drive_prefix(filename) &&
899e0b22f4SStefan Hajnoczi         filename[2] == '\0')
909e0b22f4SStefan Hajnoczi         return 1;
919e0b22f4SStefan Hajnoczi     if (strstart(filename, "\\\\.\\", NULL) ||
929e0b22f4SStefan Hajnoczi         strstart(filename, "//./", NULL))
939e0b22f4SStefan Hajnoczi         return 1;
949e0b22f4SStefan Hajnoczi     return 0;
959e0b22f4SStefan Hajnoczi }
969e0b22f4SStefan Hajnoczi #endif
979e0b22f4SStefan Hajnoczi 
98339064d5SKevin Wolf size_t bdrv_opt_mem_align(BlockDriverState *bs)
99339064d5SKevin Wolf {
100339064d5SKevin Wolf     if (!bs || !bs->drv) {
101459b4e66SDenis V. Lunev         /* page size or 4k (hdd sector size) should be on the safe side */
102459b4e66SDenis V. Lunev         return MAX(4096, getpagesize());
103339064d5SKevin Wolf     }
104339064d5SKevin Wolf 
105339064d5SKevin Wolf     return bs->bl.opt_mem_alignment;
106339064d5SKevin Wolf }
107339064d5SKevin Wolf 
1084196d2f0SDenis V. Lunev size_t bdrv_min_mem_align(BlockDriverState *bs)
1094196d2f0SDenis V. Lunev {
1104196d2f0SDenis V. Lunev     if (!bs || !bs->drv) {
111459b4e66SDenis V. Lunev         /* page size or 4k (hdd sector size) should be on the safe side */
112459b4e66SDenis V. Lunev         return MAX(4096, getpagesize());
1134196d2f0SDenis V. Lunev     }
1144196d2f0SDenis V. Lunev 
1154196d2f0SDenis V. Lunev     return bs->bl.min_mem_alignment;
1164196d2f0SDenis V. Lunev }
1174196d2f0SDenis V. Lunev 
1189e0b22f4SStefan Hajnoczi /* check if the path starts with "<protocol>:" */
1195c98415bSMax Reitz int path_has_protocol(const char *path)
1209e0b22f4SStefan Hajnoczi {
121947995c0SPaolo Bonzini     const char *p;
122947995c0SPaolo Bonzini 
1239e0b22f4SStefan Hajnoczi #ifdef _WIN32
1249e0b22f4SStefan Hajnoczi     if (is_windows_drive(path) ||
1259e0b22f4SStefan Hajnoczi         is_windows_drive_prefix(path)) {
1269e0b22f4SStefan Hajnoczi         return 0;
1279e0b22f4SStefan Hajnoczi     }
128947995c0SPaolo Bonzini     p = path + strcspn(path, ":/\\");
129947995c0SPaolo Bonzini #else
130947995c0SPaolo Bonzini     p = path + strcspn(path, ":/");
1319e0b22f4SStefan Hajnoczi #endif
1329e0b22f4SStefan Hajnoczi 
133947995c0SPaolo Bonzini     return *p == ':';
1349e0b22f4SStefan Hajnoczi }
1359e0b22f4SStefan Hajnoczi 
13683f64091Sbellard int path_is_absolute(const char *path)
13783f64091Sbellard {
13821664424Sbellard #ifdef _WIN32
13921664424Sbellard     /* specific case for names like: "\\.\d:" */
140f53f4da9SPaolo Bonzini     if (is_windows_drive(path) || is_windows_drive_prefix(path)) {
14121664424Sbellard         return 1;
142f53f4da9SPaolo Bonzini     }
143f53f4da9SPaolo Bonzini     return (*path == '/' || *path == '\\');
1443b9f94e1Sbellard #else
145f53f4da9SPaolo Bonzini     return (*path == '/');
1463b9f94e1Sbellard #endif
14783f64091Sbellard }
14883f64091Sbellard 
14983f64091Sbellard /* if filename is absolute, just copy it to dest. Otherwise, build a
15083f64091Sbellard    path to it by considering it is relative to base_path. URL are
15183f64091Sbellard    supported. */
15283f64091Sbellard void path_combine(char *dest, int dest_size,
15383f64091Sbellard                   const char *base_path,
15483f64091Sbellard                   const char *filename)
15583f64091Sbellard {
15683f64091Sbellard     const char *p, *p1;
15783f64091Sbellard     int len;
15883f64091Sbellard 
15983f64091Sbellard     if (dest_size <= 0)
16083f64091Sbellard         return;
16183f64091Sbellard     if (path_is_absolute(filename)) {
16283f64091Sbellard         pstrcpy(dest, dest_size, filename);
16383f64091Sbellard     } else {
16483f64091Sbellard         p = strchr(base_path, ':');
16583f64091Sbellard         if (p)
16683f64091Sbellard             p++;
16783f64091Sbellard         else
16883f64091Sbellard             p = base_path;
1693b9f94e1Sbellard         p1 = strrchr(base_path, '/');
1703b9f94e1Sbellard #ifdef _WIN32
1713b9f94e1Sbellard         {
1723b9f94e1Sbellard             const char *p2;
1733b9f94e1Sbellard             p2 = strrchr(base_path, '\\');
1743b9f94e1Sbellard             if (!p1 || p2 > p1)
1753b9f94e1Sbellard                 p1 = p2;
1763b9f94e1Sbellard         }
1773b9f94e1Sbellard #endif
17883f64091Sbellard         if (p1)
17983f64091Sbellard             p1++;
18083f64091Sbellard         else
18183f64091Sbellard             p1 = base_path;
18283f64091Sbellard         if (p1 > p)
18383f64091Sbellard             p = p1;
18483f64091Sbellard         len = p - base_path;
18583f64091Sbellard         if (len > dest_size - 1)
18683f64091Sbellard             len = dest_size - 1;
18783f64091Sbellard         memcpy(dest, base_path, len);
18883f64091Sbellard         dest[len] = '\0';
18983f64091Sbellard         pstrcat(dest, dest_size, filename);
19083f64091Sbellard     }
19183f64091Sbellard }
19283f64091Sbellard 
1930a82855aSMax Reitz void bdrv_get_full_backing_filename_from_filename(const char *backed,
1940a82855aSMax Reitz                                                   const char *backing,
1959f07429eSMax Reitz                                                   char *dest, size_t sz,
1969f07429eSMax Reitz                                                   Error **errp)
1970a82855aSMax Reitz {
1989f07429eSMax Reitz     if (backing[0] == '\0' || path_has_protocol(backing) ||
1999f07429eSMax Reitz         path_is_absolute(backing))
2009f07429eSMax Reitz     {
2010a82855aSMax Reitz         pstrcpy(dest, sz, backing);
2029f07429eSMax Reitz     } else if (backed[0] == '\0' || strstart(backed, "json:", NULL)) {
2039f07429eSMax Reitz         error_setg(errp, "Cannot use relative backing file names for '%s'",
2049f07429eSMax Reitz                    backed);
2050a82855aSMax Reitz     } else {
2060a82855aSMax Reitz         path_combine(dest, sz, backed, backing);
2070a82855aSMax Reitz     }
2080a82855aSMax Reitz }
2090a82855aSMax Reitz 
2109f07429eSMax Reitz void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz,
2119f07429eSMax Reitz                                     Error **errp)
212dc5a1371SPaolo Bonzini {
2139f07429eSMax Reitz     char *backed = bs->exact_filename[0] ? bs->exact_filename : bs->filename;
2149f07429eSMax Reitz 
2159f07429eSMax Reitz     bdrv_get_full_backing_filename_from_filename(backed, bs->backing_file,
2169f07429eSMax Reitz                                                  dest, sz, errp);
217dc5a1371SPaolo Bonzini }
218dc5a1371SPaolo Bonzini 
2190eb7217eSStefan Hajnoczi void bdrv_register(BlockDriver *bdrv)
2200eb7217eSStefan Hajnoczi {
2218a22f02aSStefan Hajnoczi     QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
222ea2384d3Sbellard }
223b338082bSbellard 
2247f06d47eSMarkus Armbruster BlockDriverState *bdrv_new_root(void)
225fc01f7e7Sbellard {
2269aaf28c6SMax Reitz     return bdrv_new();
227e4e9986bSMarkus Armbruster }
228e4e9986bSMarkus Armbruster 
229e4e9986bSMarkus Armbruster BlockDriverState *bdrv_new(void)
230e4e9986bSMarkus Armbruster {
231e4e9986bSMarkus Armbruster     BlockDriverState *bs;
232e4e9986bSMarkus Armbruster     int i;
233e4e9986bSMarkus Armbruster 
2345839e53bSMarkus Armbruster     bs = g_new0(BlockDriverState, 1);
235e4654d2dSFam Zheng     QLIST_INIT(&bs->dirty_bitmaps);
236fbe40ff7SFam Zheng     for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
237fbe40ff7SFam Zheng         QLIST_INIT(&bs->op_blockers[i]);
238fbe40ff7SFam Zheng     }
239d616b224SStefan Hajnoczi     notifier_with_return_list_init(&bs->before_write_notifiers);
2409fcb0251SFam Zheng     bs->refcnt = 1;
241dcd04228SStefan Hajnoczi     bs->aio_context = qemu_get_aio_context();
242d7d512f6SPaolo Bonzini 
2432c1d04e0SMax Reitz     QTAILQ_INSERT_TAIL(&all_bdrv_states, bs, bs_list);
2442c1d04e0SMax Reitz 
245b338082bSbellard     return bs;
246b338082bSbellard }
247b338082bSbellard 
248ea2384d3Sbellard BlockDriver *bdrv_find_format(const char *format_name)
249ea2384d3Sbellard {
250ea2384d3Sbellard     BlockDriver *drv1;
2518a22f02aSStefan Hajnoczi     QLIST_FOREACH(drv1, &bdrv_drivers, list) {
2528a22f02aSStefan Hajnoczi         if (!strcmp(drv1->format_name, format_name)) {
253ea2384d3Sbellard             return drv1;
254ea2384d3Sbellard         }
2558a22f02aSStefan Hajnoczi     }
256ea2384d3Sbellard     return NULL;
257ea2384d3Sbellard }
258ea2384d3Sbellard 
259b64ec4e4SFam Zheng static int bdrv_is_whitelisted(BlockDriver *drv, bool read_only)
260eb852011SMarkus Armbruster {
261b64ec4e4SFam Zheng     static const char *whitelist_rw[] = {
262b64ec4e4SFam Zheng         CONFIG_BDRV_RW_WHITELIST
263b64ec4e4SFam Zheng     };
264b64ec4e4SFam Zheng     static const char *whitelist_ro[] = {
265b64ec4e4SFam Zheng         CONFIG_BDRV_RO_WHITELIST
266eb852011SMarkus Armbruster     };
267eb852011SMarkus Armbruster     const char **p;
268eb852011SMarkus Armbruster 
269b64ec4e4SFam Zheng     if (!whitelist_rw[0] && !whitelist_ro[0]) {
270eb852011SMarkus Armbruster         return 1;               /* no whitelist, anything goes */
271b64ec4e4SFam Zheng     }
272eb852011SMarkus Armbruster 
273b64ec4e4SFam Zheng     for (p = whitelist_rw; *p; p++) {
274eb852011SMarkus Armbruster         if (!strcmp(drv->format_name, *p)) {
275eb852011SMarkus Armbruster             return 1;
276eb852011SMarkus Armbruster         }
277eb852011SMarkus Armbruster     }
278b64ec4e4SFam Zheng     if (read_only) {
279b64ec4e4SFam Zheng         for (p = whitelist_ro; *p; p++) {
280b64ec4e4SFam Zheng             if (!strcmp(drv->format_name, *p)) {
281b64ec4e4SFam Zheng                 return 1;
282b64ec4e4SFam Zheng             }
283b64ec4e4SFam Zheng         }
284b64ec4e4SFam Zheng     }
285eb852011SMarkus Armbruster     return 0;
286eb852011SMarkus Armbruster }
287eb852011SMarkus Armbruster 
288e6ff69bfSDaniel P. Berrange bool bdrv_uses_whitelist(void)
289e6ff69bfSDaniel P. Berrange {
290e6ff69bfSDaniel P. Berrange     return use_bdrv_whitelist;
291e6ff69bfSDaniel P. Berrange }
292e6ff69bfSDaniel P. Berrange 
2935b7e1542SZhi Yong Wu typedef struct CreateCo {
2945b7e1542SZhi Yong Wu     BlockDriver *drv;
2955b7e1542SZhi Yong Wu     char *filename;
29683d0521aSChunyan Liu     QemuOpts *opts;
2975b7e1542SZhi Yong Wu     int ret;
298cc84d90fSMax Reitz     Error *err;
2995b7e1542SZhi Yong Wu } CreateCo;
3005b7e1542SZhi Yong Wu 
3015b7e1542SZhi Yong Wu static void coroutine_fn bdrv_create_co_entry(void *opaque)
3025b7e1542SZhi Yong Wu {
303cc84d90fSMax Reitz     Error *local_err = NULL;
304cc84d90fSMax Reitz     int ret;
305cc84d90fSMax Reitz 
3065b7e1542SZhi Yong Wu     CreateCo *cco = opaque;
3075b7e1542SZhi Yong Wu     assert(cco->drv);
3085b7e1542SZhi Yong Wu 
309c282e1fdSChunyan Liu     ret = cco->drv->bdrv_create(cco->filename, cco->opts, &local_err);
31084d18f06SMarkus Armbruster     if (local_err) {
311cc84d90fSMax Reitz         error_propagate(&cco->err, local_err);
312cc84d90fSMax Reitz     }
313cc84d90fSMax Reitz     cco->ret = ret;
3145b7e1542SZhi Yong Wu }
3155b7e1542SZhi Yong Wu 
3160e7e1989SKevin Wolf int bdrv_create(BlockDriver *drv, const char* filename,
31783d0521aSChunyan Liu                 QemuOpts *opts, Error **errp)
318ea2384d3Sbellard {
3195b7e1542SZhi Yong Wu     int ret;
3200e7e1989SKevin Wolf 
3215b7e1542SZhi Yong Wu     Coroutine *co;
3225b7e1542SZhi Yong Wu     CreateCo cco = {
3235b7e1542SZhi Yong Wu         .drv = drv,
3245b7e1542SZhi Yong Wu         .filename = g_strdup(filename),
32583d0521aSChunyan Liu         .opts = opts,
3265b7e1542SZhi Yong Wu         .ret = NOT_DONE,
327cc84d90fSMax Reitz         .err = NULL,
3285b7e1542SZhi Yong Wu     };
3295b7e1542SZhi Yong Wu 
330c282e1fdSChunyan Liu     if (!drv->bdrv_create) {
331cc84d90fSMax Reitz         error_setg(errp, "Driver '%s' does not support image creation", drv->format_name);
33280168bffSLuiz Capitulino         ret = -ENOTSUP;
33380168bffSLuiz Capitulino         goto out;
3345b7e1542SZhi Yong Wu     }
3355b7e1542SZhi Yong Wu 
3365b7e1542SZhi Yong Wu     if (qemu_in_coroutine()) {
3375b7e1542SZhi Yong Wu         /* Fast-path if already in coroutine context */
3385b7e1542SZhi Yong Wu         bdrv_create_co_entry(&cco);
3395b7e1542SZhi Yong Wu     } else {
3405b7e1542SZhi Yong Wu         co = qemu_coroutine_create(bdrv_create_co_entry);
3415b7e1542SZhi Yong Wu         qemu_coroutine_enter(co, &cco);
3425b7e1542SZhi Yong Wu         while (cco.ret == NOT_DONE) {
343b47ec2c4SPaolo Bonzini             aio_poll(qemu_get_aio_context(), true);
3445b7e1542SZhi Yong Wu         }
3455b7e1542SZhi Yong Wu     }
3465b7e1542SZhi Yong Wu 
3475b7e1542SZhi Yong Wu     ret = cco.ret;
348cc84d90fSMax Reitz     if (ret < 0) {
34984d18f06SMarkus Armbruster         if (cco.err) {
350cc84d90fSMax Reitz             error_propagate(errp, cco.err);
351cc84d90fSMax Reitz         } else {
352cc84d90fSMax Reitz             error_setg_errno(errp, -ret, "Could not create image");
353cc84d90fSMax Reitz         }
354cc84d90fSMax Reitz     }
3555b7e1542SZhi Yong Wu 
35680168bffSLuiz Capitulino out:
35780168bffSLuiz Capitulino     g_free(cco.filename);
3585b7e1542SZhi Yong Wu     return ret;
359ea2384d3Sbellard }
360ea2384d3Sbellard 
361c282e1fdSChunyan Liu int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
36284a12e66SChristoph Hellwig {
36384a12e66SChristoph Hellwig     BlockDriver *drv;
364cc84d90fSMax Reitz     Error *local_err = NULL;
365cc84d90fSMax Reitz     int ret;
36684a12e66SChristoph Hellwig 
367b65a5e12SMax Reitz     drv = bdrv_find_protocol(filename, true, errp);
36884a12e66SChristoph Hellwig     if (drv == NULL) {
36916905d71SStefan Hajnoczi         return -ENOENT;
37084a12e66SChristoph Hellwig     }
37184a12e66SChristoph Hellwig 
372c282e1fdSChunyan Liu     ret = bdrv_create(drv, filename, opts, &local_err);
37384d18f06SMarkus Armbruster     if (local_err) {
374cc84d90fSMax Reitz         error_propagate(errp, local_err);
375cc84d90fSMax Reitz     }
376cc84d90fSMax Reitz     return ret;
37784a12e66SChristoph Hellwig }
37884a12e66SChristoph Hellwig 
379892b7de8SEkaterina Tumanova /**
380892b7de8SEkaterina Tumanova  * Try to get @bs's logical and physical block size.
381892b7de8SEkaterina Tumanova  * On success, store them in @bsz struct and return 0.
382892b7de8SEkaterina Tumanova  * On failure return -errno.
383892b7de8SEkaterina Tumanova  * @bs must not be empty.
384892b7de8SEkaterina Tumanova  */
385892b7de8SEkaterina Tumanova int bdrv_probe_blocksizes(BlockDriverState *bs, BlockSizes *bsz)
386892b7de8SEkaterina Tumanova {
387892b7de8SEkaterina Tumanova     BlockDriver *drv = bs->drv;
388892b7de8SEkaterina Tumanova 
389892b7de8SEkaterina Tumanova     if (drv && drv->bdrv_probe_blocksizes) {
390892b7de8SEkaterina Tumanova         return drv->bdrv_probe_blocksizes(bs, bsz);
391892b7de8SEkaterina Tumanova     }
392892b7de8SEkaterina Tumanova 
393892b7de8SEkaterina Tumanova     return -ENOTSUP;
394892b7de8SEkaterina Tumanova }
395892b7de8SEkaterina Tumanova 
396892b7de8SEkaterina Tumanova /**
397892b7de8SEkaterina Tumanova  * Try to get @bs's geometry (cyls, heads, sectors).
398892b7de8SEkaterina Tumanova  * On success, store them in @geo struct and return 0.
399892b7de8SEkaterina Tumanova  * On failure return -errno.
400892b7de8SEkaterina Tumanova  * @bs must not be empty.
401892b7de8SEkaterina Tumanova  */
402892b7de8SEkaterina Tumanova int bdrv_probe_geometry(BlockDriverState *bs, HDGeometry *geo)
403892b7de8SEkaterina Tumanova {
404892b7de8SEkaterina Tumanova     BlockDriver *drv = bs->drv;
405892b7de8SEkaterina Tumanova 
406892b7de8SEkaterina Tumanova     if (drv && drv->bdrv_probe_geometry) {
407892b7de8SEkaterina Tumanova         return drv->bdrv_probe_geometry(bs, geo);
408892b7de8SEkaterina Tumanova     }
409892b7de8SEkaterina Tumanova 
410892b7de8SEkaterina Tumanova     return -ENOTSUP;
411892b7de8SEkaterina Tumanova }
412892b7de8SEkaterina Tumanova 
413eba25057SJim Meyering /*
414eba25057SJim Meyering  * Create a uniquely-named empty temporary file.
415eba25057SJim Meyering  * Return 0 upon success, otherwise a negative errno value.
416eba25057SJim Meyering  */
417eba25057SJim Meyering int get_tmp_filename(char *filename, int size)
418eba25057SJim Meyering {
419d5249393Sbellard #ifdef _WIN32
4203b9f94e1Sbellard     char temp_dir[MAX_PATH];
421eba25057SJim Meyering     /* GetTempFileName requires that its output buffer (4th param)
422eba25057SJim Meyering        have length MAX_PATH or greater.  */
423eba25057SJim Meyering     assert(size >= MAX_PATH);
424eba25057SJim Meyering     return (GetTempPath(MAX_PATH, temp_dir)
425eba25057SJim Meyering             && GetTempFileName(temp_dir, "qem", 0, filename)
426eba25057SJim Meyering             ? 0 : -GetLastError());
427d5249393Sbellard #else
428ea2384d3Sbellard     int fd;
4297ccfb2ebSblueswir1     const char *tmpdir;
4300badc1eeSaurel32     tmpdir = getenv("TMPDIR");
43169bef793SAmit Shah     if (!tmpdir) {
43269bef793SAmit Shah         tmpdir = "/var/tmp";
43369bef793SAmit Shah     }
434eba25057SJim Meyering     if (snprintf(filename, size, "%s/vl.XXXXXX", tmpdir) >= size) {
435eba25057SJim Meyering         return -EOVERFLOW;
436ea2384d3Sbellard     }
437eba25057SJim Meyering     fd = mkstemp(filename);
438fe235a06SDunrong Huang     if (fd < 0) {
439fe235a06SDunrong Huang         return -errno;
440fe235a06SDunrong Huang     }
441fe235a06SDunrong Huang     if (close(fd) != 0) {
442fe235a06SDunrong Huang         unlink(filename);
443eba25057SJim Meyering         return -errno;
444eba25057SJim Meyering     }
445eba25057SJim Meyering     return 0;
446d5249393Sbellard #endif
447eba25057SJim Meyering }
448ea2384d3Sbellard 
449f3a5d3f8SChristoph Hellwig /*
450f3a5d3f8SChristoph Hellwig  * Detect host devices. By convention, /dev/cdrom[N] is always
451f3a5d3f8SChristoph Hellwig  * recognized as a host CDROM.
452f3a5d3f8SChristoph Hellwig  */
453f3a5d3f8SChristoph Hellwig static BlockDriver *find_hdev_driver(const char *filename)
454f3a5d3f8SChristoph Hellwig {
455508c7cb3SChristoph Hellwig     int score_max = 0, score;
456508c7cb3SChristoph Hellwig     BlockDriver *drv = NULL, *d;
457f3a5d3f8SChristoph Hellwig 
4588a22f02aSStefan Hajnoczi     QLIST_FOREACH(d, &bdrv_drivers, list) {
459508c7cb3SChristoph Hellwig         if (d->bdrv_probe_device) {
460508c7cb3SChristoph Hellwig             score = d->bdrv_probe_device(filename);
461508c7cb3SChristoph Hellwig             if (score > score_max) {
462508c7cb3SChristoph Hellwig                 score_max = score;
463508c7cb3SChristoph Hellwig                 drv = d;
464f3a5d3f8SChristoph Hellwig             }
465508c7cb3SChristoph Hellwig         }
466f3a5d3f8SChristoph Hellwig     }
467f3a5d3f8SChristoph Hellwig 
468508c7cb3SChristoph Hellwig     return drv;
469f3a5d3f8SChristoph Hellwig }
470f3a5d3f8SChristoph Hellwig 
47198289620SKevin Wolf BlockDriver *bdrv_find_protocol(const char *filename,
472b65a5e12SMax Reitz                                 bool allow_protocol_prefix,
473b65a5e12SMax Reitz                                 Error **errp)
47484a12e66SChristoph Hellwig {
47584a12e66SChristoph Hellwig     BlockDriver *drv1;
47684a12e66SChristoph Hellwig     char protocol[128];
47784a12e66SChristoph Hellwig     int len;
47884a12e66SChristoph Hellwig     const char *p;
47984a12e66SChristoph Hellwig 
48066f82ceeSKevin Wolf     /* TODO Drivers without bdrv_file_open must be specified explicitly */
48166f82ceeSKevin Wolf 
48239508e7aSChristoph Hellwig     /*
48339508e7aSChristoph Hellwig      * XXX(hch): we really should not let host device detection
48439508e7aSChristoph Hellwig      * override an explicit protocol specification, but moving this
48539508e7aSChristoph Hellwig      * later breaks access to device names with colons in them.
48639508e7aSChristoph Hellwig      * Thanks to the brain-dead persistent naming schemes on udev-
48739508e7aSChristoph Hellwig      * based Linux systems those actually are quite common.
48839508e7aSChristoph Hellwig      */
48984a12e66SChristoph Hellwig     drv1 = find_hdev_driver(filename);
49039508e7aSChristoph Hellwig     if (drv1) {
49184a12e66SChristoph Hellwig         return drv1;
49284a12e66SChristoph Hellwig     }
49339508e7aSChristoph Hellwig 
49498289620SKevin Wolf     if (!path_has_protocol(filename) || !allow_protocol_prefix) {
495ef810437SMax Reitz         return &bdrv_file;
49639508e7aSChristoph Hellwig     }
49798289620SKevin Wolf 
4989e0b22f4SStefan Hajnoczi     p = strchr(filename, ':');
4999e0b22f4SStefan Hajnoczi     assert(p != NULL);
50084a12e66SChristoph Hellwig     len = p - filename;
50184a12e66SChristoph Hellwig     if (len > sizeof(protocol) - 1)
50284a12e66SChristoph Hellwig         len = sizeof(protocol) - 1;
50384a12e66SChristoph Hellwig     memcpy(protocol, filename, len);
50484a12e66SChristoph Hellwig     protocol[len] = '\0';
50584a12e66SChristoph Hellwig     QLIST_FOREACH(drv1, &bdrv_drivers, list) {
50684a12e66SChristoph Hellwig         if (drv1->protocol_name &&
50784a12e66SChristoph Hellwig             !strcmp(drv1->protocol_name, protocol)) {
50884a12e66SChristoph Hellwig             return drv1;
50984a12e66SChristoph Hellwig         }
51084a12e66SChristoph Hellwig     }
511b65a5e12SMax Reitz 
512b65a5e12SMax Reitz     error_setg(errp, "Unknown protocol '%s'", protocol);
51384a12e66SChristoph Hellwig     return NULL;
51484a12e66SChristoph Hellwig }
51584a12e66SChristoph Hellwig 
516c6684249SMarkus Armbruster /*
517c6684249SMarkus Armbruster  * Guess image format by probing its contents.
518c6684249SMarkus Armbruster  * This is not a good idea when your image is raw (CVE-2008-2004), but
519c6684249SMarkus Armbruster  * we do it anyway for backward compatibility.
520c6684249SMarkus Armbruster  *
521c6684249SMarkus Armbruster  * @buf         contains the image's first @buf_size bytes.
5227cddd372SKevin Wolf  * @buf_size    is the buffer size in bytes (generally BLOCK_PROBE_BUF_SIZE,
5237cddd372SKevin Wolf  *              but can be smaller if the image file is smaller)
524c6684249SMarkus Armbruster  * @filename    is its filename.
525c6684249SMarkus Armbruster  *
526c6684249SMarkus Armbruster  * For all block drivers, call the bdrv_probe() method to get its
527c6684249SMarkus Armbruster  * probing score.
528c6684249SMarkus Armbruster  * Return the first block driver with the highest probing score.
529c6684249SMarkus Armbruster  */
53038f3ef57SKevin Wolf BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size,
531c6684249SMarkus Armbruster                             const char *filename)
532c6684249SMarkus Armbruster {
533c6684249SMarkus Armbruster     int score_max = 0, score;
534c6684249SMarkus Armbruster     BlockDriver *drv = NULL, *d;
535c6684249SMarkus Armbruster 
536c6684249SMarkus Armbruster     QLIST_FOREACH(d, &bdrv_drivers, list) {
537c6684249SMarkus Armbruster         if (d->bdrv_probe) {
538c6684249SMarkus Armbruster             score = d->bdrv_probe(buf, buf_size, filename);
539c6684249SMarkus Armbruster             if (score > score_max) {
540c6684249SMarkus Armbruster                 score_max = score;
541c6684249SMarkus Armbruster                 drv = d;
542c6684249SMarkus Armbruster             }
543c6684249SMarkus Armbruster         }
544c6684249SMarkus Armbruster     }
545c6684249SMarkus Armbruster 
546c6684249SMarkus Armbruster     return drv;
547c6684249SMarkus Armbruster }
548c6684249SMarkus Armbruster 
549f500a6d3SKevin Wolf static int find_image_format(BlockDriverState *bs, const char *filename,
55034b5d2c6SMax Reitz                              BlockDriver **pdrv, Error **errp)
551ea2384d3Sbellard {
552c6684249SMarkus Armbruster     BlockDriver *drv;
5537cddd372SKevin Wolf     uint8_t buf[BLOCK_PROBE_BUF_SIZE];
554f500a6d3SKevin Wolf     int ret = 0;
555f8ea0b00SNicholas Bellinger 
55608a00559SKevin Wolf     /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
557b192af8aSDimitris Aragiorgis     if (bdrv_is_sg(bs) || !bdrv_is_inserted(bs) || bdrv_getlength(bs) == 0) {
558ef810437SMax Reitz         *pdrv = &bdrv_raw;
559c98ac35dSStefan Weil         return ret;
5601a396859SNicholas A. Bellinger     }
561f8ea0b00SNicholas Bellinger 
56283f64091Sbellard     ret = bdrv_pread(bs, 0, buf, sizeof(buf));
563ea2384d3Sbellard     if (ret < 0) {
56434b5d2c6SMax Reitz         error_setg_errno(errp, -ret, "Could not read image for determining its "
56534b5d2c6SMax Reitz                          "format");
566c98ac35dSStefan Weil         *pdrv = NULL;
567c98ac35dSStefan Weil         return ret;
568ea2384d3Sbellard     }
569ea2384d3Sbellard 
570c6684249SMarkus Armbruster     drv = bdrv_probe_all(buf, ret, filename);
571c98ac35dSStefan Weil     if (!drv) {
57234b5d2c6SMax Reitz         error_setg(errp, "Could not determine image format: No compatible "
57334b5d2c6SMax Reitz                    "driver found");
574c98ac35dSStefan Weil         ret = -ENOENT;
575c98ac35dSStefan Weil     }
576c98ac35dSStefan Weil     *pdrv = drv;
577c98ac35dSStefan Weil     return ret;
578ea2384d3Sbellard }
579ea2384d3Sbellard 
58051762288SStefan Hajnoczi /**
58151762288SStefan Hajnoczi  * Set the current 'total_sectors' value
58265a9bb25SMarkus Armbruster  * Return 0 on success, -errno on error.
58351762288SStefan Hajnoczi  */
58451762288SStefan Hajnoczi static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
58551762288SStefan Hajnoczi {
58651762288SStefan Hajnoczi     BlockDriver *drv = bs->drv;
58751762288SStefan Hajnoczi 
588396759adSNicholas Bellinger     /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
589b192af8aSDimitris Aragiorgis     if (bdrv_is_sg(bs))
590396759adSNicholas Bellinger         return 0;
591396759adSNicholas Bellinger 
59251762288SStefan Hajnoczi     /* query actual device if possible, otherwise just trust the hint */
59351762288SStefan Hajnoczi     if (drv->bdrv_getlength) {
59451762288SStefan Hajnoczi         int64_t length = drv->bdrv_getlength(bs);
59551762288SStefan Hajnoczi         if (length < 0) {
59651762288SStefan Hajnoczi             return length;
59751762288SStefan Hajnoczi         }
5987e382003SFam Zheng         hint = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE);
59951762288SStefan Hajnoczi     }
60051762288SStefan Hajnoczi 
60151762288SStefan Hajnoczi     bs->total_sectors = hint;
60251762288SStefan Hajnoczi     return 0;
60351762288SStefan Hajnoczi }
60451762288SStefan Hajnoczi 
605c3993cdcSStefan Hajnoczi /**
606cddff5baSKevin Wolf  * Combines a QDict of new block driver @options with any missing options taken
607cddff5baSKevin Wolf  * from @old_options, so that leaving out an option defaults to its old value.
608cddff5baSKevin Wolf  */
609cddff5baSKevin Wolf static void bdrv_join_options(BlockDriverState *bs, QDict *options,
610cddff5baSKevin Wolf                               QDict *old_options)
611cddff5baSKevin Wolf {
612cddff5baSKevin Wolf     if (bs->drv && bs->drv->bdrv_join_options) {
613cddff5baSKevin Wolf         bs->drv->bdrv_join_options(options, old_options);
614cddff5baSKevin Wolf     } else {
615cddff5baSKevin Wolf         qdict_join(options, old_options, false);
616cddff5baSKevin Wolf     }
617cddff5baSKevin Wolf }
618cddff5baSKevin Wolf 
619cddff5baSKevin Wolf /**
6209e8f1835SPaolo Bonzini  * Set open flags for a given discard mode
6219e8f1835SPaolo Bonzini  *
6229e8f1835SPaolo Bonzini  * Return 0 on success, -1 if the discard mode was invalid.
6239e8f1835SPaolo Bonzini  */
6249e8f1835SPaolo Bonzini int bdrv_parse_discard_flags(const char *mode, int *flags)
6259e8f1835SPaolo Bonzini {
6269e8f1835SPaolo Bonzini     *flags &= ~BDRV_O_UNMAP;
6279e8f1835SPaolo Bonzini 
6289e8f1835SPaolo Bonzini     if (!strcmp(mode, "off") || !strcmp(mode, "ignore")) {
6299e8f1835SPaolo Bonzini         /* do nothing */
6309e8f1835SPaolo Bonzini     } else if (!strcmp(mode, "on") || !strcmp(mode, "unmap")) {
6319e8f1835SPaolo Bonzini         *flags |= BDRV_O_UNMAP;
6329e8f1835SPaolo Bonzini     } else {
6339e8f1835SPaolo Bonzini         return -1;
6349e8f1835SPaolo Bonzini     }
6359e8f1835SPaolo Bonzini 
6369e8f1835SPaolo Bonzini     return 0;
6379e8f1835SPaolo Bonzini }
6389e8f1835SPaolo Bonzini 
6399e8f1835SPaolo Bonzini /**
640c3993cdcSStefan Hajnoczi  * Set open flags for a given cache mode
641c3993cdcSStefan Hajnoczi  *
642c3993cdcSStefan Hajnoczi  * Return 0 on success, -1 if the cache mode was invalid.
643c3993cdcSStefan Hajnoczi  */
64453e8ae01SKevin Wolf int bdrv_parse_cache_mode(const char *mode, int *flags, bool *writethrough)
645c3993cdcSStefan Hajnoczi {
646c3993cdcSStefan Hajnoczi     *flags &= ~BDRV_O_CACHE_MASK;
647c3993cdcSStefan Hajnoczi 
648c3993cdcSStefan Hajnoczi     if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
64953e8ae01SKevin Wolf         *writethrough = false;
65053e8ae01SKevin Wolf         *flags |= BDRV_O_NOCACHE;
65192196b2fSStefan Hajnoczi     } else if (!strcmp(mode, "directsync")) {
65253e8ae01SKevin Wolf         *writethrough = true;
65392196b2fSStefan Hajnoczi         *flags |= BDRV_O_NOCACHE;
654c3993cdcSStefan Hajnoczi     } else if (!strcmp(mode, "writeback")) {
65553e8ae01SKevin Wolf         *writethrough = false;
656c3993cdcSStefan Hajnoczi     } else if (!strcmp(mode, "unsafe")) {
65753e8ae01SKevin Wolf         *writethrough = false;
658c3993cdcSStefan Hajnoczi         *flags |= BDRV_O_NO_FLUSH;
659c3993cdcSStefan Hajnoczi     } else if (!strcmp(mode, "writethrough")) {
66053e8ae01SKevin Wolf         *writethrough = true;
661c3993cdcSStefan Hajnoczi     } else {
662c3993cdcSStefan Hajnoczi         return -1;
663c3993cdcSStefan Hajnoczi     }
664c3993cdcSStefan Hajnoczi 
665c3993cdcSStefan Hajnoczi     return 0;
666c3993cdcSStefan Hajnoczi }
667c3993cdcSStefan Hajnoczi 
6680b50cc88SKevin Wolf /*
66973176beeSKevin Wolf  * Returns the options and flags that a temporary snapshot should get, based on
67073176beeSKevin Wolf  * the originally requested flags (the originally requested image will have
67173176beeSKevin Wolf  * flags like a backing file)
672b1e6fc08SKevin Wolf  */
67373176beeSKevin Wolf static void bdrv_temp_snapshot_options(int *child_flags, QDict *child_options,
67473176beeSKevin Wolf                                        int parent_flags, QDict *parent_options)
675b1e6fc08SKevin Wolf {
67673176beeSKevin Wolf     *child_flags = (parent_flags & ~BDRV_O_SNAPSHOT) | BDRV_O_TEMPORARY;
67773176beeSKevin Wolf 
67873176beeSKevin Wolf     /* For temporary files, unconditional cache=unsafe is fine */
67973176beeSKevin Wolf     qdict_set_default_str(child_options, BDRV_OPT_CACHE_DIRECT, "off");
68073176beeSKevin Wolf     qdict_set_default_str(child_options, BDRV_OPT_CACHE_NO_FLUSH, "on");
681b1e6fc08SKevin Wolf }
682b1e6fc08SKevin Wolf 
683b1e6fc08SKevin Wolf /*
6848e2160e2SKevin Wolf  * Returns the options and flags that bs->file should get if a protocol driver
6858e2160e2SKevin Wolf  * is expected, based on the given options and flags for the parent BDS
6860b50cc88SKevin Wolf  */
6878e2160e2SKevin Wolf static void bdrv_inherited_options(int *child_flags, QDict *child_options,
6888e2160e2SKevin Wolf                                    int parent_flags, QDict *parent_options)
6890b50cc88SKevin Wolf {
6908e2160e2SKevin Wolf     int flags = parent_flags;
6918e2160e2SKevin Wolf 
6920b50cc88SKevin Wolf     /* Enable protocol handling, disable format probing for bs->file */
6930b50cc88SKevin Wolf     flags |= BDRV_O_PROTOCOL;
6940b50cc88SKevin Wolf 
69591a097e7SKevin Wolf     /* If the cache mode isn't explicitly set, inherit direct and no-flush from
69691a097e7SKevin Wolf      * the parent. */
69791a097e7SKevin Wolf     qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
69891a097e7SKevin Wolf     qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
69991a097e7SKevin Wolf 
7000b50cc88SKevin Wolf     /* Our block drivers take care to send flushes and respect unmap policy,
70191a097e7SKevin Wolf      * so we can default to enable both on lower layers regardless of the
70291a097e7SKevin Wolf      * corresponding parent options. */
70391a097e7SKevin Wolf     flags |= BDRV_O_UNMAP;
7040b50cc88SKevin Wolf 
7050b50cc88SKevin Wolf     /* Clear flags that only apply to the top layer */
706abb06c5aSDaniel P. Berrange     flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ |
707abb06c5aSDaniel P. Berrange                BDRV_O_NO_IO);
7080b50cc88SKevin Wolf 
7098e2160e2SKevin Wolf     *child_flags = flags;
7100b50cc88SKevin Wolf }
7110b50cc88SKevin Wolf 
712f3930ed0SKevin Wolf const BdrvChildRole child_file = {
7138e2160e2SKevin Wolf     .inherit_options = bdrv_inherited_options,
714f3930ed0SKevin Wolf };
715f3930ed0SKevin Wolf 
716f3930ed0SKevin Wolf /*
7178e2160e2SKevin Wolf  * Returns the options and flags that bs->file should get if the use of formats
7188e2160e2SKevin Wolf  * (and not only protocols) is permitted for it, based on the given options and
7198e2160e2SKevin Wolf  * flags for the parent BDS
720f3930ed0SKevin Wolf  */
7218e2160e2SKevin Wolf static void bdrv_inherited_fmt_options(int *child_flags, QDict *child_options,
7228e2160e2SKevin Wolf                                        int parent_flags, QDict *parent_options)
723f3930ed0SKevin Wolf {
7248e2160e2SKevin Wolf     child_file.inherit_options(child_flags, child_options,
7258e2160e2SKevin Wolf                                parent_flags, parent_options);
7268e2160e2SKevin Wolf 
727abb06c5aSDaniel P. Berrange     *child_flags &= ~(BDRV_O_PROTOCOL | BDRV_O_NO_IO);
728f3930ed0SKevin Wolf }
729f3930ed0SKevin Wolf 
730f3930ed0SKevin Wolf const BdrvChildRole child_format = {
7318e2160e2SKevin Wolf     .inherit_options = bdrv_inherited_fmt_options,
732f3930ed0SKevin Wolf };
733f3930ed0SKevin Wolf 
734317fc44eSKevin Wolf /*
7358e2160e2SKevin Wolf  * Returns the options and flags that bs->backing should get, based on the
7368e2160e2SKevin Wolf  * given options and flags for the parent BDS
737317fc44eSKevin Wolf  */
7388e2160e2SKevin Wolf static void bdrv_backing_options(int *child_flags, QDict *child_options,
7398e2160e2SKevin Wolf                                  int parent_flags, QDict *parent_options)
740317fc44eSKevin Wolf {
7418e2160e2SKevin Wolf     int flags = parent_flags;
7428e2160e2SKevin Wolf 
743b8816a43SKevin Wolf     /* The cache mode is inherited unmodified for backing files; except WCE,
744b8816a43SKevin Wolf      * which is only applied on the top level (BlockBackend) */
74591a097e7SKevin Wolf     qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
74691a097e7SKevin Wolf     qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
74791a097e7SKevin Wolf 
748317fc44eSKevin Wolf     /* backing files always opened read-only */
749317fc44eSKevin Wolf     flags &= ~(BDRV_O_RDWR | BDRV_O_COPY_ON_READ);
750317fc44eSKevin Wolf 
751317fc44eSKevin Wolf     /* snapshot=on is handled on the top layer */
7528bfea15dSKevin Wolf     flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_TEMPORARY);
753317fc44eSKevin Wolf 
7548e2160e2SKevin Wolf     *child_flags = flags;
755317fc44eSKevin Wolf }
756317fc44eSKevin Wolf 
757f3930ed0SKevin Wolf static const BdrvChildRole child_backing = {
7588e2160e2SKevin Wolf     .inherit_options = bdrv_backing_options,
759f3930ed0SKevin Wolf };
760f3930ed0SKevin Wolf 
7617b272452SKevin Wolf static int bdrv_open_flags(BlockDriverState *bs, int flags)
7627b272452SKevin Wolf {
76361de4c68SKevin Wolf     int open_flags = flags;
7647b272452SKevin Wolf 
7657b272452SKevin Wolf     /*
7667b272452SKevin Wolf      * Clear flags that are internal to the block layer before opening the
7677b272452SKevin Wolf      * image.
7687b272452SKevin Wolf      */
76920cca275SKevin Wolf     open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_PROTOCOL);
7707b272452SKevin Wolf 
7717b272452SKevin Wolf     /*
7727b272452SKevin Wolf      * Snapshots should be writable.
7737b272452SKevin Wolf      */
7748bfea15dSKevin Wolf     if (flags & BDRV_O_TEMPORARY) {
7757b272452SKevin Wolf         open_flags |= BDRV_O_RDWR;
7767b272452SKevin Wolf     }
7777b272452SKevin Wolf 
7787b272452SKevin Wolf     return open_flags;
7797b272452SKevin Wolf }
7807b272452SKevin Wolf 
78191a097e7SKevin Wolf static void update_flags_from_options(int *flags, QemuOpts *opts)
78291a097e7SKevin Wolf {
78391a097e7SKevin Wolf     *flags &= ~BDRV_O_CACHE_MASK;
78491a097e7SKevin Wolf 
78591a097e7SKevin Wolf     assert(qemu_opt_find(opts, BDRV_OPT_CACHE_NO_FLUSH));
78691a097e7SKevin Wolf     if (qemu_opt_get_bool(opts, BDRV_OPT_CACHE_NO_FLUSH, false)) {
78791a097e7SKevin Wolf         *flags |= BDRV_O_NO_FLUSH;
78891a097e7SKevin Wolf     }
78991a097e7SKevin Wolf 
79091a097e7SKevin Wolf     assert(qemu_opt_find(opts, BDRV_OPT_CACHE_DIRECT));
79191a097e7SKevin Wolf     if (qemu_opt_get_bool(opts, BDRV_OPT_CACHE_DIRECT, false)) {
79291a097e7SKevin Wolf         *flags |= BDRV_O_NOCACHE;
79391a097e7SKevin Wolf     }
79491a097e7SKevin Wolf }
79591a097e7SKevin Wolf 
79691a097e7SKevin Wolf static void update_options_from_flags(QDict *options, int flags)
79791a097e7SKevin Wolf {
79891a097e7SKevin Wolf     if (!qdict_haskey(options, BDRV_OPT_CACHE_DIRECT)) {
79991a097e7SKevin Wolf         qdict_put(options, BDRV_OPT_CACHE_DIRECT,
80091a097e7SKevin Wolf                   qbool_from_bool(flags & BDRV_O_NOCACHE));
80191a097e7SKevin Wolf     }
80291a097e7SKevin Wolf     if (!qdict_haskey(options, BDRV_OPT_CACHE_NO_FLUSH)) {
80391a097e7SKevin Wolf         qdict_put(options, BDRV_OPT_CACHE_NO_FLUSH,
80491a097e7SKevin Wolf                   qbool_from_bool(flags & BDRV_O_NO_FLUSH));
80591a097e7SKevin Wolf     }
80691a097e7SKevin Wolf }
80791a097e7SKevin Wolf 
808636ea370SKevin Wolf static void bdrv_assign_node_name(BlockDriverState *bs,
8096913c0c2SBenoît Canet                                   const char *node_name,
8106913c0c2SBenoît Canet                                   Error **errp)
8116913c0c2SBenoît Canet {
81215489c76SJeff Cody     char *gen_node_name = NULL;
8136913c0c2SBenoît Canet 
81415489c76SJeff Cody     if (!node_name) {
81515489c76SJeff Cody         node_name = gen_node_name = id_generate(ID_BLOCK);
81615489c76SJeff Cody     } else if (!id_wellformed(node_name)) {
81715489c76SJeff Cody         /*
81815489c76SJeff Cody          * Check for empty string or invalid characters, but not if it is
81915489c76SJeff Cody          * generated (generated names use characters not available to the user)
82015489c76SJeff Cody          */
8219aebf3b8SKevin Wolf         error_setg(errp, "Invalid node name");
822636ea370SKevin Wolf         return;
8236913c0c2SBenoît Canet     }
8246913c0c2SBenoît Canet 
8250c5e94eeSBenoît Canet     /* takes care of avoiding namespaces collisions */
8267f06d47eSMarkus Armbruster     if (blk_by_name(node_name)) {
8270c5e94eeSBenoît Canet         error_setg(errp, "node-name=%s is conflicting with a device id",
8280c5e94eeSBenoît Canet                    node_name);
82915489c76SJeff Cody         goto out;
8300c5e94eeSBenoît Canet     }
8310c5e94eeSBenoît Canet 
8326913c0c2SBenoît Canet     /* takes care of avoiding duplicates node names */
8336913c0c2SBenoît Canet     if (bdrv_find_node(node_name)) {
8346913c0c2SBenoît Canet         error_setg(errp, "Duplicate node name");
83515489c76SJeff Cody         goto out;
8366913c0c2SBenoît Canet     }
8376913c0c2SBenoît Canet 
8386913c0c2SBenoît Canet     /* copy node name into the bs and insert it into the graph list */
8396913c0c2SBenoît Canet     pstrcpy(bs->node_name, sizeof(bs->node_name), node_name);
8406913c0c2SBenoît Canet     QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs, node_list);
84115489c76SJeff Cody out:
84215489c76SJeff Cody     g_free(gen_node_name);
8436913c0c2SBenoît Canet }
8446913c0c2SBenoît Canet 
84518edf289SKevin Wolf static QemuOptsList bdrv_runtime_opts = {
84618edf289SKevin Wolf     .name = "bdrv_common",
84718edf289SKevin Wolf     .head = QTAILQ_HEAD_INITIALIZER(bdrv_runtime_opts.head),
84818edf289SKevin Wolf     .desc = {
84918edf289SKevin Wolf         {
85018edf289SKevin Wolf             .name = "node-name",
85118edf289SKevin Wolf             .type = QEMU_OPT_STRING,
85218edf289SKevin Wolf             .help = "Node name of the block device node",
85318edf289SKevin Wolf         },
85462392ebbSKevin Wolf         {
85562392ebbSKevin Wolf             .name = "driver",
85662392ebbSKevin Wolf             .type = QEMU_OPT_STRING,
85762392ebbSKevin Wolf             .help = "Block driver to use for the node",
85862392ebbSKevin Wolf         },
85991a097e7SKevin Wolf         {
86091a097e7SKevin Wolf             .name = BDRV_OPT_CACHE_DIRECT,
86191a097e7SKevin Wolf             .type = QEMU_OPT_BOOL,
86291a097e7SKevin Wolf             .help = "Bypass software writeback cache on the host",
86391a097e7SKevin Wolf         },
86491a097e7SKevin Wolf         {
86591a097e7SKevin Wolf             .name = BDRV_OPT_CACHE_NO_FLUSH,
86691a097e7SKevin Wolf             .type = QEMU_OPT_BOOL,
86791a097e7SKevin Wolf             .help = "Ignore flush requests",
86891a097e7SKevin Wolf         },
86918edf289SKevin Wolf         { /* end of list */ }
87018edf289SKevin Wolf     },
87118edf289SKevin Wolf };
87218edf289SKevin Wolf 
873b6ce07aaSKevin Wolf /*
87457915332SKevin Wolf  * Common part for opening disk images and files
875b6ad491aSKevin Wolf  *
876b6ad491aSKevin Wolf  * Removes all processed options from *options.
87757915332SKevin Wolf  */
8789a4f4c31SKevin Wolf static int bdrv_open_common(BlockDriverState *bs, BdrvChild *file,
87982dc8b41SKevin Wolf                             QDict *options, Error **errp)
88057915332SKevin Wolf {
88157915332SKevin Wolf     int ret, open_flags;
882035fccdfSKevin Wolf     const char *filename;
88362392ebbSKevin Wolf     const char *driver_name = NULL;
8846913c0c2SBenoît Canet     const char *node_name = NULL;
88518edf289SKevin Wolf     QemuOpts *opts;
88662392ebbSKevin Wolf     BlockDriver *drv;
88734b5d2c6SMax Reitz     Error *local_err = NULL;
88857915332SKevin Wolf 
8896405875cSPaolo Bonzini     assert(bs->file == NULL);
890707ff828SKevin Wolf     assert(options != NULL && bs->options != options);
89157915332SKevin Wolf 
89262392ebbSKevin Wolf     opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
89362392ebbSKevin Wolf     qemu_opts_absorb_qdict(opts, options, &local_err);
89462392ebbSKevin Wolf     if (local_err) {
89562392ebbSKevin Wolf         error_propagate(errp, local_err);
89662392ebbSKevin Wolf         ret = -EINVAL;
89762392ebbSKevin Wolf         goto fail_opts;
89862392ebbSKevin Wolf     }
89962392ebbSKevin Wolf 
90062392ebbSKevin Wolf     driver_name = qemu_opt_get(opts, "driver");
90162392ebbSKevin Wolf     drv = bdrv_find_format(driver_name);
90262392ebbSKevin Wolf     assert(drv != NULL);
90362392ebbSKevin Wolf 
90445673671SKevin Wolf     if (file != NULL) {
9059a4f4c31SKevin Wolf         filename = file->bs->filename;
90645673671SKevin Wolf     } else {
90745673671SKevin Wolf         filename = qdict_get_try_str(options, "filename");
90845673671SKevin Wolf     }
90945673671SKevin Wolf 
910765003dbSKevin Wolf     if (drv->bdrv_needs_filename && !filename) {
911765003dbSKevin Wolf         error_setg(errp, "The '%s' block driver requires a file name",
912765003dbSKevin Wolf                    drv->format_name);
91318edf289SKevin Wolf         ret = -EINVAL;
91418edf289SKevin Wolf         goto fail_opts;
91518edf289SKevin Wolf     }
91618edf289SKevin Wolf 
91782dc8b41SKevin Wolf     trace_bdrv_open_common(bs, filename ?: "", bs->open_flags,
91882dc8b41SKevin Wolf                            drv->format_name);
91962392ebbSKevin Wolf 
92018edf289SKevin Wolf     node_name = qemu_opt_get(opts, "node-name");
921636ea370SKevin Wolf     bdrv_assign_node_name(bs, node_name, &local_err);
9220fb6395cSMarkus Armbruster     if (local_err) {
923636ea370SKevin Wolf         error_propagate(errp, local_err);
92418edf289SKevin Wolf         ret = -EINVAL;
92518edf289SKevin Wolf         goto fail_opts;
9265d186eb0SKevin Wolf     }
9275d186eb0SKevin Wolf 
928c25f53b0SPaolo Bonzini     bs->request_alignment = 512;
9290d51b4deSAsias He     bs->zero_beyond_eof = true;
93082dc8b41SKevin Wolf     bs->read_only = !(bs->open_flags & BDRV_O_RDWR);
931b64ec4e4SFam Zheng 
932b64ec4e4SFam Zheng     if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, bs->read_only)) {
9338f94a6e4SKevin Wolf         error_setg(errp,
9348f94a6e4SKevin Wolf                    !bs->read_only && bdrv_is_whitelisted(drv, true)
9358f94a6e4SKevin Wolf                         ? "Driver '%s' can only be used for read-only devices"
9368f94a6e4SKevin Wolf                         : "Driver '%s' is not whitelisted",
9378f94a6e4SKevin Wolf                    drv->format_name);
93818edf289SKevin Wolf         ret = -ENOTSUP;
93918edf289SKevin Wolf         goto fail_opts;
940b64ec4e4SFam Zheng     }
94157915332SKevin Wolf 
94253fec9d3SStefan Hajnoczi     assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */
94382dc8b41SKevin Wolf     if (bs->open_flags & BDRV_O_COPY_ON_READ) {
9440ebd24e0SKevin Wolf         if (!bs->read_only) {
94553fec9d3SStefan Hajnoczi             bdrv_enable_copy_on_read(bs);
9460ebd24e0SKevin Wolf         } else {
9470ebd24e0SKevin Wolf             error_setg(errp, "Can't use copy-on-read on read-only device");
94818edf289SKevin Wolf             ret = -EINVAL;
94918edf289SKevin Wolf             goto fail_opts;
9500ebd24e0SKevin Wolf         }
95153fec9d3SStefan Hajnoczi     }
95253fec9d3SStefan Hajnoczi 
953c2ad1b0cSKevin Wolf     if (filename != NULL) {
95457915332SKevin Wolf         pstrcpy(bs->filename, sizeof(bs->filename), filename);
955c2ad1b0cSKevin Wolf     } else {
956c2ad1b0cSKevin Wolf         bs->filename[0] = '\0';
957c2ad1b0cSKevin Wolf     }
95891af7014SMax Reitz     pstrcpy(bs->exact_filename, sizeof(bs->exact_filename), bs->filename);
95957915332SKevin Wolf 
96057915332SKevin Wolf     bs->drv = drv;
9617267c094SAnthony Liguori     bs->opaque = g_malloc0(drv->instance_size);
96257915332SKevin Wolf 
96391a097e7SKevin Wolf     /* Apply cache mode options */
96491a097e7SKevin Wolf     update_flags_from_options(&bs->open_flags, opts);
96573ac451fSKevin Wolf 
96666f82ceeSKevin Wolf     /* Open the image, either directly or using a protocol */
96782dc8b41SKevin Wolf     open_flags = bdrv_open_flags(bs, bs->open_flags);
96866f82ceeSKevin Wolf     if (drv->bdrv_file_open) {
9695d186eb0SKevin Wolf         assert(file == NULL);
970030be321SBenoît Canet         assert(!drv->bdrv_needs_filename || filename != NULL);
97134b5d2c6SMax Reitz         ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
972f500a6d3SKevin Wolf     } else {
9732af5ef70SKevin Wolf         if (file == NULL) {
97434b5d2c6SMax Reitz             error_setg(errp, "Can't use '%s' as a block driver for the "
97534b5d2c6SMax Reitz                        "protocol level", drv->format_name);
9762af5ef70SKevin Wolf             ret = -EINVAL;
9772af5ef70SKevin Wolf             goto free_and_fail;
9782af5ef70SKevin Wolf         }
979f500a6d3SKevin Wolf         bs->file = file;
98034b5d2c6SMax Reitz         ret = drv->bdrv_open(bs, options, open_flags, &local_err);
98166f82ceeSKevin Wolf     }
98266f82ceeSKevin Wolf 
98357915332SKevin Wolf     if (ret < 0) {
98484d18f06SMarkus Armbruster         if (local_err) {
98534b5d2c6SMax Reitz             error_propagate(errp, local_err);
9862fa9aa59SDunrong Huang         } else if (bs->filename[0]) {
9872fa9aa59SDunrong Huang             error_setg_errno(errp, -ret, "Could not open '%s'", bs->filename);
98834b5d2c6SMax Reitz         } else {
98934b5d2c6SMax Reitz             error_setg_errno(errp, -ret, "Could not open image");
99034b5d2c6SMax Reitz         }
99157915332SKevin Wolf         goto free_and_fail;
99257915332SKevin Wolf     }
99357915332SKevin Wolf 
99451762288SStefan Hajnoczi     ret = refresh_total_sectors(bs, bs->total_sectors);
99551762288SStefan Hajnoczi     if (ret < 0) {
99634b5d2c6SMax Reitz         error_setg_errno(errp, -ret, "Could not refresh total sector count");
99751762288SStefan Hajnoczi         goto free_and_fail;
99857915332SKevin Wolf     }
99951762288SStefan Hajnoczi 
10003baca891SKevin Wolf     bdrv_refresh_limits(bs, &local_err);
10013baca891SKevin Wolf     if (local_err) {
10023baca891SKevin Wolf         error_propagate(errp, local_err);
10033baca891SKevin Wolf         ret = -EINVAL;
10043baca891SKevin Wolf         goto free_and_fail;
10053baca891SKevin Wolf     }
10063baca891SKevin Wolf 
1007c25f53b0SPaolo Bonzini     assert(bdrv_opt_mem_align(bs) != 0);
10084196d2f0SDenis V. Lunev     assert(bdrv_min_mem_align(bs) != 0);
1009b192af8aSDimitris Aragiorgis     assert((bs->request_alignment != 0) || bdrv_is_sg(bs));
101018edf289SKevin Wolf 
101118edf289SKevin Wolf     qemu_opts_del(opts);
101257915332SKevin Wolf     return 0;
101357915332SKevin Wolf 
101457915332SKevin Wolf free_and_fail:
101566f82ceeSKevin Wolf     bs->file = NULL;
10167267c094SAnthony Liguori     g_free(bs->opaque);
101757915332SKevin Wolf     bs->opaque = NULL;
101857915332SKevin Wolf     bs->drv = NULL;
101918edf289SKevin Wolf fail_opts:
102018edf289SKevin Wolf     qemu_opts_del(opts);
102157915332SKevin Wolf     return ret;
102257915332SKevin Wolf }
102357915332SKevin Wolf 
10245e5c4f63SKevin Wolf static QDict *parse_json_filename(const char *filename, Error **errp)
10255e5c4f63SKevin Wolf {
10265e5c4f63SKevin Wolf     QObject *options_obj;
10275e5c4f63SKevin Wolf     QDict *options;
10285e5c4f63SKevin Wolf     int ret;
10295e5c4f63SKevin Wolf 
10305e5c4f63SKevin Wolf     ret = strstart(filename, "json:", &filename);
10315e5c4f63SKevin Wolf     assert(ret);
10325e5c4f63SKevin Wolf 
10335e5c4f63SKevin Wolf     options_obj = qobject_from_json(filename);
10345e5c4f63SKevin Wolf     if (!options_obj) {
10355e5c4f63SKevin Wolf         error_setg(errp, "Could not parse the JSON options");
10365e5c4f63SKevin Wolf         return NULL;
10375e5c4f63SKevin Wolf     }
10385e5c4f63SKevin Wolf 
10395e5c4f63SKevin Wolf     if (qobject_type(options_obj) != QTYPE_QDICT) {
10405e5c4f63SKevin Wolf         qobject_decref(options_obj);
10415e5c4f63SKevin Wolf         error_setg(errp, "Invalid JSON object given");
10425e5c4f63SKevin Wolf         return NULL;
10435e5c4f63SKevin Wolf     }
10445e5c4f63SKevin Wolf 
10455e5c4f63SKevin Wolf     options = qobject_to_qdict(options_obj);
10465e5c4f63SKevin Wolf     qdict_flatten(options);
10475e5c4f63SKevin Wolf 
10485e5c4f63SKevin Wolf     return options;
10495e5c4f63SKevin Wolf }
10505e5c4f63SKevin Wolf 
1051de3b53f0SKevin Wolf static void parse_json_protocol(QDict *options, const char **pfilename,
1052de3b53f0SKevin Wolf                                 Error **errp)
1053de3b53f0SKevin Wolf {
1054de3b53f0SKevin Wolf     QDict *json_options;
1055de3b53f0SKevin Wolf     Error *local_err = NULL;
1056de3b53f0SKevin Wolf 
1057de3b53f0SKevin Wolf     /* Parse json: pseudo-protocol */
1058de3b53f0SKevin Wolf     if (!*pfilename || !g_str_has_prefix(*pfilename, "json:")) {
1059de3b53f0SKevin Wolf         return;
1060de3b53f0SKevin Wolf     }
1061de3b53f0SKevin Wolf 
1062de3b53f0SKevin Wolf     json_options = parse_json_filename(*pfilename, &local_err);
1063de3b53f0SKevin Wolf     if (local_err) {
1064de3b53f0SKevin Wolf         error_propagate(errp, local_err);
1065de3b53f0SKevin Wolf         return;
1066de3b53f0SKevin Wolf     }
1067de3b53f0SKevin Wolf 
1068de3b53f0SKevin Wolf     /* Options given in the filename have lower priority than options
1069de3b53f0SKevin Wolf      * specified directly */
1070de3b53f0SKevin Wolf     qdict_join(options, json_options, false);
1071de3b53f0SKevin Wolf     QDECREF(json_options);
1072de3b53f0SKevin Wolf     *pfilename = NULL;
1073de3b53f0SKevin Wolf }
1074de3b53f0SKevin Wolf 
107557915332SKevin Wolf /*
1076f54120ffSKevin Wolf  * Fills in default options for opening images and converts the legacy
1077f54120ffSKevin Wolf  * filename/flags pair to option QDict entries.
107853a29513SMax Reitz  * The BDRV_O_PROTOCOL flag in *flags will be set or cleared accordingly if a
107953a29513SMax Reitz  * block driver has been specified explicitly.
1080f54120ffSKevin Wolf  */
1081de3b53f0SKevin Wolf static int bdrv_fill_options(QDict **options, const char *filename,
1082053e1578SMax Reitz                              int *flags, Error **errp)
1083f54120ffSKevin Wolf {
1084f54120ffSKevin Wolf     const char *drvname;
108553a29513SMax Reitz     bool protocol = *flags & BDRV_O_PROTOCOL;
1086f54120ffSKevin Wolf     bool parse_filename = false;
1087053e1578SMax Reitz     BlockDriver *drv = NULL;
1088f54120ffSKevin Wolf     Error *local_err = NULL;
1089f54120ffSKevin Wolf 
109053a29513SMax Reitz     drvname = qdict_get_try_str(*options, "driver");
1091053e1578SMax Reitz     if (drvname) {
1092053e1578SMax Reitz         drv = bdrv_find_format(drvname);
1093053e1578SMax Reitz         if (!drv) {
1094053e1578SMax Reitz             error_setg(errp, "Unknown driver '%s'", drvname);
1095053e1578SMax Reitz             return -ENOENT;
1096053e1578SMax Reitz         }
109753a29513SMax Reitz         /* If the user has explicitly specified the driver, this choice should
109853a29513SMax Reitz          * override the BDRV_O_PROTOCOL flag */
1099053e1578SMax Reitz         protocol = drv->bdrv_file_open;
110053a29513SMax Reitz     }
110153a29513SMax Reitz 
110253a29513SMax Reitz     if (protocol) {
110353a29513SMax Reitz         *flags |= BDRV_O_PROTOCOL;
110453a29513SMax Reitz     } else {
110553a29513SMax Reitz         *flags &= ~BDRV_O_PROTOCOL;
110653a29513SMax Reitz     }
110753a29513SMax Reitz 
110891a097e7SKevin Wolf     /* Translate cache options from flags into options */
110991a097e7SKevin Wolf     update_options_from_flags(*options, *flags);
111091a097e7SKevin Wolf 
1111f54120ffSKevin Wolf     /* Fetch the file name from the options QDict if necessary */
111217b005f1SKevin Wolf     if (protocol && filename) {
1113f54120ffSKevin Wolf         if (!qdict_haskey(*options, "filename")) {
1114f54120ffSKevin Wolf             qdict_put(*options, "filename", qstring_from_str(filename));
1115f54120ffSKevin Wolf             parse_filename = true;
1116f54120ffSKevin Wolf         } else {
1117f54120ffSKevin Wolf             error_setg(errp, "Can't specify 'file' and 'filename' options at "
1118f54120ffSKevin Wolf                              "the same time");
1119f54120ffSKevin Wolf             return -EINVAL;
1120f54120ffSKevin Wolf         }
1121f54120ffSKevin Wolf     }
1122f54120ffSKevin Wolf 
1123f54120ffSKevin Wolf     /* Find the right block driver */
1124f54120ffSKevin Wolf     filename = qdict_get_try_str(*options, "filename");
1125f54120ffSKevin Wolf 
112617b005f1SKevin Wolf     if (!drvname && protocol) {
1127f54120ffSKevin Wolf         if (filename) {
1128b65a5e12SMax Reitz             drv = bdrv_find_protocol(filename, parse_filename, errp);
1129f54120ffSKevin Wolf             if (!drv) {
1130f54120ffSKevin Wolf                 return -EINVAL;
1131f54120ffSKevin Wolf             }
1132f54120ffSKevin Wolf 
1133f54120ffSKevin Wolf             drvname = drv->format_name;
1134f54120ffSKevin Wolf             qdict_put(*options, "driver", qstring_from_str(drvname));
1135f54120ffSKevin Wolf         } else {
1136f54120ffSKevin Wolf             error_setg(errp, "Must specify either driver or file");
1137f54120ffSKevin Wolf             return -EINVAL;
1138f54120ffSKevin Wolf         }
113917b005f1SKevin Wolf     }
114017b005f1SKevin Wolf 
114117b005f1SKevin Wolf     assert(drv || !protocol);
1142f54120ffSKevin Wolf 
1143f54120ffSKevin Wolf     /* Driver-specific filename parsing */
114417b005f1SKevin Wolf     if (drv && drv->bdrv_parse_filename && parse_filename) {
1145f54120ffSKevin Wolf         drv->bdrv_parse_filename(filename, *options, &local_err);
1146f54120ffSKevin Wolf         if (local_err) {
1147f54120ffSKevin Wolf             error_propagate(errp, local_err);
1148f54120ffSKevin Wolf             return -EINVAL;
1149f54120ffSKevin Wolf         }
1150f54120ffSKevin Wolf 
1151f54120ffSKevin Wolf         if (!drv->bdrv_needs_filename) {
1152f54120ffSKevin Wolf             qdict_del(*options, "filename");
1153f54120ffSKevin Wolf         }
1154f54120ffSKevin Wolf     }
1155f54120ffSKevin Wolf 
1156f54120ffSKevin Wolf     return 0;
1157f54120ffSKevin Wolf }
1158f54120ffSKevin Wolf 
1159f21d96d0SKevin Wolf BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
1160260fecf1SKevin Wolf                                   const char *child_name,
1161df581792SKevin Wolf                                   const BdrvChildRole *child_role)
1162df581792SKevin Wolf {
1163df581792SKevin Wolf     BdrvChild *child = g_new(BdrvChild, 1);
1164df581792SKevin Wolf     *child = (BdrvChild) {
1165df581792SKevin Wolf         .bs     = child_bs,
1166260fecf1SKevin Wolf         .name   = g_strdup(child_name),
1167df581792SKevin Wolf         .role   = child_role,
1168df581792SKevin Wolf     };
1169df581792SKevin Wolf 
1170d42a8a93SKevin Wolf     QLIST_INSERT_HEAD(&child_bs->parents, child, next_parent);
1171b4b059f6SKevin Wolf 
1172b4b059f6SKevin Wolf     return child;
1173df581792SKevin Wolf }
1174df581792SKevin Wolf 
117598292c61SWen Congyang BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
1176f21d96d0SKevin Wolf                              BlockDriverState *child_bs,
1177f21d96d0SKevin Wolf                              const char *child_name,
1178f21d96d0SKevin Wolf                              const BdrvChildRole *child_role)
1179f21d96d0SKevin Wolf {
1180f21d96d0SKevin Wolf     BdrvChild *child = bdrv_root_attach_child(child_bs, child_name, child_role);
1181f21d96d0SKevin Wolf     QLIST_INSERT_HEAD(&parent_bs->children, child, next);
1182f21d96d0SKevin Wolf     return child;
1183f21d96d0SKevin Wolf }
1184f21d96d0SKevin Wolf 
11853f09bfbcSKevin Wolf static void bdrv_detach_child(BdrvChild *child)
118633a60407SKevin Wolf {
1187f21d96d0SKevin Wolf     if (child->next.le_prev) {
118833a60407SKevin Wolf         QLIST_REMOVE(child, next);
1189f21d96d0SKevin Wolf         child->next.le_prev = NULL;
1190f21d96d0SKevin Wolf     }
1191d42a8a93SKevin Wolf     QLIST_REMOVE(child, next_parent);
1192260fecf1SKevin Wolf     g_free(child->name);
119333a60407SKevin Wolf     g_free(child);
119433a60407SKevin Wolf }
119533a60407SKevin Wolf 
1196f21d96d0SKevin Wolf void bdrv_root_unref_child(BdrvChild *child)
119733a60407SKevin Wolf {
1198779020cbSKevin Wolf     BlockDriverState *child_bs;
1199779020cbSKevin Wolf 
1200f21d96d0SKevin Wolf     child_bs = child->bs;
1201f21d96d0SKevin Wolf     bdrv_detach_child(child);
1202f21d96d0SKevin Wolf     bdrv_unref(child_bs);
1203f21d96d0SKevin Wolf }
1204f21d96d0SKevin Wolf 
1205f21d96d0SKevin Wolf void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child)
1206f21d96d0SKevin Wolf {
1207779020cbSKevin Wolf     if (child == NULL) {
1208779020cbSKevin Wolf         return;
1209779020cbSKevin Wolf     }
121033a60407SKevin Wolf 
121133a60407SKevin Wolf     if (child->bs->inherits_from == parent) {
121233a60407SKevin Wolf         child->bs->inherits_from = NULL;
121333a60407SKevin Wolf     }
121433a60407SKevin Wolf 
1215f21d96d0SKevin Wolf     bdrv_root_unref_child(child);
121633a60407SKevin Wolf }
121733a60407SKevin Wolf 
12185db15a57SKevin Wolf /*
12195db15a57SKevin Wolf  * Sets the backing file link of a BDS. A new reference is created; callers
12205db15a57SKevin Wolf  * which don't need their own reference any more must call bdrv_unref().
12215db15a57SKevin Wolf  */
12228d24cce1SFam Zheng void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd)
12238d24cce1SFam Zheng {
12245db15a57SKevin Wolf     if (backing_hd) {
12255db15a57SKevin Wolf         bdrv_ref(backing_hd);
12265db15a57SKevin Wolf     }
12278d24cce1SFam Zheng 
1228760e0063SKevin Wolf     if (bs->backing) {
1229826b6ca0SFam Zheng         assert(bs->backing_blocker);
1230760e0063SKevin Wolf         bdrv_op_unblock_all(bs->backing->bs, bs->backing_blocker);
12315db15a57SKevin Wolf         bdrv_unref_child(bs, bs->backing);
1232826b6ca0SFam Zheng     } else if (backing_hd) {
1233826b6ca0SFam Zheng         error_setg(&bs->backing_blocker,
123481e5f78aSAlberto Garcia                    "node is used as backing hd of '%s'",
123581e5f78aSAlberto Garcia                    bdrv_get_device_or_node_name(bs));
1236826b6ca0SFam Zheng     }
1237826b6ca0SFam Zheng 
12388d24cce1SFam Zheng     if (!backing_hd) {
1239826b6ca0SFam Zheng         error_free(bs->backing_blocker);
1240826b6ca0SFam Zheng         bs->backing_blocker = NULL;
1241760e0063SKevin Wolf         bs->backing = NULL;
12428d24cce1SFam Zheng         goto out;
12438d24cce1SFam Zheng     }
1244260fecf1SKevin Wolf     bs->backing = bdrv_attach_child(bs, backing_hd, "backing", &child_backing);
12458d24cce1SFam Zheng     bs->open_flags &= ~BDRV_O_NO_BACKING;
12468d24cce1SFam Zheng     pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filename);
12478d24cce1SFam Zheng     pstrcpy(bs->backing_format, sizeof(bs->backing_format),
12488d24cce1SFam Zheng             backing_hd->drv ? backing_hd->drv->format_name : "");
1249826b6ca0SFam Zheng 
1250760e0063SKevin Wolf     bdrv_op_block_all(backing_hd, bs->backing_blocker);
1251826b6ca0SFam Zheng     /* Otherwise we won't be able to commit due to check in bdrv_commit */
1252760e0063SKevin Wolf     bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET,
1253826b6ca0SFam Zheng                     bs->backing_blocker);
12548d24cce1SFam Zheng out:
12553baca891SKevin Wolf     bdrv_refresh_limits(bs, NULL);
12568d24cce1SFam Zheng }
12578d24cce1SFam Zheng 
125831ca6d07SKevin Wolf /*
125931ca6d07SKevin Wolf  * Opens the backing file for a BlockDriverState if not yet open
126031ca6d07SKevin Wolf  *
1261d9b7b057SKevin Wolf  * bdref_key specifies the key for the image's BlockdevRef in the options QDict.
1262d9b7b057SKevin Wolf  * That QDict has to be flattened; therefore, if the BlockdevRef is a QDict
1263d9b7b057SKevin Wolf  * itself, all options starting with "${bdref_key}." are considered part of the
1264d9b7b057SKevin Wolf  * BlockdevRef.
1265d9b7b057SKevin Wolf  *
1266d9b7b057SKevin Wolf  * TODO Can this be unified with bdrv_open_image()?
126731ca6d07SKevin Wolf  */
1268d9b7b057SKevin Wolf int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
1269d9b7b057SKevin Wolf                            const char *bdref_key, Error **errp)
12709156df12SPaolo Bonzini {
12711ba4b6a5SBenoît Canet     char *backing_filename = g_malloc0(PATH_MAX);
1272d9b7b057SKevin Wolf     char *bdref_key_dot;
1273d9b7b057SKevin Wolf     const char *reference = NULL;
1274317fc44eSKevin Wolf     int ret = 0;
12758d24cce1SFam Zheng     BlockDriverState *backing_hd;
1276d9b7b057SKevin Wolf     QDict *options;
1277d9b7b057SKevin Wolf     QDict *tmp_parent_options = NULL;
127834b5d2c6SMax Reitz     Error *local_err = NULL;
12799156df12SPaolo Bonzini 
1280760e0063SKevin Wolf     if (bs->backing != NULL) {
12811ba4b6a5SBenoît Canet         goto free_exit;
12829156df12SPaolo Bonzini     }
12839156df12SPaolo Bonzini 
128431ca6d07SKevin Wolf     /* NULL means an empty set of options */
1285d9b7b057SKevin Wolf     if (parent_options == NULL) {
1286d9b7b057SKevin Wolf         tmp_parent_options = qdict_new();
1287d9b7b057SKevin Wolf         parent_options = tmp_parent_options;
128831ca6d07SKevin Wolf     }
128931ca6d07SKevin Wolf 
12909156df12SPaolo Bonzini     bs->open_flags &= ~BDRV_O_NO_BACKING;
1291d9b7b057SKevin Wolf 
1292d9b7b057SKevin Wolf     bdref_key_dot = g_strdup_printf("%s.", bdref_key);
1293d9b7b057SKevin Wolf     qdict_extract_subqdict(parent_options, &options, bdref_key_dot);
1294d9b7b057SKevin Wolf     g_free(bdref_key_dot);
1295d9b7b057SKevin Wolf 
1296d9b7b057SKevin Wolf     reference = qdict_get_try_str(parent_options, bdref_key);
1297d9b7b057SKevin Wolf     if (reference || qdict_haskey(options, "file.filename")) {
12981cb6f506SKevin Wolf         backing_filename[0] = '\0';
12991cb6f506SKevin Wolf     } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
130031ca6d07SKevin Wolf         QDECREF(options);
13011ba4b6a5SBenoît Canet         goto free_exit;
1302dbecebddSFam Zheng     } else {
13039f07429eSMax Reitz         bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX,
13049f07429eSMax Reitz                                        &local_err);
13059f07429eSMax Reitz         if (local_err) {
13069f07429eSMax Reitz             ret = -EINVAL;
13079f07429eSMax Reitz             error_propagate(errp, local_err);
13089f07429eSMax Reitz             QDECREF(options);
13099f07429eSMax Reitz             goto free_exit;
13109f07429eSMax Reitz         }
13119156df12SPaolo Bonzini     }
13129156df12SPaolo Bonzini 
13138ee79e70SKevin Wolf     if (!bs->drv || !bs->drv->supports_backing) {
13148ee79e70SKevin Wolf         ret = -EINVAL;
13158ee79e70SKevin Wolf         error_setg(errp, "Driver doesn't support backing files");
13168ee79e70SKevin Wolf         QDECREF(options);
13178ee79e70SKevin Wolf         goto free_exit;
13188ee79e70SKevin Wolf     }
13198ee79e70SKevin Wolf 
1320c5f6e493SKevin Wolf     if (bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
1321c5f6e493SKevin Wolf         qdict_put(options, "driver", qstring_from_str(bs->backing_format));
13229156df12SPaolo Bonzini     }
13239156df12SPaolo Bonzini 
1324d9b7b057SKevin Wolf     backing_hd = NULL;
1325f3930ed0SKevin Wolf     ret = bdrv_open_inherit(&backing_hd,
1326f3930ed0SKevin Wolf                             *backing_filename ? backing_filename : NULL,
1327d9b7b057SKevin Wolf                             reference, options, 0, bs, &child_backing,
1328e43bfd9cSMarkus Armbruster                             errp);
13299156df12SPaolo Bonzini     if (ret < 0) {
13309156df12SPaolo Bonzini         bs->open_flags |= BDRV_O_NO_BACKING;
1331e43bfd9cSMarkus Armbruster         error_prepend(errp, "Could not open backing file: ");
13321ba4b6a5SBenoît Canet         goto free_exit;
13339156df12SPaolo Bonzini     }
1334df581792SKevin Wolf 
13355db15a57SKevin Wolf     /* Hook up the backing file link; drop our reference, bs owns the
13365db15a57SKevin Wolf      * backing_hd reference now */
13378d24cce1SFam Zheng     bdrv_set_backing_hd(bs, backing_hd);
13385db15a57SKevin Wolf     bdrv_unref(backing_hd);
1339d80ac658SPeter Feiner 
1340d9b7b057SKevin Wolf     qdict_del(parent_options, bdref_key);
1341d9b7b057SKevin Wolf 
13421ba4b6a5SBenoît Canet free_exit:
13431ba4b6a5SBenoît Canet     g_free(backing_filename);
1344d9b7b057SKevin Wolf     QDECREF(tmp_parent_options);
13451ba4b6a5SBenoît Canet     return ret;
13469156df12SPaolo Bonzini }
13479156df12SPaolo Bonzini 
1348b6ce07aaSKevin Wolf /*
1349da557aacSMax Reitz  * Opens a disk image whose options are given as BlockdevRef in another block
1350da557aacSMax Reitz  * device's options.
1351da557aacSMax Reitz  *
1352da557aacSMax Reitz  * If allow_none is true, no image will be opened if filename is false and no
1353b4b059f6SKevin Wolf  * BlockdevRef is given. NULL will be returned, but errp remains unset.
1354da557aacSMax Reitz  *
1355da557aacSMax Reitz  * bdrev_key specifies the key for the image's BlockdevRef in the options QDict.
1356da557aacSMax Reitz  * That QDict has to be flattened; therefore, if the BlockdevRef is a QDict
1357da557aacSMax Reitz  * itself, all options starting with "${bdref_key}." are considered part of the
1358da557aacSMax Reitz  * BlockdevRef.
1359da557aacSMax Reitz  *
1360da557aacSMax Reitz  * The BlockdevRef will be removed from the options QDict.
1361da557aacSMax Reitz  */
1362b4b059f6SKevin Wolf BdrvChild *bdrv_open_child(const char *filename,
1363f3930ed0SKevin Wolf                            QDict *options, const char *bdref_key,
1364b4b059f6SKevin Wolf                            BlockDriverState* parent,
1365b4b059f6SKevin Wolf                            const BdrvChildRole *child_role,
1366f7d9fd8cSMax Reitz                            bool allow_none, Error **errp)
1367da557aacSMax Reitz {
1368b4b059f6SKevin Wolf     BdrvChild *c = NULL;
1369b4b059f6SKevin Wolf     BlockDriverState *bs;
1370da557aacSMax Reitz     QDict *image_options;
1371da557aacSMax Reitz     int ret;
1372da557aacSMax Reitz     char *bdref_key_dot;
1373da557aacSMax Reitz     const char *reference;
1374da557aacSMax Reitz 
1375df581792SKevin Wolf     assert(child_role != NULL);
1376f67503e5SMax Reitz 
1377da557aacSMax Reitz     bdref_key_dot = g_strdup_printf("%s.", bdref_key);
1378da557aacSMax Reitz     qdict_extract_subqdict(options, &image_options, bdref_key_dot);
1379da557aacSMax Reitz     g_free(bdref_key_dot);
1380da557aacSMax Reitz 
1381da557aacSMax Reitz     reference = qdict_get_try_str(options, bdref_key);
1382da557aacSMax Reitz     if (!filename && !reference && !qdict_size(image_options)) {
1383b4b059f6SKevin Wolf         if (!allow_none) {
1384da557aacSMax Reitz             error_setg(errp, "A block device must be specified for \"%s\"",
1385da557aacSMax Reitz                        bdref_key);
1386da557aacSMax Reitz         }
1387b20e61e0SMarkus Armbruster         QDECREF(image_options);
1388da557aacSMax Reitz         goto done;
1389da557aacSMax Reitz     }
1390da557aacSMax Reitz 
1391b4b059f6SKevin Wolf     bs = NULL;
1392b4b059f6SKevin Wolf     ret = bdrv_open_inherit(&bs, filename, reference, image_options, 0,
1393ce343771SMax Reitz                             parent, child_role, errp);
1394df581792SKevin Wolf     if (ret < 0) {
1395df581792SKevin Wolf         goto done;
1396df581792SKevin Wolf     }
1397df581792SKevin Wolf 
1398260fecf1SKevin Wolf     c = bdrv_attach_child(parent, bs, bdref_key, child_role);
1399da557aacSMax Reitz 
1400da557aacSMax Reitz done:
1401da557aacSMax Reitz     qdict_del(options, bdref_key);
1402b4b059f6SKevin Wolf     return c;
1403b4b059f6SKevin Wolf }
1404b4b059f6SKevin Wolf 
140573176beeSKevin Wolf static int bdrv_append_temp_snapshot(BlockDriverState *bs, int flags,
140673176beeSKevin Wolf                                      QDict *snapshot_options, Error **errp)
1407b998875dSKevin Wolf {
1408b998875dSKevin Wolf     /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
14091ba4b6a5SBenoît Canet     char *tmp_filename = g_malloc0(PATH_MAX + 1);
1410b998875dSKevin Wolf     int64_t total_size;
141183d0521aSChunyan Liu     QemuOpts *opts = NULL;
1412b998875dSKevin Wolf     BlockDriverState *bs_snapshot;
1413c2e0dbbfSFam Zheng     Error *local_err = NULL;
1414b998875dSKevin Wolf     int ret;
1415b998875dSKevin Wolf 
1416b998875dSKevin Wolf     /* if snapshot, we create a temporary backing file and open it
1417b998875dSKevin Wolf        instead of opening 'filename' directly */
1418b998875dSKevin Wolf 
1419b998875dSKevin Wolf     /* Get the required size from the image */
1420f187743aSKevin Wolf     total_size = bdrv_getlength(bs);
1421f187743aSKevin Wolf     if (total_size < 0) {
14226b8aeca5SChen Gang         ret = total_size;
1423f187743aSKevin Wolf         error_setg_errno(errp, -total_size, "Could not get image size");
14241ba4b6a5SBenoît Canet         goto out;
1425f187743aSKevin Wolf     }
1426b998875dSKevin Wolf 
1427b998875dSKevin Wolf     /* Create the temporary image */
14281ba4b6a5SBenoît Canet     ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
1429b998875dSKevin Wolf     if (ret < 0) {
1430b998875dSKevin Wolf         error_setg_errno(errp, -ret, "Could not get temporary filename");
14311ba4b6a5SBenoît Canet         goto out;
1432b998875dSKevin Wolf     }
1433b998875dSKevin Wolf 
1434ef810437SMax Reitz     opts = qemu_opts_create(bdrv_qcow2.create_opts, NULL, 0,
1435c282e1fdSChunyan Liu                             &error_abort);
143639101f25SMarkus Armbruster     qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size, &error_abort);
1437e43bfd9cSMarkus Armbruster     ret = bdrv_create(&bdrv_qcow2, tmp_filename, opts, errp);
143883d0521aSChunyan Liu     qemu_opts_del(opts);
1439b998875dSKevin Wolf     if (ret < 0) {
1440e43bfd9cSMarkus Armbruster         error_prepend(errp, "Could not create temporary overlay '%s': ",
1441e43bfd9cSMarkus Armbruster                       tmp_filename);
14421ba4b6a5SBenoît Canet         goto out;
1443b998875dSKevin Wolf     }
1444b998875dSKevin Wolf 
144573176beeSKevin Wolf     /* Prepare options QDict for the temporary file */
1446b998875dSKevin Wolf     qdict_put(snapshot_options, "file.driver",
1447b998875dSKevin Wolf               qstring_from_str("file"));
1448b998875dSKevin Wolf     qdict_put(snapshot_options, "file.filename",
1449b998875dSKevin Wolf               qstring_from_str(tmp_filename));
1450e6641719SMax Reitz     qdict_put(snapshot_options, "driver",
1451e6641719SMax Reitz               qstring_from_str("qcow2"));
1452b998875dSKevin Wolf 
1453e4e9986bSMarkus Armbruster     bs_snapshot = bdrv_new();
1454b998875dSKevin Wolf 
1455b998875dSKevin Wolf     ret = bdrv_open(&bs_snapshot, NULL, NULL, snapshot_options,
14566ebf9aa2SMax Reitz                     flags, &local_err);
145773176beeSKevin Wolf     snapshot_options = NULL;
1458b998875dSKevin Wolf     if (ret < 0) {
1459b998875dSKevin Wolf         error_propagate(errp, local_err);
14601ba4b6a5SBenoît Canet         goto out;
1461b998875dSKevin Wolf     }
1462b998875dSKevin Wolf 
1463b998875dSKevin Wolf     bdrv_append(bs_snapshot, bs);
14641ba4b6a5SBenoît Canet 
14651ba4b6a5SBenoît Canet out:
146673176beeSKevin Wolf     QDECREF(snapshot_options);
14671ba4b6a5SBenoît Canet     g_free(tmp_filename);
14686b8aeca5SChen Gang     return ret;
1469b998875dSKevin Wolf }
1470b998875dSKevin Wolf 
1471da557aacSMax Reitz /*
1472b6ce07aaSKevin Wolf  * Opens a disk image (raw, qcow2, vmdk, ...)
1473de9c0cecSKevin Wolf  *
1474de9c0cecSKevin Wolf  * options is a QDict of options to pass to the block drivers, or NULL for an
1475de9c0cecSKevin Wolf  * empty set of options. The reference to the QDict belongs to the block layer
1476de9c0cecSKevin Wolf  * after the call (even on failure), so if the caller intends to reuse the
1477de9c0cecSKevin Wolf  * dictionary, it needs to use QINCREF() before calling bdrv_open.
1478f67503e5SMax Reitz  *
1479f67503e5SMax Reitz  * If *pbs is NULL, a new BDS will be created with a pointer to it stored there.
1480f67503e5SMax Reitz  * If it is not NULL, the referenced BDS will be reused.
1481ddf5636dSMax Reitz  *
1482ddf5636dSMax Reitz  * The reference parameter may be used to specify an existing block device which
1483ddf5636dSMax Reitz  * should be opened. If specified, neither options nor a filename may be given,
1484ddf5636dSMax Reitz  * nor can an existing BDS be reused (that is, *pbs has to be NULL).
1485b6ce07aaSKevin Wolf  */
1486f3930ed0SKevin Wolf static int bdrv_open_inherit(BlockDriverState **pbs, const char *filename,
1487ddf5636dSMax Reitz                              const char *reference, QDict *options, int flags,
1488f3930ed0SKevin Wolf                              BlockDriverState *parent,
1489ce343771SMax Reitz                              const BdrvChildRole *child_role, Error **errp)
1490ea2384d3Sbellard {
1491b6ce07aaSKevin Wolf     int ret;
14929a4f4c31SKevin Wolf     BdrvChild *file = NULL;
14939a4f4c31SKevin Wolf     BlockDriverState *bs;
1494ce343771SMax Reitz     BlockDriver *drv = NULL;
149574fe54f2SKevin Wolf     const char *drvname;
14963e8c2e57SAlberto Garcia     const char *backing;
149734b5d2c6SMax Reitz     Error *local_err = NULL;
149873176beeSKevin Wolf     QDict *snapshot_options = NULL;
1499b1e6fc08SKevin Wolf     int snapshot_flags = 0;
150033e3963eSbellard 
1501f67503e5SMax Reitz     assert(pbs);
1502f3930ed0SKevin Wolf     assert(!child_role || !flags);
1503f3930ed0SKevin Wolf     assert(!child_role == !parent);
1504f67503e5SMax Reitz 
1505ddf5636dSMax Reitz     if (reference) {
1506ddf5636dSMax Reitz         bool options_non_empty = options ? qdict_size(options) : false;
1507ddf5636dSMax Reitz         QDECREF(options);
1508ddf5636dSMax Reitz 
1509ddf5636dSMax Reitz         if (*pbs) {
1510ddf5636dSMax Reitz             error_setg(errp, "Cannot reuse an existing BDS when referencing "
1511ddf5636dSMax Reitz                        "another block device");
1512ddf5636dSMax Reitz             return -EINVAL;
1513ddf5636dSMax Reitz         }
1514ddf5636dSMax Reitz 
1515ddf5636dSMax Reitz         if (filename || options_non_empty) {
1516ddf5636dSMax Reitz             error_setg(errp, "Cannot reference an existing block device with "
1517ddf5636dSMax Reitz                        "additional options or a new filename");
1518ddf5636dSMax Reitz             return -EINVAL;
1519ddf5636dSMax Reitz         }
1520ddf5636dSMax Reitz 
1521ddf5636dSMax Reitz         bs = bdrv_lookup_bs(reference, reference, errp);
1522ddf5636dSMax Reitz         if (!bs) {
1523ddf5636dSMax Reitz             return -ENODEV;
1524ddf5636dSMax Reitz         }
152576b22320SKevin Wolf 
1526*27ccdd52SKevin Wolf         if (bs->blk && blk_get_public(bs->blk)->throttle_state) {
152776b22320SKevin Wolf             error_setg(errp, "Cannot reference an existing block device for "
152876b22320SKevin Wolf                        "which I/O throttling is enabled");
152976b22320SKevin Wolf             return -EINVAL;
153076b22320SKevin Wolf         }
153176b22320SKevin Wolf 
1532ddf5636dSMax Reitz         bdrv_ref(bs);
1533ddf5636dSMax Reitz         *pbs = bs;
1534ddf5636dSMax Reitz         return 0;
1535ddf5636dSMax Reitz     }
1536ddf5636dSMax Reitz 
1537f67503e5SMax Reitz     if (*pbs) {
1538f67503e5SMax Reitz         bs = *pbs;
1539f67503e5SMax Reitz     } else {
1540e4e9986bSMarkus Armbruster         bs = bdrv_new();
1541f67503e5SMax Reitz     }
1542f67503e5SMax Reitz 
1543de9c0cecSKevin Wolf     /* NULL means an empty set of options */
1544de9c0cecSKevin Wolf     if (options == NULL) {
1545de9c0cecSKevin Wolf         options = qdict_new();
1546de9c0cecSKevin Wolf     }
1547de9c0cecSKevin Wolf 
1548145f598eSKevin Wolf     /* json: syntax counts as explicit options, as if in the QDict */
1549de3b53f0SKevin Wolf     parse_json_protocol(options, &filename, &local_err);
1550de3b53f0SKevin Wolf     if (local_err) {
1551de3b53f0SKevin Wolf         ret = -EINVAL;
1552de3b53f0SKevin Wolf         goto fail;
1553de3b53f0SKevin Wolf     }
1554de3b53f0SKevin Wolf 
1555145f598eSKevin Wolf     bs->explicit_options = qdict_clone_shallow(options);
1556145f598eSKevin Wolf 
1557f3930ed0SKevin Wolf     if (child_role) {
1558bddcec37SKevin Wolf         bs->inherits_from = parent;
15598e2160e2SKevin Wolf         child_role->inherit_options(&flags, options,
15608e2160e2SKevin Wolf                                     parent->open_flags, parent->options);
1561f3930ed0SKevin Wolf     }
1562f3930ed0SKevin Wolf 
1563de3b53f0SKevin Wolf     ret = bdrv_fill_options(&options, filename, &flags, &local_err);
1564462f5bcfSKevin Wolf     if (local_err) {
1565462f5bcfSKevin Wolf         goto fail;
1566462f5bcfSKevin Wolf     }
1567462f5bcfSKevin Wolf 
156862392ebbSKevin Wolf     bs->open_flags = flags;
156962392ebbSKevin Wolf     bs->options = options;
157062392ebbSKevin Wolf     options = qdict_clone_shallow(options);
157162392ebbSKevin Wolf 
157276c591b0SKevin Wolf     /* Find the right image format driver */
157376c591b0SKevin Wolf     drvname = qdict_get_try_str(options, "driver");
157476c591b0SKevin Wolf     if (drvname) {
157576c591b0SKevin Wolf         drv = bdrv_find_format(drvname);
157676c591b0SKevin Wolf         if (!drv) {
157776c591b0SKevin Wolf             error_setg(errp, "Unknown driver: '%s'", drvname);
157876c591b0SKevin Wolf             ret = -EINVAL;
157976c591b0SKevin Wolf             goto fail;
158076c591b0SKevin Wolf         }
158176c591b0SKevin Wolf     }
158276c591b0SKevin Wolf 
158376c591b0SKevin Wolf     assert(drvname || !(flags & BDRV_O_PROTOCOL));
158476c591b0SKevin Wolf 
15853e8c2e57SAlberto Garcia     backing = qdict_get_try_str(options, "backing");
15863e8c2e57SAlberto Garcia     if (backing && *backing == '\0') {
15873e8c2e57SAlberto Garcia         flags |= BDRV_O_NO_BACKING;
15883e8c2e57SAlberto Garcia         qdict_del(options, "backing");
15893e8c2e57SAlberto Garcia     }
15903e8c2e57SAlberto Garcia 
1591f500a6d3SKevin Wolf     /* Open image file without format layer */
1592f4788adcSKevin Wolf     if ((flags & BDRV_O_PROTOCOL) == 0) {
1593be028adcSJeff Cody         if (flags & BDRV_O_RDWR) {
1594be028adcSJeff Cody             flags |= BDRV_O_ALLOW_RDWR;
1595be028adcSJeff Cody         }
1596b1e6fc08SKevin Wolf         if (flags & BDRV_O_SNAPSHOT) {
159773176beeSKevin Wolf             snapshot_options = qdict_new();
159873176beeSKevin Wolf             bdrv_temp_snapshot_options(&snapshot_flags, snapshot_options,
159973176beeSKevin Wolf                                        flags, options);
16008e2160e2SKevin Wolf             bdrv_backing_options(&flags, options, flags, options);
1601b1e6fc08SKevin Wolf         }
1602be028adcSJeff Cody 
1603f3930ed0SKevin Wolf         bs->open_flags = flags;
16041fdd6933SKevin Wolf 
16059a4f4c31SKevin Wolf         file = bdrv_open_child(filename, options, "file", bs,
16061fdd6933SKevin Wolf                                &child_file, true, &local_err);
16071fdd6933SKevin Wolf         if (local_err) {
16081fdd6933SKevin Wolf             ret = -EINVAL;
16098bfea15dSKevin Wolf             goto fail;
1610f500a6d3SKevin Wolf         }
1611f4788adcSKevin Wolf     }
1612f500a6d3SKevin Wolf 
161376c591b0SKevin Wolf     /* Image format probing */
161438f3ef57SKevin Wolf     bs->probed = !drv;
161576c591b0SKevin Wolf     if (!drv && file) {
16169a4f4c31SKevin Wolf         ret = find_image_format(file->bs, filename, &drv, &local_err);
161717b005f1SKevin Wolf         if (ret < 0) {
161817b005f1SKevin Wolf             goto fail;
161917b005f1SKevin Wolf         }
162062392ebbSKevin Wolf         /*
162162392ebbSKevin Wolf          * This option update would logically belong in bdrv_fill_options(),
162262392ebbSKevin Wolf          * but we first need to open bs->file for the probing to work, while
162362392ebbSKevin Wolf          * opening bs->file already requires the (mostly) final set of options
162462392ebbSKevin Wolf          * so that cache mode etc. can be inherited.
162562392ebbSKevin Wolf          *
162662392ebbSKevin Wolf          * Adding the driver later is somewhat ugly, but it's not an option
162762392ebbSKevin Wolf          * that would ever be inherited, so it's correct. We just need to make
162862392ebbSKevin Wolf          * sure to update both bs->options (which has the full effective
162962392ebbSKevin Wolf          * options for bs) and options (which has file.* already removed).
163062392ebbSKevin Wolf          */
163162392ebbSKevin Wolf         qdict_put(bs->options, "driver", qstring_from_str(drv->format_name));
163262392ebbSKevin Wolf         qdict_put(options, "driver", qstring_from_str(drv->format_name));
163376c591b0SKevin Wolf     } else if (!drv) {
16342a05cbe4SMax Reitz         error_setg(errp, "Must specify either driver or file");
16352a05cbe4SMax Reitz         ret = -EINVAL;
16368bfea15dSKevin Wolf         goto fail;
16372a05cbe4SMax Reitz     }
1638f500a6d3SKevin Wolf 
163953a29513SMax Reitz     /* BDRV_O_PROTOCOL must be set iff a protocol BDS is about to be created */
164053a29513SMax Reitz     assert(!!(flags & BDRV_O_PROTOCOL) == !!drv->bdrv_file_open);
164153a29513SMax Reitz     /* file must be NULL if a protocol BDS is about to be created
164253a29513SMax Reitz      * (the inverse results in an error message from bdrv_open_common()) */
164353a29513SMax Reitz     assert(!(flags & BDRV_O_PROTOCOL) || !file);
164453a29513SMax Reitz 
1645b6ce07aaSKevin Wolf     /* Open the image */
164682dc8b41SKevin Wolf     ret = bdrv_open_common(bs, file, options, &local_err);
1647b6ce07aaSKevin Wolf     if (ret < 0) {
16488bfea15dSKevin Wolf         goto fail;
16496987307cSChristoph Hellwig     }
16506987307cSChristoph Hellwig 
16512a05cbe4SMax Reitz     if (file && (bs->file != file)) {
16529a4f4c31SKevin Wolf         bdrv_unref_child(bs, file);
1653f500a6d3SKevin Wolf         file = NULL;
1654f500a6d3SKevin Wolf     }
1655f500a6d3SKevin Wolf 
1656b6ce07aaSKevin Wolf     /* If there is a backing file, use it */
16579156df12SPaolo Bonzini     if ((flags & BDRV_O_NO_BACKING) == 0) {
1658d9b7b057SKevin Wolf         ret = bdrv_open_backing_file(bs, options, "backing", &local_err);
1659b6ce07aaSKevin Wolf         if (ret < 0) {
1660b6ad491aSKevin Wolf             goto close_and_fail;
1661b6ce07aaSKevin Wolf         }
1662b6ce07aaSKevin Wolf     }
1663b6ce07aaSKevin Wolf 
166491af7014SMax Reitz     bdrv_refresh_filename(bs);
166591af7014SMax Reitz 
1666b6ad491aSKevin Wolf     /* Check if any unknown options were used */
16675acd9d81SMax Reitz     if (options && (qdict_size(options) != 0)) {
1668b6ad491aSKevin Wolf         const QDictEntry *entry = qdict_first(options);
16695acd9d81SMax Reitz         if (flags & BDRV_O_PROTOCOL) {
16705acd9d81SMax Reitz             error_setg(errp, "Block protocol '%s' doesn't support the option "
16715acd9d81SMax Reitz                        "'%s'", drv->format_name, entry->key);
16725acd9d81SMax Reitz         } else {
1673d0e46a55SMax Reitz             error_setg(errp,
1674d0e46a55SMax Reitz                        "Block format '%s' does not support the option '%s'",
1675d0e46a55SMax Reitz                        drv->format_name, entry->key);
16765acd9d81SMax Reitz         }
1677b6ad491aSKevin Wolf 
1678b6ad491aSKevin Wolf         ret = -EINVAL;
1679b6ad491aSKevin Wolf         goto close_and_fail;
1680b6ad491aSKevin Wolf     }
1681b6ad491aSKevin Wolf 
1682b6ce07aaSKevin Wolf     if (!bdrv_key_required(bs)) {
1683a7f53e26SMarkus Armbruster         if (bs->blk) {
1684a7f53e26SMarkus Armbruster             blk_dev_change_media_cb(bs->blk, true);
1685a7f53e26SMarkus Armbruster         }
1686c3adb58fSMarkus Armbruster     } else if (!runstate_check(RUN_STATE_PRELAUNCH)
1687c3adb58fSMarkus Armbruster                && !runstate_check(RUN_STATE_INMIGRATE)
1688c3adb58fSMarkus Armbruster                && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
1689c3adb58fSMarkus Armbruster         error_setg(errp,
1690c3adb58fSMarkus Armbruster                    "Guest must be stopped for opening of encrypted image");
1691c3adb58fSMarkus Armbruster         ret = -EBUSY;
1692c3adb58fSMarkus Armbruster         goto close_and_fail;
1693b6ce07aaSKevin Wolf     }
1694b6ce07aaSKevin Wolf 
1695c3adb58fSMarkus Armbruster     QDECREF(options);
1696f67503e5SMax Reitz     *pbs = bs;
1697dd62f1caSKevin Wolf 
1698dd62f1caSKevin Wolf     /* For snapshot=on, create a temporary qcow2 overlay. bs points to the
1699dd62f1caSKevin Wolf      * temporary snapshot afterwards. */
1700dd62f1caSKevin Wolf     if (snapshot_flags) {
170173176beeSKevin Wolf         ret = bdrv_append_temp_snapshot(bs, snapshot_flags, snapshot_options,
170273176beeSKevin Wolf                                         &local_err);
170373176beeSKevin Wolf         snapshot_options = NULL;
1704dd62f1caSKevin Wolf         if (local_err) {
1705dd62f1caSKevin Wolf             goto close_and_fail;
1706dd62f1caSKevin Wolf         }
1707dd62f1caSKevin Wolf     }
1708dd62f1caSKevin Wolf 
1709b6ce07aaSKevin Wolf     return 0;
1710b6ce07aaSKevin Wolf 
17118bfea15dSKevin Wolf fail:
1712f500a6d3SKevin Wolf     if (file != NULL) {
17139a4f4c31SKevin Wolf         bdrv_unref_child(bs, file);
1714f500a6d3SKevin Wolf     }
171573176beeSKevin Wolf     QDECREF(snapshot_options);
1716145f598eSKevin Wolf     QDECREF(bs->explicit_options);
1717de9c0cecSKevin Wolf     QDECREF(bs->options);
1718b6ad491aSKevin Wolf     QDECREF(options);
1719de9c0cecSKevin Wolf     bs->options = NULL;
1720f67503e5SMax Reitz     if (!*pbs) {
1721f67503e5SMax Reitz         /* If *pbs is NULL, a new BDS has been created in this function and
1722f67503e5SMax Reitz            needs to be freed now. Otherwise, it does not need to be closed,
1723f67503e5SMax Reitz            since it has not really been opened yet. */
1724f67503e5SMax Reitz         bdrv_unref(bs);
1725f67503e5SMax Reitz     }
172684d18f06SMarkus Armbruster     if (local_err) {
172734b5d2c6SMax Reitz         error_propagate(errp, local_err);
172834b5d2c6SMax Reitz     }
1729b6ad491aSKevin Wolf     return ret;
1730de9c0cecSKevin Wolf 
1731b6ad491aSKevin Wolf close_and_fail:
1732f67503e5SMax Reitz     /* See fail path, but now the BDS has to be always closed */
1733f67503e5SMax Reitz     if (*pbs) {
1734b6ad491aSKevin Wolf         bdrv_close(bs);
1735f67503e5SMax Reitz     } else {
1736f67503e5SMax Reitz         bdrv_unref(bs);
1737f67503e5SMax Reitz     }
173873176beeSKevin Wolf     QDECREF(snapshot_options);
1739b6ad491aSKevin Wolf     QDECREF(options);
174084d18f06SMarkus Armbruster     if (local_err) {
174134b5d2c6SMax Reitz         error_propagate(errp, local_err);
174234b5d2c6SMax Reitz     }
1743b6ce07aaSKevin Wolf     return ret;
1744b6ce07aaSKevin Wolf }
1745b6ce07aaSKevin Wolf 
1746f3930ed0SKevin Wolf int bdrv_open(BlockDriverState **pbs, const char *filename,
17476ebf9aa2SMax Reitz               const char *reference, QDict *options, int flags, Error **errp)
1748f3930ed0SKevin Wolf {
1749f3930ed0SKevin Wolf     return bdrv_open_inherit(pbs, filename, reference, options, flags, NULL,
1750ce343771SMax Reitz                              NULL, errp);
1751f3930ed0SKevin Wolf }
1752f3930ed0SKevin Wolf 
1753e971aa12SJeff Cody typedef struct BlockReopenQueueEntry {
1754e971aa12SJeff Cody      bool prepared;
1755e971aa12SJeff Cody      BDRVReopenState state;
1756e971aa12SJeff Cody      QSIMPLEQ_ENTRY(BlockReopenQueueEntry) entry;
1757e971aa12SJeff Cody } BlockReopenQueueEntry;
1758e971aa12SJeff Cody 
1759e971aa12SJeff Cody /*
1760e971aa12SJeff Cody  * Adds a BlockDriverState to a simple queue for an atomic, transactional
1761e971aa12SJeff Cody  * reopen of multiple devices.
1762e971aa12SJeff Cody  *
1763e971aa12SJeff Cody  * bs_queue can either be an existing BlockReopenQueue that has had QSIMPLE_INIT
1764e971aa12SJeff Cody  * already performed, or alternatively may be NULL a new BlockReopenQueue will
1765e971aa12SJeff Cody  * be created and initialized. This newly created BlockReopenQueue should be
1766e971aa12SJeff Cody  * passed back in for subsequent calls that are intended to be of the same
1767e971aa12SJeff Cody  * atomic 'set'.
1768e971aa12SJeff Cody  *
1769e971aa12SJeff Cody  * bs is the BlockDriverState to add to the reopen queue.
1770e971aa12SJeff Cody  *
17714d2cb092SKevin Wolf  * options contains the changed options for the associated bs
17724d2cb092SKevin Wolf  * (the BlockReopenQueue takes ownership)
17734d2cb092SKevin Wolf  *
1774e971aa12SJeff Cody  * flags contains the open flags for the associated bs
1775e971aa12SJeff Cody  *
1776e971aa12SJeff Cody  * returns a pointer to bs_queue, which is either the newly allocated
1777e971aa12SJeff Cody  * bs_queue, or the existing bs_queue being used.
1778e971aa12SJeff Cody  *
1779e971aa12SJeff Cody  */
178028518102SKevin Wolf static BlockReopenQueue *bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
17814d2cb092SKevin Wolf                                                  BlockDriverState *bs,
178228518102SKevin Wolf                                                  QDict *options,
178328518102SKevin Wolf                                                  int flags,
178428518102SKevin Wolf                                                  const BdrvChildRole *role,
178528518102SKevin Wolf                                                  QDict *parent_options,
178628518102SKevin Wolf                                                  int parent_flags)
1787e971aa12SJeff Cody {
1788e971aa12SJeff Cody     assert(bs != NULL);
1789e971aa12SJeff Cody 
1790e971aa12SJeff Cody     BlockReopenQueueEntry *bs_entry;
179167251a31SKevin Wolf     BdrvChild *child;
1792145f598eSKevin Wolf     QDict *old_options, *explicit_options;
179367251a31SKevin Wolf 
1794e971aa12SJeff Cody     if (bs_queue == NULL) {
1795e971aa12SJeff Cody         bs_queue = g_new0(BlockReopenQueue, 1);
1796e971aa12SJeff Cody         QSIMPLEQ_INIT(bs_queue);
1797e971aa12SJeff Cody     }
1798e971aa12SJeff Cody 
17994d2cb092SKevin Wolf     if (!options) {
18004d2cb092SKevin Wolf         options = qdict_new();
18014d2cb092SKevin Wolf     }
18024d2cb092SKevin Wolf 
180328518102SKevin Wolf     /*
180428518102SKevin Wolf      * Precedence of options:
180528518102SKevin Wolf      * 1. Explicitly passed in options (highest)
180691a097e7SKevin Wolf      * 2. Set in flags (only for top level)
1807145f598eSKevin Wolf      * 3. Retained from explicitly set options of bs
18088e2160e2SKevin Wolf      * 4. Inherited from parent node
180928518102SKevin Wolf      * 5. Retained from effective options of bs
181028518102SKevin Wolf      */
181128518102SKevin Wolf 
181291a097e7SKevin Wolf     if (!parent_options) {
181391a097e7SKevin Wolf         /*
181491a097e7SKevin Wolf          * Any setting represented by flags is always updated. If the
181591a097e7SKevin Wolf          * corresponding QDict option is set, it takes precedence. Otherwise
181691a097e7SKevin Wolf          * the flag is translated into a QDict option. The old setting of bs is
181791a097e7SKevin Wolf          * not considered.
181891a097e7SKevin Wolf          */
181991a097e7SKevin Wolf         update_options_from_flags(options, flags);
182091a097e7SKevin Wolf     }
182191a097e7SKevin Wolf 
1822145f598eSKevin Wolf     /* Old explicitly set values (don't overwrite by inherited value) */
1823145f598eSKevin Wolf     old_options = qdict_clone_shallow(bs->explicit_options);
1824145f598eSKevin Wolf     bdrv_join_options(bs, options, old_options);
1825145f598eSKevin Wolf     QDECREF(old_options);
1826145f598eSKevin Wolf 
1827145f598eSKevin Wolf     explicit_options = qdict_clone_shallow(options);
1828145f598eSKevin Wolf 
182928518102SKevin Wolf     /* Inherit from parent node */
183028518102SKevin Wolf     if (parent_options) {
183128518102SKevin Wolf         assert(!flags);
18328e2160e2SKevin Wolf         role->inherit_options(&flags, options, parent_flags, parent_options);
183328518102SKevin Wolf     }
183428518102SKevin Wolf 
183528518102SKevin Wolf     /* Old values are used for options that aren't set yet */
18364d2cb092SKevin Wolf     old_options = qdict_clone_shallow(bs->options);
1837cddff5baSKevin Wolf     bdrv_join_options(bs, options, old_options);
18384d2cb092SKevin Wolf     QDECREF(old_options);
18394d2cb092SKevin Wolf 
1840f1f25a2eSKevin Wolf     /* bdrv_open() masks this flag out */
1841f1f25a2eSKevin Wolf     flags &= ~BDRV_O_PROTOCOL;
1842f1f25a2eSKevin Wolf 
184367251a31SKevin Wolf     QLIST_FOREACH(child, &bs->children, next) {
18444c9dfe5dSKevin Wolf         QDict *new_child_options;
18454c9dfe5dSKevin Wolf         char *child_key_dot;
184667251a31SKevin Wolf 
18474c9dfe5dSKevin Wolf         /* reopen can only change the options of block devices that were
18484c9dfe5dSKevin Wolf          * implicitly created and inherited options. For other (referenced)
18494c9dfe5dSKevin Wolf          * block devices, a syntax like "backing.foo" results in an error. */
185067251a31SKevin Wolf         if (child->bs->inherits_from != bs) {
185167251a31SKevin Wolf             continue;
185267251a31SKevin Wolf         }
185367251a31SKevin Wolf 
18544c9dfe5dSKevin Wolf         child_key_dot = g_strdup_printf("%s.", child->name);
18554c9dfe5dSKevin Wolf         qdict_extract_subqdict(options, &new_child_options, child_key_dot);
18564c9dfe5dSKevin Wolf         g_free(child_key_dot);
18574c9dfe5dSKevin Wolf 
185828518102SKevin Wolf         bdrv_reopen_queue_child(bs_queue, child->bs, new_child_options, 0,
185928518102SKevin Wolf                                 child->role, options, flags);
1860e971aa12SJeff Cody     }
1861e971aa12SJeff Cody 
1862e971aa12SJeff Cody     bs_entry = g_new0(BlockReopenQueueEntry, 1);
1863e971aa12SJeff Cody     QSIMPLEQ_INSERT_TAIL(bs_queue, bs_entry, entry);
1864e971aa12SJeff Cody 
1865e971aa12SJeff Cody     bs_entry->state.bs = bs;
18664d2cb092SKevin Wolf     bs_entry->state.options = options;
1867145f598eSKevin Wolf     bs_entry->state.explicit_options = explicit_options;
1868e971aa12SJeff Cody     bs_entry->state.flags = flags;
1869e971aa12SJeff Cody 
1870e971aa12SJeff Cody     return bs_queue;
1871e971aa12SJeff Cody }
1872e971aa12SJeff Cody 
187328518102SKevin Wolf BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
187428518102SKevin Wolf                                     BlockDriverState *bs,
187528518102SKevin Wolf                                     QDict *options, int flags)
187628518102SKevin Wolf {
187728518102SKevin Wolf     return bdrv_reopen_queue_child(bs_queue, bs, options, flags,
187828518102SKevin Wolf                                    NULL, NULL, 0);
187928518102SKevin Wolf }
188028518102SKevin Wolf 
1881e971aa12SJeff Cody /*
1882e971aa12SJeff Cody  * Reopen multiple BlockDriverStates atomically & transactionally.
1883e971aa12SJeff Cody  *
1884e971aa12SJeff Cody  * The queue passed in (bs_queue) must have been built up previous
1885e971aa12SJeff Cody  * via bdrv_reopen_queue().
1886e971aa12SJeff Cody  *
1887e971aa12SJeff Cody  * Reopens all BDS specified in the queue, with the appropriate
1888e971aa12SJeff Cody  * flags.  All devices are prepared for reopen, and failure of any
1889e971aa12SJeff Cody  * device will cause all device changes to be abandonded, and intermediate
1890e971aa12SJeff Cody  * data cleaned up.
1891e971aa12SJeff Cody  *
1892e971aa12SJeff Cody  * If all devices prepare successfully, then the changes are committed
1893e971aa12SJeff Cody  * to all devices.
1894e971aa12SJeff Cody  *
1895e971aa12SJeff Cody  */
1896e971aa12SJeff Cody int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
1897e971aa12SJeff Cody {
1898e971aa12SJeff Cody     int ret = -1;
1899e971aa12SJeff Cody     BlockReopenQueueEntry *bs_entry, *next;
1900e971aa12SJeff Cody     Error *local_err = NULL;
1901e971aa12SJeff Cody 
1902e971aa12SJeff Cody     assert(bs_queue != NULL);
1903e971aa12SJeff Cody 
1904e971aa12SJeff Cody     bdrv_drain_all();
1905e971aa12SJeff Cody 
1906e971aa12SJeff Cody     QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1907e971aa12SJeff Cody         if (bdrv_reopen_prepare(&bs_entry->state, bs_queue, &local_err)) {
1908e971aa12SJeff Cody             error_propagate(errp, local_err);
1909e971aa12SJeff Cody             goto cleanup;
1910e971aa12SJeff Cody         }
1911e971aa12SJeff Cody         bs_entry->prepared = true;
1912e971aa12SJeff Cody     }
1913e971aa12SJeff Cody 
1914e971aa12SJeff Cody     /* If we reach this point, we have success and just need to apply the
1915e971aa12SJeff Cody      * changes
1916e971aa12SJeff Cody      */
1917e971aa12SJeff Cody     QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1918e971aa12SJeff Cody         bdrv_reopen_commit(&bs_entry->state);
1919e971aa12SJeff Cody     }
1920e971aa12SJeff Cody 
1921e971aa12SJeff Cody     ret = 0;
1922e971aa12SJeff Cody 
1923e971aa12SJeff Cody cleanup:
1924e971aa12SJeff Cody     QSIMPLEQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
1925e971aa12SJeff Cody         if (ret && bs_entry->prepared) {
1926e971aa12SJeff Cody             bdrv_reopen_abort(&bs_entry->state);
1927145f598eSKevin Wolf         } else if (ret) {
1928145f598eSKevin Wolf             QDECREF(bs_entry->state.explicit_options);
1929e971aa12SJeff Cody         }
19304d2cb092SKevin Wolf         QDECREF(bs_entry->state.options);
1931e971aa12SJeff Cody         g_free(bs_entry);
1932e971aa12SJeff Cody     }
1933e971aa12SJeff Cody     g_free(bs_queue);
1934e971aa12SJeff Cody     return ret;
1935e971aa12SJeff Cody }
1936e971aa12SJeff Cody 
1937e971aa12SJeff Cody 
1938e971aa12SJeff Cody /* Reopen a single BlockDriverState with the specified flags. */
1939e971aa12SJeff Cody int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp)
1940e971aa12SJeff Cody {
1941e971aa12SJeff Cody     int ret = -1;
1942e971aa12SJeff Cody     Error *local_err = NULL;
19434d2cb092SKevin Wolf     BlockReopenQueue *queue = bdrv_reopen_queue(NULL, bs, NULL, bdrv_flags);
1944e971aa12SJeff Cody 
1945e971aa12SJeff Cody     ret = bdrv_reopen_multiple(queue, &local_err);
1946e971aa12SJeff Cody     if (local_err != NULL) {
1947e971aa12SJeff Cody         error_propagate(errp, local_err);
1948e971aa12SJeff Cody     }
1949e971aa12SJeff Cody     return ret;
1950e971aa12SJeff Cody }
1951e971aa12SJeff Cody 
1952e971aa12SJeff Cody 
1953e971aa12SJeff Cody /*
1954e971aa12SJeff Cody  * Prepares a BlockDriverState for reopen. All changes are staged in the
1955e971aa12SJeff Cody  * 'opaque' field of the BDRVReopenState, which is used and allocated by
1956e971aa12SJeff Cody  * the block driver layer .bdrv_reopen_prepare()
1957e971aa12SJeff Cody  *
1958e971aa12SJeff Cody  * bs is the BlockDriverState to reopen
1959e971aa12SJeff Cody  * flags are the new open flags
1960e971aa12SJeff Cody  * queue is the reopen queue
1961e971aa12SJeff Cody  *
1962e971aa12SJeff Cody  * Returns 0 on success, non-zero on error.  On error errp will be set
1963e971aa12SJeff Cody  * as well.
1964e971aa12SJeff Cody  *
1965e971aa12SJeff Cody  * On failure, bdrv_reopen_abort() will be called to clean up any data.
1966e971aa12SJeff Cody  * It is the responsibility of the caller to then call the abort() or
1967e971aa12SJeff Cody  * commit() for any other BDS that have been left in a prepare() state
1968e971aa12SJeff Cody  *
1969e971aa12SJeff Cody  */
1970e971aa12SJeff Cody int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
1971e971aa12SJeff Cody                         Error **errp)
1972e971aa12SJeff Cody {
1973e971aa12SJeff Cody     int ret = -1;
1974e971aa12SJeff Cody     Error *local_err = NULL;
1975e971aa12SJeff Cody     BlockDriver *drv;
1976ccf9dc07SKevin Wolf     QemuOpts *opts;
1977ccf9dc07SKevin Wolf     const char *value;
1978e971aa12SJeff Cody 
1979e971aa12SJeff Cody     assert(reopen_state != NULL);
1980e971aa12SJeff Cody     assert(reopen_state->bs->drv != NULL);
1981e971aa12SJeff Cody     drv = reopen_state->bs->drv;
1982e971aa12SJeff Cody 
1983ccf9dc07SKevin Wolf     /* Process generic block layer options */
1984ccf9dc07SKevin Wolf     opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
1985ccf9dc07SKevin Wolf     qemu_opts_absorb_qdict(opts, reopen_state->options, &local_err);
1986ccf9dc07SKevin Wolf     if (local_err) {
1987ccf9dc07SKevin Wolf         error_propagate(errp, local_err);
1988ccf9dc07SKevin Wolf         ret = -EINVAL;
1989ccf9dc07SKevin Wolf         goto error;
1990ccf9dc07SKevin Wolf     }
1991ccf9dc07SKevin Wolf 
199291a097e7SKevin Wolf     update_flags_from_options(&reopen_state->flags, opts);
199391a097e7SKevin Wolf 
1994ccf9dc07SKevin Wolf     /* node-name and driver must be unchanged. Put them back into the QDict, so
1995ccf9dc07SKevin Wolf      * that they are checked at the end of this function. */
1996ccf9dc07SKevin Wolf     value = qemu_opt_get(opts, "node-name");
1997ccf9dc07SKevin Wolf     if (value) {
1998ccf9dc07SKevin Wolf         qdict_put(reopen_state->options, "node-name", qstring_from_str(value));
1999ccf9dc07SKevin Wolf     }
2000ccf9dc07SKevin Wolf 
2001ccf9dc07SKevin Wolf     value = qemu_opt_get(opts, "driver");
2002ccf9dc07SKevin Wolf     if (value) {
2003ccf9dc07SKevin Wolf         qdict_put(reopen_state->options, "driver", qstring_from_str(value));
2004ccf9dc07SKevin Wolf     }
2005ccf9dc07SKevin Wolf 
2006e971aa12SJeff Cody     /* if we are to stay read-only, do not allow permission change
2007e971aa12SJeff Cody      * to r/w */
2008e971aa12SJeff Cody     if (!(reopen_state->bs->open_flags & BDRV_O_ALLOW_RDWR) &&
2009e971aa12SJeff Cody         reopen_state->flags & BDRV_O_RDWR) {
201081e5f78aSAlberto Garcia         error_setg(errp, "Node '%s' is read only",
201181e5f78aSAlberto Garcia                    bdrv_get_device_or_node_name(reopen_state->bs));
2012e971aa12SJeff Cody         goto error;
2013e971aa12SJeff Cody     }
2014e971aa12SJeff Cody 
2015e971aa12SJeff Cody 
2016e971aa12SJeff Cody     ret = bdrv_flush(reopen_state->bs);
2017e971aa12SJeff Cody     if (ret) {
2018455b0fdeSEric Blake         error_setg_errno(errp, -ret, "Error flushing drive");
2019e971aa12SJeff Cody         goto error;
2020e971aa12SJeff Cody     }
2021e971aa12SJeff Cody 
2022e971aa12SJeff Cody     if (drv->bdrv_reopen_prepare) {
2023e971aa12SJeff Cody         ret = drv->bdrv_reopen_prepare(reopen_state, queue, &local_err);
2024e971aa12SJeff Cody         if (ret) {
2025e971aa12SJeff Cody             if (local_err != NULL) {
2026e971aa12SJeff Cody                 error_propagate(errp, local_err);
2027e971aa12SJeff Cody             } else {
2028d8b6895fSLuiz Capitulino                 error_setg(errp, "failed while preparing to reopen image '%s'",
2029e971aa12SJeff Cody                            reopen_state->bs->filename);
2030e971aa12SJeff Cody             }
2031e971aa12SJeff Cody             goto error;
2032e971aa12SJeff Cody         }
2033e971aa12SJeff Cody     } else {
2034e971aa12SJeff Cody         /* It is currently mandatory to have a bdrv_reopen_prepare()
2035e971aa12SJeff Cody          * handler for each supported drv. */
203681e5f78aSAlberto Garcia         error_setg(errp, "Block format '%s' used by node '%s' "
203781e5f78aSAlberto Garcia                    "does not support reopening files", drv->format_name,
203881e5f78aSAlberto Garcia                    bdrv_get_device_or_node_name(reopen_state->bs));
2039e971aa12SJeff Cody         ret = -1;
2040e971aa12SJeff Cody         goto error;
2041e971aa12SJeff Cody     }
2042e971aa12SJeff Cody 
20434d2cb092SKevin Wolf     /* Options that are not handled are only okay if they are unchanged
20444d2cb092SKevin Wolf      * compared to the old state. It is expected that some options are only
20454d2cb092SKevin Wolf      * used for the initial open, but not reopen (e.g. filename) */
20464d2cb092SKevin Wolf     if (qdict_size(reopen_state->options)) {
20474d2cb092SKevin Wolf         const QDictEntry *entry = qdict_first(reopen_state->options);
20484d2cb092SKevin Wolf 
20494d2cb092SKevin Wolf         do {
20504d2cb092SKevin Wolf             QString *new_obj = qobject_to_qstring(entry->value);
20514d2cb092SKevin Wolf             const char *new = qstring_get_str(new_obj);
20524d2cb092SKevin Wolf             const char *old = qdict_get_try_str(reopen_state->bs->options,
20534d2cb092SKevin Wolf                                                 entry->key);
20544d2cb092SKevin Wolf 
20554d2cb092SKevin Wolf             if (!old || strcmp(new, old)) {
20564d2cb092SKevin Wolf                 error_setg(errp, "Cannot change the option '%s'", entry->key);
20574d2cb092SKevin Wolf                 ret = -EINVAL;
20584d2cb092SKevin Wolf                 goto error;
20594d2cb092SKevin Wolf             }
20604d2cb092SKevin Wolf         } while ((entry = qdict_next(reopen_state->options, entry)));
20614d2cb092SKevin Wolf     }
20624d2cb092SKevin Wolf 
2063e971aa12SJeff Cody     ret = 0;
2064e971aa12SJeff Cody 
2065e971aa12SJeff Cody error:
2066ccf9dc07SKevin Wolf     qemu_opts_del(opts);
2067e971aa12SJeff Cody     return ret;
2068e971aa12SJeff Cody }
2069e971aa12SJeff Cody 
2070e971aa12SJeff Cody /*
2071e971aa12SJeff Cody  * Takes the staged changes for the reopen from bdrv_reopen_prepare(), and
2072e971aa12SJeff Cody  * makes them final by swapping the staging BlockDriverState contents into
2073e971aa12SJeff Cody  * the active BlockDriverState contents.
2074e971aa12SJeff Cody  */
2075e971aa12SJeff Cody void bdrv_reopen_commit(BDRVReopenState *reopen_state)
2076e971aa12SJeff Cody {
2077e971aa12SJeff Cody     BlockDriver *drv;
2078e971aa12SJeff Cody 
2079e971aa12SJeff Cody     assert(reopen_state != NULL);
2080e971aa12SJeff Cody     drv = reopen_state->bs->drv;
2081e971aa12SJeff Cody     assert(drv != NULL);
2082e971aa12SJeff Cody 
2083e971aa12SJeff Cody     /* If there are any driver level actions to take */
2084e971aa12SJeff Cody     if (drv->bdrv_reopen_commit) {
2085e971aa12SJeff Cody         drv->bdrv_reopen_commit(reopen_state);
2086e971aa12SJeff Cody     }
2087e971aa12SJeff Cody 
2088e971aa12SJeff Cody     /* set BDS specific flags now */
2089145f598eSKevin Wolf     QDECREF(reopen_state->bs->explicit_options);
2090145f598eSKevin Wolf 
2091145f598eSKevin Wolf     reopen_state->bs->explicit_options   = reopen_state->explicit_options;
2092e971aa12SJeff Cody     reopen_state->bs->open_flags         = reopen_state->flags;
2093e971aa12SJeff Cody     reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
2094355ef4acSKevin Wolf 
20953baca891SKevin Wolf     bdrv_refresh_limits(reopen_state->bs, NULL);
2096e971aa12SJeff Cody }
2097e971aa12SJeff Cody 
2098e971aa12SJeff Cody /*
2099e971aa12SJeff Cody  * Abort the reopen, and delete and free the staged changes in
2100e971aa12SJeff Cody  * reopen_state
2101e971aa12SJeff Cody  */
2102e971aa12SJeff Cody void bdrv_reopen_abort(BDRVReopenState *reopen_state)
2103e971aa12SJeff Cody {
2104e971aa12SJeff Cody     BlockDriver *drv;
2105e971aa12SJeff Cody 
2106e971aa12SJeff Cody     assert(reopen_state != NULL);
2107e971aa12SJeff Cody     drv = reopen_state->bs->drv;
2108e971aa12SJeff Cody     assert(drv != NULL);
2109e971aa12SJeff Cody 
2110e971aa12SJeff Cody     if (drv->bdrv_reopen_abort) {
2111e971aa12SJeff Cody         drv->bdrv_reopen_abort(reopen_state);
2112e971aa12SJeff Cody     }
2113145f598eSKevin Wolf 
2114145f598eSKevin Wolf     QDECREF(reopen_state->explicit_options);
2115e971aa12SJeff Cody }
2116e971aa12SJeff Cody 
2117e971aa12SJeff Cody 
211864dff520SMax Reitz static void bdrv_close(BlockDriverState *bs)
2119fc01f7e7Sbellard {
212033384421SMax Reitz     BdrvAioNotifier *ban, *ban_next;
212133384421SMax Reitz 
2122ca9bd24cSMax Reitz     assert(!bs->job);
212399b7e775SAlberto Garcia 
212499b7e775SAlberto Garcia     /* Disable I/O limits and drain all pending throttled requests */
2125*27ccdd52SKevin Wolf     if (bs->blk && blk_get_public(bs->blk)->throttle_state) {
212699b7e775SAlberto Garcia         bdrv_io_limits_disable(bs);
212799b7e775SAlberto Garcia     }
212899b7e775SAlberto Garcia 
2129fc27291dSPaolo Bonzini     bdrv_drained_begin(bs); /* complete I/O */
213058fda173SStefan Hajnoczi     bdrv_flush(bs);
213153ec73e2SFam Zheng     bdrv_drain(bs); /* in case flush left pending I/O */
2132fc27291dSPaolo Bonzini 
2133c5acdc9aSMax Reitz     bdrv_release_named_dirty_bitmaps(bs);
2134c5acdc9aSMax Reitz     assert(QLIST_EMPTY(&bs->dirty_bitmaps));
2135c5acdc9aSMax Reitz 
2136b4d02820SMax Reitz     if (bs->blk) {
2137b4d02820SMax Reitz         blk_dev_change_media_cb(bs->blk, false);
2138b4d02820SMax Reitz     }
2139b4d02820SMax Reitz 
21403cbc002cSPaolo Bonzini     if (bs->drv) {
21416e93e7c4SKevin Wolf         BdrvChild *child, *next;
21426e93e7c4SKevin Wolf 
21439a7dedbcSKevin Wolf         bs->drv->bdrv_close(bs);
21449a4f4c31SKevin Wolf         bs->drv = NULL;
21459a7dedbcSKevin Wolf 
21469a7dedbcSKevin Wolf         bdrv_set_backing_hd(bs, NULL);
21479a7dedbcSKevin Wolf 
21489a4f4c31SKevin Wolf         if (bs->file != NULL) {
21499a4f4c31SKevin Wolf             bdrv_unref_child(bs, bs->file);
21509a4f4c31SKevin Wolf             bs->file = NULL;
21519a4f4c31SKevin Wolf         }
21529a4f4c31SKevin Wolf 
21536e93e7c4SKevin Wolf         QLIST_FOREACH_SAFE(child, &bs->children, next, next) {
215433a60407SKevin Wolf             /* TODO Remove bdrv_unref() from drivers' close function and use
215533a60407SKevin Wolf              * bdrv_unref_child() here */
2156bddcec37SKevin Wolf             if (child->bs->inherits_from == bs) {
2157bddcec37SKevin Wolf                 child->bs->inherits_from = NULL;
2158bddcec37SKevin Wolf             }
215933a60407SKevin Wolf             bdrv_detach_child(child);
21606e93e7c4SKevin Wolf         }
21616e93e7c4SKevin Wolf 
21627267c094SAnthony Liguori         g_free(bs->opaque);
2163ea2384d3Sbellard         bs->opaque = NULL;
216453fec9d3SStefan Hajnoczi         bs->copy_on_read = 0;
2165a275fa42SPaolo Bonzini         bs->backing_file[0] = '\0';
2166a275fa42SPaolo Bonzini         bs->backing_format[0] = '\0';
21676405875cSPaolo Bonzini         bs->total_sectors = 0;
21686405875cSPaolo Bonzini         bs->encrypted = 0;
21696405875cSPaolo Bonzini         bs->valid_key = 0;
21706405875cSPaolo Bonzini         bs->sg = 0;
21710d51b4deSAsias He         bs->zero_beyond_eof = false;
2172de9c0cecSKevin Wolf         QDECREF(bs->options);
2173145f598eSKevin Wolf         QDECREF(bs->explicit_options);
2174de9c0cecSKevin Wolf         bs->options = NULL;
217591af7014SMax Reitz         QDECREF(bs->full_open_options);
217691af7014SMax Reitz         bs->full_open_options = NULL;
21779ca11154SPavel Hrdina     }
217866f82ceeSKevin Wolf 
217933384421SMax Reitz     QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
218033384421SMax Reitz         g_free(ban);
218133384421SMax Reitz     }
218233384421SMax Reitz     QLIST_INIT(&bs->aio_notifiers);
2183fc27291dSPaolo Bonzini     bdrv_drained_end(bs);
2184b338082bSbellard }
2185b338082bSbellard 
21862bc93fedSMORITA Kazutaka void bdrv_close_all(void)
21872bc93fedSMORITA Kazutaka {
21882bc93fedSMORITA Kazutaka     BlockDriverState *bs;
2189ca9bd24cSMax Reitz     AioContext *aio_context;
21902bc93fedSMORITA Kazutaka 
2191ca9bd24cSMax Reitz     /* Drop references from requests still in flight, such as canceled block
2192ca9bd24cSMax Reitz      * jobs whose AIO context has not been polled yet */
2193ca9bd24cSMax Reitz     bdrv_drain_all();
2194ca9bd24cSMax Reitz 
2195ca9bd24cSMax Reitz     blk_remove_all_bs();
2196ca9bd24cSMax Reitz     blockdev_close_all_bdrv_states();
2197ca9bd24cSMax Reitz 
2198ca9bd24cSMax Reitz     /* Cancel all block jobs */
2199ca9bd24cSMax Reitz     while (!QTAILQ_EMPTY(&all_bdrv_states)) {
2200ca9bd24cSMax Reitz         QTAILQ_FOREACH(bs, &all_bdrv_states, bs_list) {
2201ca9bd24cSMax Reitz             aio_context = bdrv_get_aio_context(bs);
2202ed78cda3SStefan Hajnoczi 
2203ed78cda3SStefan Hajnoczi             aio_context_acquire(aio_context);
2204ca9bd24cSMax Reitz             if (bs->job) {
2205ca9bd24cSMax Reitz                 block_job_cancel_sync(bs->job);
2206ed78cda3SStefan Hajnoczi                 aio_context_release(aio_context);
2207ca9bd24cSMax Reitz                 break;
2208ca9bd24cSMax Reitz             }
2209ca9bd24cSMax Reitz             aio_context_release(aio_context);
2210ca9bd24cSMax Reitz         }
2211ca9bd24cSMax Reitz 
2212ca9bd24cSMax Reitz         /* All the remaining BlockDriverStates are referenced directly or
2213ca9bd24cSMax Reitz          * indirectly from block jobs, so there needs to be at least one BDS
2214ca9bd24cSMax Reitz          * directly used by a block job */
2215ca9bd24cSMax Reitz         assert(bs);
22162bc93fedSMORITA Kazutaka     }
22172bc93fedSMORITA Kazutaka }
22182bc93fedSMORITA Kazutaka 
22198e419aefSKevin Wolf /* Fields that need to stay with the top-level BDS */
22204ddc07caSPaolo Bonzini static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
22214ddc07caSPaolo Bonzini                                      BlockDriverState *bs_src)
22224ddc07caSPaolo Bonzini {
22234ddc07caSPaolo Bonzini     /* move some fields that need to stay attached to the device */
2224dd62f1caSKevin Wolf }
2225dd62f1caSKevin Wolf 
2226dd62f1caSKevin Wolf static void change_parent_backing_link(BlockDriverState *from,
2227dd62f1caSKevin Wolf                                        BlockDriverState *to)
2228dd62f1caSKevin Wolf {
2229dd62f1caSKevin Wolf     BdrvChild *c, *next;
2230dd62f1caSKevin Wolf 
2231f21d96d0SKevin Wolf     if (from->blk) {
2232f21d96d0SKevin Wolf         /* FIXME We bypass blk_set_bs(), so we need to make these updates
2233f21d96d0SKevin Wolf          * manually. The root problem is not in this change function, but the
2234f21d96d0SKevin Wolf          * existence of BlockDriverState.blk. */
2235f21d96d0SKevin Wolf         to->blk = from->blk;
2236f21d96d0SKevin Wolf         from->blk = NULL;
2237f21d96d0SKevin Wolf     }
2238f21d96d0SKevin Wolf 
2239dd62f1caSKevin Wolf     QLIST_FOREACH_SAFE(c, &from->parents, next_parent, next) {
2240dd62f1caSKevin Wolf         assert(c->role != &child_backing);
2241dd62f1caSKevin Wolf         c->bs = to;
2242dd62f1caSKevin Wolf         QLIST_REMOVE(c, next_parent);
2243dd62f1caSKevin Wolf         QLIST_INSERT_HEAD(&to->parents, c, next_parent);
2244dd62f1caSKevin Wolf         bdrv_ref(to);
2245dd62f1caSKevin Wolf         bdrv_unref(from);
2246dd62f1caSKevin Wolf     }
2247dd62f1caSKevin Wolf }
2248dd62f1caSKevin Wolf 
2249dd62f1caSKevin Wolf static void swap_feature_fields(BlockDriverState *bs_top,
2250dd62f1caSKevin Wolf                                 BlockDriverState *bs_new)
2251dd62f1caSKevin Wolf {
2252dd62f1caSKevin Wolf     BlockDriverState tmp;
2253dd62f1caSKevin Wolf 
2254dd62f1caSKevin Wolf     bdrv_move_feature_fields(&tmp, bs_top);
2255dd62f1caSKevin Wolf     bdrv_move_feature_fields(bs_top, bs_new);
2256dd62f1caSKevin Wolf     bdrv_move_feature_fields(bs_new, &tmp);
2257dd62f1caSKevin Wolf 
2258*27ccdd52SKevin Wolf     assert(!bs_new->blk);
2259*27ccdd52SKevin Wolf     if (bs_top->blk && blk_get_public(bs_top->blk)->throttle_state) {
2260a5614993SKevin Wolf         /*
2261a5614993SKevin Wolf          * FIXME Need to break I/O throttling with graph manipulations
2262a5614993SKevin Wolf          * temporarily because of conflicting invariants (3. will go away when
2263a5614993SKevin Wolf          * throttling is fully converted to work on BlockBackends):
2264a5614993SKevin Wolf          *
2265a5614993SKevin Wolf          * 1. Every BlockBackend has a single root BDS
2266a5614993SKevin Wolf          * 2. I/O throttling functions require an attached BlockBackend
2267a5614993SKevin Wolf          * 3. We need to first enable throttling on the new BDS and then
2268a5614993SKevin Wolf          *    disable it on the old one (because of throttle group refcounts)
2269a5614993SKevin Wolf          */
2270a5614993SKevin Wolf #if 0
2271dd62f1caSKevin Wolf         bdrv_io_limits_enable(bs_new, throttle_group_get_name(bs_top));
2272dd62f1caSKevin Wolf         bdrv_io_limits_disable(bs_top);
2273a5614993SKevin Wolf #else
2274a5614993SKevin Wolf         abort();
2275a5614993SKevin Wolf #endif
2276dd62f1caSKevin Wolf     }
2277dd62f1caSKevin Wolf }
2278dd62f1caSKevin Wolf 
22798802d1fdSJeff Cody /*
22808802d1fdSJeff Cody  * Add new bs contents at the top of an image chain while the chain is
22818802d1fdSJeff Cody  * live, while keeping required fields on the top layer.
22828802d1fdSJeff Cody  *
22838802d1fdSJeff Cody  * This will modify the BlockDriverState fields, and swap contents
22848802d1fdSJeff Cody  * between bs_new and bs_top. Both bs_new and bs_top are modified.
22858802d1fdSJeff Cody  *
2286bfb197e0SMarkus Armbruster  * bs_new must not be attached to a BlockBackend.
2287f6801b83SJeff Cody  *
22888802d1fdSJeff Cody  * This function does not create any image files.
2289dd62f1caSKevin Wolf  *
2290dd62f1caSKevin Wolf  * bdrv_append() takes ownership of a bs_new reference and unrefs it because
2291dd62f1caSKevin Wolf  * that's what the callers commonly need. bs_new will be referenced by the old
2292dd62f1caSKevin Wolf  * parents of bs_top after bdrv_append() returns. If the caller needs to keep a
2293dd62f1caSKevin Wolf  * reference of its own, it must call bdrv_ref().
22948802d1fdSJeff Cody  */
22958802d1fdSJeff Cody void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
22968802d1fdSJeff Cody {
2297dd62f1caSKevin Wolf     assert(!bdrv_requests_pending(bs_top));
2298dd62f1caSKevin Wolf     assert(!bdrv_requests_pending(bs_new));
22998802d1fdSJeff Cody 
2300dd62f1caSKevin Wolf     bdrv_ref(bs_top);
2301dd62f1caSKevin Wolf 
2302dd62f1caSKevin Wolf     /* Some fields always stay on top of the backing file chain */
2303dd62f1caSKevin Wolf     swap_feature_fields(bs_top, bs_new);
2304dd62f1caSKevin Wolf 
2305*27ccdd52SKevin Wolf     change_parent_backing_link(bs_top, bs_new);
2306dd62f1caSKevin Wolf     bdrv_set_backing_hd(bs_new, bs_top);
2307dd62f1caSKevin Wolf     bdrv_unref(bs_top);
2308dd62f1caSKevin Wolf 
2309dd62f1caSKevin Wolf     /* bs_new is now referenced by its new parents, we don't need the
2310dd62f1caSKevin Wolf      * additional reference any more. */
2311dd62f1caSKevin Wolf     bdrv_unref(bs_new);
23128802d1fdSJeff Cody }
23138802d1fdSJeff Cody 
23143f09bfbcSKevin Wolf void bdrv_replace_in_backing_chain(BlockDriverState *old, BlockDriverState *new)
23153f09bfbcSKevin Wolf {
23163f09bfbcSKevin Wolf     assert(!bdrv_requests_pending(old));
23173f09bfbcSKevin Wolf     assert(!bdrv_requests_pending(new));
23183f09bfbcSKevin Wolf 
23193f09bfbcSKevin Wolf     bdrv_ref(old);
23203f09bfbcSKevin Wolf 
23213f09bfbcSKevin Wolf     if (old->blk) {
23223f09bfbcSKevin Wolf         /* As long as these fields aren't in BlockBackend, but in the top-level
23233f09bfbcSKevin Wolf          * BlockDriverState, it's not possible for a BDS to have two BBs.
23243f09bfbcSKevin Wolf          *
23253f09bfbcSKevin Wolf          * We really want to copy the fields from old to new, but we go for a
23263f09bfbcSKevin Wolf          * swap instead so that pointers aren't duplicated and cause trouble.
23273f09bfbcSKevin Wolf          * (Also, bdrv_swap() used to do the same.) */
23283f09bfbcSKevin Wolf         assert(!new->blk);
23293f09bfbcSKevin Wolf         swap_feature_fields(old, new);
23303f09bfbcSKevin Wolf     }
23313f09bfbcSKevin Wolf     change_parent_backing_link(old, new);
23323f09bfbcSKevin Wolf 
23333f09bfbcSKevin Wolf     /* Change backing files if a previously independent node is added to the
23343f09bfbcSKevin Wolf      * chain. For active commit, we replace top by its own (indirect) backing
23353f09bfbcSKevin Wolf      * file and don't do anything here so we don't build a loop. */
23363f09bfbcSKevin Wolf     if (new->backing == NULL && !bdrv_chain_contains(backing_bs(old), new)) {
23373f09bfbcSKevin Wolf         bdrv_set_backing_hd(new, backing_bs(old));
23383f09bfbcSKevin Wolf         bdrv_set_backing_hd(old, NULL);
23393f09bfbcSKevin Wolf     }
23403f09bfbcSKevin Wolf 
23413f09bfbcSKevin Wolf     bdrv_unref(old);
23423f09bfbcSKevin Wolf }
23433f09bfbcSKevin Wolf 
23444f6fd349SFam Zheng static void bdrv_delete(BlockDriverState *bs)
2345b338082bSbellard {
23463e914655SPaolo Bonzini     assert(!bs->job);
23473718d8abSFam Zheng     assert(bdrv_op_blocker_is_empty(bs));
23484f6fd349SFam Zheng     assert(!bs->refcnt);
234918846deeSMarkus Armbruster 
2350e1b5c52eSStefan Hajnoczi     bdrv_close(bs);
2351e1b5c52eSStefan Hajnoczi 
23521b7bdbc1SStefan Hajnoczi     /* remove from list, if necessary */
235363eaaae0SKevin Wolf     if (bs->node_name[0] != '\0') {
235463eaaae0SKevin Wolf         QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
235563eaaae0SKevin Wolf     }
23562c1d04e0SMax Reitz     QTAILQ_REMOVE(&all_bdrv_states, bs, bs_list);
23572c1d04e0SMax Reitz 
23587267c094SAnthony Liguori     g_free(bs);
2359fc01f7e7Sbellard }
2360fc01f7e7Sbellard 
2361e97fc193Saliguori /*
2362e97fc193Saliguori  * Run consistency checks on an image
2363e97fc193Saliguori  *
2364e076f338SKevin Wolf  * Returns 0 if the check could be completed (it doesn't mean that the image is
2365a1c7273bSStefan Weil  * free of errors) or -errno when an internal error occurred. The results of the
2366e076f338SKevin Wolf  * check are stored in res.
2367e97fc193Saliguori  */
23684534ff54SKevin Wolf int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix)
2369e97fc193Saliguori {
2370908bcd54SMax Reitz     if (bs->drv == NULL) {
2371908bcd54SMax Reitz         return -ENOMEDIUM;
2372908bcd54SMax Reitz     }
2373e97fc193Saliguori     if (bs->drv->bdrv_check == NULL) {
2374e97fc193Saliguori         return -ENOTSUP;
2375e97fc193Saliguori     }
2376e97fc193Saliguori 
2377e076f338SKevin Wolf     memset(res, 0, sizeof(*res));
23784534ff54SKevin Wolf     return bs->drv->bdrv_check(bs, res, fix);
2379e97fc193Saliguori }
2380e97fc193Saliguori 
23818a426614SKevin Wolf #define COMMIT_BUF_SECTORS 2048
23828a426614SKevin Wolf 
238333e3963eSbellard /* commit COW file into the raw image */
238433e3963eSbellard int bdrv_commit(BlockDriverState *bs)
238533e3963eSbellard {
238619cb3738Sbellard     BlockDriver *drv = bs->drv;
238772706ea4SJeff Cody     int64_t sector, total_sectors, length, backing_length;
23888a426614SKevin Wolf     int n, ro, open_flags;
23890bce597dSJeff Cody     int ret = 0;
239072706ea4SJeff Cody     uint8_t *buf = NULL;
239133e3963eSbellard 
239219cb3738Sbellard     if (!drv)
239319cb3738Sbellard         return -ENOMEDIUM;
239433e3963eSbellard 
2395760e0063SKevin Wolf     if (!bs->backing) {
23964dca4b63SNaphtali Sprei         return -ENOTSUP;
23974dca4b63SNaphtali Sprei     }
23984dca4b63SNaphtali Sprei 
2399bb00021dSFam Zheng     if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, NULL) ||
2400760e0063SKevin Wolf         bdrv_op_is_blocked(bs->backing->bs, BLOCK_OP_TYPE_COMMIT_TARGET, NULL)) {
24012d3735d3SStefan Hajnoczi         return -EBUSY;
24022d3735d3SStefan Hajnoczi     }
24032d3735d3SStefan Hajnoczi 
2404760e0063SKevin Wolf     ro = bs->backing->bs->read_only;
2405760e0063SKevin Wolf     open_flags =  bs->backing->bs->open_flags;
24064dca4b63SNaphtali Sprei 
24074dca4b63SNaphtali Sprei     if (ro) {
2408760e0063SKevin Wolf         if (bdrv_reopen(bs->backing->bs, open_flags | BDRV_O_RDWR, NULL)) {
24090bce597dSJeff Cody             return -EACCES;
24104dca4b63SNaphtali Sprei         }
2411ea2384d3Sbellard     }
2412ea2384d3Sbellard 
241372706ea4SJeff Cody     length = bdrv_getlength(bs);
241472706ea4SJeff Cody     if (length < 0) {
241572706ea4SJeff Cody         ret = length;
241672706ea4SJeff Cody         goto ro_cleanup;
241772706ea4SJeff Cody     }
241872706ea4SJeff Cody 
2419760e0063SKevin Wolf     backing_length = bdrv_getlength(bs->backing->bs);
242072706ea4SJeff Cody     if (backing_length < 0) {
242172706ea4SJeff Cody         ret = backing_length;
242272706ea4SJeff Cody         goto ro_cleanup;
242372706ea4SJeff Cody     }
242472706ea4SJeff Cody 
242572706ea4SJeff Cody     /* If our top snapshot is larger than the backing file image,
242672706ea4SJeff Cody      * grow the backing file image if possible.  If not possible,
242772706ea4SJeff Cody      * we must return an error */
242872706ea4SJeff Cody     if (length > backing_length) {
2429760e0063SKevin Wolf         ret = bdrv_truncate(bs->backing->bs, length);
243072706ea4SJeff Cody         if (ret < 0) {
243172706ea4SJeff Cody             goto ro_cleanup;
243272706ea4SJeff Cody         }
243372706ea4SJeff Cody     }
243472706ea4SJeff Cody 
243572706ea4SJeff Cody     total_sectors = length >> BDRV_SECTOR_BITS;
2436857d4f46SKevin Wolf 
2437857d4f46SKevin Wolf     /* qemu_try_blockalign() for bs will choose an alignment that works for
2438760e0063SKevin Wolf      * bs->backing->bs as well, so no need to compare the alignment manually. */
2439857d4f46SKevin Wolf     buf = qemu_try_blockalign(bs, COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
2440857d4f46SKevin Wolf     if (buf == NULL) {
2441857d4f46SKevin Wolf         ret = -ENOMEM;
2442857d4f46SKevin Wolf         goto ro_cleanup;
2443857d4f46SKevin Wolf     }
24448a426614SKevin Wolf 
24458a426614SKevin Wolf     for (sector = 0; sector < total_sectors; sector += n) {
2446d663640cSPaolo Bonzini         ret = bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n);
2447d663640cSPaolo Bonzini         if (ret < 0) {
2448d663640cSPaolo Bonzini             goto ro_cleanup;
2449d663640cSPaolo Bonzini         }
2450d663640cSPaolo Bonzini         if (ret) {
2451dabfa6ccSKevin Wolf             ret = bdrv_read(bs, sector, buf, n);
2452dabfa6ccSKevin Wolf             if (ret < 0) {
24534dca4b63SNaphtali Sprei                 goto ro_cleanup;
245433e3963eSbellard             }
245533e3963eSbellard 
2456760e0063SKevin Wolf             ret = bdrv_write(bs->backing->bs, sector, buf, n);
2457dabfa6ccSKevin Wolf             if (ret < 0) {
24584dca4b63SNaphtali Sprei                 goto ro_cleanup;
245933e3963eSbellard             }
246033e3963eSbellard         }
246133e3963eSbellard     }
246295389c86Sbellard 
24631d44952fSChristoph Hellwig     if (drv->bdrv_make_empty) {
24641d44952fSChristoph Hellwig         ret = drv->bdrv_make_empty(bs);
2465dabfa6ccSKevin Wolf         if (ret < 0) {
2466dabfa6ccSKevin Wolf             goto ro_cleanup;
2467dabfa6ccSKevin Wolf         }
24681d44952fSChristoph Hellwig         bdrv_flush(bs);
24691d44952fSChristoph Hellwig     }
247095389c86Sbellard 
24713f5075aeSChristoph Hellwig     /*
24723f5075aeSChristoph Hellwig      * Make sure all data we wrote to the backing device is actually
24733f5075aeSChristoph Hellwig      * stable on disk.
24743f5075aeSChristoph Hellwig      */
2475760e0063SKevin Wolf     if (bs->backing) {
2476760e0063SKevin Wolf         bdrv_flush(bs->backing->bs);
2477dabfa6ccSKevin Wolf     }
24784dca4b63SNaphtali Sprei 
2479dabfa6ccSKevin Wolf     ret = 0;
24804dca4b63SNaphtali Sprei ro_cleanup:
2481857d4f46SKevin Wolf     qemu_vfree(buf);
24824dca4b63SNaphtali Sprei 
24834dca4b63SNaphtali Sprei     if (ro) {
24840bce597dSJeff Cody         /* ignoring error return here */
2485760e0063SKevin Wolf         bdrv_reopen(bs->backing->bs, open_flags & ~BDRV_O_RDWR, NULL);
24864dca4b63SNaphtali Sprei     }
24874dca4b63SNaphtali Sprei 
24881d44952fSChristoph Hellwig     return ret;
248933e3963eSbellard }
249033e3963eSbellard 
2491756e6736SKevin Wolf /*
2492756e6736SKevin Wolf  * Return values:
2493756e6736SKevin Wolf  * 0        - success
2494756e6736SKevin Wolf  * -EINVAL  - backing format specified, but no file
2495756e6736SKevin Wolf  * -ENOSPC  - can't update the backing file because no space is left in the
2496756e6736SKevin Wolf  *            image file header
2497756e6736SKevin Wolf  * -ENOTSUP - format driver doesn't support changing the backing file
2498756e6736SKevin Wolf  */
2499756e6736SKevin Wolf int bdrv_change_backing_file(BlockDriverState *bs,
2500756e6736SKevin Wolf     const char *backing_file, const char *backing_fmt)
2501756e6736SKevin Wolf {
2502756e6736SKevin Wolf     BlockDriver *drv = bs->drv;
2503469ef350SPaolo Bonzini     int ret;
2504756e6736SKevin Wolf 
25055f377794SPaolo Bonzini     /* Backing file format doesn't make sense without a backing file */
25065f377794SPaolo Bonzini     if (backing_fmt && !backing_file) {
25075f377794SPaolo Bonzini         return -EINVAL;
25085f377794SPaolo Bonzini     }
25095f377794SPaolo Bonzini 
2510756e6736SKevin Wolf     if (drv->bdrv_change_backing_file != NULL) {
2511469ef350SPaolo Bonzini         ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
2512756e6736SKevin Wolf     } else {
2513469ef350SPaolo Bonzini         ret = -ENOTSUP;
2514756e6736SKevin Wolf     }
2515469ef350SPaolo Bonzini 
2516469ef350SPaolo Bonzini     if (ret == 0) {
2517469ef350SPaolo Bonzini         pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_file ?: "");
2518469ef350SPaolo Bonzini         pstrcpy(bs->backing_format, sizeof(bs->backing_format), backing_fmt ?: "");
2519469ef350SPaolo Bonzini     }
2520469ef350SPaolo Bonzini     return ret;
2521756e6736SKevin Wolf }
2522756e6736SKevin Wolf 
25236ebdcee2SJeff Cody /*
25246ebdcee2SJeff Cody  * Finds the image layer in the chain that has 'bs' as its backing file.
25256ebdcee2SJeff Cody  *
25266ebdcee2SJeff Cody  * active is the current topmost image.
25276ebdcee2SJeff Cody  *
25286ebdcee2SJeff Cody  * Returns NULL if bs is not found in active's image chain,
25296ebdcee2SJeff Cody  * or if active == bs.
25304caf0fcdSJeff Cody  *
25314caf0fcdSJeff Cody  * Returns the bottommost base image if bs == NULL.
25326ebdcee2SJeff Cody  */
25336ebdcee2SJeff Cody BlockDriverState *bdrv_find_overlay(BlockDriverState *active,
25346ebdcee2SJeff Cody                                     BlockDriverState *bs)
25356ebdcee2SJeff Cody {
2536760e0063SKevin Wolf     while (active && bs != backing_bs(active)) {
2537760e0063SKevin Wolf         active = backing_bs(active);
25386ebdcee2SJeff Cody     }
25396ebdcee2SJeff Cody 
25404caf0fcdSJeff Cody     return active;
25416ebdcee2SJeff Cody }
25426ebdcee2SJeff Cody 
25434caf0fcdSJeff Cody /* Given a BDS, searches for the base layer. */
25444caf0fcdSJeff Cody BlockDriverState *bdrv_find_base(BlockDriverState *bs)
25454caf0fcdSJeff Cody {
25464caf0fcdSJeff Cody     return bdrv_find_overlay(bs, NULL);
25476ebdcee2SJeff Cody }
25486ebdcee2SJeff Cody 
25496ebdcee2SJeff Cody /*
25506ebdcee2SJeff Cody  * Drops images above 'base' up to and including 'top', and sets the image
25516ebdcee2SJeff Cody  * above 'top' to have base as its backing file.
25526ebdcee2SJeff Cody  *
25536ebdcee2SJeff Cody  * Requires that the overlay to 'top' is opened r/w, so that the backing file
25546ebdcee2SJeff Cody  * information in 'bs' can be properly updated.
25556ebdcee2SJeff Cody  *
25566ebdcee2SJeff Cody  * E.g., this will convert the following chain:
25576ebdcee2SJeff Cody  * bottom <- base <- intermediate <- top <- active
25586ebdcee2SJeff Cody  *
25596ebdcee2SJeff Cody  * to
25606ebdcee2SJeff Cody  *
25616ebdcee2SJeff Cody  * bottom <- base <- active
25626ebdcee2SJeff Cody  *
25636ebdcee2SJeff Cody  * It is allowed for bottom==base, in which case it converts:
25646ebdcee2SJeff Cody  *
25656ebdcee2SJeff Cody  * base <- intermediate <- top <- active
25666ebdcee2SJeff Cody  *
25676ebdcee2SJeff Cody  * to
25686ebdcee2SJeff Cody  *
25696ebdcee2SJeff Cody  * base <- active
25706ebdcee2SJeff Cody  *
257154e26900SJeff Cody  * If backing_file_str is non-NULL, it will be used when modifying top's
257254e26900SJeff Cody  * overlay image metadata.
257354e26900SJeff Cody  *
25746ebdcee2SJeff Cody  * Error conditions:
25756ebdcee2SJeff Cody  *  if active == top, that is considered an error
25766ebdcee2SJeff Cody  *
25776ebdcee2SJeff Cody  */
25786ebdcee2SJeff Cody int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
257954e26900SJeff Cody                            BlockDriverState *base, const char *backing_file_str)
25806ebdcee2SJeff Cody {
25816ebdcee2SJeff Cody     BlockDriverState *new_top_bs = NULL;
25826ebdcee2SJeff Cody     int ret = -EIO;
25836ebdcee2SJeff Cody 
25846ebdcee2SJeff Cody     if (!top->drv || !base->drv) {
25856ebdcee2SJeff Cody         goto exit;
25866ebdcee2SJeff Cody     }
25876ebdcee2SJeff Cody 
25886ebdcee2SJeff Cody     new_top_bs = bdrv_find_overlay(active, top);
25896ebdcee2SJeff Cody 
25906ebdcee2SJeff Cody     if (new_top_bs == NULL) {
25916ebdcee2SJeff Cody         /* we could not find the image above 'top', this is an error */
25926ebdcee2SJeff Cody         goto exit;
25936ebdcee2SJeff Cody     }
25946ebdcee2SJeff Cody 
2595760e0063SKevin Wolf     /* special case of new_top_bs->backing->bs already pointing to base - nothing
25966ebdcee2SJeff Cody      * to do, no intermediate images */
2597760e0063SKevin Wolf     if (backing_bs(new_top_bs) == base) {
25986ebdcee2SJeff Cody         ret = 0;
25996ebdcee2SJeff Cody         goto exit;
26006ebdcee2SJeff Cody     }
26016ebdcee2SJeff Cody 
26025db15a57SKevin Wolf     /* Make sure that base is in the backing chain of top */
26035db15a57SKevin Wolf     if (!bdrv_chain_contains(top, base)) {
26046ebdcee2SJeff Cody         goto exit;
26056ebdcee2SJeff Cody     }
26066ebdcee2SJeff Cody 
26076ebdcee2SJeff Cody     /* success - we can delete the intermediate states, and link top->base */
26085db15a57SKevin Wolf     backing_file_str = backing_file_str ? backing_file_str : base->filename;
260954e26900SJeff Cody     ret = bdrv_change_backing_file(new_top_bs, backing_file_str,
26105db15a57SKevin Wolf                                    base->drv ? base->drv->format_name : "");
26116ebdcee2SJeff Cody     if (ret) {
26126ebdcee2SJeff Cody         goto exit;
26136ebdcee2SJeff Cody     }
26145db15a57SKevin Wolf     bdrv_set_backing_hd(new_top_bs, base);
26156ebdcee2SJeff Cody 
26166ebdcee2SJeff Cody     ret = 0;
26176ebdcee2SJeff Cody exit:
26186ebdcee2SJeff Cody     return ret;
26196ebdcee2SJeff Cody }
26206ebdcee2SJeff Cody 
262183f64091Sbellard /**
262283f64091Sbellard  * Truncate file to 'offset' bytes (needed only for file protocols)
262383f64091Sbellard  */
262483f64091Sbellard int bdrv_truncate(BlockDriverState *bs, int64_t offset)
262583f64091Sbellard {
262683f64091Sbellard     BlockDriver *drv = bs->drv;
262751762288SStefan Hajnoczi     int ret;
262883f64091Sbellard     if (!drv)
262919cb3738Sbellard         return -ENOMEDIUM;
263083f64091Sbellard     if (!drv->bdrv_truncate)
263183f64091Sbellard         return -ENOTSUP;
263259f2689dSNaphtali Sprei     if (bs->read_only)
263359f2689dSNaphtali Sprei         return -EACCES;
26349c75e168SJeff Cody 
263551762288SStefan Hajnoczi     ret = drv->bdrv_truncate(bs, offset);
263651762288SStefan Hajnoczi     if (ret == 0) {
263751762288SStefan Hajnoczi         ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
2638ce1ffea8SJohn Snow         bdrv_dirty_bitmap_truncate(bs);
2639a7f53e26SMarkus Armbruster         if (bs->blk) {
2640a7f53e26SMarkus Armbruster             blk_dev_resize_cb(bs->blk);
2641a7f53e26SMarkus Armbruster         }
264251762288SStefan Hajnoczi     }
264351762288SStefan Hajnoczi     return ret;
264483f64091Sbellard }
264583f64091Sbellard 
264683f64091Sbellard /**
26474a1d5e1fSFam Zheng  * Length of a allocated file in bytes. Sparse files are counted by actual
26484a1d5e1fSFam Zheng  * allocated space. Return < 0 if error or unknown.
26494a1d5e1fSFam Zheng  */
26504a1d5e1fSFam Zheng int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
26514a1d5e1fSFam Zheng {
26524a1d5e1fSFam Zheng     BlockDriver *drv = bs->drv;
26534a1d5e1fSFam Zheng     if (!drv) {
26544a1d5e1fSFam Zheng         return -ENOMEDIUM;
26554a1d5e1fSFam Zheng     }
26564a1d5e1fSFam Zheng     if (drv->bdrv_get_allocated_file_size) {
26574a1d5e1fSFam Zheng         return drv->bdrv_get_allocated_file_size(bs);
26584a1d5e1fSFam Zheng     }
26594a1d5e1fSFam Zheng     if (bs->file) {
26609a4f4c31SKevin Wolf         return bdrv_get_allocated_file_size(bs->file->bs);
26614a1d5e1fSFam Zheng     }
26624a1d5e1fSFam Zheng     return -ENOTSUP;
26634a1d5e1fSFam Zheng }
26644a1d5e1fSFam Zheng 
26654a1d5e1fSFam Zheng /**
266665a9bb25SMarkus Armbruster  * Return number of sectors on success, -errno on error.
266783f64091Sbellard  */
266865a9bb25SMarkus Armbruster int64_t bdrv_nb_sectors(BlockDriverState *bs)
266983f64091Sbellard {
267083f64091Sbellard     BlockDriver *drv = bs->drv;
267165a9bb25SMarkus Armbruster 
267283f64091Sbellard     if (!drv)
267319cb3738Sbellard         return -ENOMEDIUM;
267451762288SStefan Hajnoczi 
2675b94a2610SKevin Wolf     if (drv->has_variable_length) {
2676b94a2610SKevin Wolf         int ret = refresh_total_sectors(bs, bs->total_sectors);
2677b94a2610SKevin Wolf         if (ret < 0) {
2678b94a2610SKevin Wolf             return ret;
2679fc01f7e7Sbellard         }
268046a4e4e6SStefan Hajnoczi     }
268165a9bb25SMarkus Armbruster     return bs->total_sectors;
268265a9bb25SMarkus Armbruster }
268365a9bb25SMarkus Armbruster 
268465a9bb25SMarkus Armbruster /**
268565a9bb25SMarkus Armbruster  * Return length in bytes on success, -errno on error.
268665a9bb25SMarkus Armbruster  * The length is always a multiple of BDRV_SECTOR_SIZE.
268765a9bb25SMarkus Armbruster  */
268865a9bb25SMarkus Armbruster int64_t bdrv_getlength(BlockDriverState *bs)
268965a9bb25SMarkus Armbruster {
269065a9bb25SMarkus Armbruster     int64_t ret = bdrv_nb_sectors(bs);
269165a9bb25SMarkus Armbruster 
26924a9c9ea0SFam Zheng     ret = ret > INT64_MAX / BDRV_SECTOR_SIZE ? -EFBIG : ret;
269365a9bb25SMarkus Armbruster     return ret < 0 ? ret : ret * BDRV_SECTOR_SIZE;
269446a4e4e6SStefan Hajnoczi }
2695fc01f7e7Sbellard 
269619cb3738Sbellard /* return 0 as number of sectors if no device present or error */
269796b8f136Sths void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
2698fc01f7e7Sbellard {
269965a9bb25SMarkus Armbruster     int64_t nb_sectors = bdrv_nb_sectors(bs);
270065a9bb25SMarkus Armbruster 
270165a9bb25SMarkus Armbruster     *nb_sectors_ptr = nb_sectors < 0 ? 0 : nb_sectors;
2702fc01f7e7Sbellard }
2703cf98951bSbellard 
2704b338082bSbellard int bdrv_is_read_only(BlockDriverState *bs)
2705b338082bSbellard {
2706b338082bSbellard     return bs->read_only;
2707b338082bSbellard }
2708b338082bSbellard 
2709985a03b0Sths int bdrv_is_sg(BlockDriverState *bs)
2710985a03b0Sths {
2711985a03b0Sths     return bs->sg;
2712985a03b0Sths }
2713985a03b0Sths 
2714ea2384d3Sbellard int bdrv_is_encrypted(BlockDriverState *bs)
2715ea2384d3Sbellard {
2716760e0063SKevin Wolf     if (bs->backing && bs->backing->bs->encrypted) {
2717ea2384d3Sbellard         return 1;
2718760e0063SKevin Wolf     }
2719ea2384d3Sbellard     return bs->encrypted;
2720ea2384d3Sbellard }
2721ea2384d3Sbellard 
2722c0f4ce77Saliguori int bdrv_key_required(BlockDriverState *bs)
2723c0f4ce77Saliguori {
2724760e0063SKevin Wolf     BdrvChild *backing = bs->backing;
2725c0f4ce77Saliguori 
2726760e0063SKevin Wolf     if (backing && backing->bs->encrypted && !backing->bs->valid_key) {
2727c0f4ce77Saliguori         return 1;
2728760e0063SKevin Wolf     }
2729c0f4ce77Saliguori     return (bs->encrypted && !bs->valid_key);
2730c0f4ce77Saliguori }
2731c0f4ce77Saliguori 
2732ea2384d3Sbellard int bdrv_set_key(BlockDriverState *bs, const char *key)
2733ea2384d3Sbellard {
2734ea2384d3Sbellard     int ret;
2735760e0063SKevin Wolf     if (bs->backing && bs->backing->bs->encrypted) {
2736760e0063SKevin Wolf         ret = bdrv_set_key(bs->backing->bs, key);
2737ea2384d3Sbellard         if (ret < 0)
2738ea2384d3Sbellard             return ret;
2739ea2384d3Sbellard         if (!bs->encrypted)
2740ea2384d3Sbellard             return 0;
2741ea2384d3Sbellard     }
2742fd04a2aeSShahar Havivi     if (!bs->encrypted) {
2743fd04a2aeSShahar Havivi         return -EINVAL;
2744fd04a2aeSShahar Havivi     } else if (!bs->drv || !bs->drv->bdrv_set_key) {
2745fd04a2aeSShahar Havivi         return -ENOMEDIUM;
2746fd04a2aeSShahar Havivi     }
2747c0f4ce77Saliguori     ret = bs->drv->bdrv_set_key(bs, key);
2748bb5fc20fSaliguori     if (ret < 0) {
2749bb5fc20fSaliguori         bs->valid_key = 0;
2750bb5fc20fSaliguori     } else if (!bs->valid_key) {
2751bb5fc20fSaliguori         bs->valid_key = 1;
2752a7f53e26SMarkus Armbruster         if (bs->blk) {
2753bb5fc20fSaliguori             /* call the change callback now, we skipped it on open */
2754a7f53e26SMarkus Armbruster             blk_dev_change_media_cb(bs->blk, true);
2755a7f53e26SMarkus Armbruster         }
2756bb5fc20fSaliguori     }
2757c0f4ce77Saliguori     return ret;
2758ea2384d3Sbellard }
2759ea2384d3Sbellard 
27604d2855a3SMarkus Armbruster /*
27614d2855a3SMarkus Armbruster  * Provide an encryption key for @bs.
27624d2855a3SMarkus Armbruster  * If @key is non-null:
27634d2855a3SMarkus Armbruster  *     If @bs is not encrypted, fail.
27644d2855a3SMarkus Armbruster  *     Else if the key is invalid, fail.
27654d2855a3SMarkus Armbruster  *     Else set @bs's key to @key, replacing the existing key, if any.
27664d2855a3SMarkus Armbruster  * If @key is null:
27674d2855a3SMarkus Armbruster  *     If @bs is encrypted and still lacks a key, fail.
27684d2855a3SMarkus Armbruster  *     Else do nothing.
27694d2855a3SMarkus Armbruster  * On failure, store an error object through @errp if non-null.
27704d2855a3SMarkus Armbruster  */
27714d2855a3SMarkus Armbruster void bdrv_add_key(BlockDriverState *bs, const char *key, Error **errp)
27724d2855a3SMarkus Armbruster {
27734d2855a3SMarkus Armbruster     if (key) {
27744d2855a3SMarkus Armbruster         if (!bdrv_is_encrypted(bs)) {
277581e5f78aSAlberto Garcia             error_setg(errp, "Node '%s' is not encrypted",
277681e5f78aSAlberto Garcia                       bdrv_get_device_or_node_name(bs));
27774d2855a3SMarkus Armbruster         } else if (bdrv_set_key(bs, key) < 0) {
2778c6bd8c70SMarkus Armbruster             error_setg(errp, QERR_INVALID_PASSWORD);
27794d2855a3SMarkus Armbruster         }
27804d2855a3SMarkus Armbruster     } else {
27814d2855a3SMarkus Armbruster         if (bdrv_key_required(bs)) {
2782b1ca6391SMarkus Armbruster             error_set(errp, ERROR_CLASS_DEVICE_ENCRYPTED,
2783b1ca6391SMarkus Armbruster                       "'%s' (%s) is encrypted",
278481e5f78aSAlberto Garcia                       bdrv_get_device_or_node_name(bs),
27854d2855a3SMarkus Armbruster                       bdrv_get_encrypted_filename(bs));
27864d2855a3SMarkus Armbruster         }
27874d2855a3SMarkus Armbruster     }
27884d2855a3SMarkus Armbruster }
27894d2855a3SMarkus Armbruster 
2790f8d6bba1SMarkus Armbruster const char *bdrv_get_format_name(BlockDriverState *bs)
2791ea2384d3Sbellard {
2792f8d6bba1SMarkus Armbruster     return bs->drv ? bs->drv->format_name : NULL;
2793ea2384d3Sbellard }
2794ea2384d3Sbellard 
2795ada42401SStefan Hajnoczi static int qsort_strcmp(const void *a, const void *b)
2796ada42401SStefan Hajnoczi {
2797ada42401SStefan Hajnoczi     return strcmp(a, b);
2798ada42401SStefan Hajnoczi }
2799ada42401SStefan Hajnoczi 
2800ea2384d3Sbellard void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
2801ea2384d3Sbellard                          void *opaque)
2802ea2384d3Sbellard {
2803ea2384d3Sbellard     BlockDriver *drv;
2804e855e4fbSJeff Cody     int count = 0;
2805ada42401SStefan Hajnoczi     int i;
2806e855e4fbSJeff Cody     const char **formats = NULL;
2807ea2384d3Sbellard 
28088a22f02aSStefan Hajnoczi     QLIST_FOREACH(drv, &bdrv_drivers, list) {
2809e855e4fbSJeff Cody         if (drv->format_name) {
2810e855e4fbSJeff Cody             bool found = false;
2811e855e4fbSJeff Cody             int i = count;
2812e855e4fbSJeff Cody             while (formats && i && !found) {
2813e855e4fbSJeff Cody                 found = !strcmp(formats[--i], drv->format_name);
2814e855e4fbSJeff Cody             }
2815e855e4fbSJeff Cody 
2816e855e4fbSJeff Cody             if (!found) {
28175839e53bSMarkus Armbruster                 formats = g_renew(const char *, formats, count + 1);
2818e855e4fbSJeff Cody                 formats[count++] = drv->format_name;
2819ea2384d3Sbellard             }
2820ea2384d3Sbellard         }
2821e855e4fbSJeff Cody     }
2822ada42401SStefan Hajnoczi 
2823ada42401SStefan Hajnoczi     qsort(formats, count, sizeof(formats[0]), qsort_strcmp);
2824ada42401SStefan Hajnoczi 
2825ada42401SStefan Hajnoczi     for (i = 0; i < count; i++) {
2826ada42401SStefan Hajnoczi         it(opaque, formats[i]);
2827ada42401SStefan Hajnoczi     }
2828ada42401SStefan Hajnoczi 
2829e855e4fbSJeff Cody     g_free(formats);
2830e855e4fbSJeff Cody }
2831ea2384d3Sbellard 
2832dc364f4cSBenoît Canet /* This function is to find a node in the bs graph */
2833dc364f4cSBenoît Canet BlockDriverState *bdrv_find_node(const char *node_name)
2834dc364f4cSBenoît Canet {
2835dc364f4cSBenoît Canet     BlockDriverState *bs;
2836dc364f4cSBenoît Canet 
2837dc364f4cSBenoît Canet     assert(node_name);
2838dc364f4cSBenoît Canet 
2839dc364f4cSBenoît Canet     QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
2840dc364f4cSBenoît Canet         if (!strcmp(node_name, bs->node_name)) {
2841dc364f4cSBenoît Canet             return bs;
2842dc364f4cSBenoît Canet         }
2843dc364f4cSBenoît Canet     }
2844dc364f4cSBenoît Canet     return NULL;
2845dc364f4cSBenoît Canet }
2846dc364f4cSBenoît Canet 
2847c13163fbSBenoît Canet /* Put this QMP function here so it can access the static graph_bdrv_states. */
2848d5a8ee60SAlberto Garcia BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp)
2849c13163fbSBenoît Canet {
2850c13163fbSBenoît Canet     BlockDeviceInfoList *list, *entry;
2851c13163fbSBenoît Canet     BlockDriverState *bs;
2852c13163fbSBenoît Canet 
2853c13163fbSBenoît Canet     list = NULL;
2854c13163fbSBenoît Canet     QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
2855c83f9fbaSKevin Wolf         BlockDeviceInfo *info = bdrv_block_device_info(NULL, bs, errp);
2856d5a8ee60SAlberto Garcia         if (!info) {
2857d5a8ee60SAlberto Garcia             qapi_free_BlockDeviceInfoList(list);
2858d5a8ee60SAlberto Garcia             return NULL;
2859d5a8ee60SAlberto Garcia         }
2860c13163fbSBenoît Canet         entry = g_malloc0(sizeof(*entry));
2861d5a8ee60SAlberto Garcia         entry->value = info;
2862c13163fbSBenoît Canet         entry->next = list;
2863c13163fbSBenoît Canet         list = entry;
2864c13163fbSBenoît Canet     }
2865c13163fbSBenoît Canet 
2866c13163fbSBenoît Canet     return list;
2867c13163fbSBenoît Canet }
2868c13163fbSBenoît Canet 
286912d3ba82SBenoît Canet BlockDriverState *bdrv_lookup_bs(const char *device,
287012d3ba82SBenoît Canet                                  const char *node_name,
287112d3ba82SBenoît Canet                                  Error **errp)
287212d3ba82SBenoît Canet {
28737f06d47eSMarkus Armbruster     BlockBackend *blk;
28747f06d47eSMarkus Armbruster     BlockDriverState *bs;
287512d3ba82SBenoît Canet 
287612d3ba82SBenoît Canet     if (device) {
28777f06d47eSMarkus Armbruster         blk = blk_by_name(device);
287812d3ba82SBenoît Canet 
28797f06d47eSMarkus Armbruster         if (blk) {
28809f4ed6fbSAlberto Garcia             bs = blk_bs(blk);
28819f4ed6fbSAlberto Garcia             if (!bs) {
28825433c24fSMax Reitz                 error_setg(errp, "Device '%s' has no medium", device);
28835433c24fSMax Reitz             }
28845433c24fSMax Reitz 
28859f4ed6fbSAlberto Garcia             return bs;
288612d3ba82SBenoît Canet         }
2887dd67fa50SBenoît Canet     }
288812d3ba82SBenoît Canet 
2889dd67fa50SBenoît Canet     if (node_name) {
289012d3ba82SBenoît Canet         bs = bdrv_find_node(node_name);
289112d3ba82SBenoît Canet 
2892dd67fa50SBenoît Canet         if (bs) {
2893dd67fa50SBenoît Canet             return bs;
2894dd67fa50SBenoît Canet         }
289512d3ba82SBenoît Canet     }
289612d3ba82SBenoît Canet 
2897dd67fa50SBenoît Canet     error_setg(errp, "Cannot find device=%s nor node_name=%s",
2898dd67fa50SBenoît Canet                      device ? device : "",
2899dd67fa50SBenoît Canet                      node_name ? node_name : "");
2900dd67fa50SBenoît Canet     return NULL;
290112d3ba82SBenoît Canet }
290212d3ba82SBenoît Canet 
29035a6684d2SJeff Cody /* If 'base' is in the same chain as 'top', return true. Otherwise,
29045a6684d2SJeff Cody  * return false.  If either argument is NULL, return false. */
29055a6684d2SJeff Cody bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
29065a6684d2SJeff Cody {
29075a6684d2SJeff Cody     while (top && top != base) {
2908760e0063SKevin Wolf         top = backing_bs(top);
29095a6684d2SJeff Cody     }
29105a6684d2SJeff Cody 
29115a6684d2SJeff Cody     return top != NULL;
29125a6684d2SJeff Cody }
29135a6684d2SJeff Cody 
291404df765aSFam Zheng BlockDriverState *bdrv_next_node(BlockDriverState *bs)
291504df765aSFam Zheng {
291604df765aSFam Zheng     if (!bs) {
291704df765aSFam Zheng         return QTAILQ_FIRST(&graph_bdrv_states);
291804df765aSFam Zheng     }
291904df765aSFam Zheng     return QTAILQ_NEXT(bs, node_list);
292004df765aSFam Zheng }
292104df765aSFam Zheng 
292226260580SMax Reitz /* Iterates over all top-level BlockDriverStates, i.e. BDSs that are owned by
292326260580SMax Reitz  * the monitor or attached to a BlockBackend */
29242f399b0aSMarkus Armbruster BlockDriverState *bdrv_next(BlockDriverState *bs)
29252f399b0aSMarkus Armbruster {
292626260580SMax Reitz     if (!bs || bs->blk) {
292726260580SMax Reitz         bs = blk_next_root_bs(bs);
292826260580SMax Reitz         if (bs) {
292926260580SMax Reitz             return bs;
29302f399b0aSMarkus Armbruster         }
293126260580SMax Reitz     }
293226260580SMax Reitz 
293326260580SMax Reitz     /* Ignore all BDSs that are attached to a BlockBackend here; they have been
293426260580SMax Reitz      * handled by the above block already */
293526260580SMax Reitz     do {
293626260580SMax Reitz         bs = bdrv_next_monitor_owned(bs);
293726260580SMax Reitz     } while (bs && bs->blk);
293826260580SMax Reitz     return bs;
29392f399b0aSMarkus Armbruster }
29402f399b0aSMarkus Armbruster 
294120a9e77dSFam Zheng const char *bdrv_get_node_name(const BlockDriverState *bs)
294220a9e77dSFam Zheng {
294320a9e77dSFam Zheng     return bs->node_name;
294420a9e77dSFam Zheng }
294520a9e77dSFam Zheng 
29467f06d47eSMarkus Armbruster /* TODO check what callers really want: bs->node_name or blk_name() */
2947bfb197e0SMarkus Armbruster const char *bdrv_get_device_name(const BlockDriverState *bs)
2948ea2384d3Sbellard {
2949bfb197e0SMarkus Armbruster     return bs->blk ? blk_name(bs->blk) : "";
2950ea2384d3Sbellard }
2951ea2384d3Sbellard 
29529b2aa84fSAlberto Garcia /* This can be used to identify nodes that might not have a device
29539b2aa84fSAlberto Garcia  * name associated. Since node and device names live in the same
29549b2aa84fSAlberto Garcia  * namespace, the result is unambiguous. The exception is if both are
29559b2aa84fSAlberto Garcia  * absent, then this returns an empty (non-null) string. */
29569b2aa84fSAlberto Garcia const char *bdrv_get_device_or_node_name(const BlockDriverState *bs)
29579b2aa84fSAlberto Garcia {
29589b2aa84fSAlberto Garcia     return bs->blk ? blk_name(bs->blk) : bs->node_name;
29599b2aa84fSAlberto Garcia }
29609b2aa84fSAlberto Garcia 
2961c8433287SMarkus Armbruster int bdrv_get_flags(BlockDriverState *bs)
2962c8433287SMarkus Armbruster {
2963c8433287SMarkus Armbruster     return bs->open_flags;
2964c8433287SMarkus Armbruster }
2965c8433287SMarkus Armbruster 
29663ac21627SPeter Lieven int bdrv_has_zero_init_1(BlockDriverState *bs)
29673ac21627SPeter Lieven {
29683ac21627SPeter Lieven     return 1;
29693ac21627SPeter Lieven }
29703ac21627SPeter Lieven 
2971f2feebbdSKevin Wolf int bdrv_has_zero_init(BlockDriverState *bs)
2972f2feebbdSKevin Wolf {
2973f2feebbdSKevin Wolf     assert(bs->drv);
2974f2feebbdSKevin Wolf 
297511212d8fSPaolo Bonzini     /* If BS is a copy on write image, it is initialized to
297611212d8fSPaolo Bonzini        the contents of the base image, which may not be zeroes.  */
2977760e0063SKevin Wolf     if (bs->backing) {
297811212d8fSPaolo Bonzini         return 0;
297911212d8fSPaolo Bonzini     }
2980336c1c12SKevin Wolf     if (bs->drv->bdrv_has_zero_init) {
2981336c1c12SKevin Wolf         return bs->drv->bdrv_has_zero_init(bs);
2982f2feebbdSKevin Wolf     }
2983f2feebbdSKevin Wolf 
29843ac21627SPeter Lieven     /* safe default */
29853ac21627SPeter Lieven     return 0;
2986f2feebbdSKevin Wolf }
2987f2feebbdSKevin Wolf 
29884ce78691SPeter Lieven bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs)
29894ce78691SPeter Lieven {
29904ce78691SPeter Lieven     BlockDriverInfo bdi;
29914ce78691SPeter Lieven 
2992760e0063SKevin Wolf     if (bs->backing) {
29934ce78691SPeter Lieven         return false;
29944ce78691SPeter Lieven     }
29954ce78691SPeter Lieven 
29964ce78691SPeter Lieven     if (bdrv_get_info(bs, &bdi) == 0) {
29974ce78691SPeter Lieven         return bdi.unallocated_blocks_are_zero;
29984ce78691SPeter Lieven     }
29994ce78691SPeter Lieven 
30004ce78691SPeter Lieven     return false;
30014ce78691SPeter Lieven }
30024ce78691SPeter Lieven 
30034ce78691SPeter Lieven bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs)
30044ce78691SPeter Lieven {
30054ce78691SPeter Lieven     BlockDriverInfo bdi;
30064ce78691SPeter Lieven 
3007760e0063SKevin Wolf     if (bs->backing || !(bs->open_flags & BDRV_O_UNMAP)) {
30084ce78691SPeter Lieven         return false;
30094ce78691SPeter Lieven     }
30104ce78691SPeter Lieven 
30114ce78691SPeter Lieven     if (bdrv_get_info(bs, &bdi) == 0) {
30124ce78691SPeter Lieven         return bdi.can_write_zeroes_with_unmap;
30134ce78691SPeter Lieven     }
30144ce78691SPeter Lieven 
30154ce78691SPeter Lieven     return false;
30164ce78691SPeter Lieven }
30174ce78691SPeter Lieven 
3018045df330Saliguori const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
3019045df330Saliguori {
3020760e0063SKevin Wolf     if (bs->backing && bs->backing->bs->encrypted)
3021045df330Saliguori         return bs->backing_file;
3022045df330Saliguori     else if (bs->encrypted)
3023045df330Saliguori         return bs->filename;
3024045df330Saliguori     else
3025045df330Saliguori         return NULL;
3026045df330Saliguori }
3027045df330Saliguori 
302883f64091Sbellard void bdrv_get_backing_filename(BlockDriverState *bs,
302983f64091Sbellard                                char *filename, int filename_size)
303083f64091Sbellard {
303183f64091Sbellard     pstrcpy(filename, filename_size, bs->backing_file);
303283f64091Sbellard }
303383f64091Sbellard 
3034faea38e7Sbellard int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
3035faea38e7Sbellard {
3036faea38e7Sbellard     BlockDriver *drv = bs->drv;
3037faea38e7Sbellard     if (!drv)
303819cb3738Sbellard         return -ENOMEDIUM;
3039faea38e7Sbellard     if (!drv->bdrv_get_info)
3040faea38e7Sbellard         return -ENOTSUP;
3041faea38e7Sbellard     memset(bdi, 0, sizeof(*bdi));
3042faea38e7Sbellard     return drv->bdrv_get_info(bs, bdi);
3043faea38e7Sbellard }
3044faea38e7Sbellard 
3045eae041feSMax Reitz ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs)
3046eae041feSMax Reitz {
3047eae041feSMax Reitz     BlockDriver *drv = bs->drv;
3048eae041feSMax Reitz     if (drv && drv->bdrv_get_specific_info) {
3049eae041feSMax Reitz         return drv->bdrv_get_specific_info(bs);
3050eae041feSMax Reitz     }
3051eae041feSMax Reitz     return NULL;
3052eae041feSMax Reitz }
3053eae041feSMax Reitz 
3054a31939e6SEric Blake void bdrv_debug_event(BlockDriverState *bs, BlkdebugEvent event)
30558b9b0cc2SKevin Wolf {
3056bf736fe3SKevin Wolf     if (!bs || !bs->drv || !bs->drv->bdrv_debug_event) {
30578b9b0cc2SKevin Wolf         return;
30588b9b0cc2SKevin Wolf     }
30598b9b0cc2SKevin Wolf 
3060bf736fe3SKevin Wolf     bs->drv->bdrv_debug_event(bs, event);
306141c695c7SKevin Wolf }
30628b9b0cc2SKevin Wolf 
306341c695c7SKevin Wolf int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
306441c695c7SKevin Wolf                           const char *tag)
306541c695c7SKevin Wolf {
306641c695c7SKevin Wolf     while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) {
30679a4f4c31SKevin Wolf         bs = bs->file ? bs->file->bs : NULL;
306841c695c7SKevin Wolf     }
306941c695c7SKevin Wolf 
307041c695c7SKevin Wolf     if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) {
307141c695c7SKevin Wolf         return bs->drv->bdrv_debug_breakpoint(bs, event, tag);
307241c695c7SKevin Wolf     }
307341c695c7SKevin Wolf 
307441c695c7SKevin Wolf     return -ENOTSUP;
307541c695c7SKevin Wolf }
307641c695c7SKevin Wolf 
30774cc70e93SFam Zheng int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag)
30784cc70e93SFam Zheng {
30794cc70e93SFam Zheng     while (bs && bs->drv && !bs->drv->bdrv_debug_remove_breakpoint) {
30809a4f4c31SKevin Wolf         bs = bs->file ? bs->file->bs : NULL;
30814cc70e93SFam Zheng     }
30824cc70e93SFam Zheng 
30834cc70e93SFam Zheng     if (bs && bs->drv && bs->drv->bdrv_debug_remove_breakpoint) {
30844cc70e93SFam Zheng         return bs->drv->bdrv_debug_remove_breakpoint(bs, tag);
30854cc70e93SFam Zheng     }
30864cc70e93SFam Zheng 
30874cc70e93SFam Zheng     return -ENOTSUP;
30884cc70e93SFam Zheng }
30894cc70e93SFam Zheng 
309041c695c7SKevin Wolf int bdrv_debug_resume(BlockDriverState *bs, const char *tag)
309141c695c7SKevin Wolf {
3092938789eaSMax Reitz     while (bs && (!bs->drv || !bs->drv->bdrv_debug_resume)) {
30939a4f4c31SKevin Wolf         bs = bs->file ? bs->file->bs : NULL;
309441c695c7SKevin Wolf     }
309541c695c7SKevin Wolf 
309641c695c7SKevin Wolf     if (bs && bs->drv && bs->drv->bdrv_debug_resume) {
309741c695c7SKevin Wolf         return bs->drv->bdrv_debug_resume(bs, tag);
309841c695c7SKevin Wolf     }
309941c695c7SKevin Wolf 
310041c695c7SKevin Wolf     return -ENOTSUP;
310141c695c7SKevin Wolf }
310241c695c7SKevin Wolf 
310341c695c7SKevin Wolf bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag)
310441c695c7SKevin Wolf {
310541c695c7SKevin Wolf     while (bs && bs->drv && !bs->drv->bdrv_debug_is_suspended) {
31069a4f4c31SKevin Wolf         bs = bs->file ? bs->file->bs : NULL;
310741c695c7SKevin Wolf     }
310841c695c7SKevin Wolf 
310941c695c7SKevin Wolf     if (bs && bs->drv && bs->drv->bdrv_debug_is_suspended) {
311041c695c7SKevin Wolf         return bs->drv->bdrv_debug_is_suspended(bs, tag);
311141c695c7SKevin Wolf     }
311241c695c7SKevin Wolf 
311341c695c7SKevin Wolf     return false;
31148b9b0cc2SKevin Wolf }
31158b9b0cc2SKevin Wolf 
3116199630b6SBlue Swirl int bdrv_is_snapshot(BlockDriverState *bs)
3117199630b6SBlue Swirl {
3118199630b6SBlue Swirl     return !!(bs->open_flags & BDRV_O_SNAPSHOT);
3119199630b6SBlue Swirl }
3120199630b6SBlue Swirl 
3121b1b1d783SJeff Cody /* backing_file can either be relative, or absolute, or a protocol.  If it is
3122b1b1d783SJeff Cody  * relative, it must be relative to the chain.  So, passing in bs->filename
3123b1b1d783SJeff Cody  * from a BDS as backing_file should not be done, as that may be relative to
3124b1b1d783SJeff Cody  * the CWD rather than the chain. */
3125e8a6bb9cSMarcelo Tosatti BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
3126e8a6bb9cSMarcelo Tosatti         const char *backing_file)
3127e8a6bb9cSMarcelo Tosatti {
3128b1b1d783SJeff Cody     char *filename_full = NULL;
3129b1b1d783SJeff Cody     char *backing_file_full = NULL;
3130b1b1d783SJeff Cody     char *filename_tmp = NULL;
3131b1b1d783SJeff Cody     int is_protocol = 0;
3132b1b1d783SJeff Cody     BlockDriverState *curr_bs = NULL;
3133b1b1d783SJeff Cody     BlockDriverState *retval = NULL;
3134b1b1d783SJeff Cody 
3135b1b1d783SJeff Cody     if (!bs || !bs->drv || !backing_file) {
3136e8a6bb9cSMarcelo Tosatti         return NULL;
3137e8a6bb9cSMarcelo Tosatti     }
3138e8a6bb9cSMarcelo Tosatti 
3139b1b1d783SJeff Cody     filename_full     = g_malloc(PATH_MAX);
3140b1b1d783SJeff Cody     backing_file_full = g_malloc(PATH_MAX);
3141b1b1d783SJeff Cody     filename_tmp      = g_malloc(PATH_MAX);
3142b1b1d783SJeff Cody 
3143b1b1d783SJeff Cody     is_protocol = path_has_protocol(backing_file);
3144b1b1d783SJeff Cody 
3145760e0063SKevin Wolf     for (curr_bs = bs; curr_bs->backing; curr_bs = curr_bs->backing->bs) {
3146b1b1d783SJeff Cody 
3147b1b1d783SJeff Cody         /* If either of the filename paths is actually a protocol, then
3148b1b1d783SJeff Cody          * compare unmodified paths; otherwise make paths relative */
3149b1b1d783SJeff Cody         if (is_protocol || path_has_protocol(curr_bs->backing_file)) {
3150b1b1d783SJeff Cody             if (strcmp(backing_file, curr_bs->backing_file) == 0) {
3151760e0063SKevin Wolf                 retval = curr_bs->backing->bs;
3152b1b1d783SJeff Cody                 break;
3153b1b1d783SJeff Cody             }
3154e8a6bb9cSMarcelo Tosatti         } else {
3155b1b1d783SJeff Cody             /* If not an absolute filename path, make it relative to the current
3156b1b1d783SJeff Cody              * image's filename path */
3157b1b1d783SJeff Cody             path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
3158b1b1d783SJeff Cody                          backing_file);
3159b1b1d783SJeff Cody 
3160b1b1d783SJeff Cody             /* We are going to compare absolute pathnames */
3161b1b1d783SJeff Cody             if (!realpath(filename_tmp, filename_full)) {
3162b1b1d783SJeff Cody                 continue;
3163b1b1d783SJeff Cody             }
3164b1b1d783SJeff Cody 
3165b1b1d783SJeff Cody             /* We need to make sure the backing filename we are comparing against
3166b1b1d783SJeff Cody              * is relative to the current image filename (or absolute) */
3167b1b1d783SJeff Cody             path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
3168b1b1d783SJeff Cody                          curr_bs->backing_file);
3169b1b1d783SJeff Cody 
3170b1b1d783SJeff Cody             if (!realpath(filename_tmp, backing_file_full)) {
3171b1b1d783SJeff Cody                 continue;
3172b1b1d783SJeff Cody             }
3173b1b1d783SJeff Cody 
3174b1b1d783SJeff Cody             if (strcmp(backing_file_full, filename_full) == 0) {
3175760e0063SKevin Wolf                 retval = curr_bs->backing->bs;
3176b1b1d783SJeff Cody                 break;
3177b1b1d783SJeff Cody             }
3178e8a6bb9cSMarcelo Tosatti         }
3179e8a6bb9cSMarcelo Tosatti     }
3180e8a6bb9cSMarcelo Tosatti 
3181b1b1d783SJeff Cody     g_free(filename_full);
3182b1b1d783SJeff Cody     g_free(backing_file_full);
3183b1b1d783SJeff Cody     g_free(filename_tmp);
3184b1b1d783SJeff Cody     return retval;
3185e8a6bb9cSMarcelo Tosatti }
3186e8a6bb9cSMarcelo Tosatti 
3187f198fd1cSBenoît Canet int bdrv_get_backing_file_depth(BlockDriverState *bs)
3188f198fd1cSBenoît Canet {
3189f198fd1cSBenoît Canet     if (!bs->drv) {
3190f198fd1cSBenoît Canet         return 0;
3191f198fd1cSBenoît Canet     }
3192f198fd1cSBenoît Canet 
3193760e0063SKevin Wolf     if (!bs->backing) {
3194f198fd1cSBenoît Canet         return 0;
3195f198fd1cSBenoît Canet     }
3196f198fd1cSBenoît Canet 
3197760e0063SKevin Wolf     return 1 + bdrv_get_backing_file_depth(bs->backing->bs);
3198f198fd1cSBenoît Canet }
3199f198fd1cSBenoît Canet 
3200ea2384d3Sbellard void bdrv_init(void)
3201ea2384d3Sbellard {
32025efa9d5aSAnthony Liguori     module_call_init(MODULE_INIT_BLOCK);
3203ea2384d3Sbellard }
3204ce1a14dcSpbrook 
3205eb852011SMarkus Armbruster void bdrv_init_with_whitelist(void)
3206eb852011SMarkus Armbruster {
3207eb852011SMarkus Armbruster     use_bdrv_whitelist = 1;
3208eb852011SMarkus Armbruster     bdrv_init();
3209eb852011SMarkus Armbruster }
3210eb852011SMarkus Armbruster 
32115a8a30dbSKevin Wolf void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
32120f15423cSAnthony Liguori {
32130d1c5c91SFam Zheng     BdrvChild *child;
32145a8a30dbSKevin Wolf     Error *local_err = NULL;
32155a8a30dbSKevin Wolf     int ret;
32165a8a30dbSKevin Wolf 
32173456a8d1SKevin Wolf     if (!bs->drv)  {
32183456a8d1SKevin Wolf         return;
32190f15423cSAnthony Liguori     }
32203456a8d1SKevin Wolf 
322104c01a5cSKevin Wolf     if (!(bs->open_flags & BDRV_O_INACTIVE)) {
32227ea2d269SAlexey Kardashevskiy         return;
32237ea2d269SAlexey Kardashevskiy     }
322404c01a5cSKevin Wolf     bs->open_flags &= ~BDRV_O_INACTIVE;
32257ea2d269SAlexey Kardashevskiy 
32263456a8d1SKevin Wolf     if (bs->drv->bdrv_invalidate_cache) {
32275a8a30dbSKevin Wolf         bs->drv->bdrv_invalidate_cache(bs, &local_err);
32285a8a30dbSKevin Wolf         if (local_err) {
322904c01a5cSKevin Wolf             bs->open_flags |= BDRV_O_INACTIVE;
32305a8a30dbSKevin Wolf             error_propagate(errp, local_err);
32315a8a30dbSKevin Wolf             return;
32323456a8d1SKevin Wolf         }
32330d1c5c91SFam Zheng     }
32340d1c5c91SFam Zheng 
32350d1c5c91SFam Zheng     QLIST_FOREACH(child, &bs->children, next) {
32360d1c5c91SFam Zheng         bdrv_invalidate_cache(child->bs, &local_err);
32370d1c5c91SFam Zheng         if (local_err) {
32380d1c5c91SFam Zheng             bs->open_flags |= BDRV_O_INACTIVE;
32390d1c5c91SFam Zheng             error_propagate(errp, local_err);
32400d1c5c91SFam Zheng             return;
32410d1c5c91SFam Zheng         }
32420d1c5c91SFam Zheng     }
32433456a8d1SKevin Wolf 
32445a8a30dbSKevin Wolf     ret = refresh_total_sectors(bs, bs->total_sectors);
32455a8a30dbSKevin Wolf     if (ret < 0) {
324604c01a5cSKevin Wolf         bs->open_flags |= BDRV_O_INACTIVE;
32475a8a30dbSKevin Wolf         error_setg_errno(errp, -ret, "Could not refresh total sector count");
32485a8a30dbSKevin Wolf         return;
32495a8a30dbSKevin Wolf     }
32500f15423cSAnthony Liguori }
32510f15423cSAnthony Liguori 
32525a8a30dbSKevin Wolf void bdrv_invalidate_cache_all(Error **errp)
32530f15423cSAnthony Liguori {
325479720af6SMax Reitz     BlockDriverState *bs = NULL;
32555a8a30dbSKevin Wolf     Error *local_err = NULL;
32560f15423cSAnthony Liguori 
325779720af6SMax Reitz     while ((bs = bdrv_next(bs)) != NULL) {
3258ed78cda3SStefan Hajnoczi         AioContext *aio_context = bdrv_get_aio_context(bs);
3259ed78cda3SStefan Hajnoczi 
3260ed78cda3SStefan Hajnoczi         aio_context_acquire(aio_context);
32615a8a30dbSKevin Wolf         bdrv_invalidate_cache(bs, &local_err);
3262ed78cda3SStefan Hajnoczi         aio_context_release(aio_context);
32635a8a30dbSKevin Wolf         if (local_err) {
32645a8a30dbSKevin Wolf             error_propagate(errp, local_err);
32655a8a30dbSKevin Wolf             return;
32665a8a30dbSKevin Wolf         }
32670f15423cSAnthony Liguori     }
32680f15423cSAnthony Liguori }
32690f15423cSAnthony Liguori 
3270aad0b7a0SFam Zheng static int bdrv_inactivate_recurse(BlockDriverState *bs,
3271aad0b7a0SFam Zheng                                    bool setting_flag)
327276b1c7feSKevin Wolf {
3273aad0b7a0SFam Zheng     BdrvChild *child;
327476b1c7feSKevin Wolf     int ret;
327576b1c7feSKevin Wolf 
3276aad0b7a0SFam Zheng     if (!setting_flag && bs->drv->bdrv_inactivate) {
327776b1c7feSKevin Wolf         ret = bs->drv->bdrv_inactivate(bs);
327876b1c7feSKevin Wolf         if (ret < 0) {
327976b1c7feSKevin Wolf             return ret;
328076b1c7feSKevin Wolf         }
328176b1c7feSKevin Wolf     }
328276b1c7feSKevin Wolf 
3283aad0b7a0SFam Zheng     QLIST_FOREACH(child, &bs->children, next) {
3284aad0b7a0SFam Zheng         ret = bdrv_inactivate_recurse(child->bs, setting_flag);
3285aad0b7a0SFam Zheng         if (ret < 0) {
3286aad0b7a0SFam Zheng             return ret;
3287aad0b7a0SFam Zheng         }
3288aad0b7a0SFam Zheng     }
3289aad0b7a0SFam Zheng 
3290aad0b7a0SFam Zheng     if (setting_flag) {
329176b1c7feSKevin Wolf         bs->open_flags |= BDRV_O_INACTIVE;
3292aad0b7a0SFam Zheng     }
329376b1c7feSKevin Wolf     return 0;
329476b1c7feSKevin Wolf }
329576b1c7feSKevin Wolf 
329676b1c7feSKevin Wolf int bdrv_inactivate_all(void)
329776b1c7feSKevin Wolf {
329879720af6SMax Reitz     BlockDriverState *bs = NULL;
3299aad0b7a0SFam Zheng     int ret = 0;
3300aad0b7a0SFam Zheng     int pass;
330176b1c7feSKevin Wolf 
330279720af6SMax Reitz     while ((bs = bdrv_next(bs)) != NULL) {
3303aad0b7a0SFam Zheng         aio_context_acquire(bdrv_get_aio_context(bs));
3304aad0b7a0SFam Zheng     }
330576b1c7feSKevin Wolf 
3306aad0b7a0SFam Zheng     /* We do two passes of inactivation. The first pass calls to drivers'
3307aad0b7a0SFam Zheng      * .bdrv_inactivate callbacks recursively so all cache is flushed to disk;
3308aad0b7a0SFam Zheng      * the second pass sets the BDRV_O_INACTIVE flag so that no further write
3309aad0b7a0SFam Zheng      * is allowed. */
3310aad0b7a0SFam Zheng     for (pass = 0; pass < 2; pass++) {
3311aad0b7a0SFam Zheng         bs = NULL;
3312aad0b7a0SFam Zheng         while ((bs = bdrv_next(bs)) != NULL) {
3313aad0b7a0SFam Zheng             ret = bdrv_inactivate_recurse(bs, pass);
331476b1c7feSKevin Wolf             if (ret < 0) {
3315aad0b7a0SFam Zheng                 goto out;
3316aad0b7a0SFam Zheng             }
331776b1c7feSKevin Wolf         }
331876b1c7feSKevin Wolf     }
331976b1c7feSKevin Wolf 
3320aad0b7a0SFam Zheng out:
3321aad0b7a0SFam Zheng     bs = NULL;
3322aad0b7a0SFam Zheng     while ((bs = bdrv_next(bs)) != NULL) {
3323aad0b7a0SFam Zheng         aio_context_release(bdrv_get_aio_context(bs));
3324aad0b7a0SFam Zheng     }
3325aad0b7a0SFam Zheng 
3326aad0b7a0SFam Zheng     return ret;
332776b1c7feSKevin Wolf }
332876b1c7feSKevin Wolf 
3329f9f05dc5SKevin Wolf /**************************************************************/
333019cb3738Sbellard /* removable device support */
333119cb3738Sbellard 
333219cb3738Sbellard /**
333319cb3738Sbellard  * Return TRUE if the media is present
333419cb3738Sbellard  */
3335e031f750SMax Reitz bool bdrv_is_inserted(BlockDriverState *bs)
333619cb3738Sbellard {
333719cb3738Sbellard     BlockDriver *drv = bs->drv;
333828d7a789SMax Reitz     BdrvChild *child;
3339a1aff5bfSMarkus Armbruster 
3340e031f750SMax Reitz     if (!drv) {
3341e031f750SMax Reitz         return false;
3342e031f750SMax Reitz     }
334328d7a789SMax Reitz     if (drv->bdrv_is_inserted) {
3344a1aff5bfSMarkus Armbruster         return drv->bdrv_is_inserted(bs);
334519cb3738Sbellard     }
334628d7a789SMax Reitz     QLIST_FOREACH(child, &bs->children, next) {
334728d7a789SMax Reitz         if (!bdrv_is_inserted(child->bs)) {
334828d7a789SMax Reitz             return false;
334928d7a789SMax Reitz         }
335028d7a789SMax Reitz     }
335128d7a789SMax Reitz     return true;
335228d7a789SMax Reitz }
335319cb3738Sbellard 
335419cb3738Sbellard /**
33558e49ca46SMarkus Armbruster  * Return whether the media changed since the last call to this
33568e49ca46SMarkus Armbruster  * function, or -ENOTSUP if we don't know.  Most drivers don't know.
335719cb3738Sbellard  */
335819cb3738Sbellard int bdrv_media_changed(BlockDriverState *bs)
335919cb3738Sbellard {
336019cb3738Sbellard     BlockDriver *drv = bs->drv;
336119cb3738Sbellard 
33628e49ca46SMarkus Armbruster     if (drv && drv->bdrv_media_changed) {
33638e49ca46SMarkus Armbruster         return drv->bdrv_media_changed(bs);
33648e49ca46SMarkus Armbruster     }
33658e49ca46SMarkus Armbruster     return -ENOTSUP;
336619cb3738Sbellard }
336719cb3738Sbellard 
336819cb3738Sbellard /**
336919cb3738Sbellard  * If eject_flag is TRUE, eject the media. Otherwise, close the tray
337019cb3738Sbellard  */
3371f36f3949SLuiz Capitulino void bdrv_eject(BlockDriverState *bs, bool eject_flag)
337219cb3738Sbellard {
337319cb3738Sbellard     BlockDriver *drv = bs->drv;
3374bfb197e0SMarkus Armbruster     const char *device_name;
337519cb3738Sbellard 
3376822e1cd1SMarkus Armbruster     if (drv && drv->bdrv_eject) {
3377822e1cd1SMarkus Armbruster         drv->bdrv_eject(bs, eject_flag);
337819cb3738Sbellard     }
33796f382ed2SLuiz Capitulino 
3380bfb197e0SMarkus Armbruster     device_name = bdrv_get_device_name(bs);
3381bfb197e0SMarkus Armbruster     if (device_name[0] != '\0') {
3382bfb197e0SMarkus Armbruster         qapi_event_send_device_tray_moved(device_name,
3383a5ee7bd4SWenchao Xia                                           eject_flag, &error_abort);
33846f382ed2SLuiz Capitulino     }
338519cb3738Sbellard }
338619cb3738Sbellard 
338719cb3738Sbellard /**
338819cb3738Sbellard  * Lock or unlock the media (if it is locked, the user won't be able
338919cb3738Sbellard  * to eject it manually).
339019cb3738Sbellard  */
3391025e849aSMarkus Armbruster void bdrv_lock_medium(BlockDriverState *bs, bool locked)
339219cb3738Sbellard {
339319cb3738Sbellard     BlockDriver *drv = bs->drv;
339419cb3738Sbellard 
3395025e849aSMarkus Armbruster     trace_bdrv_lock_medium(bs, locked);
3396b8c6d095SStefan Hajnoczi 
3397025e849aSMarkus Armbruster     if (drv && drv->bdrv_lock_medium) {
3398025e849aSMarkus Armbruster         drv->bdrv_lock_medium(bs, locked);
339919cb3738Sbellard     }
340019cb3738Sbellard }
3401985a03b0Sths 
34029fcb0251SFam Zheng /* Get a reference to bs */
34039fcb0251SFam Zheng void bdrv_ref(BlockDriverState *bs)
34049fcb0251SFam Zheng {
34059fcb0251SFam Zheng     bs->refcnt++;
34069fcb0251SFam Zheng }
34079fcb0251SFam Zheng 
34089fcb0251SFam Zheng /* Release a previously grabbed reference to bs.
34099fcb0251SFam Zheng  * If after releasing, reference count is zero, the BlockDriverState is
34109fcb0251SFam Zheng  * deleted. */
34119fcb0251SFam Zheng void bdrv_unref(BlockDriverState *bs)
34129fcb0251SFam Zheng {
34139a4d5ca6SJeff Cody     if (!bs) {
34149a4d5ca6SJeff Cody         return;
34159a4d5ca6SJeff Cody     }
34169fcb0251SFam Zheng     assert(bs->refcnt > 0);
34179fcb0251SFam Zheng     if (--bs->refcnt == 0) {
34189fcb0251SFam Zheng         bdrv_delete(bs);
34199fcb0251SFam Zheng     }
34209fcb0251SFam Zheng }
34219fcb0251SFam Zheng 
3422fbe40ff7SFam Zheng struct BdrvOpBlocker {
3423fbe40ff7SFam Zheng     Error *reason;
3424fbe40ff7SFam Zheng     QLIST_ENTRY(BdrvOpBlocker) list;
3425fbe40ff7SFam Zheng };
3426fbe40ff7SFam Zheng 
3427fbe40ff7SFam Zheng bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
3428fbe40ff7SFam Zheng {
3429fbe40ff7SFam Zheng     BdrvOpBlocker *blocker;
3430fbe40ff7SFam Zheng     assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3431fbe40ff7SFam Zheng     if (!QLIST_EMPTY(&bs->op_blockers[op])) {
3432fbe40ff7SFam Zheng         blocker = QLIST_FIRST(&bs->op_blockers[op]);
3433fbe40ff7SFam Zheng         if (errp) {
3434e43bfd9cSMarkus Armbruster             *errp = error_copy(blocker->reason);
3435e43bfd9cSMarkus Armbruster             error_prepend(errp, "Node '%s' is busy: ",
3436e43bfd9cSMarkus Armbruster                           bdrv_get_device_or_node_name(bs));
3437fbe40ff7SFam Zheng         }
3438fbe40ff7SFam Zheng         return true;
3439fbe40ff7SFam Zheng     }
3440fbe40ff7SFam Zheng     return false;
3441fbe40ff7SFam Zheng }
3442fbe40ff7SFam Zheng 
3443fbe40ff7SFam Zheng void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason)
3444fbe40ff7SFam Zheng {
3445fbe40ff7SFam Zheng     BdrvOpBlocker *blocker;
3446fbe40ff7SFam Zheng     assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3447fbe40ff7SFam Zheng 
34485839e53bSMarkus Armbruster     blocker = g_new0(BdrvOpBlocker, 1);
3449fbe40ff7SFam Zheng     blocker->reason = reason;
3450fbe40ff7SFam Zheng     QLIST_INSERT_HEAD(&bs->op_blockers[op], blocker, list);
3451fbe40ff7SFam Zheng }
3452fbe40ff7SFam Zheng 
3453fbe40ff7SFam Zheng void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason)
3454fbe40ff7SFam Zheng {
3455fbe40ff7SFam Zheng     BdrvOpBlocker *blocker, *next;
3456fbe40ff7SFam Zheng     assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3457fbe40ff7SFam Zheng     QLIST_FOREACH_SAFE(blocker, &bs->op_blockers[op], list, next) {
3458fbe40ff7SFam Zheng         if (blocker->reason == reason) {
3459fbe40ff7SFam Zheng             QLIST_REMOVE(blocker, list);
3460fbe40ff7SFam Zheng             g_free(blocker);
3461fbe40ff7SFam Zheng         }
3462fbe40ff7SFam Zheng     }
3463fbe40ff7SFam Zheng }
3464fbe40ff7SFam Zheng 
3465fbe40ff7SFam Zheng void bdrv_op_block_all(BlockDriverState *bs, Error *reason)
3466fbe40ff7SFam Zheng {
3467fbe40ff7SFam Zheng     int i;
3468fbe40ff7SFam Zheng     for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3469fbe40ff7SFam Zheng         bdrv_op_block(bs, i, reason);
3470fbe40ff7SFam Zheng     }
3471fbe40ff7SFam Zheng }
3472fbe40ff7SFam Zheng 
3473fbe40ff7SFam Zheng void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason)
3474fbe40ff7SFam Zheng {
3475fbe40ff7SFam Zheng     int i;
3476fbe40ff7SFam Zheng     for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3477fbe40ff7SFam Zheng         bdrv_op_unblock(bs, i, reason);
3478fbe40ff7SFam Zheng     }
3479fbe40ff7SFam Zheng }
3480fbe40ff7SFam Zheng 
3481fbe40ff7SFam Zheng bool bdrv_op_blocker_is_empty(BlockDriverState *bs)
3482fbe40ff7SFam Zheng {
3483fbe40ff7SFam Zheng     int i;
3484fbe40ff7SFam Zheng 
3485fbe40ff7SFam Zheng     for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3486fbe40ff7SFam Zheng         if (!QLIST_EMPTY(&bs->op_blockers[i])) {
3487fbe40ff7SFam Zheng             return false;
3488fbe40ff7SFam Zheng         }
3489fbe40ff7SFam Zheng     }
3490fbe40ff7SFam Zheng     return true;
3491fbe40ff7SFam Zheng }
3492fbe40ff7SFam Zheng 
3493d92ada22SLuiz Capitulino void bdrv_img_create(const char *filename, const char *fmt,
3494f88e1a42SJes Sorensen                      const char *base_filename, const char *base_fmt,
3495f382d43aSMiroslav Rezanina                      char *options, uint64_t img_size, int flags,
3496f382d43aSMiroslav Rezanina                      Error **errp, bool quiet)
3497f88e1a42SJes Sorensen {
349883d0521aSChunyan Liu     QemuOptsList *create_opts = NULL;
349983d0521aSChunyan Liu     QemuOpts *opts = NULL;
350083d0521aSChunyan Liu     const char *backing_fmt, *backing_file;
350183d0521aSChunyan Liu     int64_t size;
3502f88e1a42SJes Sorensen     BlockDriver *drv, *proto_drv;
3503cc84d90fSMax Reitz     Error *local_err = NULL;
3504f88e1a42SJes Sorensen     int ret = 0;
3505f88e1a42SJes Sorensen 
3506f88e1a42SJes Sorensen     /* Find driver and parse its options */
3507f88e1a42SJes Sorensen     drv = bdrv_find_format(fmt);
3508f88e1a42SJes Sorensen     if (!drv) {
350971c79813SLuiz Capitulino         error_setg(errp, "Unknown file format '%s'", fmt);
3510d92ada22SLuiz Capitulino         return;
3511f88e1a42SJes Sorensen     }
3512f88e1a42SJes Sorensen 
3513b65a5e12SMax Reitz     proto_drv = bdrv_find_protocol(filename, true, errp);
3514f88e1a42SJes Sorensen     if (!proto_drv) {
3515d92ada22SLuiz Capitulino         return;
3516f88e1a42SJes Sorensen     }
3517f88e1a42SJes Sorensen 
3518c6149724SMax Reitz     if (!drv->create_opts) {
3519c6149724SMax Reitz         error_setg(errp, "Format driver '%s' does not support image creation",
3520c6149724SMax Reitz                    drv->format_name);
3521c6149724SMax Reitz         return;
3522c6149724SMax Reitz     }
3523c6149724SMax Reitz 
3524c6149724SMax Reitz     if (!proto_drv->create_opts) {
3525c6149724SMax Reitz         error_setg(errp, "Protocol driver '%s' does not support image creation",
3526c6149724SMax Reitz                    proto_drv->format_name);
3527c6149724SMax Reitz         return;
3528c6149724SMax Reitz     }
3529c6149724SMax Reitz 
3530c282e1fdSChunyan Liu     create_opts = qemu_opts_append(create_opts, drv->create_opts);
3531c282e1fdSChunyan Liu     create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
3532f88e1a42SJes Sorensen 
3533f88e1a42SJes Sorensen     /* Create parameter list with default values */
353483d0521aSChunyan Liu     opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
353539101f25SMarkus Armbruster     qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
3536f88e1a42SJes Sorensen 
3537f88e1a42SJes Sorensen     /* Parse -o options */
3538f88e1a42SJes Sorensen     if (options) {
3539dc523cd3SMarkus Armbruster         qemu_opts_do_parse(opts, options, NULL, &local_err);
3540dc523cd3SMarkus Armbruster         if (local_err) {
3541dc523cd3SMarkus Armbruster             error_report_err(local_err);
3542dc523cd3SMarkus Armbruster             local_err = NULL;
354383d0521aSChunyan Liu             error_setg(errp, "Invalid options for file format '%s'", fmt);
3544f88e1a42SJes Sorensen             goto out;
3545f88e1a42SJes Sorensen         }
3546f88e1a42SJes Sorensen     }
3547f88e1a42SJes Sorensen 
3548f88e1a42SJes Sorensen     if (base_filename) {
3549f43e47dbSMarkus Armbruster         qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
35506be4194bSMarkus Armbruster         if (local_err) {
355171c79813SLuiz Capitulino             error_setg(errp, "Backing file not supported for file format '%s'",
355271c79813SLuiz Capitulino                        fmt);
3553f88e1a42SJes Sorensen             goto out;
3554f88e1a42SJes Sorensen         }
3555f88e1a42SJes Sorensen     }
3556f88e1a42SJes Sorensen 
3557f88e1a42SJes Sorensen     if (base_fmt) {
3558f43e47dbSMarkus Armbruster         qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
35596be4194bSMarkus Armbruster         if (local_err) {
356071c79813SLuiz Capitulino             error_setg(errp, "Backing file format not supported for file "
356171c79813SLuiz Capitulino                              "format '%s'", fmt);
3562f88e1a42SJes Sorensen             goto out;
3563f88e1a42SJes Sorensen         }
3564f88e1a42SJes Sorensen     }
3565f88e1a42SJes Sorensen 
356683d0521aSChunyan Liu     backing_file = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
356783d0521aSChunyan Liu     if (backing_file) {
356883d0521aSChunyan Liu         if (!strcmp(filename, backing_file)) {
356971c79813SLuiz Capitulino             error_setg(errp, "Error: Trying to create an image with the "
357071c79813SLuiz Capitulino                              "same filename as the backing file");
3571792da93aSJes Sorensen             goto out;
3572792da93aSJes Sorensen         }
3573792da93aSJes Sorensen     }
3574792da93aSJes Sorensen 
357583d0521aSChunyan Liu     backing_fmt = qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT);
3576f88e1a42SJes Sorensen 
3577f88e1a42SJes Sorensen     // The size for the image must always be specified, with one exception:
3578f88e1a42SJes Sorensen     // If we are using a backing file, we can obtain the size from there
357983d0521aSChunyan Liu     size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, 0);
358083d0521aSChunyan Liu     if (size == -1) {
358183d0521aSChunyan Liu         if (backing_file) {
358266f6b814SMax Reitz             BlockDriverState *bs;
358329168018SMax Reitz             char *full_backing = g_new0(char, PATH_MAX);
358452bf1e72SMarkus Armbruster             int64_t size;
358563090dacSPaolo Bonzini             int back_flags;
3586e6641719SMax Reitz             QDict *backing_options = NULL;
358763090dacSPaolo Bonzini 
358829168018SMax Reitz             bdrv_get_full_backing_filename_from_filename(filename, backing_file,
358929168018SMax Reitz                                                          full_backing, PATH_MAX,
359029168018SMax Reitz                                                          &local_err);
359129168018SMax Reitz             if (local_err) {
359229168018SMax Reitz                 g_free(full_backing);
359329168018SMax Reitz                 goto out;
359429168018SMax Reitz             }
359529168018SMax Reitz 
359663090dacSPaolo Bonzini             /* backing files always opened read-only */
359761de4c68SKevin Wolf             back_flags = flags;
3598bfd18d1eSKevin Wolf             back_flags &= ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
3599f88e1a42SJes Sorensen 
3600e6641719SMax Reitz             if (backing_fmt) {
3601e6641719SMax Reitz                 backing_options = qdict_new();
3602e6641719SMax Reitz                 qdict_put(backing_options, "driver",
3603e6641719SMax Reitz                           qstring_from_str(backing_fmt));
3604e6641719SMax Reitz             }
3605e6641719SMax Reitz 
3606f67503e5SMax Reitz             bs = NULL;
3607e6641719SMax Reitz             ret = bdrv_open(&bs, full_backing, NULL, backing_options,
36086ebf9aa2SMax Reitz                             back_flags, &local_err);
360929168018SMax Reitz             g_free(full_backing);
3610f88e1a42SJes Sorensen             if (ret < 0) {
3611f88e1a42SJes Sorensen                 goto out;
3612f88e1a42SJes Sorensen             }
361352bf1e72SMarkus Armbruster             size = bdrv_getlength(bs);
361452bf1e72SMarkus Armbruster             if (size < 0) {
361552bf1e72SMarkus Armbruster                 error_setg_errno(errp, -size, "Could not get size of '%s'",
361652bf1e72SMarkus Armbruster                                  backing_file);
361752bf1e72SMarkus Armbruster                 bdrv_unref(bs);
361852bf1e72SMarkus Armbruster                 goto out;
361952bf1e72SMarkus Armbruster             }
3620f88e1a42SJes Sorensen 
362139101f25SMarkus Armbruster             qemu_opt_set_number(opts, BLOCK_OPT_SIZE, size, &error_abort);
362266f6b814SMax Reitz 
362366f6b814SMax Reitz             bdrv_unref(bs);
3624f88e1a42SJes Sorensen         } else {
362571c79813SLuiz Capitulino             error_setg(errp, "Image creation needs a size parameter");
3626f88e1a42SJes Sorensen             goto out;
3627f88e1a42SJes Sorensen         }
3628f88e1a42SJes Sorensen     }
3629f88e1a42SJes Sorensen 
3630f382d43aSMiroslav Rezanina     if (!quiet) {
3631f88e1a42SJes Sorensen         printf("Formatting '%s', fmt=%s ", filename, fmt);
363243c5d8f8SFam Zheng         qemu_opts_print(opts, " ");
3633f88e1a42SJes Sorensen         puts("");
3634f382d43aSMiroslav Rezanina     }
363583d0521aSChunyan Liu 
3636c282e1fdSChunyan Liu     ret = bdrv_create(drv, filename, opts, &local_err);
363783d0521aSChunyan Liu 
3638cc84d90fSMax Reitz     if (ret == -EFBIG) {
3639cc84d90fSMax Reitz         /* This is generally a better message than whatever the driver would
3640cc84d90fSMax Reitz          * deliver (especially because of the cluster_size_hint), since that
3641cc84d90fSMax Reitz          * is most probably not much different from "image too large". */
3642f3f4d2c0SKevin Wolf         const char *cluster_size_hint = "";
364383d0521aSChunyan Liu         if (qemu_opt_get_size(opts, BLOCK_OPT_CLUSTER_SIZE, 0)) {
3644f3f4d2c0SKevin Wolf             cluster_size_hint = " (try using a larger cluster size)";
3645f3f4d2c0SKevin Wolf         }
3646cc84d90fSMax Reitz         error_setg(errp, "The image size is too large for file format '%s'"
3647cc84d90fSMax Reitz                    "%s", fmt, cluster_size_hint);
3648cc84d90fSMax Reitz         error_free(local_err);
3649cc84d90fSMax Reitz         local_err = NULL;
3650f88e1a42SJes Sorensen     }
3651f88e1a42SJes Sorensen 
3652f88e1a42SJes Sorensen out:
365383d0521aSChunyan Liu     qemu_opts_del(opts);
365483d0521aSChunyan Liu     qemu_opts_free(create_opts);
365584d18f06SMarkus Armbruster     if (local_err) {
3656cc84d90fSMax Reitz         error_propagate(errp, local_err);
3657cc84d90fSMax Reitz     }
3658f88e1a42SJes Sorensen }
365985d126f3SStefan Hajnoczi 
366085d126f3SStefan Hajnoczi AioContext *bdrv_get_aio_context(BlockDriverState *bs)
366185d126f3SStefan Hajnoczi {
3662dcd04228SStefan Hajnoczi     return bs->aio_context;
3663dcd04228SStefan Hajnoczi }
3664dcd04228SStefan Hajnoczi 
3665dcd04228SStefan Hajnoczi void bdrv_detach_aio_context(BlockDriverState *bs)
3666dcd04228SStefan Hajnoczi {
366733384421SMax Reitz     BdrvAioNotifier *baf;
366833384421SMax Reitz 
3669dcd04228SStefan Hajnoczi     if (!bs->drv) {
3670dcd04228SStefan Hajnoczi         return;
3671dcd04228SStefan Hajnoczi     }
3672dcd04228SStefan Hajnoczi 
367333384421SMax Reitz     QLIST_FOREACH(baf, &bs->aio_notifiers, list) {
367433384421SMax Reitz         baf->detach_aio_context(baf->opaque);
367533384421SMax Reitz     }
367633384421SMax Reitz 
3677*27ccdd52SKevin Wolf     if (bs->blk && blk_get_public(bs->blk)->throttle_state) {
3678*27ccdd52SKevin Wolf         throttle_timers_detach_aio_context(
3679*27ccdd52SKevin Wolf             &blk_get_public(bs->blk)->throttle_timers);
368013af91ebSStefan Hajnoczi     }
3681dcd04228SStefan Hajnoczi     if (bs->drv->bdrv_detach_aio_context) {
3682dcd04228SStefan Hajnoczi         bs->drv->bdrv_detach_aio_context(bs);
3683dcd04228SStefan Hajnoczi     }
3684dcd04228SStefan Hajnoczi     if (bs->file) {
36859a4f4c31SKevin Wolf         bdrv_detach_aio_context(bs->file->bs);
3686dcd04228SStefan Hajnoczi     }
3687760e0063SKevin Wolf     if (bs->backing) {
3688760e0063SKevin Wolf         bdrv_detach_aio_context(bs->backing->bs);
3689dcd04228SStefan Hajnoczi     }
3690dcd04228SStefan Hajnoczi 
3691dcd04228SStefan Hajnoczi     bs->aio_context = NULL;
3692dcd04228SStefan Hajnoczi }
3693dcd04228SStefan Hajnoczi 
3694dcd04228SStefan Hajnoczi void bdrv_attach_aio_context(BlockDriverState *bs,
3695dcd04228SStefan Hajnoczi                              AioContext *new_context)
3696dcd04228SStefan Hajnoczi {
369733384421SMax Reitz     BdrvAioNotifier *ban;
369833384421SMax Reitz 
3699dcd04228SStefan Hajnoczi     if (!bs->drv) {
3700dcd04228SStefan Hajnoczi         return;
3701dcd04228SStefan Hajnoczi     }
3702dcd04228SStefan Hajnoczi 
3703dcd04228SStefan Hajnoczi     bs->aio_context = new_context;
3704dcd04228SStefan Hajnoczi 
3705760e0063SKevin Wolf     if (bs->backing) {
3706760e0063SKevin Wolf         bdrv_attach_aio_context(bs->backing->bs, new_context);
3707dcd04228SStefan Hajnoczi     }
3708dcd04228SStefan Hajnoczi     if (bs->file) {
37099a4f4c31SKevin Wolf         bdrv_attach_aio_context(bs->file->bs, new_context);
3710dcd04228SStefan Hajnoczi     }
3711dcd04228SStefan Hajnoczi     if (bs->drv->bdrv_attach_aio_context) {
3712dcd04228SStefan Hajnoczi         bs->drv->bdrv_attach_aio_context(bs, new_context);
3713dcd04228SStefan Hajnoczi     }
3714*27ccdd52SKevin Wolf     if (bs->blk && blk_get_public(bs->blk)->throttle_state) {
3715*27ccdd52SKevin Wolf         throttle_timers_attach_aio_context(
3716*27ccdd52SKevin Wolf             &blk_get_public(bs->blk)->throttle_timers, new_context);
371713af91ebSStefan Hajnoczi     }
371833384421SMax Reitz 
371933384421SMax Reitz     QLIST_FOREACH(ban, &bs->aio_notifiers, list) {
372033384421SMax Reitz         ban->attached_aio_context(new_context, ban->opaque);
372133384421SMax Reitz     }
3722dcd04228SStefan Hajnoczi }
3723dcd04228SStefan Hajnoczi 
3724dcd04228SStefan Hajnoczi void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
3725dcd04228SStefan Hajnoczi {
372653ec73e2SFam Zheng     bdrv_drain(bs); /* ensure there are no in-flight requests */
3727dcd04228SStefan Hajnoczi 
3728dcd04228SStefan Hajnoczi     bdrv_detach_aio_context(bs);
3729dcd04228SStefan Hajnoczi 
3730dcd04228SStefan Hajnoczi     /* This function executes in the old AioContext so acquire the new one in
3731dcd04228SStefan Hajnoczi      * case it runs in a different thread.
3732dcd04228SStefan Hajnoczi      */
3733dcd04228SStefan Hajnoczi     aio_context_acquire(new_context);
3734dcd04228SStefan Hajnoczi     bdrv_attach_aio_context(bs, new_context);
3735dcd04228SStefan Hajnoczi     aio_context_release(new_context);
373685d126f3SStefan Hajnoczi }
3737d616b224SStefan Hajnoczi 
373833384421SMax Reitz void bdrv_add_aio_context_notifier(BlockDriverState *bs,
373933384421SMax Reitz         void (*attached_aio_context)(AioContext *new_context, void *opaque),
374033384421SMax Reitz         void (*detach_aio_context)(void *opaque), void *opaque)
374133384421SMax Reitz {
374233384421SMax Reitz     BdrvAioNotifier *ban = g_new(BdrvAioNotifier, 1);
374333384421SMax Reitz     *ban = (BdrvAioNotifier){
374433384421SMax Reitz         .attached_aio_context = attached_aio_context,
374533384421SMax Reitz         .detach_aio_context   = detach_aio_context,
374633384421SMax Reitz         .opaque               = opaque
374733384421SMax Reitz     };
374833384421SMax Reitz 
374933384421SMax Reitz     QLIST_INSERT_HEAD(&bs->aio_notifiers, ban, list);
375033384421SMax Reitz }
375133384421SMax Reitz 
375233384421SMax Reitz void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
375333384421SMax Reitz                                       void (*attached_aio_context)(AioContext *,
375433384421SMax Reitz                                                                    void *),
375533384421SMax Reitz                                       void (*detach_aio_context)(void *),
375633384421SMax Reitz                                       void *opaque)
375733384421SMax Reitz {
375833384421SMax Reitz     BdrvAioNotifier *ban, *ban_next;
375933384421SMax Reitz 
376033384421SMax Reitz     QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
376133384421SMax Reitz         if (ban->attached_aio_context == attached_aio_context &&
376233384421SMax Reitz             ban->detach_aio_context   == detach_aio_context   &&
376333384421SMax Reitz             ban->opaque               == opaque)
376433384421SMax Reitz         {
376533384421SMax Reitz             QLIST_REMOVE(ban, list);
376633384421SMax Reitz             g_free(ban);
376733384421SMax Reitz 
376833384421SMax Reitz             return;
376933384421SMax Reitz         }
377033384421SMax Reitz     }
377133384421SMax Reitz 
377233384421SMax Reitz     abort();
377333384421SMax Reitz }
377433384421SMax Reitz 
377577485434SMax Reitz int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
37768b13976dSMax Reitz                        BlockDriverAmendStatusCB *status_cb, void *cb_opaque)
37776f176b48SMax Reitz {
3778c282e1fdSChunyan Liu     if (!bs->drv->bdrv_amend_options) {
37796f176b48SMax Reitz         return -ENOTSUP;
37806f176b48SMax Reitz     }
37818b13976dSMax Reitz     return bs->drv->bdrv_amend_options(bs, opts, status_cb, cb_opaque);
37826f176b48SMax Reitz }
3783f6186f49SBenoît Canet 
3784b5042a36SBenoît Canet /* This function will be called by the bdrv_recurse_is_first_non_filter method
3785b5042a36SBenoît Canet  * of block filter and by bdrv_is_first_non_filter.
3786b5042a36SBenoît Canet  * It is used to test if the given bs is the candidate or recurse more in the
3787b5042a36SBenoît Canet  * node graph.
3788212a5a8fSBenoît Canet  */
3789212a5a8fSBenoît Canet bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
3790212a5a8fSBenoît Canet                                       BlockDriverState *candidate)
3791f6186f49SBenoît Canet {
3792b5042a36SBenoît Canet     /* return false if basic checks fails */
3793b5042a36SBenoît Canet     if (!bs || !bs->drv) {
3794b5042a36SBenoît Canet         return false;
3795b5042a36SBenoît Canet     }
3796b5042a36SBenoît Canet 
3797b5042a36SBenoît Canet     /* the code reached a non block filter driver -> check if the bs is
3798b5042a36SBenoît Canet      * the same as the candidate. It's the recursion termination condition.
3799b5042a36SBenoît Canet      */
3800b5042a36SBenoît Canet     if (!bs->drv->is_filter) {
3801b5042a36SBenoît Canet         return bs == candidate;
3802b5042a36SBenoît Canet     }
3803b5042a36SBenoît Canet     /* Down this path the driver is a block filter driver */
3804b5042a36SBenoît Canet 
3805b5042a36SBenoît Canet     /* If the block filter recursion method is defined use it to recurse down
3806b5042a36SBenoît Canet      * the node graph.
3807b5042a36SBenoît Canet      */
3808b5042a36SBenoît Canet     if (bs->drv->bdrv_recurse_is_first_non_filter) {
3809212a5a8fSBenoît Canet         return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate);
3810212a5a8fSBenoît Canet     }
3811212a5a8fSBenoît Canet 
3812b5042a36SBenoît Canet     /* the driver is a block filter but don't allow to recurse -> return false
3813b5042a36SBenoît Canet      */
3814b5042a36SBenoît Canet     return false;
3815212a5a8fSBenoît Canet }
3816212a5a8fSBenoît Canet 
3817212a5a8fSBenoît Canet /* This function checks if the candidate is the first non filter bs down it's
3818212a5a8fSBenoît Canet  * bs chain. Since we don't have pointers to parents it explore all bs chains
3819212a5a8fSBenoît Canet  * from the top. Some filters can choose not to pass down the recursion.
3820212a5a8fSBenoît Canet  */
3821212a5a8fSBenoît Canet bool bdrv_is_first_non_filter(BlockDriverState *candidate)
3822212a5a8fSBenoît Canet {
382379720af6SMax Reitz     BlockDriverState *bs = NULL;
3824212a5a8fSBenoît Canet 
3825212a5a8fSBenoît Canet     /* walk down the bs forest recursively */
382679720af6SMax Reitz     while ((bs = bdrv_next(bs)) != NULL) {
3827212a5a8fSBenoît Canet         bool perm;
3828212a5a8fSBenoît Canet 
3829b5042a36SBenoît Canet         /* try to recurse in this top level bs */
3830e6dc8a1fSKevin Wolf         perm = bdrv_recurse_is_first_non_filter(bs, candidate);
3831212a5a8fSBenoît Canet 
3832212a5a8fSBenoît Canet         /* candidate is the first non filter */
3833212a5a8fSBenoît Canet         if (perm) {
3834212a5a8fSBenoît Canet             return true;
3835212a5a8fSBenoît Canet         }
3836212a5a8fSBenoît Canet     }
3837212a5a8fSBenoît Canet 
3838212a5a8fSBenoît Canet     return false;
3839f6186f49SBenoît Canet }
384009158f00SBenoît Canet 
3841e12f3784SWen Congyang BlockDriverState *check_to_replace_node(BlockDriverState *parent_bs,
3842e12f3784SWen Congyang                                         const char *node_name, Error **errp)
384309158f00SBenoît Canet {
384409158f00SBenoît Canet     BlockDriverState *to_replace_bs = bdrv_find_node(node_name);
38455a7e7a0bSStefan Hajnoczi     AioContext *aio_context;
38465a7e7a0bSStefan Hajnoczi 
384709158f00SBenoît Canet     if (!to_replace_bs) {
384809158f00SBenoît Canet         error_setg(errp, "Node name '%s' not found", node_name);
384909158f00SBenoît Canet         return NULL;
385009158f00SBenoît Canet     }
385109158f00SBenoît Canet 
38525a7e7a0bSStefan Hajnoczi     aio_context = bdrv_get_aio_context(to_replace_bs);
38535a7e7a0bSStefan Hajnoczi     aio_context_acquire(aio_context);
38545a7e7a0bSStefan Hajnoczi 
385509158f00SBenoît Canet     if (bdrv_op_is_blocked(to_replace_bs, BLOCK_OP_TYPE_REPLACE, errp)) {
38565a7e7a0bSStefan Hajnoczi         to_replace_bs = NULL;
38575a7e7a0bSStefan Hajnoczi         goto out;
385809158f00SBenoît Canet     }
385909158f00SBenoît Canet 
386009158f00SBenoît Canet     /* We don't want arbitrary node of the BDS chain to be replaced only the top
386109158f00SBenoît Canet      * most non filter in order to prevent data corruption.
386209158f00SBenoît Canet      * Another benefit is that this tests exclude backing files which are
386309158f00SBenoît Canet      * blocked by the backing blockers.
386409158f00SBenoît Canet      */
3865e12f3784SWen Congyang     if (!bdrv_recurse_is_first_non_filter(parent_bs, to_replace_bs)) {
386609158f00SBenoît Canet         error_setg(errp, "Only top most non filter can be replaced");
38675a7e7a0bSStefan Hajnoczi         to_replace_bs = NULL;
38685a7e7a0bSStefan Hajnoczi         goto out;
386909158f00SBenoît Canet     }
387009158f00SBenoît Canet 
38715a7e7a0bSStefan Hajnoczi out:
38725a7e7a0bSStefan Hajnoczi     aio_context_release(aio_context);
387309158f00SBenoît Canet     return to_replace_bs;
387409158f00SBenoît Canet }
3875448ad91dSMing Lei 
387691af7014SMax Reitz static bool append_open_options(QDict *d, BlockDriverState *bs)
387791af7014SMax Reitz {
387891af7014SMax Reitz     const QDictEntry *entry;
38799e700c1aSKevin Wolf     QemuOptDesc *desc;
3880260fecf1SKevin Wolf     BdrvChild *child;
388191af7014SMax Reitz     bool found_any = false;
3882260fecf1SKevin Wolf     const char *p;
388391af7014SMax Reitz 
388491af7014SMax Reitz     for (entry = qdict_first(bs->options); entry;
388591af7014SMax Reitz          entry = qdict_next(bs->options, entry))
388691af7014SMax Reitz     {
3887260fecf1SKevin Wolf         /* Exclude options for children */
3888260fecf1SKevin Wolf         QLIST_FOREACH(child, &bs->children, next) {
3889260fecf1SKevin Wolf             if (strstart(qdict_entry_key(entry), child->name, &p)
3890260fecf1SKevin Wolf                 && (!*p || *p == '.'))
3891260fecf1SKevin Wolf             {
3892260fecf1SKevin Wolf                 break;
3893260fecf1SKevin Wolf             }
3894260fecf1SKevin Wolf         }
3895260fecf1SKevin Wolf         if (child) {
38969e700c1aSKevin Wolf             continue;
38979e700c1aSKevin Wolf         }
38989e700c1aSKevin Wolf 
38999e700c1aSKevin Wolf         /* And exclude all non-driver-specific options */
39009e700c1aSKevin Wolf         for (desc = bdrv_runtime_opts.desc; desc->name; desc++) {
39019e700c1aSKevin Wolf             if (!strcmp(qdict_entry_key(entry), desc->name)) {
39029e700c1aSKevin Wolf                 break;
39039e700c1aSKevin Wolf             }
39049e700c1aSKevin Wolf         }
39059e700c1aSKevin Wolf         if (desc->name) {
39069e700c1aSKevin Wolf             continue;
39079e700c1aSKevin Wolf         }
39089e700c1aSKevin Wolf 
390991af7014SMax Reitz         qobject_incref(qdict_entry_value(entry));
391091af7014SMax Reitz         qdict_put_obj(d, qdict_entry_key(entry), qdict_entry_value(entry));
391191af7014SMax Reitz         found_any = true;
391291af7014SMax Reitz     }
391391af7014SMax Reitz 
391491af7014SMax Reitz     return found_any;
391591af7014SMax Reitz }
391691af7014SMax Reitz 
391791af7014SMax Reitz /* Updates the following BDS fields:
391891af7014SMax Reitz  *  - exact_filename: A filename which may be used for opening a block device
391991af7014SMax Reitz  *                    which (mostly) equals the given BDS (even without any
392091af7014SMax Reitz  *                    other options; so reading and writing must return the same
392191af7014SMax Reitz  *                    results, but caching etc. may be different)
392291af7014SMax Reitz  *  - full_open_options: Options which, when given when opening a block device
392391af7014SMax Reitz  *                       (without a filename), result in a BDS (mostly)
392491af7014SMax Reitz  *                       equalling the given one
392591af7014SMax Reitz  *  - filename: If exact_filename is set, it is copied here. Otherwise,
392691af7014SMax Reitz  *              full_open_options is converted to a JSON object, prefixed with
392791af7014SMax Reitz  *              "json:" (for use through the JSON pseudo protocol) and put here.
392891af7014SMax Reitz  */
392991af7014SMax Reitz void bdrv_refresh_filename(BlockDriverState *bs)
393091af7014SMax Reitz {
393191af7014SMax Reitz     BlockDriver *drv = bs->drv;
393291af7014SMax Reitz     QDict *opts;
393391af7014SMax Reitz 
393491af7014SMax Reitz     if (!drv) {
393591af7014SMax Reitz         return;
393691af7014SMax Reitz     }
393791af7014SMax Reitz 
393891af7014SMax Reitz     /* This BDS's file name will most probably depend on its file's name, so
393991af7014SMax Reitz      * refresh that first */
394091af7014SMax Reitz     if (bs->file) {
39419a4f4c31SKevin Wolf         bdrv_refresh_filename(bs->file->bs);
394291af7014SMax Reitz     }
394391af7014SMax Reitz 
394491af7014SMax Reitz     if (drv->bdrv_refresh_filename) {
394591af7014SMax Reitz         /* Obsolete information is of no use here, so drop the old file name
394691af7014SMax Reitz          * information before refreshing it */
394791af7014SMax Reitz         bs->exact_filename[0] = '\0';
394891af7014SMax Reitz         if (bs->full_open_options) {
394991af7014SMax Reitz             QDECREF(bs->full_open_options);
395091af7014SMax Reitz             bs->full_open_options = NULL;
395191af7014SMax Reitz         }
395291af7014SMax Reitz 
39534cdd01d3SKevin Wolf         opts = qdict_new();
39544cdd01d3SKevin Wolf         append_open_options(opts, bs);
39554cdd01d3SKevin Wolf         drv->bdrv_refresh_filename(bs, opts);
39564cdd01d3SKevin Wolf         QDECREF(opts);
395791af7014SMax Reitz     } else if (bs->file) {
395891af7014SMax Reitz         /* Try to reconstruct valid information from the underlying file */
395991af7014SMax Reitz         bool has_open_options;
396091af7014SMax Reitz 
396191af7014SMax Reitz         bs->exact_filename[0] = '\0';
396291af7014SMax Reitz         if (bs->full_open_options) {
396391af7014SMax Reitz             QDECREF(bs->full_open_options);
396491af7014SMax Reitz             bs->full_open_options = NULL;
396591af7014SMax Reitz         }
396691af7014SMax Reitz 
396791af7014SMax Reitz         opts = qdict_new();
396891af7014SMax Reitz         has_open_options = append_open_options(opts, bs);
396991af7014SMax Reitz 
397091af7014SMax Reitz         /* If no specific options have been given for this BDS, the filename of
397191af7014SMax Reitz          * the underlying file should suffice for this one as well */
39729a4f4c31SKevin Wolf         if (bs->file->bs->exact_filename[0] && !has_open_options) {
39739a4f4c31SKevin Wolf             strcpy(bs->exact_filename, bs->file->bs->exact_filename);
397491af7014SMax Reitz         }
397591af7014SMax Reitz         /* Reconstructing the full options QDict is simple for most format block
397691af7014SMax Reitz          * drivers, as long as the full options are known for the underlying
397791af7014SMax Reitz          * file BDS. The full options QDict of that file BDS should somehow
397891af7014SMax Reitz          * contain a representation of the filename, therefore the following
397991af7014SMax Reitz          * suffices without querying the (exact_)filename of this BDS. */
39809a4f4c31SKevin Wolf         if (bs->file->bs->full_open_options) {
398191af7014SMax Reitz             qdict_put_obj(opts, "driver",
398291af7014SMax Reitz                           QOBJECT(qstring_from_str(drv->format_name)));
39839a4f4c31SKevin Wolf             QINCREF(bs->file->bs->full_open_options);
39849a4f4c31SKevin Wolf             qdict_put_obj(opts, "file",
39859a4f4c31SKevin Wolf                           QOBJECT(bs->file->bs->full_open_options));
398691af7014SMax Reitz 
398791af7014SMax Reitz             bs->full_open_options = opts;
398891af7014SMax Reitz         } else {
398991af7014SMax Reitz             QDECREF(opts);
399091af7014SMax Reitz         }
399191af7014SMax Reitz     } else if (!bs->full_open_options && qdict_size(bs->options)) {
399291af7014SMax Reitz         /* There is no underlying file BDS (at least referenced by BDS.file),
399391af7014SMax Reitz          * so the full options QDict should be equal to the options given
399491af7014SMax Reitz          * specifically for this block device when it was opened (plus the
399591af7014SMax Reitz          * driver specification).
399691af7014SMax Reitz          * Because those options don't change, there is no need to update
399791af7014SMax Reitz          * full_open_options when it's already set. */
399891af7014SMax Reitz 
399991af7014SMax Reitz         opts = qdict_new();
400091af7014SMax Reitz         append_open_options(opts, bs);
400191af7014SMax Reitz         qdict_put_obj(opts, "driver",
400291af7014SMax Reitz                       QOBJECT(qstring_from_str(drv->format_name)));
400391af7014SMax Reitz 
400491af7014SMax Reitz         if (bs->exact_filename[0]) {
400591af7014SMax Reitz             /* This may not work for all block protocol drivers (some may
400691af7014SMax Reitz              * require this filename to be parsed), but we have to find some
400791af7014SMax Reitz              * default solution here, so just include it. If some block driver
400891af7014SMax Reitz              * does not support pure options without any filename at all or
400991af7014SMax Reitz              * needs some special format of the options QDict, it needs to
401091af7014SMax Reitz              * implement the driver-specific bdrv_refresh_filename() function.
401191af7014SMax Reitz              */
401291af7014SMax Reitz             qdict_put_obj(opts, "filename",
401391af7014SMax Reitz                           QOBJECT(qstring_from_str(bs->exact_filename)));
401491af7014SMax Reitz         }
401591af7014SMax Reitz 
401691af7014SMax Reitz         bs->full_open_options = opts;
401791af7014SMax Reitz     }
401891af7014SMax Reitz 
401991af7014SMax Reitz     if (bs->exact_filename[0]) {
402091af7014SMax Reitz         pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename);
402191af7014SMax Reitz     } else if (bs->full_open_options) {
402291af7014SMax Reitz         QString *json = qobject_to_json(QOBJECT(bs->full_open_options));
402391af7014SMax Reitz         snprintf(bs->filename, sizeof(bs->filename), "json:%s",
402491af7014SMax Reitz                  qstring_get_str(json));
402591af7014SMax Reitz         QDECREF(json);
402691af7014SMax Reitz     }
402791af7014SMax Reitz }
4028e06018adSWen Congyang 
4029e06018adSWen Congyang /*
4030e06018adSWen Congyang  * Hot add/remove a BDS's child. So the user can take a child offline when
4031e06018adSWen Congyang  * it is broken and take a new child online
4032e06018adSWen Congyang  */
4033e06018adSWen Congyang void bdrv_add_child(BlockDriverState *parent_bs, BlockDriverState *child_bs,
4034e06018adSWen Congyang                     Error **errp)
4035e06018adSWen Congyang {
4036e06018adSWen Congyang 
4037e06018adSWen Congyang     if (!parent_bs->drv || !parent_bs->drv->bdrv_add_child) {
4038e06018adSWen Congyang         error_setg(errp, "The node %s does not support adding a child",
4039e06018adSWen Congyang                    bdrv_get_device_or_node_name(parent_bs));
4040e06018adSWen Congyang         return;
4041e06018adSWen Congyang     }
4042e06018adSWen Congyang 
4043e06018adSWen Congyang     if (!QLIST_EMPTY(&child_bs->parents)) {
4044e06018adSWen Congyang         error_setg(errp, "The node %s already has a parent",
4045e06018adSWen Congyang                    child_bs->node_name);
4046e06018adSWen Congyang         return;
4047e06018adSWen Congyang     }
4048e06018adSWen Congyang 
4049e06018adSWen Congyang     parent_bs->drv->bdrv_add_child(parent_bs, child_bs, errp);
4050e06018adSWen Congyang }
4051e06018adSWen Congyang 
4052e06018adSWen Congyang void bdrv_del_child(BlockDriverState *parent_bs, BdrvChild *child, Error **errp)
4053e06018adSWen Congyang {
4054e06018adSWen Congyang     BdrvChild *tmp;
4055e06018adSWen Congyang 
4056e06018adSWen Congyang     if (!parent_bs->drv || !parent_bs->drv->bdrv_del_child) {
4057e06018adSWen Congyang         error_setg(errp, "The node %s does not support removing a child",
4058e06018adSWen Congyang                    bdrv_get_device_or_node_name(parent_bs));
4059e06018adSWen Congyang         return;
4060e06018adSWen Congyang     }
4061e06018adSWen Congyang 
4062e06018adSWen Congyang     QLIST_FOREACH(tmp, &parent_bs->children, next) {
4063e06018adSWen Congyang         if (tmp == child) {
4064e06018adSWen Congyang             break;
4065e06018adSWen Congyang         }
4066e06018adSWen Congyang     }
4067e06018adSWen Congyang 
4068e06018adSWen Congyang     if (!tmp) {
4069e06018adSWen Congyang         error_setg(errp, "The node %s does not have a child named %s",
4070e06018adSWen Congyang                    bdrv_get_device_or_node_name(parent_bs),
4071e06018adSWen Congyang                    bdrv_get_device_or_node_name(child->bs));
4072e06018adSWen Congyang         return;
4073e06018adSWen Congyang     }
4074e06018adSWen Congyang 
4075e06018adSWen Congyang     parent_bs->drv->bdrv_del_child(parent_bs, child, errp);
4076e06018adSWen Congyang }
4077