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