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