blob: 54d789a8e982bc98d636b802d96e535cdf20fedf [file] [log] [blame]
bellardfc01f7e2003-06-30 10:03:06 +00001/*
2 * QEMU System Emulator block driver
ths5fafdf22007-09-16 21:08:06 +00003 *
bellardfc01f7e2003-06-30 10:03:06 +00004 * Copyright (c) 2003 Fabrice Bellard
ths5fafdf22007-09-16 21:08:06 +00005 *
bellardfc01f7e2003-06-30 10:03:06 +00006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
blueswir13990d092008-12-05 17:53:21 +000024#include "config-host.h"
pbrookfaf07962007-11-11 02:51:17 +000025#include "qemu-common.h"
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +010026#include "trace.h"
Paolo Bonzini737e1502012-12-17 18:19:44 +010027#include "block/block_int.h"
28#include "block/blockjob.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010029#include "qemu/module.h"
Paolo Bonzini7b1b5d12012-12-17 18:19:43 +010030#include "qapi/qmp/qjson.h"
Markus Armbrusterbfb197e2014-10-07 13:59:11 +020031#include "sysemu/block-backend.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010032#include "sysemu/sysemu.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010033#include "qemu/notify.h"
Paolo Bonzini737e1502012-12-17 18:19:44 +010034#include "block/coroutine.h"
Benoît Canetc13163f2014-01-23 21:31:34 +010035#include "block/qapi.h"
Luiz Capitulinob2023812011-09-21 17:16:47 -030036#include "qmp-commands.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010037#include "qemu/timer.h"
Wenchao Xiaa5ee7bd2014-06-18 08:43:44 +020038#include "qapi-event.h"
Alberto Garciadb628332015-06-08 18:17:45 +020039#include "block/throttle-groups.h"
bellardfc01f7e2003-06-30 10:03:06 +000040
Juan Quintela71e72a12009-07-27 16:12:56 +020041#ifdef CONFIG_BSD
bellard7674e7b2005-04-26 21:59:26 +000042#include <sys/types.h>
43#include <sys/stat.h>
44#include <sys/ioctl.h>
Blue Swirl72cf2d42009-09-12 07:36:22 +000045#include <sys/queue.h>
blueswir1c5e97232009-03-07 20:06:23 +000046#ifndef __DragonFly__
bellard7674e7b2005-04-26 21:59:26 +000047#include <sys/disk.h>
48#endif
blueswir1c5e97232009-03-07 20:06:23 +000049#endif
bellard7674e7b2005-04-26 21:59:26 +000050
aliguori49dc7682009-03-08 16:26:59 +000051#ifdef _WIN32
52#include <windows.h>
53#endif
54
John Snow9bd2b082015-04-17 19:49:57 -040055/**
56 * A BdrvDirtyBitmap can be in three possible states:
57 * (1) successor is NULL and disabled is false: full r/w mode
58 * (2) successor is NULL and disabled is true: read only mode ("disabled")
59 * (3) successor is set: frozen mode.
60 * A frozen bitmap cannot be renamed, deleted, anonymized, cleared, set,
61 * or enabled. A frozen bitmap can only abdicate() or reclaim().
62 */
Fam Zhenge4654d22013-11-13 18:29:43 +080063struct BdrvDirtyBitmap {
John Snowaa0c7ca2015-04-17 19:50:01 -040064 HBitmap *bitmap; /* Dirty sector bitmap implementation */
65 BdrvDirtyBitmap *successor; /* Anonymous child; implies frozen status */
66 char *name; /* Optional non-empty unique ID */
67 int64_t size; /* Size of the bitmap (Number of sectors) */
68 bool disabled; /* Bitmap is read-only */
Fam Zhenge4654d22013-11-13 18:29:43 +080069 QLIST_ENTRY(BdrvDirtyBitmap) list;
70};
71
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +010072#define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */
73
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +010074static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
75 QTAILQ_HEAD_INITIALIZER(bdrv_states);
blueswir17ee930d2008-09-17 19:04:14 +000076
Benoît Canetdc364f42014-01-23 21:31:32 +010077static QTAILQ_HEAD(, BlockDriverState) graph_bdrv_states =
78 QTAILQ_HEAD_INITIALIZER(graph_bdrv_states);
79
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +010080static QLIST_HEAD(, BlockDriver) bdrv_drivers =
81 QLIST_HEAD_INITIALIZER(bdrv_drivers);
bellardea2384d2004-08-01 21:59:26 +000082
John Snowce1ffea2015-04-17 19:50:03 -040083static void bdrv_dirty_bitmap_truncate(BlockDriverState *bs);
Markus Armbrustereb852012009-10-27 18:41:44 +010084/* If non-zero, use only whitelisted block drivers */
85static int use_bdrv_whitelist;
86
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +000087#ifdef _WIN32
88static int is_windows_drive_prefix(const char *filename)
89{
90 return (((filename[0] >= 'a' && filename[0] <= 'z') ||
91 (filename[0] >= 'A' && filename[0] <= 'Z')) &&
92 filename[1] == ':');
93}
94
95int is_windows_drive(const char *filename)
96{
97 if (is_windows_drive_prefix(filename) &&
98 filename[2] == '\0')
99 return 1;
100 if (strstart(filename, "\\\\.\\", NULL) ||
101 strstart(filename, "//./", NULL))
102 return 1;
103 return 0;
104}
105#endif
106
Kevin Wolf339064d2013-11-28 10:23:32 +0100107size_t bdrv_opt_mem_align(BlockDriverState *bs)
108{
109 if (!bs || !bs->drv) {
Denis V. Lunev459b4e62015-05-12 17:30:56 +0300110 /* page size or 4k (hdd sector size) should be on the safe side */
111 return MAX(4096, getpagesize());
Kevin Wolf339064d2013-11-28 10:23:32 +0100112 }
113
114 return bs->bl.opt_mem_alignment;
115}
116
Denis V. Lunev4196d2f2015-05-12 17:30:55 +0300117size_t bdrv_min_mem_align(BlockDriverState *bs)
118{
119 if (!bs || !bs->drv) {
Denis V. Lunev459b4e62015-05-12 17:30:56 +0300120 /* page size or 4k (hdd sector size) should be on the safe side */
121 return MAX(4096, getpagesize());
Denis V. Lunev4196d2f2015-05-12 17:30:55 +0300122 }
123
124 return bs->bl.min_mem_alignment;
125}
126
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000127/* check if the path starts with "<protocol>:" */
Max Reitz5c984152014-12-03 14:57:22 +0100128int path_has_protocol(const char *path)
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000129{
Paolo Bonzini947995c2012-05-08 16:51:48 +0200130 const char *p;
131
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000132#ifdef _WIN32
133 if (is_windows_drive(path) ||
134 is_windows_drive_prefix(path)) {
135 return 0;
136 }
Paolo Bonzini947995c2012-05-08 16:51:48 +0200137 p = path + strcspn(path, ":/\\");
138#else
139 p = path + strcspn(path, ":/");
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000140#endif
141
Paolo Bonzini947995c2012-05-08 16:51:48 +0200142 return *p == ':';
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000143}
144
bellard83f64092006-08-01 16:21:11 +0000145int path_is_absolute(const char *path)
146{
bellard21664422007-01-07 18:22:37 +0000147#ifdef _WIN32
148 /* specific case for names like: "\\.\d:" */
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200149 if (is_windows_drive(path) || is_windows_drive_prefix(path)) {
bellard21664422007-01-07 18:22:37 +0000150 return 1;
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200151 }
152 return (*path == '/' || *path == '\\');
bellard3b9f94e2007-01-07 17:27:07 +0000153#else
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200154 return (*path == '/');
bellard3b9f94e2007-01-07 17:27:07 +0000155#endif
bellard83f64092006-08-01 16:21:11 +0000156}
157
158/* if filename is absolute, just copy it to dest. Otherwise, build a
159 path to it by considering it is relative to base_path. URL are
160 supported. */
161void path_combine(char *dest, int dest_size,
162 const char *base_path,
163 const char *filename)
164{
165 const char *p, *p1;
166 int len;
167
168 if (dest_size <= 0)
169 return;
170 if (path_is_absolute(filename)) {
171 pstrcpy(dest, dest_size, filename);
172 } else {
173 p = strchr(base_path, ':');
174 if (p)
175 p++;
176 else
177 p = base_path;
bellard3b9f94e2007-01-07 17:27:07 +0000178 p1 = strrchr(base_path, '/');
179#ifdef _WIN32
180 {
181 const char *p2;
182 p2 = strrchr(base_path, '\\');
183 if (!p1 || p2 > p1)
184 p1 = p2;
185 }
186#endif
bellard83f64092006-08-01 16:21:11 +0000187 if (p1)
188 p1++;
189 else
190 p1 = base_path;
191 if (p1 > p)
192 p = p1;
193 len = p - base_path;
194 if (len > dest_size - 1)
195 len = dest_size - 1;
196 memcpy(dest, base_path, len);
197 dest[len] = '\0';
198 pstrcat(dest, dest_size, filename);
199 }
200}
201
Max Reitz0a828552014-11-26 17:20:25 +0100202void bdrv_get_full_backing_filename_from_filename(const char *backed,
203 const char *backing,
Max Reitz9f074292014-11-26 17:20:26 +0100204 char *dest, size_t sz,
205 Error **errp)
Max Reitz0a828552014-11-26 17:20:25 +0100206{
Max Reitz9f074292014-11-26 17:20:26 +0100207 if (backing[0] == '\0' || path_has_protocol(backing) ||
208 path_is_absolute(backing))
209 {
Max Reitz0a828552014-11-26 17:20:25 +0100210 pstrcpy(dest, sz, backing);
Max Reitz9f074292014-11-26 17:20:26 +0100211 } else if (backed[0] == '\0' || strstart(backed, "json:", NULL)) {
212 error_setg(errp, "Cannot use relative backing file names for '%s'",
213 backed);
Max Reitz0a828552014-11-26 17:20:25 +0100214 } else {
215 path_combine(dest, sz, backed, backing);
216 }
217}
218
Max Reitz9f074292014-11-26 17:20:26 +0100219void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz,
220 Error **errp)
Paolo Bonzinidc5a1372012-05-08 16:51:50 +0200221{
Max Reitz9f074292014-11-26 17:20:26 +0100222 char *backed = bs->exact_filename[0] ? bs->exact_filename : bs->filename;
223
224 bdrv_get_full_backing_filename_from_filename(backed, bs->backing_file,
225 dest, sz, errp);
Paolo Bonzinidc5a1372012-05-08 16:51:50 +0200226}
227
Stefan Hajnoczi0eb72172015-04-28 14:27:51 +0100228void bdrv_register(BlockDriver *bdrv)
229{
230 bdrv_setup_io_funcs(bdrv);
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +0200231
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100232 QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
bellardea2384d2004-08-01 21:59:26 +0000233}
bellardb3380822004-03-14 21:38:54 +0000234
Markus Armbruster7f06d472014-10-07 13:59:12 +0200235BlockDriverState *bdrv_new_root(void)
bellardfc01f7e2003-06-30 10:03:06 +0000236{
Markus Armbruster7f06d472014-10-07 13:59:12 +0200237 BlockDriverState *bs = bdrv_new();
Markus Armbrustere4e99862014-10-07 13:59:03 +0200238
Markus Armbrustere4e99862014-10-07 13:59:03 +0200239 QTAILQ_INSERT_TAIL(&bdrv_states, bs, device_list);
Markus Armbrustere4e99862014-10-07 13:59:03 +0200240 return bs;
241}
242
243BlockDriverState *bdrv_new(void)
244{
245 BlockDriverState *bs;
246 int i;
247
Markus Armbruster5839e532014-08-19 10:31:08 +0200248 bs = g_new0(BlockDriverState, 1);
Fam Zhenge4654d22013-11-13 18:29:43 +0800249 QLIST_INIT(&bs->dirty_bitmaps);
Fam Zhengfbe40ff2014-05-23 21:29:42 +0800250 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
251 QLIST_INIT(&bs->op_blockers[i]);
252 }
Luiz Capitulino28a72822011-09-26 17:43:50 -0300253 bdrv_iostatus_disable(bs);
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200254 notifier_list_init(&bs->close_notifiers);
Stefan Hajnoczid616b222013-06-24 17:13:10 +0200255 notifier_with_return_list_init(&bs->before_write_notifiers);
Benoît Canetcc0681c2013-09-02 14:14:39 +0200256 qemu_co_queue_init(&bs->throttled_reqs[0]);
257 qemu_co_queue_init(&bs->throttled_reqs[1]);
Fam Zheng9fcb0252013-08-23 09:14:46 +0800258 bs->refcnt = 1;
Stefan Hajnoczidcd04222014-05-08 16:34:37 +0200259 bs->aio_context = qemu_get_aio_context();
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200260
bellardb3380822004-03-14 21:38:54 +0000261 return bs;
262}
263
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200264void bdrv_add_close_notifier(BlockDriverState *bs, Notifier *notify)
265{
266 notifier_list_add(&bs->close_notifiers, notify);
267}
268
bellardea2384d2004-08-01 21:59:26 +0000269BlockDriver *bdrv_find_format(const char *format_name)
270{
271 BlockDriver *drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100272 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
273 if (!strcmp(drv1->format_name, format_name)) {
bellardea2384d2004-08-01 21:59:26 +0000274 return drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100275 }
bellardea2384d2004-08-01 21:59:26 +0000276 }
277 return NULL;
278}
279
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800280static int bdrv_is_whitelisted(BlockDriver *drv, bool read_only)
Markus Armbrustereb852012009-10-27 18:41:44 +0100281{
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800282 static const char *whitelist_rw[] = {
283 CONFIG_BDRV_RW_WHITELIST
284 };
285 static const char *whitelist_ro[] = {
286 CONFIG_BDRV_RO_WHITELIST
Markus Armbrustereb852012009-10-27 18:41:44 +0100287 };
288 const char **p;
289
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800290 if (!whitelist_rw[0] && !whitelist_ro[0]) {
Markus Armbrustereb852012009-10-27 18:41:44 +0100291 return 1; /* no whitelist, anything goes */
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800292 }
Markus Armbrustereb852012009-10-27 18:41:44 +0100293
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800294 for (p = whitelist_rw; *p; p++) {
Markus Armbrustereb852012009-10-27 18:41:44 +0100295 if (!strcmp(drv->format_name, *p)) {
296 return 1;
297 }
298 }
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800299 if (read_only) {
300 for (p = whitelist_ro; *p; p++) {
301 if (!strcmp(drv->format_name, *p)) {
302 return 1;
303 }
304 }
305 }
Markus Armbrustereb852012009-10-27 18:41:44 +0100306 return 0;
307}
308
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800309BlockDriver *bdrv_find_whitelisted_format(const char *format_name,
310 bool read_only)
Markus Armbrustereb852012009-10-27 18:41:44 +0100311{
312 BlockDriver *drv = bdrv_find_format(format_name);
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800313 return drv && bdrv_is_whitelisted(drv, read_only) ? drv : NULL;
Markus Armbrustereb852012009-10-27 18:41:44 +0100314}
315
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800316typedef struct CreateCo {
317 BlockDriver *drv;
318 char *filename;
Chunyan Liu83d05212014-06-05 17:20:51 +0800319 QemuOpts *opts;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800320 int ret;
Max Reitzcc84d902013-09-06 17:14:26 +0200321 Error *err;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800322} CreateCo;
323
324static void coroutine_fn bdrv_create_co_entry(void *opaque)
325{
Max Reitzcc84d902013-09-06 17:14:26 +0200326 Error *local_err = NULL;
327 int ret;
328
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800329 CreateCo *cco = opaque;
330 assert(cco->drv);
331
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800332 ret = cco->drv->bdrv_create(cco->filename, cco->opts, &local_err);
Markus Armbruster84d18f02014-01-30 15:07:28 +0100333 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200334 error_propagate(&cco->err, local_err);
335 }
336 cco->ret = ret;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800337}
338
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200339int bdrv_create(BlockDriver *drv, const char* filename,
Chunyan Liu83d05212014-06-05 17:20:51 +0800340 QemuOpts *opts, Error **errp)
bellardea2384d2004-08-01 21:59:26 +0000341{
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800342 int ret;
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200343
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800344 Coroutine *co;
345 CreateCo cco = {
346 .drv = drv,
347 .filename = g_strdup(filename),
Chunyan Liu83d05212014-06-05 17:20:51 +0800348 .opts = opts,
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800349 .ret = NOT_DONE,
Max Reitzcc84d902013-09-06 17:14:26 +0200350 .err = NULL,
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800351 };
352
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800353 if (!drv->bdrv_create) {
Max Reitzcc84d902013-09-06 17:14:26 +0200354 error_setg(errp, "Driver '%s' does not support image creation", drv->format_name);
Luiz Capitulino80168bf2012-10-17 16:45:25 -0300355 ret = -ENOTSUP;
356 goto out;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800357 }
358
359 if (qemu_in_coroutine()) {
360 /* Fast-path if already in coroutine context */
361 bdrv_create_co_entry(&cco);
362 } else {
363 co = qemu_coroutine_create(bdrv_create_co_entry);
364 qemu_coroutine_enter(co, &cco);
365 while (cco.ret == NOT_DONE) {
Paolo Bonzinib47ec2c2014-07-07 15:18:01 +0200366 aio_poll(qemu_get_aio_context(), true);
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800367 }
368 }
369
370 ret = cco.ret;
Max Reitzcc84d902013-09-06 17:14:26 +0200371 if (ret < 0) {
Markus Armbruster84d18f02014-01-30 15:07:28 +0100372 if (cco.err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200373 error_propagate(errp, cco.err);
374 } else {
375 error_setg_errno(errp, -ret, "Could not create image");
376 }
377 }
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800378
Luiz Capitulino80168bf2012-10-17 16:45:25 -0300379out:
380 g_free(cco.filename);
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800381 return ret;
bellardea2384d2004-08-01 21:59:26 +0000382}
383
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800384int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200385{
386 BlockDriver *drv;
Max Reitzcc84d902013-09-06 17:14:26 +0200387 Error *local_err = NULL;
388 int ret;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200389
Max Reitzb65a5e12015-02-05 13:58:12 -0500390 drv = bdrv_find_protocol(filename, true, errp);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200391 if (drv == NULL) {
Stefan Hajnoczi16905d72010-11-30 15:14:14 +0000392 return -ENOENT;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200393 }
394
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800395 ret = bdrv_create(drv, filename, opts, &local_err);
Markus Armbruster84d18f02014-01-30 15:07:28 +0100396 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200397 error_propagate(errp, local_err);
398 }
399 return ret;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200400}
401
Ekaterina Tumanova892b7de2015-02-16 12:47:54 +0100402/**
403 * Try to get @bs's logical and physical block size.
404 * On success, store them in @bsz struct and return 0.
405 * On failure return -errno.
406 * @bs must not be empty.
407 */
408int bdrv_probe_blocksizes(BlockDriverState *bs, BlockSizes *bsz)
409{
410 BlockDriver *drv = bs->drv;
411
412 if (drv && drv->bdrv_probe_blocksizes) {
413 return drv->bdrv_probe_blocksizes(bs, bsz);
414 }
415
416 return -ENOTSUP;
417}
418
419/**
420 * Try to get @bs's geometry (cyls, heads, sectors).
421 * On success, store them in @geo struct and return 0.
422 * On failure return -errno.
423 * @bs must not be empty.
424 */
425int bdrv_probe_geometry(BlockDriverState *bs, HDGeometry *geo)
426{
427 BlockDriver *drv = bs->drv;
428
429 if (drv && drv->bdrv_probe_geometry) {
430 return drv->bdrv_probe_geometry(bs, geo);
431 }
432
433 return -ENOTSUP;
434}
435
Jim Meyeringeba25052012-05-28 09:27:54 +0200436/*
437 * Create a uniquely-named empty temporary file.
438 * Return 0 upon success, otherwise a negative errno value.
439 */
440int get_tmp_filename(char *filename, int size)
441{
bellardd5249392004-08-03 21:14:23 +0000442#ifdef _WIN32
bellard3b9f94e2007-01-07 17:27:07 +0000443 char temp_dir[MAX_PATH];
Jim Meyeringeba25052012-05-28 09:27:54 +0200444 /* GetTempFileName requires that its output buffer (4th param)
445 have length MAX_PATH or greater. */
446 assert(size >= MAX_PATH);
447 return (GetTempPath(MAX_PATH, temp_dir)
448 && GetTempFileName(temp_dir, "qem", 0, filename)
449 ? 0 : -GetLastError());
bellardd5249392004-08-03 21:14:23 +0000450#else
bellardea2384d2004-08-01 21:59:26 +0000451 int fd;
blueswir17ccfb2e2008-09-14 06:45:34 +0000452 const char *tmpdir;
aurel320badc1e2008-03-10 00:05:34 +0000453 tmpdir = getenv("TMPDIR");
Amit Shah69bef792014-02-26 15:12:37 +0530454 if (!tmpdir) {
455 tmpdir = "/var/tmp";
456 }
Jim Meyeringeba25052012-05-28 09:27:54 +0200457 if (snprintf(filename, size, "%s/vl.XXXXXX", tmpdir) >= size) {
458 return -EOVERFLOW;
459 }
bellardea2384d2004-08-01 21:59:26 +0000460 fd = mkstemp(filename);
Dunrong Huangfe235a02012-09-05 21:26:22 +0800461 if (fd < 0) {
462 return -errno;
463 }
464 if (close(fd) != 0) {
465 unlink(filename);
Jim Meyeringeba25052012-05-28 09:27:54 +0200466 return -errno;
467 }
468 return 0;
bellardd5249392004-08-03 21:14:23 +0000469#endif
Jim Meyeringeba25052012-05-28 09:27:54 +0200470}
bellardea2384d2004-08-01 21:59:26 +0000471
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200472/*
473 * Detect host devices. By convention, /dev/cdrom[N] is always
474 * recognized as a host CDROM.
475 */
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200476static BlockDriver *find_hdev_driver(const char *filename)
477{
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200478 int score_max = 0, score;
479 BlockDriver *drv = NULL, *d;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200480
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100481 QLIST_FOREACH(d, &bdrv_drivers, list) {
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200482 if (d->bdrv_probe_device) {
483 score = d->bdrv_probe_device(filename);
484 if (score > score_max) {
485 score_max = score;
486 drv = d;
487 }
488 }
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200489 }
490
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200491 return drv;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200492}
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200493
Kevin Wolf98289622013-07-10 15:47:39 +0200494BlockDriver *bdrv_find_protocol(const char *filename,
Max Reitzb65a5e12015-02-05 13:58:12 -0500495 bool allow_protocol_prefix,
496 Error **errp)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200497{
498 BlockDriver *drv1;
499 char protocol[128];
500 int len;
501 const char *p;
502
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200503 /* TODO Drivers without bdrv_file_open must be specified explicitly */
504
Christoph Hellwig39508e72010-06-23 12:25:17 +0200505 /*
506 * XXX(hch): we really should not let host device detection
507 * override an explicit protocol specification, but moving this
508 * later breaks access to device names with colons in them.
509 * Thanks to the brain-dead persistent naming schemes on udev-
510 * based Linux systems those actually are quite common.
511 */
512 drv1 = find_hdev_driver(filename);
513 if (drv1) {
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200514 return drv1;
515 }
Christoph Hellwig39508e72010-06-23 12:25:17 +0200516
Kevin Wolf98289622013-07-10 15:47:39 +0200517 if (!path_has_protocol(filename) || !allow_protocol_prefix) {
Max Reitzef810432014-12-02 18:32:42 +0100518 return &bdrv_file;
Christoph Hellwig39508e72010-06-23 12:25:17 +0200519 }
Kevin Wolf98289622013-07-10 15:47:39 +0200520
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000521 p = strchr(filename, ':');
522 assert(p != NULL);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200523 len = p - filename;
524 if (len > sizeof(protocol) - 1)
525 len = sizeof(protocol) - 1;
526 memcpy(protocol, filename, len);
527 protocol[len] = '\0';
528 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
529 if (drv1->protocol_name &&
530 !strcmp(drv1->protocol_name, protocol)) {
531 return drv1;
532 }
533 }
Max Reitzb65a5e12015-02-05 13:58:12 -0500534
535 error_setg(errp, "Unknown protocol '%s'", protocol);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200536 return NULL;
537}
538
Markus Armbrusterc6684242014-11-20 16:27:10 +0100539/*
540 * Guess image format by probing its contents.
541 * This is not a good idea when your image is raw (CVE-2008-2004), but
542 * we do it anyway for backward compatibility.
543 *
544 * @buf contains the image's first @buf_size bytes.
Kevin Wolf7cddd372014-11-20 16:27:11 +0100545 * @buf_size is the buffer size in bytes (generally BLOCK_PROBE_BUF_SIZE,
546 * but can be smaller if the image file is smaller)
Markus Armbrusterc6684242014-11-20 16:27:10 +0100547 * @filename is its filename.
548 *
549 * For all block drivers, call the bdrv_probe() method to get its
550 * probing score.
551 * Return the first block driver with the highest probing score.
552 */
Kevin Wolf38f3ef52014-11-20 16:27:12 +0100553BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size,
554 const char *filename)
Markus Armbrusterc6684242014-11-20 16:27:10 +0100555{
556 int score_max = 0, score;
557 BlockDriver *drv = NULL, *d;
558
559 QLIST_FOREACH(d, &bdrv_drivers, list) {
560 if (d->bdrv_probe) {
561 score = d->bdrv_probe(buf, buf_size, filename);
562 if (score > score_max) {
563 score_max = score;
564 drv = d;
565 }
566 }
567 }
568
569 return drv;
570}
571
Kevin Wolff500a6d2012-11-12 17:35:27 +0100572static int find_image_format(BlockDriverState *bs, const char *filename,
Max Reitz34b5d2c2013-09-05 14:45:29 +0200573 BlockDriver **pdrv, Error **errp)
bellardea2384d2004-08-01 21:59:26 +0000574{
Markus Armbrusterc6684242014-11-20 16:27:10 +0100575 BlockDriver *drv;
Kevin Wolf7cddd372014-11-20 16:27:11 +0100576 uint8_t buf[BLOCK_PROBE_BUF_SIZE];
Kevin Wolff500a6d2012-11-12 17:35:27 +0100577 int ret = 0;
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700578
Kevin Wolf08a00552010-06-01 18:37:31 +0200579 /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
Paolo Bonzini8e895592013-01-10 15:39:27 +0100580 if (bs->sg || !bdrv_is_inserted(bs) || bdrv_getlength(bs) == 0) {
Max Reitzef810432014-12-02 18:32:42 +0100581 *pdrv = &bdrv_raw;
Stefan Weilc98ac352010-07-21 21:51:51 +0200582 return ret;
Nicholas A. Bellinger1a396852010-05-27 08:56:28 -0700583 }
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700584
bellard83f64092006-08-01 16:21:11 +0000585 ret = bdrv_pread(bs, 0, buf, sizeof(buf));
bellard83f64092006-08-01 16:21:11 +0000586 if (ret < 0) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200587 error_setg_errno(errp, -ret, "Could not read image for determining its "
588 "format");
Stefan Weilc98ac352010-07-21 21:51:51 +0200589 *pdrv = NULL;
590 return ret;
bellard83f64092006-08-01 16:21:11 +0000591 }
592
Markus Armbrusterc6684242014-11-20 16:27:10 +0100593 drv = bdrv_probe_all(buf, ret, filename);
Stefan Weilc98ac352010-07-21 21:51:51 +0200594 if (!drv) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200595 error_setg(errp, "Could not determine image format: No compatible "
596 "driver found");
Stefan Weilc98ac352010-07-21 21:51:51 +0200597 ret = -ENOENT;
598 }
599 *pdrv = drv;
600 return ret;
bellardea2384d2004-08-01 21:59:26 +0000601}
602
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100603/**
604 * Set the current 'total_sectors' value
Markus Armbruster65a9bb22014-06-26 13:23:17 +0200605 * Return 0 on success, -errno on error.
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100606 */
607static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
608{
609 BlockDriver *drv = bs->drv;
610
Nicholas Bellinger396759a2010-05-17 09:46:04 -0700611 /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
612 if (bs->sg)
613 return 0;
614
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100615 /* query actual device if possible, otherwise just trust the hint */
616 if (drv->bdrv_getlength) {
617 int64_t length = drv->bdrv_getlength(bs);
618 if (length < 0) {
619 return length;
620 }
Fam Zheng7e382002013-11-06 19:48:06 +0800621 hint = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE);
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100622 }
623
624 bs->total_sectors = hint;
625 return 0;
626}
627
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100628/**
Paolo Bonzini9e8f1832013-02-08 14:06:11 +0100629 * Set open flags for a given discard mode
630 *
631 * Return 0 on success, -1 if the discard mode was invalid.
632 */
633int bdrv_parse_discard_flags(const char *mode, int *flags)
634{
635 *flags &= ~BDRV_O_UNMAP;
636
637 if (!strcmp(mode, "off") || !strcmp(mode, "ignore")) {
638 /* do nothing */
639 } else if (!strcmp(mode, "on") || !strcmp(mode, "unmap")) {
640 *flags |= BDRV_O_UNMAP;
641 } else {
642 return -1;
643 }
644
645 return 0;
646}
647
648/**
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100649 * Set open flags for a given cache mode
650 *
651 * Return 0 on success, -1 if the cache mode was invalid.
652 */
653int bdrv_parse_cache_flags(const char *mode, int *flags)
654{
655 *flags &= ~BDRV_O_CACHE_MASK;
656
657 if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
658 *flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
Stefan Hajnoczi92196b22011-08-04 12:26:52 +0100659 } else if (!strcmp(mode, "directsync")) {
660 *flags |= BDRV_O_NOCACHE;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100661 } else if (!strcmp(mode, "writeback")) {
662 *flags |= BDRV_O_CACHE_WB;
663 } else if (!strcmp(mode, "unsafe")) {
664 *flags |= BDRV_O_CACHE_WB;
665 *flags |= BDRV_O_NO_FLUSH;
666 } else if (!strcmp(mode, "writethrough")) {
667 /* this is the default */
668 } else {
669 return -1;
670 }
671
672 return 0;
673}
674
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200675/*
Kevin Wolfb1e6fc02014-05-06 12:11:42 +0200676 * Returns the flags that a temporary snapshot should get, based on the
677 * originally requested flags (the originally requested image will have flags
678 * like a backing file)
679 */
680static int bdrv_temp_snapshot_flags(int flags)
681{
682 return (flags & ~BDRV_O_SNAPSHOT) | BDRV_O_TEMPORARY;
683}
684
685/*
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200686 * Returns the flags that bs->file should get, based on the given flags for
687 * the parent BDS
688 */
689static int bdrv_inherited_flags(int flags)
690{
691 /* Enable protocol handling, disable format probing for bs->file */
692 flags |= BDRV_O_PROTOCOL;
693
694 /* Our block drivers take care to send flushes and respect unmap policy,
695 * so we can enable both unconditionally on lower layers. */
696 flags |= BDRV_O_CACHE_WB | BDRV_O_UNMAP;
697
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200698 /* Clear flags that only apply to the top layer */
Kevin Wolf5669b442014-04-11 21:36:45 +0200699 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ);
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200700
701 return flags;
702}
703
Kevin Wolf317fc442014-04-25 13:27:34 +0200704/*
705 * Returns the flags that bs->backing_hd should get, based on the given flags
706 * for the parent BDS
707 */
708static int bdrv_backing_flags(int flags)
709{
710 /* backing files always opened read-only */
711 flags &= ~(BDRV_O_RDWR | BDRV_O_COPY_ON_READ);
712
713 /* snapshot=on is handled on the top layer */
Kevin Wolf8bfea152014-04-11 19:16:36 +0200714 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_TEMPORARY);
Kevin Wolf317fc442014-04-25 13:27:34 +0200715
716 return flags;
717}
718
Kevin Wolf7b272452012-11-12 17:05:39 +0100719static int bdrv_open_flags(BlockDriverState *bs, int flags)
720{
721 int open_flags = flags | BDRV_O_CACHE_WB;
722
723 /*
724 * Clear flags that are internal to the block layer before opening the
725 * image.
726 */
Kevin Wolf20cca272014-06-04 14:33:27 +0200727 open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_PROTOCOL);
Kevin Wolf7b272452012-11-12 17:05:39 +0100728
729 /*
730 * Snapshots should be writable.
731 */
Kevin Wolf8bfea152014-04-11 19:16:36 +0200732 if (flags & BDRV_O_TEMPORARY) {
Kevin Wolf7b272452012-11-12 17:05:39 +0100733 open_flags |= BDRV_O_RDWR;
734 }
735
736 return open_flags;
737}
738
Kevin Wolf636ea372014-01-24 14:11:52 +0100739static void bdrv_assign_node_name(BlockDriverState *bs,
740 const char *node_name,
741 Error **errp)
Benoît Canet6913c0c2014-01-23 21:31:33 +0100742{
743 if (!node_name) {
Kevin Wolf636ea372014-01-24 14:11:52 +0100744 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100745 }
746
Kevin Wolf9aebf3b2014-09-25 09:54:02 +0200747 /* Check for empty string or invalid characters */
Markus Armbrusterf5bebbb2014-09-30 13:59:30 +0200748 if (!id_wellformed(node_name)) {
Kevin Wolf9aebf3b2014-09-25 09:54:02 +0200749 error_setg(errp, "Invalid node name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100750 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100751 }
752
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100753 /* takes care of avoiding namespaces collisions */
Markus Armbruster7f06d472014-10-07 13:59:12 +0200754 if (blk_by_name(node_name)) {
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100755 error_setg(errp, "node-name=%s is conflicting with a device id",
756 node_name);
Kevin Wolf636ea372014-01-24 14:11:52 +0100757 return;
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100758 }
759
Benoît Canet6913c0c2014-01-23 21:31:33 +0100760 /* takes care of avoiding duplicates node names */
761 if (bdrv_find_node(node_name)) {
762 error_setg(errp, "Duplicate node name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100763 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100764 }
765
766 /* copy node name into the bs and insert it into the graph list */
767 pstrcpy(bs->node_name, sizeof(bs->node_name), node_name);
768 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs, node_list);
Benoît Canet6913c0c2014-01-23 21:31:33 +0100769}
770
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200771/*
Kevin Wolf57915332010-04-14 15:24:50 +0200772 * Common part for opening disk images and files
Kevin Wolfb6ad4912013-03-15 10:35:04 +0100773 *
774 * Removes all processed options from *options.
Kevin Wolf57915332010-04-14 15:24:50 +0200775 */
Kevin Wolff500a6d2012-11-12 17:35:27 +0100776static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
Max Reitz34b5d2c2013-09-05 14:45:29 +0200777 QDict *options, int flags, BlockDriver *drv, Error **errp)
Kevin Wolf57915332010-04-14 15:24:50 +0200778{
779 int ret, open_flags;
Kevin Wolf035fccd2013-04-09 14:34:19 +0200780 const char *filename;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100781 const char *node_name = NULL;
Max Reitz34b5d2c2013-09-05 14:45:29 +0200782 Error *local_err = NULL;
Kevin Wolf57915332010-04-14 15:24:50 +0200783
784 assert(drv != NULL);
Paolo Bonzini64058752012-05-08 16:51:49 +0200785 assert(bs->file == NULL);
Kevin Wolf707ff822013-03-06 12:20:31 +0100786 assert(options != NULL && bs->options != options);
Kevin Wolf57915332010-04-14 15:24:50 +0200787
Kevin Wolf45673672013-04-22 17:48:40 +0200788 if (file != NULL) {
789 filename = file->filename;
790 } else {
791 filename = qdict_get_try_str(options, "filename");
792 }
793
Kevin Wolf765003d2014-02-03 14:49:42 +0100794 if (drv->bdrv_needs_filename && !filename) {
795 error_setg(errp, "The '%s' block driver requires a file name",
796 drv->format_name);
797 return -EINVAL;
798 }
799
Kevin Wolf45673672013-04-22 17:48:40 +0200800 trace_bdrv_open_common(bs, filename ?: "", flags, drv->format_name);
Stefan Hajnoczi28dcee12011-09-22 20:14:12 +0100801
Benoît Canet6913c0c2014-01-23 21:31:33 +0100802 node_name = qdict_get_try_str(options, "node-name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100803 bdrv_assign_node_name(bs, node_name, &local_err);
Markus Armbruster0fb63952014-04-25 16:50:31 +0200804 if (local_err) {
Kevin Wolf636ea372014-01-24 14:11:52 +0100805 error_propagate(errp, local_err);
806 return -EINVAL;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100807 }
808 qdict_del(options, "node-name");
809
Kevin Wolf5d186eb2013-03-27 17:28:18 +0100810 /* bdrv_open() with directly using a protocol as drv. This layer is already
811 * opened, so assign it to bs (while file becomes a closed BlockDriverState)
812 * and return immediately. */
813 if (file != NULL && drv->bdrv_file_open) {
814 bdrv_swap(file, bs);
815 return 0;
816 }
817
Kevin Wolf57915332010-04-14 15:24:50 +0200818 bs->open_flags = flags;
Paolo Bonzini1b7fd722011-11-29 11:35:47 +0100819 bs->guest_block_size = 512;
Paolo Bonzinic25f53b2011-11-29 12:42:20 +0100820 bs->request_alignment = 512;
Asias He0d51b4d2013-08-22 15:24:14 +0800821 bs->zero_beyond_eof = true;
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800822 open_flags = bdrv_open_flags(bs, flags);
823 bs->read_only = !(open_flags & BDRV_O_RDWR);
824
825 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, bs->read_only)) {
Kevin Wolf8f94a6e2013-10-10 11:45:55 +0200826 error_setg(errp,
827 !bs->read_only && bdrv_is_whitelisted(drv, true)
828 ? "Driver '%s' can only be used for read-only devices"
829 : "Driver '%s' is not whitelisted",
830 drv->format_name);
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800831 return -ENOTSUP;
832 }
Kevin Wolf57915332010-04-14 15:24:50 +0200833
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000834 assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */
Kevin Wolf0ebd24e2013-09-19 15:12:18 +0200835 if (flags & BDRV_O_COPY_ON_READ) {
836 if (!bs->read_only) {
837 bdrv_enable_copy_on_read(bs);
838 } else {
839 error_setg(errp, "Can't use copy-on-read on read-only device");
840 return -EINVAL;
841 }
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000842 }
843
Kevin Wolfc2ad1b02013-03-18 16:40:51 +0100844 if (filename != NULL) {
845 pstrcpy(bs->filename, sizeof(bs->filename), filename);
846 } else {
847 bs->filename[0] = '\0';
848 }
Max Reitz91af7012014-07-18 20:24:56 +0200849 pstrcpy(bs->exact_filename, sizeof(bs->exact_filename), bs->filename);
Kevin Wolf57915332010-04-14 15:24:50 +0200850
Kevin Wolf57915332010-04-14 15:24:50 +0200851 bs->drv = drv;
Anthony Liguori7267c092011-08-20 22:09:37 -0500852 bs->opaque = g_malloc0(drv->instance_size);
Kevin Wolf57915332010-04-14 15:24:50 +0200853
Stefan Hajnoczi03f541b2011-10-27 10:54:28 +0100854 bs->enable_write_cache = !!(flags & BDRV_O_CACHE_WB);
Stefan Hajnoczie7c63792011-10-27 10:54:27 +0100855
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200856 /* Open the image, either directly or using a protocol */
857 if (drv->bdrv_file_open) {
Kevin Wolf5d186eb2013-03-27 17:28:18 +0100858 assert(file == NULL);
Benoît Canet030be322013-09-24 17:07:04 +0200859 assert(!drv->bdrv_needs_filename || filename != NULL);
Max Reitz34b5d2c2013-09-05 14:45:29 +0200860 ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
Kevin Wolff500a6d2012-11-12 17:35:27 +0100861 } else {
Kevin Wolf2af5ef72013-04-09 13:19:18 +0200862 if (file == NULL) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200863 error_setg(errp, "Can't use '%s' as a block driver for the "
864 "protocol level", drv->format_name);
Kevin Wolf2af5ef72013-04-09 13:19:18 +0200865 ret = -EINVAL;
866 goto free_and_fail;
867 }
Kevin Wolff500a6d2012-11-12 17:35:27 +0100868 bs->file = file;
Max Reitz34b5d2c2013-09-05 14:45:29 +0200869 ret = drv->bdrv_open(bs, options, open_flags, &local_err);
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200870 }
871
Kevin Wolf57915332010-04-14 15:24:50 +0200872 if (ret < 0) {
Markus Armbruster84d18f02014-01-30 15:07:28 +0100873 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200874 error_propagate(errp, local_err);
Dunrong Huang2fa9aa52013-09-24 18:14:01 +0800875 } else if (bs->filename[0]) {
876 error_setg_errno(errp, -ret, "Could not open '%s'", bs->filename);
Max Reitz34b5d2c2013-09-05 14:45:29 +0200877 } else {
878 error_setg_errno(errp, -ret, "Could not open image");
879 }
Kevin Wolf57915332010-04-14 15:24:50 +0200880 goto free_and_fail;
881 }
882
Markus Armbrustera1f688f2015-03-13 21:09:40 +0100883 if (bs->encrypted) {
884 error_report("Encrypted images are deprecated");
885 error_printf("Support for them will be removed in a future release.\n"
886 "You can use 'qemu-img convert' to convert your image"
887 " to an unencrypted one.\n");
888 }
889
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100890 ret = refresh_total_sectors(bs, bs->total_sectors);
891 if (ret < 0) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200892 error_setg_errno(errp, -ret, "Could not refresh total sector count");
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100893 goto free_and_fail;
Kevin Wolf57915332010-04-14 15:24:50 +0200894 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100895
Kevin Wolf3baca892014-07-16 17:48:16 +0200896 bdrv_refresh_limits(bs, &local_err);
897 if (local_err) {
898 error_propagate(errp, local_err);
899 ret = -EINVAL;
900 goto free_and_fail;
901 }
902
Paolo Bonzinic25f53b2011-11-29 12:42:20 +0100903 assert(bdrv_opt_mem_align(bs) != 0);
Denis V. Lunev4196d2f2015-05-12 17:30:55 +0300904 assert(bdrv_min_mem_align(bs) != 0);
Kevin Wolf47ea2de2014-03-05 15:49:55 +0100905 assert((bs->request_alignment != 0) || bs->sg);
Kevin Wolf57915332010-04-14 15:24:50 +0200906 return 0;
907
908free_and_fail:
Kevin Wolff500a6d2012-11-12 17:35:27 +0100909 bs->file = NULL;
Anthony Liguori7267c092011-08-20 22:09:37 -0500910 g_free(bs->opaque);
Kevin Wolf57915332010-04-14 15:24:50 +0200911 bs->opaque = NULL;
912 bs->drv = NULL;
913 return ret;
914}
915
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200916static QDict *parse_json_filename(const char *filename, Error **errp)
917{
918 QObject *options_obj;
919 QDict *options;
920 int ret;
921
922 ret = strstart(filename, "json:", &filename);
923 assert(ret);
924
925 options_obj = qobject_from_json(filename);
926 if (!options_obj) {
927 error_setg(errp, "Could not parse the JSON options");
928 return NULL;
929 }
930
931 if (qobject_type(options_obj) != QTYPE_QDICT) {
932 qobject_decref(options_obj);
933 error_setg(errp, "Invalid JSON object given");
934 return NULL;
935 }
936
937 options = qobject_to_qdict(options_obj);
938 qdict_flatten(options);
939
940 return options;
941}
942
Kevin Wolf57915332010-04-14 15:24:50 +0200943/*
Kevin Wolff54120f2014-05-26 11:09:59 +0200944 * Fills in default options for opening images and converts the legacy
945 * filename/flags pair to option QDict entries.
946 */
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200947static int bdrv_fill_options(QDict **options, const char **pfilename, int flags,
Kevin Wolf17b005f2014-05-27 10:50:29 +0200948 BlockDriver *drv, Error **errp)
Kevin Wolff54120f2014-05-26 11:09:59 +0200949{
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200950 const char *filename = *pfilename;
Kevin Wolff54120f2014-05-26 11:09:59 +0200951 const char *drvname;
Kevin Wolf462f5bc2014-05-26 11:39:55 +0200952 bool protocol = flags & BDRV_O_PROTOCOL;
Kevin Wolff54120f2014-05-26 11:09:59 +0200953 bool parse_filename = false;
954 Error *local_err = NULL;
Kevin Wolff54120f2014-05-26 11:09:59 +0200955
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200956 /* Parse json: pseudo-protocol */
957 if (filename && g_str_has_prefix(filename, "json:")) {
958 QDict *json_options = parse_json_filename(filename, &local_err);
959 if (local_err) {
960 error_propagate(errp, local_err);
961 return -EINVAL;
962 }
963
964 /* Options given in the filename have lower priority than options
965 * specified directly */
966 qdict_join(*options, json_options, false);
967 QDECREF(json_options);
968 *pfilename = filename = NULL;
969 }
970
Kevin Wolff54120f2014-05-26 11:09:59 +0200971 /* Fetch the file name from the options QDict if necessary */
Kevin Wolf17b005f2014-05-27 10:50:29 +0200972 if (protocol && filename) {
Kevin Wolff54120f2014-05-26 11:09:59 +0200973 if (!qdict_haskey(*options, "filename")) {
974 qdict_put(*options, "filename", qstring_from_str(filename));
975 parse_filename = true;
976 } else {
977 error_setg(errp, "Can't specify 'file' and 'filename' options at "
978 "the same time");
979 return -EINVAL;
980 }
981 }
982
983 /* Find the right block driver */
984 filename = qdict_get_try_str(*options, "filename");
985 drvname = qdict_get_try_str(*options, "driver");
986
Kevin Wolf17b005f2014-05-27 10:50:29 +0200987 if (drv) {
988 if (drvname) {
989 error_setg(errp, "Driver specified twice");
990 return -EINVAL;
991 }
992 drvname = drv->format_name;
993 qdict_put(*options, "driver", qstring_from_str(drvname));
994 } else {
995 if (!drvname && protocol) {
996 if (filename) {
Max Reitzb65a5e12015-02-05 13:58:12 -0500997 drv = bdrv_find_protocol(filename, parse_filename, errp);
Kevin Wolf17b005f2014-05-27 10:50:29 +0200998 if (!drv) {
Kevin Wolf17b005f2014-05-27 10:50:29 +0200999 return -EINVAL;
1000 }
1001
1002 drvname = drv->format_name;
1003 qdict_put(*options, "driver", qstring_from_str(drvname));
1004 } else {
1005 error_setg(errp, "Must specify either driver or file");
Kevin Wolff54120f2014-05-26 11:09:59 +02001006 return -EINVAL;
1007 }
Kevin Wolf17b005f2014-05-27 10:50:29 +02001008 } else if (drvname) {
1009 drv = bdrv_find_format(drvname);
1010 if (!drv) {
1011 error_setg(errp, "Unknown driver '%s'", drvname);
1012 return -ENOENT;
1013 }
Kevin Wolff54120f2014-05-26 11:09:59 +02001014 }
1015 }
1016
Kevin Wolf17b005f2014-05-27 10:50:29 +02001017 assert(drv || !protocol);
Kevin Wolff54120f2014-05-26 11:09:59 +02001018
1019 /* Driver-specific filename parsing */
Kevin Wolf17b005f2014-05-27 10:50:29 +02001020 if (drv && drv->bdrv_parse_filename && parse_filename) {
Kevin Wolff54120f2014-05-26 11:09:59 +02001021 drv->bdrv_parse_filename(filename, *options, &local_err);
1022 if (local_err) {
1023 error_propagate(errp, local_err);
1024 return -EINVAL;
1025 }
1026
1027 if (!drv->bdrv_needs_filename) {
1028 qdict_del(*options, "filename");
1029 }
1030 }
1031
1032 return 0;
1033}
1034
Fam Zheng8d24cce2014-05-23 21:29:45 +08001035void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd)
1036{
1037
Fam Zheng826b6ca2014-05-23 21:29:47 +08001038 if (bs->backing_hd) {
1039 assert(bs->backing_blocker);
1040 bdrv_op_unblock_all(bs->backing_hd, bs->backing_blocker);
1041 } else if (backing_hd) {
1042 error_setg(&bs->backing_blocker,
Alberto Garcia81e5f782015-04-08 12:29:19 +03001043 "node is used as backing hd of '%s'",
1044 bdrv_get_device_or_node_name(bs));
Fam Zheng826b6ca2014-05-23 21:29:47 +08001045 }
1046
Fam Zheng8d24cce2014-05-23 21:29:45 +08001047 bs->backing_hd = backing_hd;
1048 if (!backing_hd) {
Fam Zheng826b6ca2014-05-23 21:29:47 +08001049 error_free(bs->backing_blocker);
1050 bs->backing_blocker = NULL;
Fam Zheng8d24cce2014-05-23 21:29:45 +08001051 goto out;
1052 }
1053 bs->open_flags &= ~BDRV_O_NO_BACKING;
1054 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filename);
1055 pstrcpy(bs->backing_format, sizeof(bs->backing_format),
1056 backing_hd->drv ? backing_hd->drv->format_name : "");
Fam Zheng826b6ca2014-05-23 21:29:47 +08001057
1058 bdrv_op_block_all(bs->backing_hd, bs->backing_blocker);
1059 /* Otherwise we won't be able to commit due to check in bdrv_commit */
Fam Zhengbb000212014-09-11 13:14:00 +08001060 bdrv_op_unblock(bs->backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET,
Fam Zheng826b6ca2014-05-23 21:29:47 +08001061 bs->backing_blocker);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001062out:
Kevin Wolf3baca892014-07-16 17:48:16 +02001063 bdrv_refresh_limits(bs, NULL);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001064}
1065
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001066/*
1067 * Opens the backing file for a BlockDriverState if not yet open
1068 *
1069 * options is a QDict of options to pass to the block drivers, or NULL for an
1070 * empty set of options. The reference to the QDict is transferred to this
1071 * function (even on failure), so if the caller intends to reuse the dictionary,
1072 * it needs to use QINCREF() before calling bdrv_file_open.
1073 */
Max Reitz34b5d2c2013-09-05 14:45:29 +02001074int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
Paolo Bonzini9156df12012-10-18 16:49:17 +02001075{
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001076 char *backing_filename = g_malloc0(PATH_MAX);
Kevin Wolf317fc442014-04-25 13:27:34 +02001077 int ret = 0;
Fam Zheng8d24cce2014-05-23 21:29:45 +08001078 BlockDriverState *backing_hd;
Max Reitz34b5d2c2013-09-05 14:45:29 +02001079 Error *local_err = NULL;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001080
1081 if (bs->backing_hd != NULL) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001082 QDECREF(options);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001083 goto free_exit;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001084 }
1085
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001086 /* NULL means an empty set of options */
1087 if (options == NULL) {
1088 options = qdict_new();
1089 }
1090
Paolo Bonzini9156df12012-10-18 16:49:17 +02001091 bs->open_flags &= ~BDRV_O_NO_BACKING;
Kevin Wolf1cb6f502013-04-12 20:27:07 +02001092 if (qdict_haskey(options, "file.filename")) {
1093 backing_filename[0] = '\0';
1094 } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001095 QDECREF(options);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001096 goto free_exit;
Fam Zhengdbecebd2013-09-22 20:05:06 +08001097 } else {
Max Reitz9f074292014-11-26 17:20:26 +01001098 bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX,
1099 &local_err);
1100 if (local_err) {
1101 ret = -EINVAL;
1102 error_propagate(errp, local_err);
1103 QDECREF(options);
1104 goto free_exit;
1105 }
Paolo Bonzini9156df12012-10-18 16:49:17 +02001106 }
1107
Kevin Wolf8ee79e72014-06-04 15:09:35 +02001108 if (!bs->drv || !bs->drv->supports_backing) {
1109 ret = -EINVAL;
1110 error_setg(errp, "Driver doesn't support backing files");
1111 QDECREF(options);
1112 goto free_exit;
1113 }
1114
Markus Armbrustere4e99862014-10-07 13:59:03 +02001115 backing_hd = bdrv_new();
Fam Zheng8d24cce2014-05-23 21:29:45 +08001116
Kevin Wolfc5f6e492014-11-25 18:12:42 +01001117 if (bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
1118 qdict_put(options, "driver", qstring_from_str(bs->backing_format));
Paolo Bonzini9156df12012-10-18 16:49:17 +02001119 }
1120
Max Reitzf67503e2014-02-18 18:33:05 +01001121 assert(bs->backing_hd == NULL);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001122 ret = bdrv_open(&backing_hd,
Max Reitzddf56362014-02-18 18:33:06 +01001123 *backing_filename ? backing_filename : NULL, NULL, options,
Kevin Wolfc5f6e492014-11-25 18:12:42 +01001124 bdrv_backing_flags(bs->open_flags), NULL, &local_err);
Paolo Bonzini9156df12012-10-18 16:49:17 +02001125 if (ret < 0) {
Fam Zheng8d24cce2014-05-23 21:29:45 +08001126 bdrv_unref(backing_hd);
1127 backing_hd = NULL;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001128 bs->open_flags |= BDRV_O_NO_BACKING;
Fam Zhengb04b6b62013-11-08 11:26:49 +08001129 error_setg(errp, "Could not open backing file: %s",
1130 error_get_pretty(local_err));
1131 error_free(local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001132 goto free_exit;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001133 }
Fam Zheng8d24cce2014-05-23 21:29:45 +08001134 bdrv_set_backing_hd(bs, backing_hd);
Peter Feinerd80ac652014-01-08 19:43:25 +00001135
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001136free_exit:
1137 g_free(backing_filename);
1138 return ret;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001139}
1140
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001141/*
Max Reitzda557aa2013-12-20 19:28:11 +01001142 * Opens a disk image whose options are given as BlockdevRef in another block
1143 * device's options.
1144 *
Max Reitzda557aa2013-12-20 19:28:11 +01001145 * If allow_none is true, no image will be opened if filename is false and no
1146 * BlockdevRef is given. *pbs will remain unchanged and 0 will be returned.
1147 *
1148 * bdrev_key specifies the key for the image's BlockdevRef in the options QDict.
1149 * That QDict has to be flattened; therefore, if the BlockdevRef is a QDict
1150 * itself, all options starting with "${bdref_key}." are considered part of the
1151 * BlockdevRef.
1152 *
1153 * The BlockdevRef will be removed from the options QDict.
Max Reitzf67503e2014-02-18 18:33:05 +01001154 *
1155 * To conform with the behavior of bdrv_open(), *pbs has to be NULL.
Max Reitzda557aa2013-12-20 19:28:11 +01001156 */
1157int bdrv_open_image(BlockDriverState **pbs, const char *filename,
1158 QDict *options, const char *bdref_key, int flags,
Max Reitzf7d9fd82014-02-18 18:33:12 +01001159 bool allow_none, Error **errp)
Max Reitzda557aa2013-12-20 19:28:11 +01001160{
1161 QDict *image_options;
1162 int ret;
1163 char *bdref_key_dot;
1164 const char *reference;
1165
Max Reitzf67503e2014-02-18 18:33:05 +01001166 assert(pbs);
1167 assert(*pbs == NULL);
1168
Max Reitzda557aa2013-12-20 19:28:11 +01001169 bdref_key_dot = g_strdup_printf("%s.", bdref_key);
1170 qdict_extract_subqdict(options, &image_options, bdref_key_dot);
1171 g_free(bdref_key_dot);
1172
1173 reference = qdict_get_try_str(options, bdref_key);
1174 if (!filename && !reference && !qdict_size(image_options)) {
1175 if (allow_none) {
1176 ret = 0;
1177 } else {
1178 error_setg(errp, "A block device must be specified for \"%s\"",
1179 bdref_key);
1180 ret = -EINVAL;
1181 }
Markus Armbrusterb20e61e2014-05-28 11:16:57 +02001182 QDECREF(image_options);
Max Reitzda557aa2013-12-20 19:28:11 +01001183 goto done;
1184 }
1185
Max Reitzf7d9fd82014-02-18 18:33:12 +01001186 ret = bdrv_open(pbs, filename, reference, image_options, flags, NULL, errp);
Max Reitzda557aa2013-12-20 19:28:11 +01001187
1188done:
1189 qdict_del(options, bdref_key);
1190 return ret;
1191}
1192
Chen Gang6b8aeca2014-06-23 23:28:23 +08001193int bdrv_append_temp_snapshot(BlockDriverState *bs, int flags, Error **errp)
Kevin Wolfb9988752014-04-03 12:09:34 +02001194{
1195 /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001196 char *tmp_filename = g_malloc0(PATH_MAX + 1);
Kevin Wolfb9988752014-04-03 12:09:34 +02001197 int64_t total_size;
Chunyan Liu83d05212014-06-05 17:20:51 +08001198 QemuOpts *opts = NULL;
Kevin Wolfb9988752014-04-03 12:09:34 +02001199 QDict *snapshot_options;
1200 BlockDriverState *bs_snapshot;
1201 Error *local_err;
1202 int ret;
1203
1204 /* if snapshot, we create a temporary backing file and open it
1205 instead of opening 'filename' directly */
1206
1207 /* Get the required size from the image */
Kevin Wolff1877432014-04-04 17:07:19 +02001208 total_size = bdrv_getlength(bs);
1209 if (total_size < 0) {
Chen Gang6b8aeca2014-06-23 23:28:23 +08001210 ret = total_size;
Kevin Wolff1877432014-04-04 17:07:19 +02001211 error_setg_errno(errp, -total_size, "Could not get image size");
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001212 goto out;
Kevin Wolff1877432014-04-04 17:07:19 +02001213 }
Kevin Wolfb9988752014-04-03 12:09:34 +02001214
1215 /* Create the temporary image */
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001216 ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
Kevin Wolfb9988752014-04-03 12:09:34 +02001217 if (ret < 0) {
1218 error_setg_errno(errp, -ret, "Could not get temporary filename");
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001219 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001220 }
1221
Max Reitzef810432014-12-02 18:32:42 +01001222 opts = qemu_opts_create(bdrv_qcow2.create_opts, NULL, 0,
Chunyan Liuc282e1f2014-06-05 17:21:11 +08001223 &error_abort);
Markus Armbruster39101f22015-02-12 16:46:36 +01001224 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size, &error_abort);
Max Reitzef810432014-12-02 18:32:42 +01001225 ret = bdrv_create(&bdrv_qcow2, tmp_filename, opts, &local_err);
Chunyan Liu83d05212014-06-05 17:20:51 +08001226 qemu_opts_del(opts);
Kevin Wolfb9988752014-04-03 12:09:34 +02001227 if (ret < 0) {
1228 error_setg_errno(errp, -ret, "Could not create temporary overlay "
1229 "'%s': %s", tmp_filename,
1230 error_get_pretty(local_err));
1231 error_free(local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001232 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001233 }
1234
1235 /* Prepare a new options QDict for the temporary file */
1236 snapshot_options = qdict_new();
1237 qdict_put(snapshot_options, "file.driver",
1238 qstring_from_str("file"));
1239 qdict_put(snapshot_options, "file.filename",
1240 qstring_from_str(tmp_filename));
1241
Markus Armbrustere4e99862014-10-07 13:59:03 +02001242 bs_snapshot = bdrv_new();
Kevin Wolfb9988752014-04-03 12:09:34 +02001243
1244 ret = bdrv_open(&bs_snapshot, NULL, NULL, snapshot_options,
Max Reitzef810432014-12-02 18:32:42 +01001245 flags, &bdrv_qcow2, &local_err);
Kevin Wolfb9988752014-04-03 12:09:34 +02001246 if (ret < 0) {
1247 error_propagate(errp, local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001248 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001249 }
1250
1251 bdrv_append(bs_snapshot, bs);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001252
1253out:
1254 g_free(tmp_filename);
Chen Gang6b8aeca2014-06-23 23:28:23 +08001255 return ret;
Kevin Wolfb9988752014-04-03 12:09:34 +02001256}
1257
Max Reitzda557aa2013-12-20 19:28:11 +01001258/*
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001259 * Opens a disk image (raw, qcow2, vmdk, ...)
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001260 *
1261 * options is a QDict of options to pass to the block drivers, or NULL for an
1262 * empty set of options. The reference to the QDict belongs to the block layer
1263 * after the call (even on failure), so if the caller intends to reuse the
1264 * dictionary, it needs to use QINCREF() before calling bdrv_open.
Max Reitzf67503e2014-02-18 18:33:05 +01001265 *
1266 * If *pbs is NULL, a new BDS will be created with a pointer to it stored there.
1267 * If it is not NULL, the referenced BDS will be reused.
Max Reitzddf56362014-02-18 18:33:06 +01001268 *
1269 * The reference parameter may be used to specify an existing block device which
1270 * should be opened. If specified, neither options nor a filename may be given,
1271 * nor can an existing BDS be reused (that is, *pbs has to be NULL).
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001272 */
Max Reitzddf56362014-02-18 18:33:06 +01001273int bdrv_open(BlockDriverState **pbs, const char *filename,
1274 const char *reference, QDict *options, int flags,
1275 BlockDriver *drv, Error **errp)
bellardea2384d2004-08-01 21:59:26 +00001276{
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001277 int ret;
Max Reitzf67503e2014-02-18 18:33:05 +01001278 BlockDriverState *file = NULL, *bs;
Kevin Wolf74fe54f2013-07-09 11:09:02 +02001279 const char *drvname;
Max Reitz34b5d2c2013-09-05 14:45:29 +02001280 Error *local_err = NULL;
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001281 int snapshot_flags = 0;
bellard712e7872005-04-28 21:09:32 +00001282
Max Reitzf67503e2014-02-18 18:33:05 +01001283 assert(pbs);
1284
Max Reitzddf56362014-02-18 18:33:06 +01001285 if (reference) {
1286 bool options_non_empty = options ? qdict_size(options) : false;
1287 QDECREF(options);
1288
1289 if (*pbs) {
1290 error_setg(errp, "Cannot reuse an existing BDS when referencing "
1291 "another block device");
1292 return -EINVAL;
1293 }
1294
1295 if (filename || options_non_empty) {
1296 error_setg(errp, "Cannot reference an existing block device with "
1297 "additional options or a new filename");
1298 return -EINVAL;
1299 }
1300
1301 bs = bdrv_lookup_bs(reference, reference, errp);
1302 if (!bs) {
1303 return -ENODEV;
1304 }
1305 bdrv_ref(bs);
1306 *pbs = bs;
1307 return 0;
1308 }
1309
Max Reitzf67503e2014-02-18 18:33:05 +01001310 if (*pbs) {
1311 bs = *pbs;
1312 } else {
Markus Armbrustere4e99862014-10-07 13:59:03 +02001313 bs = bdrv_new();
Max Reitzf67503e2014-02-18 18:33:05 +01001314 }
1315
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001316 /* NULL means an empty set of options */
1317 if (options == NULL) {
1318 options = qdict_new();
1319 }
1320
Kevin Wolf17b005f2014-05-27 10:50:29 +02001321 ret = bdrv_fill_options(&options, &filename, flags, drv, &local_err);
Kevin Wolf462f5bc2014-05-26 11:39:55 +02001322 if (local_err) {
1323 goto fail;
1324 }
1325
Kevin Wolf76c591b2014-06-04 14:19:44 +02001326 /* Find the right image format driver */
1327 drv = NULL;
1328 drvname = qdict_get_try_str(options, "driver");
1329 if (drvname) {
1330 drv = bdrv_find_format(drvname);
1331 qdict_del(options, "driver");
1332 if (!drv) {
1333 error_setg(errp, "Unknown driver: '%s'", drvname);
1334 ret = -EINVAL;
1335 goto fail;
1336 }
1337 }
1338
1339 assert(drvname || !(flags & BDRV_O_PROTOCOL));
1340 if (drv && !drv->bdrv_file_open) {
1341 /* If the user explicitly wants a format driver here, we'll need to add
1342 * another layer for the protocol in bs->file */
1343 flags &= ~BDRV_O_PROTOCOL;
1344 }
1345
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001346 bs->options = options;
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001347 options = qdict_clone_shallow(options);
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001348
Kevin Wolff4788ad2014-06-03 16:44:19 +02001349 /* Open image file without format layer */
1350 if ((flags & BDRV_O_PROTOCOL) == 0) {
1351 if (flags & BDRV_O_RDWR) {
1352 flags |= BDRV_O_ALLOW_RDWR;
1353 }
1354 if (flags & BDRV_O_SNAPSHOT) {
1355 snapshot_flags = bdrv_temp_snapshot_flags(flags);
1356 flags = bdrv_backing_flags(flags);
1357 }
1358
1359 assert(file == NULL);
1360 ret = bdrv_open_image(&file, filename, options, "file",
1361 bdrv_inherited_flags(flags),
1362 true, &local_err);
1363 if (ret < 0) {
Max Reitz5469a2a2014-02-18 18:33:10 +01001364 goto fail;
1365 }
1366 }
1367
Kevin Wolf76c591b2014-06-04 14:19:44 +02001368 /* Image format probing */
Kevin Wolf38f3ef52014-11-20 16:27:12 +01001369 bs->probed = !drv;
Kevin Wolf76c591b2014-06-04 14:19:44 +02001370 if (!drv && file) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001371 ret = find_image_format(file, filename, &drv, &local_err);
1372 if (ret < 0) {
Kevin Wolf8bfea152014-04-11 19:16:36 +02001373 goto fail;
Max Reitz2a05cbe2013-12-20 19:28:10 +01001374 }
Kevin Wolf76c591b2014-06-04 14:19:44 +02001375 } else if (!drv) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001376 error_setg(errp, "Must specify either driver or file");
1377 ret = -EINVAL;
Kevin Wolf8bfea152014-04-11 19:16:36 +02001378 goto fail;
Kevin Wolff500a6d2012-11-12 17:35:27 +01001379 }
1380
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001381 /* Open the image */
Max Reitz34b5d2c2013-09-05 14:45:29 +02001382 ret = bdrv_open_common(bs, file, options, flags, drv, &local_err);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001383 if (ret < 0) {
Kevin Wolf8bfea152014-04-11 19:16:36 +02001384 goto fail;
Christoph Hellwig69873072010-01-20 18:13:25 +01001385 }
1386
Max Reitz2a05cbe2013-12-20 19:28:10 +01001387 if (file && (bs->file != file)) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001388 bdrv_unref(file);
Kevin Wolff500a6d2012-11-12 17:35:27 +01001389 file = NULL;
1390 }
1391
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001392 /* If there is a backing file, use it */
Paolo Bonzini9156df12012-10-18 16:49:17 +02001393 if ((flags & BDRV_O_NO_BACKING) == 0) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001394 QDict *backing_options;
1395
Benoît Canet5726d872013-09-25 13:30:01 +02001396 qdict_extract_subqdict(options, &backing_options, "backing.");
Max Reitz34b5d2c2013-09-05 14:45:29 +02001397 ret = bdrv_open_backing_file(bs, backing_options, &local_err);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001398 if (ret < 0) {
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001399 goto close_and_fail;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001400 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001401 }
1402
Max Reitz91af7012014-07-18 20:24:56 +02001403 bdrv_refresh_filename(bs);
1404
Kevin Wolfb9988752014-04-03 12:09:34 +02001405 /* For snapshot=on, create a temporary qcow2 overlay. bs points to the
1406 * temporary snapshot afterwards. */
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001407 if (snapshot_flags) {
Chen Gang6b8aeca2014-06-23 23:28:23 +08001408 ret = bdrv_append_temp_snapshot(bs, snapshot_flags, &local_err);
Kevin Wolfb9988752014-04-03 12:09:34 +02001409 if (local_err) {
Kevin Wolfb9988752014-04-03 12:09:34 +02001410 goto close_and_fail;
1411 }
1412 }
1413
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001414 /* Check if any unknown options were used */
Max Reitz5acd9d82014-02-18 18:33:11 +01001415 if (options && (qdict_size(options) != 0)) {
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001416 const QDictEntry *entry = qdict_first(options);
Max Reitz5acd9d82014-02-18 18:33:11 +01001417 if (flags & BDRV_O_PROTOCOL) {
1418 error_setg(errp, "Block protocol '%s' doesn't support the option "
1419 "'%s'", drv->format_name, entry->key);
1420 } else {
1421 error_setg(errp, "Block format '%s' used by device '%s' doesn't "
1422 "support the option '%s'", drv->format_name,
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001423 bdrv_get_device_name(bs), entry->key);
Max Reitz5acd9d82014-02-18 18:33:11 +01001424 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001425
1426 ret = -EINVAL;
1427 goto close_and_fail;
1428 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001429
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001430 if (!bdrv_key_required(bs)) {
Markus Armbrustera7f53e22014-10-07 13:59:25 +02001431 if (bs->blk) {
1432 blk_dev_change_media_cb(bs->blk, true);
1433 }
Markus Armbrusterc3adb582014-03-14 09:22:48 +01001434 } else if (!runstate_check(RUN_STATE_PRELAUNCH)
1435 && !runstate_check(RUN_STATE_INMIGRATE)
1436 && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
1437 error_setg(errp,
1438 "Guest must be stopped for opening of encrypted image");
1439 ret = -EBUSY;
1440 goto close_and_fail;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001441 }
1442
Markus Armbrusterc3adb582014-03-14 09:22:48 +01001443 QDECREF(options);
Max Reitzf67503e2014-02-18 18:33:05 +01001444 *pbs = bs;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001445 return 0;
1446
Kevin Wolf8bfea152014-04-11 19:16:36 +02001447fail:
Kevin Wolff500a6d2012-11-12 17:35:27 +01001448 if (file != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001449 bdrv_unref(file);
Kevin Wolff500a6d2012-11-12 17:35:27 +01001450 }
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001451 QDECREF(bs->options);
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001452 QDECREF(options);
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001453 bs->options = NULL;
Max Reitzf67503e2014-02-18 18:33:05 +01001454 if (!*pbs) {
1455 /* If *pbs is NULL, a new BDS has been created in this function and
1456 needs to be freed now. Otherwise, it does not need to be closed,
1457 since it has not really been opened yet. */
1458 bdrv_unref(bs);
1459 }
Markus Armbruster84d18f02014-01-30 15:07:28 +01001460 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001461 error_propagate(errp, local_err);
1462 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001463 return ret;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001464
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001465close_and_fail:
Max Reitzf67503e2014-02-18 18:33:05 +01001466 /* See fail path, but now the BDS has to be always closed */
1467 if (*pbs) {
1468 bdrv_close(bs);
1469 } else {
1470 bdrv_unref(bs);
1471 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001472 QDECREF(options);
Markus Armbruster84d18f02014-01-30 15:07:28 +01001473 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001474 error_propagate(errp, local_err);
1475 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001476 return ret;
1477}
1478
Jeff Codye971aa12012-09-20 15:13:19 -04001479typedef struct BlockReopenQueueEntry {
1480 bool prepared;
1481 BDRVReopenState state;
1482 QSIMPLEQ_ENTRY(BlockReopenQueueEntry) entry;
1483} BlockReopenQueueEntry;
1484
1485/*
1486 * Adds a BlockDriverState to a simple queue for an atomic, transactional
1487 * reopen of multiple devices.
1488 *
1489 * bs_queue can either be an existing BlockReopenQueue that has had QSIMPLE_INIT
1490 * already performed, or alternatively may be NULL a new BlockReopenQueue will
1491 * be created and initialized. This newly created BlockReopenQueue should be
1492 * passed back in for subsequent calls that are intended to be of the same
1493 * atomic 'set'.
1494 *
1495 * bs is the BlockDriverState to add to the reopen queue.
1496 *
1497 * flags contains the open flags for the associated bs
1498 *
1499 * returns a pointer to bs_queue, which is either the newly allocated
1500 * bs_queue, or the existing bs_queue being used.
1501 *
1502 */
1503BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
1504 BlockDriverState *bs, int flags)
1505{
1506 assert(bs != NULL);
1507
1508 BlockReopenQueueEntry *bs_entry;
1509 if (bs_queue == NULL) {
1510 bs_queue = g_new0(BlockReopenQueue, 1);
1511 QSIMPLEQ_INIT(bs_queue);
1512 }
1513
Kevin Wolff1f25a22014-04-25 19:04:55 +02001514 /* bdrv_open() masks this flag out */
1515 flags &= ~BDRV_O_PROTOCOL;
1516
Jeff Codye971aa12012-09-20 15:13:19 -04001517 if (bs->file) {
Kevin Wolff1f25a22014-04-25 19:04:55 +02001518 bdrv_reopen_queue(bs_queue, bs->file, bdrv_inherited_flags(flags));
Jeff Codye971aa12012-09-20 15:13:19 -04001519 }
1520
1521 bs_entry = g_new0(BlockReopenQueueEntry, 1);
1522 QSIMPLEQ_INSERT_TAIL(bs_queue, bs_entry, entry);
1523
1524 bs_entry->state.bs = bs;
1525 bs_entry->state.flags = flags;
1526
1527 return bs_queue;
1528}
1529
1530/*
1531 * Reopen multiple BlockDriverStates atomically & transactionally.
1532 *
1533 * The queue passed in (bs_queue) must have been built up previous
1534 * via bdrv_reopen_queue().
1535 *
1536 * Reopens all BDS specified in the queue, with the appropriate
1537 * flags. All devices are prepared for reopen, and failure of any
1538 * device will cause all device changes to be abandonded, and intermediate
1539 * data cleaned up.
1540 *
1541 * If all devices prepare successfully, then the changes are committed
1542 * to all devices.
1543 *
1544 */
1545int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
1546{
1547 int ret = -1;
1548 BlockReopenQueueEntry *bs_entry, *next;
1549 Error *local_err = NULL;
1550
1551 assert(bs_queue != NULL);
1552
1553 bdrv_drain_all();
1554
1555 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1556 if (bdrv_reopen_prepare(&bs_entry->state, bs_queue, &local_err)) {
1557 error_propagate(errp, local_err);
1558 goto cleanup;
1559 }
1560 bs_entry->prepared = true;
1561 }
1562
1563 /* If we reach this point, we have success and just need to apply the
1564 * changes
1565 */
1566 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1567 bdrv_reopen_commit(&bs_entry->state);
1568 }
1569
1570 ret = 0;
1571
1572cleanup:
1573 QSIMPLEQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
1574 if (ret && bs_entry->prepared) {
1575 bdrv_reopen_abort(&bs_entry->state);
1576 }
1577 g_free(bs_entry);
1578 }
1579 g_free(bs_queue);
1580 return ret;
1581}
1582
1583
1584/* Reopen a single BlockDriverState with the specified flags. */
1585int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp)
1586{
1587 int ret = -1;
1588 Error *local_err = NULL;
1589 BlockReopenQueue *queue = bdrv_reopen_queue(NULL, bs, bdrv_flags);
1590
1591 ret = bdrv_reopen_multiple(queue, &local_err);
1592 if (local_err != NULL) {
1593 error_propagate(errp, local_err);
1594 }
1595 return ret;
1596}
1597
1598
1599/*
1600 * Prepares a BlockDriverState for reopen. All changes are staged in the
1601 * 'opaque' field of the BDRVReopenState, which is used and allocated by
1602 * the block driver layer .bdrv_reopen_prepare()
1603 *
1604 * bs is the BlockDriverState to reopen
1605 * flags are the new open flags
1606 * queue is the reopen queue
1607 *
1608 * Returns 0 on success, non-zero on error. On error errp will be set
1609 * as well.
1610 *
1611 * On failure, bdrv_reopen_abort() will be called to clean up any data.
1612 * It is the responsibility of the caller to then call the abort() or
1613 * commit() for any other BDS that have been left in a prepare() state
1614 *
1615 */
1616int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
1617 Error **errp)
1618{
1619 int ret = -1;
1620 Error *local_err = NULL;
1621 BlockDriver *drv;
1622
1623 assert(reopen_state != NULL);
1624 assert(reopen_state->bs->drv != NULL);
1625 drv = reopen_state->bs->drv;
1626
1627 /* if we are to stay read-only, do not allow permission change
1628 * to r/w */
1629 if (!(reopen_state->bs->open_flags & BDRV_O_ALLOW_RDWR) &&
1630 reopen_state->flags & BDRV_O_RDWR) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03001631 error_setg(errp, "Node '%s' is read only",
1632 bdrv_get_device_or_node_name(reopen_state->bs));
Jeff Codye971aa12012-09-20 15:13:19 -04001633 goto error;
1634 }
1635
1636
1637 ret = bdrv_flush(reopen_state->bs);
1638 if (ret) {
1639 error_set(errp, ERROR_CLASS_GENERIC_ERROR, "Error (%s) flushing drive",
1640 strerror(-ret));
1641 goto error;
1642 }
1643
1644 if (drv->bdrv_reopen_prepare) {
1645 ret = drv->bdrv_reopen_prepare(reopen_state, queue, &local_err);
1646 if (ret) {
1647 if (local_err != NULL) {
1648 error_propagate(errp, local_err);
1649 } else {
Luiz Capitulinod8b68952013-06-10 11:29:27 -04001650 error_setg(errp, "failed while preparing to reopen image '%s'",
1651 reopen_state->bs->filename);
Jeff Codye971aa12012-09-20 15:13:19 -04001652 }
1653 goto error;
1654 }
1655 } else {
1656 /* It is currently mandatory to have a bdrv_reopen_prepare()
1657 * handler for each supported drv. */
Alberto Garcia81e5f782015-04-08 12:29:19 +03001658 error_setg(errp, "Block format '%s' used by node '%s' "
1659 "does not support reopening files", drv->format_name,
1660 bdrv_get_device_or_node_name(reopen_state->bs));
Jeff Codye971aa12012-09-20 15:13:19 -04001661 ret = -1;
1662 goto error;
1663 }
1664
1665 ret = 0;
1666
1667error:
1668 return ret;
1669}
1670
1671/*
1672 * Takes the staged changes for the reopen from bdrv_reopen_prepare(), and
1673 * makes them final by swapping the staging BlockDriverState contents into
1674 * the active BlockDriverState contents.
1675 */
1676void bdrv_reopen_commit(BDRVReopenState *reopen_state)
1677{
1678 BlockDriver *drv;
1679
1680 assert(reopen_state != NULL);
1681 drv = reopen_state->bs->drv;
1682 assert(drv != NULL);
1683
1684 /* If there are any driver level actions to take */
1685 if (drv->bdrv_reopen_commit) {
1686 drv->bdrv_reopen_commit(reopen_state);
1687 }
1688
1689 /* set BDS specific flags now */
1690 reopen_state->bs->open_flags = reopen_state->flags;
1691 reopen_state->bs->enable_write_cache = !!(reopen_state->flags &
1692 BDRV_O_CACHE_WB);
1693 reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
Kevin Wolf355ef4a2013-12-11 20:14:09 +01001694
Kevin Wolf3baca892014-07-16 17:48:16 +02001695 bdrv_refresh_limits(reopen_state->bs, NULL);
Jeff Codye971aa12012-09-20 15:13:19 -04001696}
1697
1698/*
1699 * Abort the reopen, and delete and free the staged changes in
1700 * reopen_state
1701 */
1702void bdrv_reopen_abort(BDRVReopenState *reopen_state)
1703{
1704 BlockDriver *drv;
1705
1706 assert(reopen_state != NULL);
1707 drv = reopen_state->bs->drv;
1708 assert(drv != NULL);
1709
1710 if (drv->bdrv_reopen_abort) {
1711 drv->bdrv_reopen_abort(reopen_state);
1712 }
1713}
1714
1715
bellardfc01f7e2003-06-30 10:03:06 +00001716void bdrv_close(BlockDriverState *bs)
1717{
Max Reitz33384422014-06-20 21:57:33 +02001718 BdrvAioNotifier *ban, *ban_next;
1719
Paolo Bonzini3cbc0022012-10-19 11:36:48 +02001720 if (bs->job) {
1721 block_job_cancel_sync(bs->job);
1722 }
Stefan Hajnoczi58fda172013-07-02 15:36:25 +02001723 bdrv_drain_all(); /* complete I/O */
1724 bdrv_flush(bs);
1725 bdrv_drain_all(); /* in case flush left pending I/O */
Paolo Bonzinid7d512f2012-08-23 11:20:36 +02001726 notifier_list_notify(&bs->close_notifiers, bs);
Kevin Wolf7094f122012-04-11 11:06:37 +02001727
Paolo Bonzini3cbc0022012-10-19 11:36:48 +02001728 if (bs->drv) {
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +01001729 if (bs->backing_hd) {
Fam Zheng826b6ca2014-05-23 21:29:47 +08001730 BlockDriverState *backing_hd = bs->backing_hd;
1731 bdrv_set_backing_hd(bs, NULL);
1732 bdrv_unref(backing_hd);
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +01001733 }
bellardea2384d2004-08-01 21:59:26 +00001734 bs->drv->bdrv_close(bs);
Anthony Liguori7267c092011-08-20 22:09:37 -05001735 g_free(bs->opaque);
bellardea2384d2004-08-01 21:59:26 +00001736 bs->opaque = NULL;
1737 bs->drv = NULL;
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +00001738 bs->copy_on_read = 0;
Paolo Bonzinia275fa42012-05-08 16:51:43 +02001739 bs->backing_file[0] = '\0';
1740 bs->backing_format[0] = '\0';
Paolo Bonzini64058752012-05-08 16:51:49 +02001741 bs->total_sectors = 0;
1742 bs->encrypted = 0;
1743 bs->valid_key = 0;
1744 bs->sg = 0;
Asias He0d51b4d2013-08-22 15:24:14 +08001745 bs->zero_beyond_eof = false;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001746 QDECREF(bs->options);
1747 bs->options = NULL;
Max Reitz91af7012014-07-18 20:24:56 +02001748 QDECREF(bs->full_open_options);
1749 bs->full_open_options = NULL;
bellardb3380822004-03-14 21:38:54 +00001750
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001751 if (bs->file != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001752 bdrv_unref(bs->file);
Paolo Bonzini0ac93772012-05-08 16:51:44 +02001753 bs->file = NULL;
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001754 }
bellardb3380822004-03-14 21:38:54 +00001755 }
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001756
Markus Armbrustera7f53e22014-10-07 13:59:25 +02001757 if (bs->blk) {
1758 blk_dev_change_media_cb(bs->blk, false);
1759 }
Pavel Hrdina9ca11152012-08-09 12:44:48 +02001760
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001761 /*throttling disk I/O limits*/
1762 if (bs->io_limits_enabled) {
1763 bdrv_io_limits_disable(bs);
1764 }
Max Reitz33384422014-06-20 21:57:33 +02001765
1766 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
1767 g_free(ban);
1768 }
1769 QLIST_INIT(&bs->aio_notifiers);
bellardb3380822004-03-14 21:38:54 +00001770}
1771
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001772void bdrv_close_all(void)
1773{
1774 BlockDriverState *bs;
1775
Benoît Canetdc364f42014-01-23 21:31:32 +01001776 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02001777 AioContext *aio_context = bdrv_get_aio_context(bs);
1778
1779 aio_context_acquire(aio_context);
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001780 bdrv_close(bs);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02001781 aio_context_release(aio_context);
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001782 }
1783}
1784
Benoît Canetdc364f42014-01-23 21:31:32 +01001785/* make a BlockDriverState anonymous by removing from bdrv_state and
1786 * graph_bdrv_state list.
Ryan Harperd22b2f42011-03-29 20:51:47 -05001787 Also, NULL terminate the device_name to prevent double remove */
1788void bdrv_make_anon(BlockDriverState *bs)
1789{
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001790 /*
1791 * Take care to remove bs from bdrv_states only when it's actually
1792 * in it. Note that bs->device_list.tqe_prev is initially null,
1793 * and gets set to non-null by QTAILQ_INSERT_TAIL(). Establish
1794 * the useful invariant "bs in bdrv_states iff bs->tqe_prev" by
1795 * resetting it to null on remove.
1796 */
1797 if (bs->device_list.tqe_prev) {
Benoît Canetdc364f42014-01-23 21:31:32 +01001798 QTAILQ_REMOVE(&bdrv_states, bs, device_list);
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001799 bs->device_list.tqe_prev = NULL;
Ryan Harperd22b2f42011-03-29 20:51:47 -05001800 }
Benoît Canetdc364f42014-01-23 21:31:32 +01001801 if (bs->node_name[0] != '\0') {
1802 QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
1803 }
1804 bs->node_name[0] = '\0';
Ryan Harperd22b2f42011-03-29 20:51:47 -05001805}
1806
Paolo Bonzinie023b2e2012-05-08 16:51:41 +02001807static void bdrv_rebind(BlockDriverState *bs)
1808{
1809 if (bs->drv && bs->drv->bdrv_rebind) {
1810 bs->drv->bdrv_rebind(bs);
1811 }
1812}
1813
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001814static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
1815 BlockDriverState *bs_src)
1816{
1817 /* move some fields that need to stay attached to the device */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001818
1819 /* dev info */
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01001820 bs_dest->guest_block_size = bs_src->guest_block_size;
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001821 bs_dest->copy_on_read = bs_src->copy_on_read;
1822
1823 bs_dest->enable_write_cache = bs_src->enable_write_cache;
1824
Benoît Canetcc0681c2013-09-02 14:14:39 +02001825 /* i/o throttled req */
Alberto Garcia76f4afb2015-06-08 18:17:44 +02001826 bs_dest->throttle_state = bs_src->throttle_state,
1827 bs_dest->io_limits_enabled = bs_src->io_limits_enabled;
1828 bs_dest->pending_reqs[0] = bs_src->pending_reqs[0];
1829 bs_dest->pending_reqs[1] = bs_src->pending_reqs[1];
1830 bs_dest->throttled_reqs[0] = bs_src->throttled_reqs[0];
1831 bs_dest->throttled_reqs[1] = bs_src->throttled_reqs[1];
1832 memcpy(&bs_dest->round_robin,
1833 &bs_src->round_robin,
1834 sizeof(bs_dest->round_robin));
Benoît Canet0e5b0a22015-06-08 18:17:41 +02001835 memcpy(&bs_dest->throttle_timers,
1836 &bs_src->throttle_timers,
1837 sizeof(ThrottleTimers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001838
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001839 /* r/w error */
1840 bs_dest->on_read_error = bs_src->on_read_error;
1841 bs_dest->on_write_error = bs_src->on_write_error;
1842
1843 /* i/o status */
1844 bs_dest->iostatus_enabled = bs_src->iostatus_enabled;
1845 bs_dest->iostatus = bs_src->iostatus;
1846
1847 /* dirty bitmap */
Fam Zhenge4654d22013-11-13 18:29:43 +08001848 bs_dest->dirty_bitmaps = bs_src->dirty_bitmaps;
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001849
Fam Zheng9fcb0252013-08-23 09:14:46 +08001850 /* reference count */
1851 bs_dest->refcnt = bs_src->refcnt;
1852
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001853 /* job */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001854 bs_dest->job = bs_src->job;
1855
1856 /* keep the same entry in bdrv_states */
Benoît Canetdc364f42014-01-23 21:31:32 +01001857 bs_dest->device_list = bs_src->device_list;
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001858 bs_dest->blk = bs_src->blk;
1859
Fam Zhengfbe40ff2014-05-23 21:29:42 +08001860 memcpy(bs_dest->op_blockers, bs_src->op_blockers,
1861 sizeof(bs_dest->op_blockers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001862}
1863
1864/*
1865 * Swap bs contents for two image chains while they are live,
1866 * while keeping required fields on the BlockDriverState that is
1867 * actually attached to a device.
1868 *
1869 * This will modify the BlockDriverState fields, and swap contents
1870 * between bs_new and bs_old. Both bs_new and bs_old are modified.
1871 *
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001872 * bs_new must not be attached to a BlockBackend.
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001873 *
1874 * This function does not create any image files.
1875 */
1876void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
1877{
1878 BlockDriverState tmp;
1879
Benoît Canet90ce8a02014-03-05 23:48:29 +01001880 /* The code needs to swap the node_name but simply swapping node_list won't
1881 * work so first remove the nodes from the graph list, do the swap then
1882 * insert them back if needed.
1883 */
1884 if (bs_new->node_name[0] != '\0') {
1885 QTAILQ_REMOVE(&graph_bdrv_states, bs_new, node_list);
1886 }
1887 if (bs_old->node_name[0] != '\0') {
1888 QTAILQ_REMOVE(&graph_bdrv_states, bs_old, node_list);
1889 }
1890
Alberto Garciadb628332015-06-08 18:17:45 +02001891 /* If the BlockDriverState is part of a throttling group acquire
1892 * its lock since we're going to mess with the protected fields.
1893 * Otherwise there's no need to worry since no one else can touch
1894 * them. */
1895 if (bs_old->throttle_state) {
1896 throttle_group_lock(bs_old);
1897 }
1898
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001899 /* bs_new must be unattached and shouldn't have anything fancy enabled */
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001900 assert(!bs_new->blk);
Fam Zhenge4654d22013-11-13 18:29:43 +08001901 assert(QLIST_EMPTY(&bs_new->dirty_bitmaps));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001902 assert(bs_new->job == NULL);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001903 assert(bs_new->io_limits_enabled == false);
Alberto Garciadb628332015-06-08 18:17:45 +02001904 assert(bs_new->throttle_state == NULL);
Benoît Canet0e5b0a22015-06-08 18:17:41 +02001905 assert(!throttle_timers_are_initialized(&bs_new->throttle_timers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001906
1907 tmp = *bs_new;
1908 *bs_new = *bs_old;
1909 *bs_old = tmp;
1910
1911 /* there are some fields that should not be swapped, move them back */
1912 bdrv_move_feature_fields(&tmp, bs_old);
1913 bdrv_move_feature_fields(bs_old, bs_new);
1914 bdrv_move_feature_fields(bs_new, &tmp);
1915
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001916 /* bs_new must remain unattached */
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001917 assert(!bs_new->blk);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001918
1919 /* Check a few fields that should remain attached to the device */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001920 assert(bs_new->job == NULL);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001921 assert(bs_new->io_limits_enabled == false);
Alberto Garciadb628332015-06-08 18:17:45 +02001922 assert(bs_new->throttle_state == NULL);
Benoît Canet0e5b0a22015-06-08 18:17:41 +02001923 assert(!throttle_timers_are_initialized(&bs_new->throttle_timers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001924
Alberto Garciadb628332015-06-08 18:17:45 +02001925 /* Release the ThrottleGroup lock */
1926 if (bs_old->throttle_state) {
1927 throttle_group_unlock(bs_old);
1928 }
1929
Benoît Canet90ce8a02014-03-05 23:48:29 +01001930 /* insert the nodes back into the graph node list if needed */
1931 if (bs_new->node_name[0] != '\0') {
1932 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_new, node_list);
1933 }
1934 if (bs_old->node_name[0] != '\0') {
1935 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_old, node_list);
1936 }
1937
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001938 bdrv_rebind(bs_new);
1939 bdrv_rebind(bs_old);
1940}
1941
Jeff Cody8802d1f2012-02-28 15:54:06 -05001942/*
1943 * Add new bs contents at the top of an image chain while the chain is
1944 * live, while keeping required fields on the top layer.
1945 *
1946 * This will modify the BlockDriverState fields, and swap contents
1947 * between bs_new and bs_top. Both bs_new and bs_top are modified.
1948 *
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001949 * bs_new must not be attached to a BlockBackend.
Jeff Codyf6801b82012-03-27 16:30:19 -04001950 *
Jeff Cody8802d1f2012-02-28 15:54:06 -05001951 * This function does not create any image files.
1952 */
1953void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
1954{
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001955 bdrv_swap(bs_new, bs_top);
Jeff Cody8802d1f2012-02-28 15:54:06 -05001956
1957 /* The contents of 'tmp' will become bs_top, as we are
1958 * swapping bs_new and bs_top contents. */
Fam Zheng8d24cce2014-05-23 21:29:45 +08001959 bdrv_set_backing_hd(bs_top, bs_new);
Jeff Cody8802d1f2012-02-28 15:54:06 -05001960}
1961
Fam Zheng4f6fd342013-08-23 09:14:47 +08001962static void bdrv_delete(BlockDriverState *bs)
bellardb3380822004-03-14 21:38:54 +00001963{
Paolo Bonzini3e914652012-03-30 13:17:11 +02001964 assert(!bs->job);
Fam Zheng3718d8a2014-05-23 21:29:43 +08001965 assert(bdrv_op_blocker_is_empty(bs));
Fam Zheng4f6fd342013-08-23 09:14:47 +08001966 assert(!bs->refcnt);
Fam Zhenge4654d22013-11-13 18:29:43 +08001967 assert(QLIST_EMPTY(&bs->dirty_bitmaps));
Markus Armbruster18846de2010-06-29 16:58:30 +02001968
Stefan Hajnoczie1b5c522013-06-27 15:32:26 +02001969 bdrv_close(bs);
1970
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001971 /* remove from list, if necessary */
Ryan Harperd22b2f42011-03-29 20:51:47 -05001972 bdrv_make_anon(bs);
aurel3234c6f052008-04-08 19:51:21 +00001973
Anthony Liguori7267c092011-08-20 22:09:37 -05001974 g_free(bs);
bellardfc01f7e2003-06-30 10:03:06 +00001975}
1976
aliguorie97fc192009-04-21 23:11:50 +00001977/*
1978 * Run consistency checks on an image
1979 *
Kevin Wolfe076f332010-06-29 11:43:13 +02001980 * Returns 0 if the check could be completed (it doesn't mean that the image is
Stefan Weila1c72732011-04-28 17:20:38 +02001981 * free of errors) or -errno when an internal error occurred. The results of the
Kevin Wolfe076f332010-06-29 11:43:13 +02001982 * check are stored in res.
aliguorie97fc192009-04-21 23:11:50 +00001983 */
Kevin Wolf4534ff52012-05-11 16:07:02 +02001984int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix)
aliguorie97fc192009-04-21 23:11:50 +00001985{
Max Reitz908bcd52014-08-07 22:47:55 +02001986 if (bs->drv == NULL) {
1987 return -ENOMEDIUM;
1988 }
aliguorie97fc192009-04-21 23:11:50 +00001989 if (bs->drv->bdrv_check == NULL) {
1990 return -ENOTSUP;
1991 }
1992
Kevin Wolfe076f332010-06-29 11:43:13 +02001993 memset(res, 0, sizeof(*res));
Kevin Wolf4534ff52012-05-11 16:07:02 +02001994 return bs->drv->bdrv_check(bs, res, fix);
aliguorie97fc192009-04-21 23:11:50 +00001995}
1996
Kevin Wolf8a426612010-07-16 17:17:01 +02001997#define COMMIT_BUF_SECTORS 2048
1998
bellard33e39632003-07-06 17:15:21 +00001999/* commit COW file into the raw image */
2000int bdrv_commit(BlockDriverState *bs)
2001{
bellard19cb3732006-08-19 11:45:59 +00002002 BlockDriver *drv = bs->drv;
Jeff Cody72706ea2014-01-24 09:02:35 -05002003 int64_t sector, total_sectors, length, backing_length;
Kevin Wolf8a426612010-07-16 17:17:01 +02002004 int n, ro, open_flags;
Jeff Cody0bce5972012-09-20 15:13:34 -04002005 int ret = 0;
Jeff Cody72706ea2014-01-24 09:02:35 -05002006 uint8_t *buf = NULL;
bellard33e39632003-07-06 17:15:21 +00002007
bellard19cb3732006-08-19 11:45:59 +00002008 if (!drv)
2009 return -ENOMEDIUM;
Liu Yuan6bb45152014-09-01 13:35:21 +08002010
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002011 if (!bs->backing_hd) {
2012 return -ENOTSUP;
bellard33e39632003-07-06 17:15:21 +00002013 }
2014
Fam Zhengbb000212014-09-11 13:14:00 +08002015 if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, NULL) ||
2016 bdrv_op_is_blocked(bs->backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET, NULL)) {
Stefan Hajnoczi2d3735d2012-01-18 14:40:41 +00002017 return -EBUSY;
2018 }
2019
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002020 ro = bs->backing_hd->read_only;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002021 open_flags = bs->backing_hd->open_flags;
2022
2023 if (ro) {
Jeff Cody0bce5972012-09-20 15:13:34 -04002024 if (bdrv_reopen(bs->backing_hd, open_flags | BDRV_O_RDWR, NULL)) {
2025 return -EACCES;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002026 }
bellard33e39632003-07-06 17:15:21 +00002027 }
bellardea2384d2004-08-01 21:59:26 +00002028
Jeff Cody72706ea2014-01-24 09:02:35 -05002029 length = bdrv_getlength(bs);
2030 if (length < 0) {
2031 ret = length;
2032 goto ro_cleanup;
2033 }
2034
2035 backing_length = bdrv_getlength(bs->backing_hd);
2036 if (backing_length < 0) {
2037 ret = backing_length;
2038 goto ro_cleanup;
2039 }
2040
2041 /* If our top snapshot is larger than the backing file image,
2042 * grow the backing file image if possible. If not possible,
2043 * we must return an error */
2044 if (length > backing_length) {
2045 ret = bdrv_truncate(bs->backing_hd, length);
2046 if (ret < 0) {
2047 goto ro_cleanup;
2048 }
2049 }
2050
2051 total_sectors = length >> BDRV_SECTOR_BITS;
Kevin Wolf857d4f42014-05-20 13:16:51 +02002052
2053 /* qemu_try_blockalign() for bs will choose an alignment that works for
2054 * bs->backing_hd as well, so no need to compare the alignment manually. */
2055 buf = qemu_try_blockalign(bs, COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
2056 if (buf == NULL) {
2057 ret = -ENOMEM;
2058 goto ro_cleanup;
2059 }
bellardea2384d2004-08-01 21:59:26 +00002060
Kevin Wolf8a426612010-07-16 17:17:01 +02002061 for (sector = 0; sector < total_sectors; sector += n) {
Paolo Bonzinid6636402013-09-04 19:00:25 +02002062 ret = bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n);
2063 if (ret < 0) {
2064 goto ro_cleanup;
2065 }
2066 if (ret) {
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002067 ret = bdrv_read(bs, sector, buf, n);
2068 if (ret < 0) {
Kevin Wolf8a426612010-07-16 17:17:01 +02002069 goto ro_cleanup;
2070 }
2071
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002072 ret = bdrv_write(bs->backing_hd, sector, buf, n);
2073 if (ret < 0) {
Kevin Wolf8a426612010-07-16 17:17:01 +02002074 goto ro_cleanup;
2075 }
bellardea2384d2004-08-01 21:59:26 +00002076 }
2077 }
bellard95389c82005-12-18 18:28:15 +00002078
Christoph Hellwig1d449522010-01-17 12:32:30 +01002079 if (drv->bdrv_make_empty) {
2080 ret = drv->bdrv_make_empty(bs);
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002081 if (ret < 0) {
2082 goto ro_cleanup;
2083 }
Christoph Hellwig1d449522010-01-17 12:32:30 +01002084 bdrv_flush(bs);
2085 }
bellard95389c82005-12-18 18:28:15 +00002086
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01002087 /*
2088 * Make sure all data we wrote to the backing device is actually
2089 * stable on disk.
2090 */
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002091 if (bs->backing_hd) {
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01002092 bdrv_flush(bs->backing_hd);
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002093 }
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002094
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002095 ret = 0;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002096ro_cleanup:
Kevin Wolf857d4f42014-05-20 13:16:51 +02002097 qemu_vfree(buf);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002098
2099 if (ro) {
Jeff Cody0bce5972012-09-20 15:13:34 -04002100 /* ignoring error return here */
2101 bdrv_reopen(bs->backing_hd, open_flags & ~BDRV_O_RDWR, NULL);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002102 }
2103
Christoph Hellwig1d449522010-01-17 12:32:30 +01002104 return ret;
bellard33e39632003-07-06 17:15:21 +00002105}
2106
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002107int bdrv_commit_all(void)
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002108{
2109 BlockDriverState *bs;
2110
Benoît Canetdc364f42014-01-23 21:31:32 +01002111 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002112 AioContext *aio_context = bdrv_get_aio_context(bs);
2113
2114 aio_context_acquire(aio_context);
Jeff Cody272d2d82013-02-26 09:55:48 -05002115 if (bs->drv && bs->backing_hd) {
2116 int ret = bdrv_commit(bs);
2117 if (ret < 0) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002118 aio_context_release(aio_context);
Jeff Cody272d2d82013-02-26 09:55:48 -05002119 return ret;
2120 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002121 }
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002122 aio_context_release(aio_context);
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002123 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002124 return 0;
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002125}
2126
Kevin Wolf756e6732010-01-12 12:55:17 +01002127/*
2128 * Return values:
2129 * 0 - success
2130 * -EINVAL - backing format specified, but no file
2131 * -ENOSPC - can't update the backing file because no space is left in the
2132 * image file header
2133 * -ENOTSUP - format driver doesn't support changing the backing file
2134 */
2135int bdrv_change_backing_file(BlockDriverState *bs,
2136 const char *backing_file, const char *backing_fmt)
2137{
2138 BlockDriver *drv = bs->drv;
Paolo Bonzini469ef352012-04-12 14:01:02 +02002139 int ret;
Kevin Wolf756e6732010-01-12 12:55:17 +01002140
Paolo Bonzini5f377792012-04-12 14:01:01 +02002141 /* Backing file format doesn't make sense without a backing file */
2142 if (backing_fmt && !backing_file) {
2143 return -EINVAL;
2144 }
2145
Kevin Wolf756e6732010-01-12 12:55:17 +01002146 if (drv->bdrv_change_backing_file != NULL) {
Paolo Bonzini469ef352012-04-12 14:01:02 +02002147 ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
Kevin Wolf756e6732010-01-12 12:55:17 +01002148 } else {
Paolo Bonzini469ef352012-04-12 14:01:02 +02002149 ret = -ENOTSUP;
Kevin Wolf756e6732010-01-12 12:55:17 +01002150 }
Paolo Bonzini469ef352012-04-12 14:01:02 +02002151
2152 if (ret == 0) {
2153 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_file ?: "");
2154 pstrcpy(bs->backing_format, sizeof(bs->backing_format), backing_fmt ?: "");
2155 }
2156 return ret;
Kevin Wolf756e6732010-01-12 12:55:17 +01002157}
2158
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002159/*
2160 * Finds the image layer in the chain that has 'bs' as its backing file.
2161 *
2162 * active is the current topmost image.
2163 *
2164 * Returns NULL if bs is not found in active's image chain,
2165 * or if active == bs.
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002166 *
2167 * Returns the bottommost base image if bs == NULL.
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002168 */
2169BlockDriverState *bdrv_find_overlay(BlockDriverState *active,
2170 BlockDriverState *bs)
2171{
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002172 while (active && bs != active->backing_hd) {
2173 active = active->backing_hd;
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002174 }
2175
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002176 return active;
2177}
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002178
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002179/* Given a BDS, searches for the base layer. */
2180BlockDriverState *bdrv_find_base(BlockDriverState *bs)
2181{
2182 return bdrv_find_overlay(bs, NULL);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002183}
2184
2185typedef struct BlkIntermediateStates {
2186 BlockDriverState *bs;
2187 QSIMPLEQ_ENTRY(BlkIntermediateStates) entry;
2188} BlkIntermediateStates;
2189
2190
2191/*
2192 * Drops images above 'base' up to and including 'top', and sets the image
2193 * above 'top' to have base as its backing file.
2194 *
2195 * Requires that the overlay to 'top' is opened r/w, so that the backing file
2196 * information in 'bs' can be properly updated.
2197 *
2198 * E.g., this will convert the following chain:
2199 * bottom <- base <- intermediate <- top <- active
2200 *
2201 * to
2202 *
2203 * bottom <- base <- active
2204 *
2205 * It is allowed for bottom==base, in which case it converts:
2206 *
2207 * base <- intermediate <- top <- active
2208 *
2209 * to
2210 *
2211 * base <- active
2212 *
Jeff Cody54e26902014-06-25 15:40:10 -04002213 * If backing_file_str is non-NULL, it will be used when modifying top's
2214 * overlay image metadata.
2215 *
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002216 * Error conditions:
2217 * if active == top, that is considered an error
2218 *
2219 */
2220int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
Jeff Cody54e26902014-06-25 15:40:10 -04002221 BlockDriverState *base, const char *backing_file_str)
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002222{
2223 BlockDriverState *intermediate;
2224 BlockDriverState *base_bs = NULL;
2225 BlockDriverState *new_top_bs = NULL;
2226 BlkIntermediateStates *intermediate_state, *next;
2227 int ret = -EIO;
2228
2229 QSIMPLEQ_HEAD(states_to_delete, BlkIntermediateStates) states_to_delete;
2230 QSIMPLEQ_INIT(&states_to_delete);
2231
2232 if (!top->drv || !base->drv) {
2233 goto exit;
2234 }
2235
2236 new_top_bs = bdrv_find_overlay(active, top);
2237
2238 if (new_top_bs == NULL) {
2239 /* we could not find the image above 'top', this is an error */
2240 goto exit;
2241 }
2242
2243 /* special case of new_top_bs->backing_hd already pointing to base - nothing
2244 * to do, no intermediate images */
2245 if (new_top_bs->backing_hd == base) {
2246 ret = 0;
2247 goto exit;
2248 }
2249
2250 intermediate = top;
2251
2252 /* now we will go down through the list, and add each BDS we find
2253 * into our deletion queue, until we hit the 'base'
2254 */
2255 while (intermediate) {
Markus Armbruster5839e532014-08-19 10:31:08 +02002256 intermediate_state = g_new0(BlkIntermediateStates, 1);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002257 intermediate_state->bs = intermediate;
2258 QSIMPLEQ_INSERT_TAIL(&states_to_delete, intermediate_state, entry);
2259
2260 if (intermediate->backing_hd == base) {
2261 base_bs = intermediate->backing_hd;
2262 break;
2263 }
2264 intermediate = intermediate->backing_hd;
2265 }
2266 if (base_bs == NULL) {
2267 /* something went wrong, we did not end at the base. safely
2268 * unravel everything, and exit with error */
2269 goto exit;
2270 }
2271
2272 /* success - we can delete the intermediate states, and link top->base */
Jeff Cody54e26902014-06-25 15:40:10 -04002273 backing_file_str = backing_file_str ? backing_file_str : base_bs->filename;
2274 ret = bdrv_change_backing_file(new_top_bs, backing_file_str,
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002275 base_bs->drv ? base_bs->drv->format_name : "");
2276 if (ret) {
2277 goto exit;
2278 }
Fam Zheng920beae2014-05-23 21:29:46 +08002279 bdrv_set_backing_hd(new_top_bs, base_bs);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002280
2281 QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
2282 /* so that bdrv_close() does not recursively close the chain */
Fam Zheng920beae2014-05-23 21:29:46 +08002283 bdrv_set_backing_hd(intermediate_state->bs, NULL);
Fam Zheng4f6fd342013-08-23 09:14:47 +08002284 bdrv_unref(intermediate_state->bs);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002285 }
2286 ret = 0;
2287
2288exit:
2289 QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
2290 g_free(intermediate_state);
2291 }
2292 return ret;
2293}
2294
bellard83f64092006-08-01 16:21:11 +00002295/**
bellard83f64092006-08-01 16:21:11 +00002296 * Truncate file to 'offset' bytes (needed only for file protocols)
2297 */
2298int bdrv_truncate(BlockDriverState *bs, int64_t offset)
2299{
2300 BlockDriver *drv = bs->drv;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002301 int ret;
bellard83f64092006-08-01 16:21:11 +00002302 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002303 return -ENOMEDIUM;
bellard83f64092006-08-01 16:21:11 +00002304 if (!drv->bdrv_truncate)
2305 return -ENOTSUP;
Naphtali Sprei59f26892009-10-26 16:25:16 +02002306 if (bs->read_only)
2307 return -EACCES;
Jeff Cody9c75e162014-06-25 16:55:30 -04002308
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002309 ret = drv->bdrv_truncate(bs, offset);
2310 if (ret == 0) {
2311 ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
John Snowce1ffea2015-04-17 19:50:03 -04002312 bdrv_dirty_bitmap_truncate(bs);
Markus Armbrustera7f53e22014-10-07 13:59:25 +02002313 if (bs->blk) {
2314 blk_dev_resize_cb(bs->blk);
2315 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002316 }
2317 return ret;
bellard83f64092006-08-01 16:21:11 +00002318}
2319
2320/**
Fam Zheng4a1d5e12011-07-12 19:56:39 +08002321 * Length of a allocated file in bytes. Sparse files are counted by actual
2322 * allocated space. Return < 0 if error or unknown.
2323 */
2324int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
2325{
2326 BlockDriver *drv = bs->drv;
2327 if (!drv) {
2328 return -ENOMEDIUM;
2329 }
2330 if (drv->bdrv_get_allocated_file_size) {
2331 return drv->bdrv_get_allocated_file_size(bs);
2332 }
2333 if (bs->file) {
2334 return bdrv_get_allocated_file_size(bs->file);
2335 }
2336 return -ENOTSUP;
2337}
2338
2339/**
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002340 * Return number of sectors on success, -errno on error.
bellard83f64092006-08-01 16:21:11 +00002341 */
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002342int64_t bdrv_nb_sectors(BlockDriverState *bs)
bellard83f64092006-08-01 16:21:11 +00002343{
2344 BlockDriver *drv = bs->drv;
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002345
bellard83f64092006-08-01 16:21:11 +00002346 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002347 return -ENOMEDIUM;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002348
Kevin Wolfb94a2612013-10-29 12:18:58 +01002349 if (drv->has_variable_length) {
2350 int ret = refresh_total_sectors(bs, bs->total_sectors);
2351 if (ret < 0) {
2352 return ret;
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01002353 }
bellard83f64092006-08-01 16:21:11 +00002354 }
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002355 return bs->total_sectors;
2356}
2357
2358/**
2359 * Return length in bytes on success, -errno on error.
2360 * The length is always a multiple of BDRV_SECTOR_SIZE.
2361 */
2362int64_t bdrv_getlength(BlockDriverState *bs)
2363{
2364 int64_t ret = bdrv_nb_sectors(bs);
2365
Fam Zheng4a9c9ea2015-05-15 16:36:05 +08002366 ret = ret > INT64_MAX / BDRV_SECTOR_SIZE ? -EFBIG : ret;
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002367 return ret < 0 ? ret : ret * BDRV_SECTOR_SIZE;
bellardfc01f7e2003-06-30 10:03:06 +00002368}
2369
bellard19cb3732006-08-19 11:45:59 +00002370/* return 0 as number of sectors if no device present or error */
ths96b8f132007-12-17 01:35:20 +00002371void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
bellardfc01f7e2003-06-30 10:03:06 +00002372{
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002373 int64_t nb_sectors = bdrv_nb_sectors(bs);
2374
2375 *nb_sectors_ptr = nb_sectors < 0 ? 0 : nb_sectors;
bellardfc01f7e2003-06-30 10:03:06 +00002376}
bellardcf989512004-02-16 21:56:36 +00002377
Paolo Bonziniff06f5f2012-09-28 17:22:54 +02002378void bdrv_set_on_error(BlockDriverState *bs, BlockdevOnError on_read_error,
2379 BlockdevOnError on_write_error)
Markus Armbrusterabd7f682010-06-02 18:55:17 +02002380{
2381 bs->on_read_error = on_read_error;
2382 bs->on_write_error = on_write_error;
2383}
2384
Paolo Bonzini1ceee0d2012-09-28 17:22:56 +02002385BlockdevOnError bdrv_get_on_error(BlockDriverState *bs, bool is_read)
Markus Armbrusterabd7f682010-06-02 18:55:17 +02002386{
2387 return is_read ? bs->on_read_error : bs->on_write_error;
2388}
2389
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002390BlockErrorAction bdrv_get_error_action(BlockDriverState *bs, bool is_read, int error)
2391{
2392 BlockdevOnError on_err = is_read ? bs->on_read_error : bs->on_write_error;
2393
2394 switch (on_err) {
2395 case BLOCKDEV_ON_ERROR_ENOSPC:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002396 return (error == ENOSPC) ?
2397 BLOCK_ERROR_ACTION_STOP : BLOCK_ERROR_ACTION_REPORT;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002398 case BLOCKDEV_ON_ERROR_STOP:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002399 return BLOCK_ERROR_ACTION_STOP;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002400 case BLOCKDEV_ON_ERROR_REPORT:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002401 return BLOCK_ERROR_ACTION_REPORT;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002402 case BLOCKDEV_ON_ERROR_IGNORE:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002403 return BLOCK_ERROR_ACTION_IGNORE;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002404 default:
2405 abort();
2406 }
2407}
2408
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002409static void send_qmp_error_event(BlockDriverState *bs,
2410 BlockErrorAction action,
2411 bool is_read, int error)
2412{
Peter Maydell573742a2014-10-10 20:33:03 +01002413 IoOperationType optype;
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002414
Peter Maydell573742a2014-10-10 20:33:03 +01002415 optype = is_read ? IO_OPERATION_TYPE_READ : IO_OPERATION_TYPE_WRITE;
2416 qapi_event_send_block_io_error(bdrv_get_device_name(bs), optype, action,
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002417 bdrv_iostatus_is_enabled(bs),
Luiz Capitulino624ff572014-09-11 10:25:48 -04002418 error == ENOSPC, strerror(error),
2419 &error_abort);
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002420}
2421
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002422/* This is done by device models because, while the block layer knows
2423 * about the error, it does not know whether an operation comes from
2424 * the device or the block layer (from a job, for example).
2425 */
2426void bdrv_error_action(BlockDriverState *bs, BlockErrorAction action,
2427 bool is_read, int error)
2428{
2429 assert(error >= 0);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002430
Wenchao Xiaa5895692014-06-18 08:43:30 +02002431 if (action == BLOCK_ERROR_ACTION_STOP) {
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002432 /* First set the iostatus, so that "info block" returns an iostatus
2433 * that matches the events raised so far (an additional error iostatus
2434 * is fine, but not a lost one).
2435 */
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002436 bdrv_iostatus_set_err(bs, error);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002437
2438 /* Then raise the request to stop the VM and the event.
2439 * qemu_system_vmstop_request_prepare has two effects. First,
2440 * it ensures that the STOP event always comes after the
2441 * BLOCK_IO_ERROR event. Second, it ensures that even if management
2442 * can observe the STOP event and do a "cont" before the STOP
2443 * event is issued, the VM will not stop. In this case, vm_start()
2444 * also ensures that the STOP/RESUME pair of events is emitted.
2445 */
2446 qemu_system_vmstop_request_prepare();
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002447 send_qmp_error_event(bs, action, is_read, error);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002448 qemu_system_vmstop_request(RUN_STATE_IO_ERROR);
2449 } else {
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002450 send_qmp_error_event(bs, action, is_read, error);
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002451 }
2452}
2453
bellardb3380822004-03-14 21:38:54 +00002454int bdrv_is_read_only(BlockDriverState *bs)
2455{
2456 return bs->read_only;
2457}
2458
ths985a03b2007-12-24 16:10:43 +00002459int bdrv_is_sg(BlockDriverState *bs)
2460{
2461 return bs->sg;
2462}
2463
Christoph Hellwige900a7b2009-09-04 19:01:15 +02002464int bdrv_enable_write_cache(BlockDriverState *bs)
2465{
2466 return bs->enable_write_cache;
2467}
2468
Paolo Bonzini425b0142012-06-06 00:04:52 +02002469void bdrv_set_enable_write_cache(BlockDriverState *bs, bool wce)
2470{
2471 bs->enable_write_cache = wce;
Jeff Cody55b110f2012-09-20 15:13:18 -04002472
2473 /* so a reopen() will preserve wce */
2474 if (wce) {
2475 bs->open_flags |= BDRV_O_CACHE_WB;
2476 } else {
2477 bs->open_flags &= ~BDRV_O_CACHE_WB;
2478 }
Paolo Bonzini425b0142012-06-06 00:04:52 +02002479}
2480
bellardea2384d2004-08-01 21:59:26 +00002481int bdrv_is_encrypted(BlockDriverState *bs)
2482{
2483 if (bs->backing_hd && bs->backing_hd->encrypted)
2484 return 1;
2485 return bs->encrypted;
2486}
2487
aliguoric0f4ce72009-03-05 23:01:01 +00002488int bdrv_key_required(BlockDriverState *bs)
2489{
2490 BlockDriverState *backing_hd = bs->backing_hd;
2491
2492 if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
2493 return 1;
2494 return (bs->encrypted && !bs->valid_key);
2495}
2496
bellardea2384d2004-08-01 21:59:26 +00002497int bdrv_set_key(BlockDriverState *bs, const char *key)
2498{
2499 int ret;
2500 if (bs->backing_hd && bs->backing_hd->encrypted) {
2501 ret = bdrv_set_key(bs->backing_hd, key);
2502 if (ret < 0)
2503 return ret;
2504 if (!bs->encrypted)
2505 return 0;
2506 }
Shahar Havivifd04a2a2010-03-06 00:26:13 +02002507 if (!bs->encrypted) {
2508 return -EINVAL;
2509 } else if (!bs->drv || !bs->drv->bdrv_set_key) {
2510 return -ENOMEDIUM;
2511 }
aliguoric0f4ce72009-03-05 23:01:01 +00002512 ret = bs->drv->bdrv_set_key(bs, key);
aliguoribb5fc202009-03-05 23:01:15 +00002513 if (ret < 0) {
2514 bs->valid_key = 0;
2515 } else if (!bs->valid_key) {
2516 bs->valid_key = 1;
Markus Armbrustera7f53e22014-10-07 13:59:25 +02002517 if (bs->blk) {
2518 /* call the change callback now, we skipped it on open */
2519 blk_dev_change_media_cb(bs->blk, true);
2520 }
aliguoribb5fc202009-03-05 23:01:15 +00002521 }
aliguoric0f4ce72009-03-05 23:01:01 +00002522 return ret;
bellardea2384d2004-08-01 21:59:26 +00002523}
2524
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002525/*
2526 * Provide an encryption key for @bs.
2527 * If @key is non-null:
2528 * If @bs is not encrypted, fail.
2529 * Else if the key is invalid, fail.
2530 * Else set @bs's key to @key, replacing the existing key, if any.
2531 * If @key is null:
2532 * If @bs is encrypted and still lacks a key, fail.
2533 * Else do nothing.
2534 * On failure, store an error object through @errp if non-null.
2535 */
2536void bdrv_add_key(BlockDriverState *bs, const char *key, Error **errp)
2537{
2538 if (key) {
2539 if (!bdrv_is_encrypted(bs)) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03002540 error_setg(errp, "Node '%s' is not encrypted",
2541 bdrv_get_device_or_node_name(bs));
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002542 } else if (bdrv_set_key(bs, key) < 0) {
2543 error_set(errp, QERR_INVALID_PASSWORD);
2544 }
2545 } else {
2546 if (bdrv_key_required(bs)) {
Markus Armbrusterb1ca6392015-01-29 10:37:01 +01002547 error_set(errp, ERROR_CLASS_DEVICE_ENCRYPTED,
2548 "'%s' (%s) is encrypted",
Alberto Garcia81e5f782015-04-08 12:29:19 +03002549 bdrv_get_device_or_node_name(bs),
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002550 bdrv_get_encrypted_filename(bs));
2551 }
2552 }
2553}
2554
Markus Armbrusterf8d6bba2012-06-13 10:11:48 +02002555const char *bdrv_get_format_name(BlockDriverState *bs)
bellardea2384d2004-08-01 21:59:26 +00002556{
Markus Armbrusterf8d6bba2012-06-13 10:11:48 +02002557 return bs->drv ? bs->drv->format_name : NULL;
bellardea2384d2004-08-01 21:59:26 +00002558}
2559
Stefan Hajnocziada42402014-08-27 12:08:55 +01002560static int qsort_strcmp(const void *a, const void *b)
2561{
2562 return strcmp(a, b);
2563}
2564
ths5fafdf22007-09-16 21:08:06 +00002565void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
bellardea2384d2004-08-01 21:59:26 +00002566 void *opaque)
2567{
2568 BlockDriver *drv;
Jeff Codye855e4f2014-04-28 18:29:54 -04002569 int count = 0;
Stefan Hajnocziada42402014-08-27 12:08:55 +01002570 int i;
Jeff Codye855e4f2014-04-28 18:29:54 -04002571 const char **formats = NULL;
bellardea2384d2004-08-01 21:59:26 +00002572
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +01002573 QLIST_FOREACH(drv, &bdrv_drivers, list) {
Jeff Codye855e4f2014-04-28 18:29:54 -04002574 if (drv->format_name) {
2575 bool found = false;
2576 int i = count;
2577 while (formats && i && !found) {
2578 found = !strcmp(formats[--i], drv->format_name);
2579 }
2580
2581 if (!found) {
Markus Armbruster5839e532014-08-19 10:31:08 +02002582 formats = g_renew(const char *, formats, count + 1);
Jeff Codye855e4f2014-04-28 18:29:54 -04002583 formats[count++] = drv->format_name;
Jeff Codye855e4f2014-04-28 18:29:54 -04002584 }
2585 }
bellardea2384d2004-08-01 21:59:26 +00002586 }
Stefan Hajnocziada42402014-08-27 12:08:55 +01002587
2588 qsort(formats, count, sizeof(formats[0]), qsort_strcmp);
2589
2590 for (i = 0; i < count; i++) {
2591 it(opaque, formats[i]);
2592 }
2593
Jeff Codye855e4f2014-04-28 18:29:54 -04002594 g_free(formats);
bellardea2384d2004-08-01 21:59:26 +00002595}
2596
Benoît Canetdc364f42014-01-23 21:31:32 +01002597/* This function is to find a node in the bs graph */
2598BlockDriverState *bdrv_find_node(const char *node_name)
2599{
2600 BlockDriverState *bs;
2601
2602 assert(node_name);
2603
2604 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
2605 if (!strcmp(node_name, bs->node_name)) {
2606 return bs;
2607 }
2608 }
2609 return NULL;
2610}
2611
Benoît Canetc13163f2014-01-23 21:31:34 +01002612/* Put this QMP function here so it can access the static graph_bdrv_states. */
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002613BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp)
Benoît Canetc13163f2014-01-23 21:31:34 +01002614{
2615 BlockDeviceInfoList *list, *entry;
2616 BlockDriverState *bs;
2617
2618 list = NULL;
2619 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002620 BlockDeviceInfo *info = bdrv_block_device_info(bs, errp);
2621 if (!info) {
2622 qapi_free_BlockDeviceInfoList(list);
2623 return NULL;
2624 }
Benoît Canetc13163f2014-01-23 21:31:34 +01002625 entry = g_malloc0(sizeof(*entry));
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002626 entry->value = info;
Benoît Canetc13163f2014-01-23 21:31:34 +01002627 entry->next = list;
2628 list = entry;
2629 }
2630
2631 return list;
2632}
2633
Benoît Canet12d3ba82014-01-23 21:31:35 +01002634BlockDriverState *bdrv_lookup_bs(const char *device,
2635 const char *node_name,
2636 Error **errp)
2637{
Markus Armbruster7f06d472014-10-07 13:59:12 +02002638 BlockBackend *blk;
2639 BlockDriverState *bs;
Benoît Canet12d3ba82014-01-23 21:31:35 +01002640
Benoît Canet12d3ba82014-01-23 21:31:35 +01002641 if (device) {
Markus Armbruster7f06d472014-10-07 13:59:12 +02002642 blk = blk_by_name(device);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002643
Markus Armbruster7f06d472014-10-07 13:59:12 +02002644 if (blk) {
2645 return blk_bs(blk);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002646 }
Benoît Canet12d3ba82014-01-23 21:31:35 +01002647 }
2648
Benoît Canetdd67fa52014-02-12 17:15:06 +01002649 if (node_name) {
2650 bs = bdrv_find_node(node_name);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002651
Benoît Canetdd67fa52014-02-12 17:15:06 +01002652 if (bs) {
2653 return bs;
2654 }
Benoît Canet12d3ba82014-01-23 21:31:35 +01002655 }
2656
Benoît Canetdd67fa52014-02-12 17:15:06 +01002657 error_setg(errp, "Cannot find device=%s nor node_name=%s",
2658 device ? device : "",
2659 node_name ? node_name : "");
2660 return NULL;
Benoît Canet12d3ba82014-01-23 21:31:35 +01002661}
2662
Jeff Cody5a6684d2014-06-25 15:40:09 -04002663/* If 'base' is in the same chain as 'top', return true. Otherwise,
2664 * return false. If either argument is NULL, return false. */
2665bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
2666{
2667 while (top && top != base) {
2668 top = top->backing_hd;
2669 }
2670
2671 return top != NULL;
2672}
2673
Fam Zheng04df7652014-10-31 11:32:54 +08002674BlockDriverState *bdrv_next_node(BlockDriverState *bs)
2675{
2676 if (!bs) {
2677 return QTAILQ_FIRST(&graph_bdrv_states);
2678 }
2679 return QTAILQ_NEXT(bs, node_list);
2680}
2681
Markus Armbruster2f399b02010-06-02 18:55:20 +02002682BlockDriverState *bdrv_next(BlockDriverState *bs)
2683{
2684 if (!bs) {
2685 return QTAILQ_FIRST(&bdrv_states);
2686 }
Benoît Canetdc364f42014-01-23 21:31:32 +01002687 return QTAILQ_NEXT(bs, device_list);
Markus Armbruster2f399b02010-06-02 18:55:20 +02002688}
2689
Fam Zheng20a9e772014-10-31 11:32:55 +08002690const char *bdrv_get_node_name(const BlockDriverState *bs)
2691{
2692 return bs->node_name;
2693}
2694
Markus Armbruster7f06d472014-10-07 13:59:12 +02002695/* TODO check what callers really want: bs->node_name or blk_name() */
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02002696const char *bdrv_get_device_name(const BlockDriverState *bs)
bellardea2384d2004-08-01 21:59:26 +00002697{
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02002698 return bs->blk ? blk_name(bs->blk) : "";
bellardea2384d2004-08-01 21:59:26 +00002699}
2700
Alberto Garcia9b2aa842015-04-08 12:29:18 +03002701/* This can be used to identify nodes that might not have a device
2702 * name associated. Since node and device names live in the same
2703 * namespace, the result is unambiguous. The exception is if both are
2704 * absent, then this returns an empty (non-null) string. */
2705const char *bdrv_get_device_or_node_name(const BlockDriverState *bs)
2706{
2707 return bs->blk ? blk_name(bs->blk) : bs->node_name;
2708}
2709
Markus Armbrusterc8433282012-06-05 16:49:24 +02002710int bdrv_get_flags(BlockDriverState *bs)
2711{
2712 return bs->open_flags;
2713}
2714
Peter Lieven3ac21622013-06-28 12:47:42 +02002715int bdrv_has_zero_init_1(BlockDriverState *bs)
2716{
2717 return 1;
2718}
2719
Kevin Wolff2feebb2010-04-14 17:30:35 +02002720int bdrv_has_zero_init(BlockDriverState *bs)
2721{
2722 assert(bs->drv);
2723
Paolo Bonzini11212d82013-09-04 19:00:27 +02002724 /* If BS is a copy on write image, it is initialized to
2725 the contents of the base image, which may not be zeroes. */
2726 if (bs->backing_hd) {
2727 return 0;
2728 }
Kevin Wolf336c1c12010-07-28 11:26:29 +02002729 if (bs->drv->bdrv_has_zero_init) {
2730 return bs->drv->bdrv_has_zero_init(bs);
Kevin Wolff2feebb2010-04-14 17:30:35 +02002731 }
2732
Peter Lieven3ac21622013-06-28 12:47:42 +02002733 /* safe default */
2734 return 0;
Kevin Wolff2feebb2010-04-14 17:30:35 +02002735}
2736
Peter Lieven4ce78692013-10-24 12:06:54 +02002737bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs)
2738{
2739 BlockDriverInfo bdi;
2740
2741 if (bs->backing_hd) {
2742 return false;
2743 }
2744
2745 if (bdrv_get_info(bs, &bdi) == 0) {
2746 return bdi.unallocated_blocks_are_zero;
2747 }
2748
2749 return false;
2750}
2751
2752bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs)
2753{
2754 BlockDriverInfo bdi;
2755
2756 if (bs->backing_hd || !(bs->open_flags & BDRV_O_UNMAP)) {
2757 return false;
2758 }
2759
2760 if (bdrv_get_info(bs, &bdi) == 0) {
2761 return bdi.can_write_zeroes_with_unmap;
2762 }
2763
2764 return false;
2765}
2766
aliguori045df332009-03-05 23:00:48 +00002767const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
2768{
2769 if (bs->backing_hd && bs->backing_hd->encrypted)
2770 return bs->backing_file;
2771 else if (bs->encrypted)
2772 return bs->filename;
2773 else
2774 return NULL;
2775}
2776
ths5fafdf22007-09-16 21:08:06 +00002777void bdrv_get_backing_filename(BlockDriverState *bs,
bellard83f64092006-08-01 16:21:11 +00002778 char *filename, int filename_size)
bellardea2384d2004-08-01 21:59:26 +00002779{
Kevin Wolf3574c602011-10-26 11:02:11 +02002780 pstrcpy(filename, filename_size, bs->backing_file);
bellardea2384d2004-08-01 21:59:26 +00002781}
2782
bellardfaea38e2006-08-05 21:31:00 +00002783int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
2784{
2785 BlockDriver *drv = bs->drv;
2786 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002787 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00002788 if (!drv->bdrv_get_info)
2789 return -ENOTSUP;
2790 memset(bdi, 0, sizeof(*bdi));
2791 return drv->bdrv_get_info(bs, bdi);
2792}
2793
Max Reitzeae041f2013-10-09 10:46:16 +02002794ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs)
2795{
2796 BlockDriver *drv = bs->drv;
2797 if (drv && drv->bdrv_get_specific_info) {
2798 return drv->bdrv_get_specific_info(bs);
2799 }
2800 return NULL;
2801}
2802
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002803void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event)
2804{
Kevin Wolfbf736fe2013-06-05 15:17:55 +02002805 if (!bs || !bs->drv || !bs->drv->bdrv_debug_event) {
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002806 return;
2807 }
2808
Kevin Wolfbf736fe2013-06-05 15:17:55 +02002809 bs->drv->bdrv_debug_event(bs, event);
Kevin Wolf41c695c2012-12-06 14:32:58 +01002810}
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002811
Kevin Wolf41c695c2012-12-06 14:32:58 +01002812int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
2813 const char *tag)
2814{
2815 while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) {
2816 bs = bs->file;
2817 }
2818
2819 if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) {
2820 return bs->drv->bdrv_debug_breakpoint(bs, event, tag);
2821 }
2822
2823 return -ENOTSUP;
2824}
2825
Fam Zheng4cc70e92013-11-20 10:01:54 +08002826int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag)
2827{
2828 while (bs && bs->drv && !bs->drv->bdrv_debug_remove_breakpoint) {
2829 bs = bs->file;
2830 }
2831
2832 if (bs && bs->drv && bs->drv->bdrv_debug_remove_breakpoint) {
2833 return bs->drv->bdrv_debug_remove_breakpoint(bs, tag);
2834 }
2835
2836 return -ENOTSUP;
2837}
2838
Kevin Wolf41c695c2012-12-06 14:32:58 +01002839int bdrv_debug_resume(BlockDriverState *bs, const char *tag)
2840{
Max Reitz938789e2014-03-10 23:44:08 +01002841 while (bs && (!bs->drv || !bs->drv->bdrv_debug_resume)) {
Kevin Wolf41c695c2012-12-06 14:32:58 +01002842 bs = bs->file;
2843 }
2844
2845 if (bs && bs->drv && bs->drv->bdrv_debug_resume) {
2846 return bs->drv->bdrv_debug_resume(bs, tag);
2847 }
2848
2849 return -ENOTSUP;
2850}
2851
2852bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag)
2853{
2854 while (bs && bs->drv && !bs->drv->bdrv_debug_is_suspended) {
2855 bs = bs->file;
2856 }
2857
2858 if (bs && bs->drv && bs->drv->bdrv_debug_is_suspended) {
2859 return bs->drv->bdrv_debug_is_suspended(bs, tag);
2860 }
2861
2862 return false;
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002863}
2864
Blue Swirl199630b2010-07-25 20:49:34 +00002865int bdrv_is_snapshot(BlockDriverState *bs)
2866{
2867 return !!(bs->open_flags & BDRV_O_SNAPSHOT);
2868}
2869
Jeff Codyb1b1d782012-10-16 15:49:09 -04002870/* backing_file can either be relative, or absolute, or a protocol. If it is
2871 * relative, it must be relative to the chain. So, passing in bs->filename
2872 * from a BDS as backing_file should not be done, as that may be relative to
2873 * the CWD rather than the chain. */
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002874BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
2875 const char *backing_file)
2876{
Jeff Codyb1b1d782012-10-16 15:49:09 -04002877 char *filename_full = NULL;
2878 char *backing_file_full = NULL;
2879 char *filename_tmp = NULL;
2880 int is_protocol = 0;
2881 BlockDriverState *curr_bs = NULL;
2882 BlockDriverState *retval = NULL;
2883
2884 if (!bs || !bs->drv || !backing_file) {
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002885 return NULL;
2886 }
2887
Jeff Codyb1b1d782012-10-16 15:49:09 -04002888 filename_full = g_malloc(PATH_MAX);
2889 backing_file_full = g_malloc(PATH_MAX);
2890 filename_tmp = g_malloc(PATH_MAX);
2891
2892 is_protocol = path_has_protocol(backing_file);
2893
2894 for (curr_bs = bs; curr_bs->backing_hd; curr_bs = curr_bs->backing_hd) {
2895
2896 /* If either of the filename paths is actually a protocol, then
2897 * compare unmodified paths; otherwise make paths relative */
2898 if (is_protocol || path_has_protocol(curr_bs->backing_file)) {
2899 if (strcmp(backing_file, curr_bs->backing_file) == 0) {
2900 retval = curr_bs->backing_hd;
2901 break;
2902 }
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002903 } else {
Jeff Codyb1b1d782012-10-16 15:49:09 -04002904 /* If not an absolute filename path, make it relative to the current
2905 * image's filename path */
2906 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
2907 backing_file);
2908
2909 /* We are going to compare absolute pathnames */
2910 if (!realpath(filename_tmp, filename_full)) {
2911 continue;
2912 }
2913
2914 /* We need to make sure the backing filename we are comparing against
2915 * is relative to the current image filename (or absolute) */
2916 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
2917 curr_bs->backing_file);
2918
2919 if (!realpath(filename_tmp, backing_file_full)) {
2920 continue;
2921 }
2922
2923 if (strcmp(backing_file_full, filename_full) == 0) {
2924 retval = curr_bs->backing_hd;
2925 break;
2926 }
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002927 }
2928 }
2929
Jeff Codyb1b1d782012-10-16 15:49:09 -04002930 g_free(filename_full);
2931 g_free(backing_file_full);
2932 g_free(filename_tmp);
2933 return retval;
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002934}
2935
Benoît Canetf198fd12012-08-02 10:22:47 +02002936int bdrv_get_backing_file_depth(BlockDriverState *bs)
2937{
2938 if (!bs->drv) {
2939 return 0;
2940 }
2941
2942 if (!bs->backing_hd) {
2943 return 0;
2944 }
2945
2946 return 1 + bdrv_get_backing_file_depth(bs->backing_hd);
2947}
2948
bellardea2384d2004-08-01 21:59:26 +00002949void bdrv_init(void)
2950{
Anthony Liguori5efa9d52009-05-09 17:03:42 -05002951 module_call_init(MODULE_INIT_BLOCK);
bellardea2384d2004-08-01 21:59:26 +00002952}
pbrookce1a14d2006-08-07 02:38:06 +00002953
Markus Armbrustereb852012009-10-27 18:41:44 +01002954void bdrv_init_with_whitelist(void)
2955{
2956 use_bdrv_whitelist = 1;
2957 bdrv_init();
2958}
2959
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002960void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
Anthony Liguori0f154232011-11-14 15:09:45 -06002961{
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002962 Error *local_err = NULL;
2963 int ret;
2964
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002965 if (!bs->drv) {
2966 return;
Anthony Liguori0f154232011-11-14 15:09:45 -06002967 }
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002968
Alexey Kardashevskiy7ea2d262014-10-09 13:50:46 +11002969 if (!(bs->open_flags & BDRV_O_INCOMING)) {
2970 return;
2971 }
2972 bs->open_flags &= ~BDRV_O_INCOMING;
2973
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002974 if (bs->drv->bdrv_invalidate_cache) {
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002975 bs->drv->bdrv_invalidate_cache(bs, &local_err);
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002976 } else if (bs->file) {
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002977 bdrv_invalidate_cache(bs->file, &local_err);
2978 }
2979 if (local_err) {
2980 error_propagate(errp, local_err);
2981 return;
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002982 }
2983
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002984 ret = refresh_total_sectors(bs, bs->total_sectors);
2985 if (ret < 0) {
2986 error_setg_errno(errp, -ret, "Could not refresh total sector count");
2987 return;
2988 }
Anthony Liguori0f154232011-11-14 15:09:45 -06002989}
2990
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002991void bdrv_invalidate_cache_all(Error **errp)
Anthony Liguori0f154232011-11-14 15:09:45 -06002992{
2993 BlockDriverState *bs;
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002994 Error *local_err = NULL;
Anthony Liguori0f154232011-11-14 15:09:45 -06002995
Benoît Canetdc364f42014-01-23 21:31:32 +01002996 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002997 AioContext *aio_context = bdrv_get_aio_context(bs);
2998
2999 aio_context_acquire(aio_context);
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003000 bdrv_invalidate_cache(bs, &local_err);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02003001 aio_context_release(aio_context);
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003002 if (local_err) {
3003 error_propagate(errp, local_err);
3004 return;
3005 }
Anthony Liguori0f154232011-11-14 15:09:45 -06003006 }
3007}
3008
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003009/**************************************************************/
bellard19cb3732006-08-19 11:45:59 +00003010/* removable device support */
3011
3012/**
3013 * Return TRUE if the media is present
3014 */
3015int bdrv_is_inserted(BlockDriverState *bs)
3016{
3017 BlockDriver *drv = bs->drv;
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003018
bellard19cb3732006-08-19 11:45:59 +00003019 if (!drv)
3020 return 0;
3021 if (!drv->bdrv_is_inserted)
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003022 return 1;
3023 return drv->bdrv_is_inserted(bs);
bellard19cb3732006-08-19 11:45:59 +00003024}
3025
3026/**
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003027 * Return whether the media changed since the last call to this
3028 * function, or -ENOTSUP if we don't know. Most drivers don't know.
bellard19cb3732006-08-19 11:45:59 +00003029 */
3030int bdrv_media_changed(BlockDriverState *bs)
3031{
3032 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003033
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003034 if (drv && drv->bdrv_media_changed) {
3035 return drv->bdrv_media_changed(bs);
3036 }
3037 return -ENOTSUP;
bellard19cb3732006-08-19 11:45:59 +00003038}
3039
3040/**
3041 * If eject_flag is TRUE, eject the media. Otherwise, close the tray
3042 */
Luiz Capitulinof36f3942012-02-03 16:24:53 -02003043void bdrv_eject(BlockDriverState *bs, bool eject_flag)
bellard19cb3732006-08-19 11:45:59 +00003044{
3045 BlockDriver *drv = bs->drv;
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003046 const char *device_name;
bellard19cb3732006-08-19 11:45:59 +00003047
Markus Armbruster822e1cd2011-07-20 18:23:42 +02003048 if (drv && drv->bdrv_eject) {
3049 drv->bdrv_eject(bs, eject_flag);
bellard19cb3732006-08-19 11:45:59 +00003050 }
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02003051
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003052 device_name = bdrv_get_device_name(bs);
3053 if (device_name[0] != '\0') {
3054 qapi_event_send_device_tray_moved(device_name,
Wenchao Xiaa5ee7bd2014-06-18 08:43:44 +02003055 eject_flag, &error_abort);
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02003056 }
bellard19cb3732006-08-19 11:45:59 +00003057}
3058
bellard19cb3732006-08-19 11:45:59 +00003059/**
3060 * Lock or unlock the media (if it is locked, the user won't be able
3061 * to eject it manually).
3062 */
Markus Armbruster025e8492011-09-06 18:58:47 +02003063void bdrv_lock_medium(BlockDriverState *bs, bool locked)
bellard19cb3732006-08-19 11:45:59 +00003064{
3065 BlockDriver *drv = bs->drv;
3066
Markus Armbruster025e8492011-09-06 18:58:47 +02003067 trace_bdrv_lock_medium(bs, locked);
Stefan Hajnoczib8c6d092011-03-29 20:04:40 +01003068
Markus Armbruster025e8492011-09-06 18:58:47 +02003069 if (drv && drv->bdrv_lock_medium) {
3070 drv->bdrv_lock_medium(bs, locked);
bellard19cb3732006-08-19 11:45:59 +00003071 }
3072}
ths985a03b2007-12-24 16:10:43 +00003073
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01003074void bdrv_set_guest_block_size(BlockDriverState *bs, int align)
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003075{
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01003076 bs->guest_block_size = align;
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003077}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003078
Fam Zheng0db6e542015-04-17 19:49:50 -04003079BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs, const char *name)
3080{
3081 BdrvDirtyBitmap *bm;
3082
3083 assert(name);
3084 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
3085 if (bm->name && !strcmp(name, bm->name)) {
3086 return bm;
3087 }
3088 }
3089 return NULL;
3090}
3091
John Snow20dca812015-04-17 19:50:02 -04003092void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap)
Fam Zheng0db6e542015-04-17 19:49:50 -04003093{
John Snow9bd2b082015-04-17 19:49:57 -04003094 assert(!bdrv_dirty_bitmap_frozen(bitmap));
Fam Zheng0db6e542015-04-17 19:49:50 -04003095 g_free(bitmap->name);
3096 bitmap->name = NULL;
3097}
3098
3099BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
John Snow5fba6c02015-04-17 19:49:51 -04003100 uint32_t granularity,
Fam Zheng0db6e542015-04-17 19:49:50 -04003101 const char *name,
Fam Zhengb8afb522014-04-16 09:34:30 +08003102 Error **errp)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003103{
3104 int64_t bitmap_size;
Fam Zhenge4654d22013-11-13 18:29:43 +08003105 BdrvDirtyBitmap *bitmap;
John Snow5fba6c02015-04-17 19:49:51 -04003106 uint32_t sector_granularity;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003107
Paolo Bonzini50717e92013-01-21 17:09:45 +01003108 assert((granularity & (granularity - 1)) == 0);
3109
Fam Zheng0db6e542015-04-17 19:49:50 -04003110 if (name && bdrv_find_dirty_bitmap(bs, name)) {
3111 error_setg(errp, "Bitmap already exists: %s", name);
3112 return NULL;
3113 }
John Snow5fba6c02015-04-17 19:49:51 -04003114 sector_granularity = granularity >> BDRV_SECTOR_BITS;
3115 assert(sector_granularity);
Markus Armbruster57322b72014-06-26 13:23:22 +02003116 bitmap_size = bdrv_nb_sectors(bs);
Fam Zhengb8afb522014-04-16 09:34:30 +08003117 if (bitmap_size < 0) {
3118 error_setg_errno(errp, -bitmap_size, "could not get length of device");
3119 errno = -bitmap_size;
3120 return NULL;
3121 }
Markus Armbruster5839e532014-08-19 10:31:08 +02003122 bitmap = g_new0(BdrvDirtyBitmap, 1);
John Snow5fba6c02015-04-17 19:49:51 -04003123 bitmap->bitmap = hbitmap_alloc(bitmap_size, ctz32(sector_granularity));
John Snowe74e6b72015-04-17 19:49:59 -04003124 bitmap->size = bitmap_size;
Fam Zheng0db6e542015-04-17 19:49:50 -04003125 bitmap->name = g_strdup(name);
John Snowb8e6fb72015-04-17 19:49:56 -04003126 bitmap->disabled = false;
Fam Zhenge4654d22013-11-13 18:29:43 +08003127 QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
3128 return bitmap;
3129}
3130
John Snow9bd2b082015-04-17 19:49:57 -04003131bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
3132{
3133 return bitmap->successor;
3134}
3135
John Snowb8e6fb72015-04-17 19:49:56 -04003136bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
3137{
John Snow9bd2b082015-04-17 19:49:57 -04003138 return !(bitmap->disabled || bitmap->successor);
3139}
3140
John Snow9abe3bd2015-05-12 15:53:01 -04003141DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap)
3142{
3143 if (bdrv_dirty_bitmap_frozen(bitmap)) {
3144 return DIRTY_BITMAP_STATUS_FROZEN;
3145 } else if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3146 return DIRTY_BITMAP_STATUS_DISABLED;
3147 } else {
3148 return DIRTY_BITMAP_STATUS_ACTIVE;
3149 }
3150}
3151
John Snow9bd2b082015-04-17 19:49:57 -04003152/**
3153 * Create a successor bitmap destined to replace this bitmap after an operation.
3154 * Requires that the bitmap is not frozen and has no successor.
3155 */
3156int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
3157 BdrvDirtyBitmap *bitmap, Error **errp)
3158{
3159 uint64_t granularity;
3160 BdrvDirtyBitmap *child;
3161
3162 if (bdrv_dirty_bitmap_frozen(bitmap)) {
3163 error_setg(errp, "Cannot create a successor for a bitmap that is "
3164 "currently frozen");
3165 return -1;
3166 }
3167 assert(!bitmap->successor);
3168
3169 /* Create an anonymous successor */
3170 granularity = bdrv_dirty_bitmap_granularity(bitmap);
3171 child = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
3172 if (!child) {
3173 return -1;
3174 }
3175
3176 /* Successor will be on or off based on our current state. */
3177 child->disabled = bitmap->disabled;
3178
3179 /* Install the successor and freeze the parent */
3180 bitmap->successor = child;
3181 return 0;
3182}
3183
3184/**
3185 * For a bitmap with a successor, yield our name to the successor,
3186 * delete the old bitmap, and return a handle to the new bitmap.
3187 */
3188BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
3189 BdrvDirtyBitmap *bitmap,
3190 Error **errp)
3191{
3192 char *name;
3193 BdrvDirtyBitmap *successor = bitmap->successor;
3194
3195 if (successor == NULL) {
3196 error_setg(errp, "Cannot relinquish control if "
3197 "there's no successor present");
3198 return NULL;
3199 }
3200
3201 name = bitmap->name;
3202 bitmap->name = NULL;
3203 successor->name = name;
3204 bitmap->successor = NULL;
3205 bdrv_release_dirty_bitmap(bs, bitmap);
3206
3207 return successor;
3208}
3209
3210/**
3211 * In cases of failure where we can no longer safely delete the parent,
3212 * we may wish to re-join the parent and child/successor.
3213 * The merged parent will be un-frozen, but not explicitly re-enabled.
3214 */
3215BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
3216 BdrvDirtyBitmap *parent,
3217 Error **errp)
3218{
3219 BdrvDirtyBitmap *successor = parent->successor;
3220
3221 if (!successor) {
3222 error_setg(errp, "Cannot reclaim a successor when none is present");
3223 return NULL;
3224 }
3225
3226 if (!hbitmap_merge(parent->bitmap, successor->bitmap)) {
3227 error_setg(errp, "Merging of parent and successor bitmap failed");
3228 return NULL;
3229 }
3230 bdrv_release_dirty_bitmap(bs, successor);
3231 parent->successor = NULL;
3232
3233 return parent;
John Snowb8e6fb72015-04-17 19:49:56 -04003234}
3235
John Snowce1ffea2015-04-17 19:50:03 -04003236/**
3237 * Truncates _all_ bitmaps attached to a BDS.
3238 */
3239static void bdrv_dirty_bitmap_truncate(BlockDriverState *bs)
3240{
3241 BdrvDirtyBitmap *bitmap;
3242 uint64_t size = bdrv_nb_sectors(bs);
3243
3244 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
3245 if (bdrv_dirty_bitmap_frozen(bitmap)) {
3246 continue;
3247 }
3248 hbitmap_truncate(bitmap->bitmap, size);
3249 }
3250}
3251
Fam Zhenge4654d22013-11-13 18:29:43 +08003252void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
3253{
3254 BdrvDirtyBitmap *bm, *next;
3255 QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
3256 if (bm == bitmap) {
John Snow9bd2b082015-04-17 19:49:57 -04003257 assert(!bdrv_dirty_bitmap_frozen(bm));
Fam Zhenge4654d22013-11-13 18:29:43 +08003258 QLIST_REMOVE(bitmap, list);
3259 hbitmap_free(bitmap->bitmap);
Fam Zheng0db6e542015-04-17 19:49:50 -04003260 g_free(bitmap->name);
Fam Zhenge4654d22013-11-13 18:29:43 +08003261 g_free(bitmap);
3262 return;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003263 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003264 }
3265}
3266
John Snowb8e6fb72015-04-17 19:49:56 -04003267void bdrv_disable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3268{
John Snow9bd2b082015-04-17 19:49:57 -04003269 assert(!bdrv_dirty_bitmap_frozen(bitmap));
John Snowb8e6fb72015-04-17 19:49:56 -04003270 bitmap->disabled = true;
3271}
3272
3273void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3274{
John Snow9bd2b082015-04-17 19:49:57 -04003275 assert(!bdrv_dirty_bitmap_frozen(bitmap));
John Snowb8e6fb72015-04-17 19:49:56 -04003276 bitmap->disabled = false;
3277}
3278
Fam Zheng21b56832013-11-13 18:29:44 +08003279BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
3280{
3281 BdrvDirtyBitmap *bm;
3282 BlockDirtyInfoList *list = NULL;
3283 BlockDirtyInfoList **plist = &list;
3284
3285 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
Markus Armbruster5839e532014-08-19 10:31:08 +02003286 BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
3287 BlockDirtyInfoList *entry = g_new0(BlockDirtyInfoList, 1);
John Snow20dca812015-04-17 19:50:02 -04003288 info->count = bdrv_get_dirty_count(bm);
John Snow592fdd02015-04-17 19:49:53 -04003289 info->granularity = bdrv_dirty_bitmap_granularity(bm);
Fam Zheng0db6e542015-04-17 19:49:50 -04003290 info->has_name = !!bm->name;
3291 info->name = g_strdup(bm->name);
John Snow9abe3bd2015-05-12 15:53:01 -04003292 info->status = bdrv_dirty_bitmap_status(bm);
Fam Zheng21b56832013-11-13 18:29:44 +08003293 entry->value = info;
3294 *plist = entry;
3295 plist = &entry->next;
3296 }
3297
3298 return list;
3299}
3300
Fam Zhenge4654d22013-11-13 18:29:43 +08003301int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003302{
Fam Zhenge4654d22013-11-13 18:29:43 +08003303 if (bitmap) {
3304 return hbitmap_get(bitmap->bitmap, sector);
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003305 } else {
3306 return 0;
3307 }
3308}
3309
John Snow341ebc22015-04-17 19:49:52 -04003310/**
3311 * Chooses a default granularity based on the existing cluster size,
3312 * but clamped between [4K, 64K]. Defaults to 64K in the case that there
3313 * is no cluster size information available.
3314 */
3315uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs)
3316{
3317 BlockDriverInfo bdi;
3318 uint32_t granularity;
3319
3320 if (bdrv_get_info(bs, &bdi) >= 0 && bdi.cluster_size > 0) {
3321 granularity = MAX(4096, bdi.cluster_size);
3322 granularity = MIN(65536, granularity);
3323 } else {
3324 granularity = 65536;
3325 }
3326
3327 return granularity;
3328}
3329
John Snow592fdd02015-04-17 19:49:53 -04003330uint32_t bdrv_dirty_bitmap_granularity(BdrvDirtyBitmap *bitmap)
3331{
3332 return BDRV_SECTOR_SIZE << hbitmap_granularity(bitmap->bitmap);
3333}
3334
John Snow20dca812015-04-17 19:50:02 -04003335void bdrv_dirty_iter_init(BdrvDirtyBitmap *bitmap, HBitmapIter *hbi)
Paolo Bonzini1755da12012-10-18 16:49:18 +02003336{
Fam Zhenge4654d22013-11-13 18:29:43 +08003337 hbitmap_iter_init(hbi, bitmap->bitmap, 0);
Paolo Bonzini1755da12012-10-18 16:49:18 +02003338}
3339
John Snow20dca812015-04-17 19:50:02 -04003340void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003341 int64_t cur_sector, int nr_sectors)
3342{
John Snowb8e6fb72015-04-17 19:49:56 -04003343 assert(bdrv_dirty_bitmap_enabled(bitmap));
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003344 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
3345}
3346
John Snow20dca812015-04-17 19:50:02 -04003347void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003348 int64_t cur_sector, int nr_sectors)
3349{
John Snowb8e6fb72015-04-17 19:49:56 -04003350 assert(bdrv_dirty_bitmap_enabled(bitmap));
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003351 hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
3352}
3353
John Snowe74e6b72015-04-17 19:49:59 -04003354void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3355{
3356 assert(bdrv_dirty_bitmap_enabled(bitmap));
3357 hbitmap_reset(bitmap->bitmap, 0, bitmap->size);
3358}
3359
Stefan Hajnoczie0c47b62015-04-28 14:27:50 +01003360void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,
3361 int nr_sectors)
Paolo Bonzini1755da12012-10-18 16:49:18 +02003362{
Fam Zhenge4654d22013-11-13 18:29:43 +08003363 BdrvDirtyBitmap *bitmap;
3364 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
John Snowb8e6fb72015-04-17 19:49:56 -04003365 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3366 continue;
3367 }
Fam Zhenge4654d22013-11-13 18:29:43 +08003368 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
Paolo Bonzini8f0720e2013-01-21 17:09:41 +01003369 }
Liran Schouraaa0eb72010-01-26 10:31:48 +02003370}
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003371
Stefan Hajnoczie0c47b62015-04-28 14:27:50 +01003372void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
3373 int nr_sectors)
Fam Zhenge4654d22013-11-13 18:29:43 +08003374{
3375 BdrvDirtyBitmap *bitmap;
3376 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
John Snowb8e6fb72015-04-17 19:49:56 -04003377 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3378 continue;
3379 }
Fam Zhenge4654d22013-11-13 18:29:43 +08003380 hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
3381 }
3382}
3383
John Snowd58d8452015-04-17 19:49:58 -04003384/**
3385 * Advance an HBitmapIter to an arbitrary offset.
3386 */
3387void bdrv_set_dirty_iter(HBitmapIter *hbi, int64_t offset)
3388{
3389 assert(hbi->hb);
3390 hbitmap_iter_init(hbi, hbi->hb, offset);
3391}
3392
John Snow20dca812015-04-17 19:50:02 -04003393int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
Fam Zhenge4654d22013-11-13 18:29:43 +08003394{
3395 return hbitmap_count(bitmap->bitmap);
3396}
3397
Fam Zheng9fcb0252013-08-23 09:14:46 +08003398/* Get a reference to bs */
3399void bdrv_ref(BlockDriverState *bs)
3400{
3401 bs->refcnt++;
3402}
3403
3404/* Release a previously grabbed reference to bs.
3405 * If after releasing, reference count is zero, the BlockDriverState is
3406 * deleted. */
3407void bdrv_unref(BlockDriverState *bs)
3408{
Jeff Cody9a4d5ca2014-07-23 17:22:57 -04003409 if (!bs) {
3410 return;
3411 }
Fam Zheng9fcb0252013-08-23 09:14:46 +08003412 assert(bs->refcnt > 0);
3413 if (--bs->refcnt == 0) {
3414 bdrv_delete(bs);
3415 }
3416}
3417
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003418struct BdrvOpBlocker {
3419 Error *reason;
3420 QLIST_ENTRY(BdrvOpBlocker) list;
3421};
3422
3423bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
3424{
3425 BdrvOpBlocker *blocker;
3426 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3427 if (!QLIST_EMPTY(&bs->op_blockers[op])) {
3428 blocker = QLIST_FIRST(&bs->op_blockers[op]);
3429 if (errp) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03003430 error_setg(errp, "Node '%s' is busy: %s",
3431 bdrv_get_device_or_node_name(bs),
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003432 error_get_pretty(blocker->reason));
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003433 }
3434 return true;
3435 }
3436 return false;
3437}
3438
3439void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason)
3440{
3441 BdrvOpBlocker *blocker;
3442 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3443
Markus Armbruster5839e532014-08-19 10:31:08 +02003444 blocker = g_new0(BdrvOpBlocker, 1);
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003445 blocker->reason = reason;
3446 QLIST_INSERT_HEAD(&bs->op_blockers[op], blocker, list);
3447}
3448
3449void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason)
3450{
3451 BdrvOpBlocker *blocker, *next;
3452 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3453 QLIST_FOREACH_SAFE(blocker, &bs->op_blockers[op], list, next) {
3454 if (blocker->reason == reason) {
3455 QLIST_REMOVE(blocker, list);
3456 g_free(blocker);
3457 }
3458 }
3459}
3460
3461void bdrv_op_block_all(BlockDriverState *bs, Error *reason)
3462{
3463 int i;
3464 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3465 bdrv_op_block(bs, i, reason);
3466 }
3467}
3468
3469void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason)
3470{
3471 int i;
3472 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3473 bdrv_op_unblock(bs, i, reason);
3474 }
3475}
3476
3477bool bdrv_op_blocker_is_empty(BlockDriverState *bs)
3478{
3479 int i;
3480
3481 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3482 if (!QLIST_EMPTY(&bs->op_blockers[i])) {
3483 return false;
3484 }
3485 }
3486 return true;
3487}
3488
Luiz Capitulino28a72822011-09-26 17:43:50 -03003489void bdrv_iostatus_enable(BlockDriverState *bs)
3490{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003491 bs->iostatus_enabled = true;
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003492 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003493}
3494
3495/* The I/O status is only enabled if the drive explicitly
3496 * enables it _and_ the VM is configured to stop on errors */
3497bool bdrv_iostatus_is_enabled(const BlockDriverState *bs)
3498{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003499 return (bs->iostatus_enabled &&
Paolo Bonzini92aa5c62012-09-28 17:22:55 +02003500 (bs->on_write_error == BLOCKDEV_ON_ERROR_ENOSPC ||
3501 bs->on_write_error == BLOCKDEV_ON_ERROR_STOP ||
3502 bs->on_read_error == BLOCKDEV_ON_ERROR_STOP));
Luiz Capitulino28a72822011-09-26 17:43:50 -03003503}
3504
3505void bdrv_iostatus_disable(BlockDriverState *bs)
3506{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003507 bs->iostatus_enabled = false;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003508}
3509
3510void bdrv_iostatus_reset(BlockDriverState *bs)
3511{
3512 if (bdrv_iostatus_is_enabled(bs)) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003513 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Paolo Bonzini3bd293c2012-10-18 16:49:27 +02003514 if (bs->job) {
3515 block_job_iostatus_reset(bs->job);
3516 }
Luiz Capitulino28a72822011-09-26 17:43:50 -03003517 }
3518}
3519
Luiz Capitulino28a72822011-09-26 17:43:50 -03003520void bdrv_iostatus_set_err(BlockDriverState *bs, int error)
3521{
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003522 assert(bdrv_iostatus_is_enabled(bs));
3523 if (bs->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003524 bs->iostatus = error == ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOSPACE :
3525 BLOCK_DEVICE_IO_STATUS_FAILED;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003526 }
3527}
3528
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003529void bdrv_img_create(const char *filename, const char *fmt,
3530 const char *base_filename, const char *base_fmt,
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003531 char *options, uint64_t img_size, int flags,
3532 Error **errp, bool quiet)
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003533{
Chunyan Liu83d05212014-06-05 17:20:51 +08003534 QemuOptsList *create_opts = NULL;
3535 QemuOpts *opts = NULL;
3536 const char *backing_fmt, *backing_file;
3537 int64_t size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003538 BlockDriver *drv, *proto_drv;
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003539 BlockDriver *backing_drv = NULL;
Max Reitzcc84d902013-09-06 17:14:26 +02003540 Error *local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003541 int ret = 0;
3542
3543 /* Find driver and parse its options */
3544 drv = bdrv_find_format(fmt);
3545 if (!drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003546 error_setg(errp, "Unknown file format '%s'", fmt);
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003547 return;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003548 }
3549
Max Reitzb65a5e12015-02-05 13:58:12 -05003550 proto_drv = bdrv_find_protocol(filename, true, errp);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003551 if (!proto_drv) {
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003552 return;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003553 }
3554
Max Reitzc6149722014-12-02 18:32:45 +01003555 if (!drv->create_opts) {
3556 error_setg(errp, "Format driver '%s' does not support image creation",
3557 drv->format_name);
3558 return;
3559 }
3560
3561 if (!proto_drv->create_opts) {
3562 error_setg(errp, "Protocol driver '%s' does not support image creation",
3563 proto_drv->format_name);
3564 return;
3565 }
3566
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003567 create_opts = qemu_opts_append(create_opts, drv->create_opts);
3568 create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003569
3570 /* Create parameter list with default values */
Chunyan Liu83d05212014-06-05 17:20:51 +08003571 opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
Markus Armbruster39101f22015-02-12 16:46:36 +01003572 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003573
3574 /* Parse -o options */
3575 if (options) {
Markus Armbrusterdc523cd342015-02-12 18:37:11 +01003576 qemu_opts_do_parse(opts, options, NULL, &local_err);
3577 if (local_err) {
3578 error_report_err(local_err);
3579 local_err = NULL;
Chunyan Liu83d05212014-06-05 17:20:51 +08003580 error_setg(errp, "Invalid options for file format '%s'", fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003581 goto out;
3582 }
3583 }
3584
3585 if (base_filename) {
Markus Armbrusterf43e47d2015-02-12 17:52:20 +01003586 qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
Markus Armbruster6be41942015-02-12 17:49:02 +01003587 if (local_err) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003588 error_setg(errp, "Backing file not supported for file format '%s'",
3589 fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003590 goto out;
3591 }
3592 }
3593
3594 if (base_fmt) {
Markus Armbrusterf43e47d2015-02-12 17:52:20 +01003595 qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
Markus Armbruster6be41942015-02-12 17:49:02 +01003596 if (local_err) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003597 error_setg(errp, "Backing file format not supported for file "
3598 "format '%s'", fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003599 goto out;
3600 }
3601 }
3602
Chunyan Liu83d05212014-06-05 17:20:51 +08003603 backing_file = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
3604 if (backing_file) {
3605 if (!strcmp(filename, backing_file)) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003606 error_setg(errp, "Error: Trying to create an image with the "
3607 "same filename as the backing file");
Jes Sorensen792da932010-12-16 13:52:17 +01003608 goto out;
3609 }
3610 }
3611
Chunyan Liu83d05212014-06-05 17:20:51 +08003612 backing_fmt = qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT);
3613 if (backing_fmt) {
3614 backing_drv = bdrv_find_format(backing_fmt);
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003615 if (!backing_drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003616 error_setg(errp, "Unknown backing file format '%s'",
Chunyan Liu83d05212014-06-05 17:20:51 +08003617 backing_fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003618 goto out;
3619 }
3620 }
3621
3622 // The size for the image must always be specified, with one exception:
3623 // If we are using a backing file, we can obtain the size from there
Chunyan Liu83d05212014-06-05 17:20:51 +08003624 size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, 0);
3625 if (size == -1) {
3626 if (backing_file) {
Max Reitz66f6b812013-12-03 14:57:52 +01003627 BlockDriverState *bs;
Max Reitz29168012014-11-26 17:20:27 +01003628 char *full_backing = g_new0(char, PATH_MAX);
Markus Armbruster52bf1e72014-06-26 13:23:25 +02003629 int64_t size;
Paolo Bonzini63090da2012-04-12 14:01:03 +02003630 int back_flags;
3631
Max Reitz29168012014-11-26 17:20:27 +01003632 bdrv_get_full_backing_filename_from_filename(filename, backing_file,
3633 full_backing, PATH_MAX,
3634 &local_err);
3635 if (local_err) {
3636 g_free(full_backing);
3637 goto out;
3638 }
3639
Paolo Bonzini63090da2012-04-12 14:01:03 +02003640 /* backing files always opened read-only */
3641 back_flags =
3642 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003643
Max Reitzf67503e2014-02-18 18:33:05 +01003644 bs = NULL;
Max Reitz29168012014-11-26 17:20:27 +01003645 ret = bdrv_open(&bs, full_backing, NULL, NULL, back_flags,
Max Reitzcc84d902013-09-06 17:14:26 +02003646 backing_drv, &local_err);
Max Reitz29168012014-11-26 17:20:27 +01003647 g_free(full_backing);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003648 if (ret < 0) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003649 goto out;
3650 }
Markus Armbruster52bf1e72014-06-26 13:23:25 +02003651 size = bdrv_getlength(bs);
3652 if (size < 0) {
3653 error_setg_errno(errp, -size, "Could not get size of '%s'",
3654 backing_file);
3655 bdrv_unref(bs);
3656 goto out;
3657 }
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003658
Markus Armbruster39101f22015-02-12 16:46:36 +01003659 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, size, &error_abort);
Max Reitz66f6b812013-12-03 14:57:52 +01003660
3661 bdrv_unref(bs);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003662 } else {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003663 error_setg(errp, "Image creation needs a size parameter");
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003664 goto out;
3665 }
3666 }
3667
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003668 if (!quiet) {
Fam Zheng43c5d8f2014-12-09 15:38:04 +08003669 printf("Formatting '%s', fmt=%s", filename, fmt);
3670 qemu_opts_print(opts, " ");
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003671 puts("");
3672 }
Chunyan Liu83d05212014-06-05 17:20:51 +08003673
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003674 ret = bdrv_create(drv, filename, opts, &local_err);
Chunyan Liu83d05212014-06-05 17:20:51 +08003675
Max Reitzcc84d902013-09-06 17:14:26 +02003676 if (ret == -EFBIG) {
3677 /* This is generally a better message than whatever the driver would
3678 * deliver (especially because of the cluster_size_hint), since that
3679 * is most probably not much different from "image too large". */
3680 const char *cluster_size_hint = "";
Chunyan Liu83d05212014-06-05 17:20:51 +08003681 if (qemu_opt_get_size(opts, BLOCK_OPT_CLUSTER_SIZE, 0)) {
Max Reitzcc84d902013-09-06 17:14:26 +02003682 cluster_size_hint = " (try using a larger cluster size)";
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003683 }
Max Reitzcc84d902013-09-06 17:14:26 +02003684 error_setg(errp, "The image size is too large for file format '%s'"
3685 "%s", fmt, cluster_size_hint);
3686 error_free(local_err);
3687 local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003688 }
3689
3690out:
Chunyan Liu83d05212014-06-05 17:20:51 +08003691 qemu_opts_del(opts);
3692 qemu_opts_free(create_opts);
Markus Armbruster84d18f02014-01-30 15:07:28 +01003693 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +02003694 error_propagate(errp, local_err);
3695 }
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003696}
Stefan Hajnoczi85d126f2013-03-07 13:41:48 +01003697
3698AioContext *bdrv_get_aio_context(BlockDriverState *bs)
3699{
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003700 return bs->aio_context;
3701}
3702
3703void bdrv_detach_aio_context(BlockDriverState *bs)
3704{
Max Reitz33384422014-06-20 21:57:33 +02003705 BdrvAioNotifier *baf;
3706
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003707 if (!bs->drv) {
3708 return;
3709 }
3710
Max Reitz33384422014-06-20 21:57:33 +02003711 QLIST_FOREACH(baf, &bs->aio_notifiers, list) {
3712 baf->detach_aio_context(baf->opaque);
3713 }
3714
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003715 if (bs->io_limits_enabled) {
Benoît Canet0e5b0a22015-06-08 18:17:41 +02003716 throttle_timers_detach_aio_context(&bs->throttle_timers);
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003717 }
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003718 if (bs->drv->bdrv_detach_aio_context) {
3719 bs->drv->bdrv_detach_aio_context(bs);
3720 }
3721 if (bs->file) {
3722 bdrv_detach_aio_context(bs->file);
3723 }
3724 if (bs->backing_hd) {
3725 bdrv_detach_aio_context(bs->backing_hd);
3726 }
3727
3728 bs->aio_context = NULL;
3729}
3730
3731void bdrv_attach_aio_context(BlockDriverState *bs,
3732 AioContext *new_context)
3733{
Max Reitz33384422014-06-20 21:57:33 +02003734 BdrvAioNotifier *ban;
3735
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003736 if (!bs->drv) {
3737 return;
3738 }
3739
3740 bs->aio_context = new_context;
3741
3742 if (bs->backing_hd) {
3743 bdrv_attach_aio_context(bs->backing_hd, new_context);
3744 }
3745 if (bs->file) {
3746 bdrv_attach_aio_context(bs->file, new_context);
3747 }
3748 if (bs->drv->bdrv_attach_aio_context) {
3749 bs->drv->bdrv_attach_aio_context(bs, new_context);
3750 }
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003751 if (bs->io_limits_enabled) {
Benoît Canet0e5b0a22015-06-08 18:17:41 +02003752 throttle_timers_attach_aio_context(&bs->throttle_timers, new_context);
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003753 }
Max Reitz33384422014-06-20 21:57:33 +02003754
3755 QLIST_FOREACH(ban, &bs->aio_notifiers, list) {
3756 ban->attached_aio_context(new_context, ban->opaque);
3757 }
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003758}
3759
3760void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
3761{
3762 bdrv_drain_all(); /* ensure there are no in-flight requests */
3763
3764 bdrv_detach_aio_context(bs);
3765
3766 /* This function executes in the old AioContext so acquire the new one in
3767 * case it runs in a different thread.
3768 */
3769 aio_context_acquire(new_context);
3770 bdrv_attach_aio_context(bs, new_context);
3771 aio_context_release(new_context);
Stefan Hajnoczi85d126f2013-03-07 13:41:48 +01003772}
Stefan Hajnoczid616b222013-06-24 17:13:10 +02003773
Max Reitz33384422014-06-20 21:57:33 +02003774void bdrv_add_aio_context_notifier(BlockDriverState *bs,
3775 void (*attached_aio_context)(AioContext *new_context, void *opaque),
3776 void (*detach_aio_context)(void *opaque), void *opaque)
3777{
3778 BdrvAioNotifier *ban = g_new(BdrvAioNotifier, 1);
3779 *ban = (BdrvAioNotifier){
3780 .attached_aio_context = attached_aio_context,
3781 .detach_aio_context = detach_aio_context,
3782 .opaque = opaque
3783 };
3784
3785 QLIST_INSERT_HEAD(&bs->aio_notifiers, ban, list);
3786}
3787
3788void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
3789 void (*attached_aio_context)(AioContext *,
3790 void *),
3791 void (*detach_aio_context)(void *),
3792 void *opaque)
3793{
3794 BdrvAioNotifier *ban, *ban_next;
3795
3796 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
3797 if (ban->attached_aio_context == attached_aio_context &&
3798 ban->detach_aio_context == detach_aio_context &&
3799 ban->opaque == opaque)
3800 {
3801 QLIST_REMOVE(ban, list);
3802 g_free(ban);
3803
3804 return;
3805 }
3806 }
3807
3808 abort();
3809}
3810
Max Reitz77485432014-10-27 11:12:50 +01003811int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
3812 BlockDriverAmendStatusCB *status_cb)
Max Reitz6f176b42013-09-03 10:09:50 +02003813{
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003814 if (!bs->drv->bdrv_amend_options) {
Max Reitz6f176b42013-09-03 10:09:50 +02003815 return -ENOTSUP;
3816 }
Max Reitz77485432014-10-27 11:12:50 +01003817 return bs->drv->bdrv_amend_options(bs, opts, status_cb);
Max Reitz6f176b42013-09-03 10:09:50 +02003818}
Benoît Canetf6186f42013-10-02 14:33:48 +02003819
Benoît Canetb5042a32014-03-03 19:11:34 +01003820/* This function will be called by the bdrv_recurse_is_first_non_filter method
3821 * of block filter and by bdrv_is_first_non_filter.
3822 * It is used to test if the given bs is the candidate or recurse more in the
3823 * node graph.
Benoît Canet212a5a82014-01-23 21:31:36 +01003824 */
Benoît Canet212a5a82014-01-23 21:31:36 +01003825bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
3826 BlockDriverState *candidate)
Benoît Canetf6186f42013-10-02 14:33:48 +02003827{
Benoît Canetb5042a32014-03-03 19:11:34 +01003828 /* return false if basic checks fails */
3829 if (!bs || !bs->drv) {
3830 return false;
3831 }
3832
3833 /* the code reached a non block filter driver -> check if the bs is
3834 * the same as the candidate. It's the recursion termination condition.
3835 */
3836 if (!bs->drv->is_filter) {
3837 return bs == candidate;
3838 }
3839 /* Down this path the driver is a block filter driver */
3840
3841 /* If the block filter recursion method is defined use it to recurse down
3842 * the node graph.
3843 */
3844 if (bs->drv->bdrv_recurse_is_first_non_filter) {
Benoît Canet212a5a82014-01-23 21:31:36 +01003845 return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate);
3846 }
3847
Benoît Canetb5042a32014-03-03 19:11:34 +01003848 /* the driver is a block filter but don't allow to recurse -> return false
3849 */
3850 return false;
Benoît Canet212a5a82014-01-23 21:31:36 +01003851}
3852
3853/* This function checks if the candidate is the first non filter bs down it's
3854 * bs chain. Since we don't have pointers to parents it explore all bs chains
3855 * from the top. Some filters can choose not to pass down the recursion.
3856 */
3857bool bdrv_is_first_non_filter(BlockDriverState *candidate)
3858{
3859 BlockDriverState *bs;
3860
3861 /* walk down the bs forest recursively */
3862 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
3863 bool perm;
3864
Benoît Canetb5042a32014-03-03 19:11:34 +01003865 /* try to recurse in this top level bs */
Kevin Wolfe6dc8a12014-02-04 11:45:31 +01003866 perm = bdrv_recurse_is_first_non_filter(bs, candidate);
Benoît Canet212a5a82014-01-23 21:31:36 +01003867
3868 /* candidate is the first non filter */
3869 if (perm) {
3870 return true;
3871 }
3872 }
3873
3874 return false;
Benoît Canetf6186f42013-10-02 14:33:48 +02003875}
Benoît Canet09158f02014-06-27 18:25:25 +02003876
3877BlockDriverState *check_to_replace_node(const char *node_name, Error **errp)
3878{
3879 BlockDriverState *to_replace_bs = bdrv_find_node(node_name);
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003880 AioContext *aio_context;
3881
Benoît Canet09158f02014-06-27 18:25:25 +02003882 if (!to_replace_bs) {
3883 error_setg(errp, "Node name '%s' not found", node_name);
3884 return NULL;
3885 }
3886
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003887 aio_context = bdrv_get_aio_context(to_replace_bs);
3888 aio_context_acquire(aio_context);
3889
Benoît Canet09158f02014-06-27 18:25:25 +02003890 if (bdrv_op_is_blocked(to_replace_bs, BLOCK_OP_TYPE_REPLACE, errp)) {
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003891 to_replace_bs = NULL;
3892 goto out;
Benoît Canet09158f02014-06-27 18:25:25 +02003893 }
3894
3895 /* We don't want arbitrary node of the BDS chain to be replaced only the top
3896 * most non filter in order to prevent data corruption.
3897 * Another benefit is that this tests exclude backing files which are
3898 * blocked by the backing blockers.
3899 */
3900 if (!bdrv_is_first_non_filter(to_replace_bs)) {
3901 error_setg(errp, "Only top most non filter can be replaced");
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003902 to_replace_bs = NULL;
3903 goto out;
Benoît Canet09158f02014-06-27 18:25:25 +02003904 }
3905
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003906out:
3907 aio_context_release(aio_context);
Benoît Canet09158f02014-06-27 18:25:25 +02003908 return to_replace_bs;
3909}
Ming Lei448ad912014-07-04 18:04:33 +08003910
Max Reitz91af7012014-07-18 20:24:56 +02003911static bool append_open_options(QDict *d, BlockDriverState *bs)
3912{
3913 const QDictEntry *entry;
3914 bool found_any = false;
3915
3916 for (entry = qdict_first(bs->options); entry;
3917 entry = qdict_next(bs->options, entry))
3918 {
3919 /* Only take options for this level and exclude all non-driver-specific
3920 * options */
3921 if (!strchr(qdict_entry_key(entry), '.') &&
3922 strcmp(qdict_entry_key(entry), "node-name"))
3923 {
3924 qobject_incref(qdict_entry_value(entry));
3925 qdict_put_obj(d, qdict_entry_key(entry), qdict_entry_value(entry));
3926 found_any = true;
3927 }
3928 }
3929
3930 return found_any;
3931}
3932
3933/* Updates the following BDS fields:
3934 * - exact_filename: A filename which may be used for opening a block device
3935 * which (mostly) equals the given BDS (even without any
3936 * other options; so reading and writing must return the same
3937 * results, but caching etc. may be different)
3938 * - full_open_options: Options which, when given when opening a block device
3939 * (without a filename), result in a BDS (mostly)
3940 * equalling the given one
3941 * - filename: If exact_filename is set, it is copied here. Otherwise,
3942 * full_open_options is converted to a JSON object, prefixed with
3943 * "json:" (for use through the JSON pseudo protocol) and put here.
3944 */
3945void bdrv_refresh_filename(BlockDriverState *bs)
3946{
3947 BlockDriver *drv = bs->drv;
3948 QDict *opts;
3949
3950 if (!drv) {
3951 return;
3952 }
3953
3954 /* This BDS's file name will most probably depend on its file's name, so
3955 * refresh that first */
3956 if (bs->file) {
3957 bdrv_refresh_filename(bs->file);
3958 }
3959
3960 if (drv->bdrv_refresh_filename) {
3961 /* Obsolete information is of no use here, so drop the old file name
3962 * information before refreshing it */
3963 bs->exact_filename[0] = '\0';
3964 if (bs->full_open_options) {
3965 QDECREF(bs->full_open_options);
3966 bs->full_open_options = NULL;
3967 }
3968
3969 drv->bdrv_refresh_filename(bs);
3970 } else if (bs->file) {
3971 /* Try to reconstruct valid information from the underlying file */
3972 bool has_open_options;
3973
3974 bs->exact_filename[0] = '\0';
3975 if (bs->full_open_options) {
3976 QDECREF(bs->full_open_options);
3977 bs->full_open_options = NULL;
3978 }
3979
3980 opts = qdict_new();
3981 has_open_options = append_open_options(opts, bs);
3982
3983 /* If no specific options have been given for this BDS, the filename of
3984 * the underlying file should suffice for this one as well */
3985 if (bs->file->exact_filename[0] && !has_open_options) {
3986 strcpy(bs->exact_filename, bs->file->exact_filename);
3987 }
3988 /* Reconstructing the full options QDict is simple for most format block
3989 * drivers, as long as the full options are known for the underlying
3990 * file BDS. The full options QDict of that file BDS should somehow
3991 * contain a representation of the filename, therefore the following
3992 * suffices without querying the (exact_)filename of this BDS. */
3993 if (bs->file->full_open_options) {
3994 qdict_put_obj(opts, "driver",
3995 QOBJECT(qstring_from_str(drv->format_name)));
3996 QINCREF(bs->file->full_open_options);
3997 qdict_put_obj(opts, "file", QOBJECT(bs->file->full_open_options));
3998
3999 bs->full_open_options = opts;
4000 } else {
4001 QDECREF(opts);
4002 }
4003 } else if (!bs->full_open_options && qdict_size(bs->options)) {
4004 /* There is no underlying file BDS (at least referenced by BDS.file),
4005 * so the full options QDict should be equal to the options given
4006 * specifically for this block device when it was opened (plus the
4007 * driver specification).
4008 * Because those options don't change, there is no need to update
4009 * full_open_options when it's already set. */
4010
4011 opts = qdict_new();
4012 append_open_options(opts, bs);
4013 qdict_put_obj(opts, "driver",
4014 QOBJECT(qstring_from_str(drv->format_name)));
4015
4016 if (bs->exact_filename[0]) {
4017 /* This may not work for all block protocol drivers (some may
4018 * require this filename to be parsed), but we have to find some
4019 * default solution here, so just include it. If some block driver
4020 * does not support pure options without any filename at all or
4021 * needs some special format of the options QDict, it needs to
4022 * implement the driver-specific bdrv_refresh_filename() function.
4023 */
4024 qdict_put_obj(opts, "filename",
4025 QOBJECT(qstring_from_str(bs->exact_filename)));
4026 }
4027
4028 bs->full_open_options = opts;
4029 }
4030
4031 if (bs->exact_filename[0]) {
4032 pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename);
4033 } else if (bs->full_open_options) {
4034 QString *json = qobject_to_json(QOBJECT(bs->full_open_options));
4035 snprintf(bs->filename, sizeof(bs->filename), "json:%s",
4036 qstring_get_str(json));
4037 QDECREF(json);
4038 }
4039}
Benoît Canet5366d0c2014-09-05 15:46:18 +02004040
4041/* This accessor function purpose is to allow the device models to access the
4042 * BlockAcctStats structure embedded inside a BlockDriverState without being
4043 * aware of the BlockDriverState structure layout.
4044 * It will go away when the BlockAcctStats structure will be moved inside
4045 * the device models.
4046 */
4047BlockAcctStats *bdrv_get_stats(BlockDriverState *bs)
4048{
4049 return &bs->stats;
4050}