blob: 1bc0e7394bcdde43fc7dc4a79ab9313a1c0081a5 [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"
bellardfc01f7e2003-06-30 10:03:06 +000039
Juan Quintela71e72a12009-07-27 16:12:56 +020040#ifdef CONFIG_BSD
bellard7674e7b2005-04-26 21:59:26 +000041#include <sys/types.h>
42#include <sys/stat.h>
43#include <sys/ioctl.h>
Blue Swirl72cf2d42009-09-12 07:36:22 +000044#include <sys/queue.h>
blueswir1c5e97232009-03-07 20:06:23 +000045#ifndef __DragonFly__
bellard7674e7b2005-04-26 21:59:26 +000046#include <sys/disk.h>
47#endif
blueswir1c5e97232009-03-07 20:06:23 +000048#endif
bellard7674e7b2005-04-26 21:59:26 +000049
aliguori49dc7682009-03-08 16:26:59 +000050#ifdef _WIN32
51#include <windows.h>
52#endif
53
John Snow9bd2b082015-04-17 19:49:57 -040054/**
55 * A BdrvDirtyBitmap can be in three possible states:
56 * (1) successor is NULL and disabled is false: full r/w mode
57 * (2) successor is NULL and disabled is true: read only mode ("disabled")
58 * (3) successor is set: frozen mode.
59 * A frozen bitmap cannot be renamed, deleted, anonymized, cleared, set,
60 * or enabled. A frozen bitmap can only abdicate() or reclaim().
61 */
Fam Zhenge4654d22013-11-13 18:29:43 +080062struct BdrvDirtyBitmap {
John Snowaa0c7ca2015-04-17 19:50:01 -040063 HBitmap *bitmap; /* Dirty sector bitmap implementation */
64 BdrvDirtyBitmap *successor; /* Anonymous child; implies frozen status */
65 char *name; /* Optional non-empty unique ID */
66 int64_t size; /* Size of the bitmap (Number of sectors) */
67 bool disabled; /* Bitmap is read-only */
Fam Zhenge4654d22013-11-13 18:29:43 +080068 QLIST_ENTRY(BdrvDirtyBitmap) list;
69};
70
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +010071#define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */
72
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +010073static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
74 QTAILQ_HEAD_INITIALIZER(bdrv_states);
blueswir17ee930d2008-09-17 19:04:14 +000075
Benoît Canetdc364f42014-01-23 21:31:32 +010076static QTAILQ_HEAD(, BlockDriverState) graph_bdrv_states =
77 QTAILQ_HEAD_INITIALIZER(graph_bdrv_states);
78
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +010079static QLIST_HEAD(, BlockDriver) bdrv_drivers =
80 QLIST_HEAD_INITIALIZER(bdrv_drivers);
bellardea2384d2004-08-01 21:59:26 +000081
John Snowce1ffea2015-04-17 19:50:03 -040082static void bdrv_dirty_bitmap_truncate(BlockDriverState *bs);
Markus Armbrustereb852012009-10-27 18:41:44 +010083/* If non-zero, use only whitelisted block drivers */
84static int use_bdrv_whitelist;
85
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +000086#ifdef _WIN32
87static int is_windows_drive_prefix(const char *filename)
88{
89 return (((filename[0] >= 'a' && filename[0] <= 'z') ||
90 (filename[0] >= 'A' && filename[0] <= 'Z')) &&
91 filename[1] == ':');
92}
93
94int is_windows_drive(const char *filename)
95{
96 if (is_windows_drive_prefix(filename) &&
97 filename[2] == '\0')
98 return 1;
99 if (strstart(filename, "\\\\.\\", NULL) ||
100 strstart(filename, "//./", NULL))
101 return 1;
102 return 0;
103}
104#endif
105
Kevin Wolf339064d2013-11-28 10:23:32 +0100106size_t bdrv_opt_mem_align(BlockDriverState *bs)
107{
108 if (!bs || !bs->drv) {
Denis V. Lunev459b4e62015-05-12 17:30:56 +0300109 /* page size or 4k (hdd sector size) should be on the safe side */
110 return MAX(4096, getpagesize());
Kevin Wolf339064d2013-11-28 10:23:32 +0100111 }
112
113 return bs->bl.opt_mem_alignment;
114}
115
Denis V. Lunev4196d2f2015-05-12 17:30:55 +0300116size_t bdrv_min_mem_align(BlockDriverState *bs)
117{
118 if (!bs || !bs->drv) {
Denis V. Lunev459b4e62015-05-12 17:30:56 +0300119 /* page size or 4k (hdd sector size) should be on the safe side */
120 return MAX(4096, getpagesize());
Denis V. Lunev4196d2f2015-05-12 17:30:55 +0300121 }
122
123 return bs->bl.min_mem_alignment;
124}
125
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000126/* check if the path starts with "<protocol>:" */
Max Reitz5c984152014-12-03 14:57:22 +0100127int path_has_protocol(const char *path)
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000128{
Paolo Bonzini947995c2012-05-08 16:51:48 +0200129 const char *p;
130
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000131#ifdef _WIN32
132 if (is_windows_drive(path) ||
133 is_windows_drive_prefix(path)) {
134 return 0;
135 }
Paolo Bonzini947995c2012-05-08 16:51:48 +0200136 p = path + strcspn(path, ":/\\");
137#else
138 p = path + strcspn(path, ":/");
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000139#endif
140
Paolo Bonzini947995c2012-05-08 16:51:48 +0200141 return *p == ':';
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000142}
143
bellard83f64092006-08-01 16:21:11 +0000144int path_is_absolute(const char *path)
145{
bellard21664422007-01-07 18:22:37 +0000146#ifdef _WIN32
147 /* specific case for names like: "\\.\d:" */
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200148 if (is_windows_drive(path) || is_windows_drive_prefix(path)) {
bellard21664422007-01-07 18:22:37 +0000149 return 1;
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200150 }
151 return (*path == '/' || *path == '\\');
bellard3b9f94e2007-01-07 17:27:07 +0000152#else
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200153 return (*path == '/');
bellard3b9f94e2007-01-07 17:27:07 +0000154#endif
bellard83f64092006-08-01 16:21:11 +0000155}
156
157/* if filename is absolute, just copy it to dest. Otherwise, build a
158 path to it by considering it is relative to base_path. URL are
159 supported. */
160void path_combine(char *dest, int dest_size,
161 const char *base_path,
162 const char *filename)
163{
164 const char *p, *p1;
165 int len;
166
167 if (dest_size <= 0)
168 return;
169 if (path_is_absolute(filename)) {
170 pstrcpy(dest, dest_size, filename);
171 } else {
172 p = strchr(base_path, ':');
173 if (p)
174 p++;
175 else
176 p = base_path;
bellard3b9f94e2007-01-07 17:27:07 +0000177 p1 = strrchr(base_path, '/');
178#ifdef _WIN32
179 {
180 const char *p2;
181 p2 = strrchr(base_path, '\\');
182 if (!p1 || p2 > p1)
183 p1 = p2;
184 }
185#endif
bellard83f64092006-08-01 16:21:11 +0000186 if (p1)
187 p1++;
188 else
189 p1 = base_path;
190 if (p1 > p)
191 p = p1;
192 len = p - base_path;
193 if (len > dest_size - 1)
194 len = dest_size - 1;
195 memcpy(dest, base_path, len);
196 dest[len] = '\0';
197 pstrcat(dest, dest_size, filename);
198 }
199}
200
Max Reitz0a828552014-11-26 17:20:25 +0100201void bdrv_get_full_backing_filename_from_filename(const char *backed,
202 const char *backing,
Max Reitz9f074292014-11-26 17:20:26 +0100203 char *dest, size_t sz,
204 Error **errp)
Max Reitz0a828552014-11-26 17:20:25 +0100205{
Max Reitz9f074292014-11-26 17:20:26 +0100206 if (backing[0] == '\0' || path_has_protocol(backing) ||
207 path_is_absolute(backing))
208 {
Max Reitz0a828552014-11-26 17:20:25 +0100209 pstrcpy(dest, sz, backing);
Max Reitz9f074292014-11-26 17:20:26 +0100210 } else if (backed[0] == '\0' || strstart(backed, "json:", NULL)) {
211 error_setg(errp, "Cannot use relative backing file names for '%s'",
212 backed);
Max Reitz0a828552014-11-26 17:20:25 +0100213 } else {
214 path_combine(dest, sz, backed, backing);
215 }
216}
217
Max Reitz9f074292014-11-26 17:20:26 +0100218void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz,
219 Error **errp)
Paolo Bonzinidc5a1372012-05-08 16:51:50 +0200220{
Max Reitz9f074292014-11-26 17:20:26 +0100221 char *backed = bs->exact_filename[0] ? bs->exact_filename : bs->filename;
222
223 bdrv_get_full_backing_filename_from_filename(backed, bs->backing_file,
224 dest, sz, errp);
Paolo Bonzinidc5a1372012-05-08 16:51:50 +0200225}
226
Stefan Hajnoczi0eb72172015-04-28 14:27:51 +0100227void bdrv_register(BlockDriver *bdrv)
228{
229 bdrv_setup_io_funcs(bdrv);
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +0200230
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100231 QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
bellardea2384d2004-08-01 21:59:26 +0000232}
bellardb3380822004-03-14 21:38:54 +0000233
Markus Armbruster7f06d472014-10-07 13:59:12 +0200234BlockDriverState *bdrv_new_root(void)
bellardfc01f7e2003-06-30 10:03:06 +0000235{
Markus Armbruster7f06d472014-10-07 13:59:12 +0200236 BlockDriverState *bs = bdrv_new();
Markus Armbrustere4e99862014-10-07 13:59:03 +0200237
Markus Armbrustere4e99862014-10-07 13:59:03 +0200238 QTAILQ_INSERT_TAIL(&bdrv_states, bs, device_list);
Markus Armbrustere4e99862014-10-07 13:59:03 +0200239 return bs;
240}
241
242BlockDriverState *bdrv_new(void)
243{
244 BlockDriverState *bs;
245 int i;
246
Markus Armbruster5839e532014-08-19 10:31:08 +0200247 bs = g_new0(BlockDriverState, 1);
Fam Zhenge4654d22013-11-13 18:29:43 +0800248 QLIST_INIT(&bs->dirty_bitmaps);
Fam Zhengfbe40ff2014-05-23 21:29:42 +0800249 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
250 QLIST_INIT(&bs->op_blockers[i]);
251 }
Luiz Capitulino28a72822011-09-26 17:43:50 -0300252 bdrv_iostatus_disable(bs);
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200253 notifier_list_init(&bs->close_notifiers);
Stefan Hajnoczid616b222013-06-24 17:13:10 +0200254 notifier_with_return_list_init(&bs->before_write_notifiers);
Benoît Canetcc0681c2013-09-02 14:14:39 +0200255 qemu_co_queue_init(&bs->throttled_reqs[0]);
256 qemu_co_queue_init(&bs->throttled_reqs[1]);
Fam Zheng9fcb0252013-08-23 09:14:46 +0800257 bs->refcnt = 1;
Stefan Hajnoczidcd04222014-05-08 16:34:37 +0200258 bs->aio_context = qemu_get_aio_context();
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200259
bellardb3380822004-03-14 21:38:54 +0000260 return bs;
261}
262
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200263void bdrv_add_close_notifier(BlockDriverState *bs, Notifier *notify)
264{
265 notifier_list_add(&bs->close_notifiers, notify);
266}
267
bellardea2384d2004-08-01 21:59:26 +0000268BlockDriver *bdrv_find_format(const char *format_name)
269{
270 BlockDriver *drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100271 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
272 if (!strcmp(drv1->format_name, format_name)) {
bellardea2384d2004-08-01 21:59:26 +0000273 return drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100274 }
bellardea2384d2004-08-01 21:59:26 +0000275 }
276 return NULL;
277}
278
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800279static int bdrv_is_whitelisted(BlockDriver *drv, bool read_only)
Markus Armbrustereb852012009-10-27 18:41:44 +0100280{
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800281 static const char *whitelist_rw[] = {
282 CONFIG_BDRV_RW_WHITELIST
283 };
284 static const char *whitelist_ro[] = {
285 CONFIG_BDRV_RO_WHITELIST
Markus Armbrustereb852012009-10-27 18:41:44 +0100286 };
287 const char **p;
288
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800289 if (!whitelist_rw[0] && !whitelist_ro[0]) {
Markus Armbrustereb852012009-10-27 18:41:44 +0100290 return 1; /* no whitelist, anything goes */
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800291 }
Markus Armbrustereb852012009-10-27 18:41:44 +0100292
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800293 for (p = whitelist_rw; *p; p++) {
Markus Armbrustereb852012009-10-27 18:41:44 +0100294 if (!strcmp(drv->format_name, *p)) {
295 return 1;
296 }
297 }
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800298 if (read_only) {
299 for (p = whitelist_ro; *p; p++) {
300 if (!strcmp(drv->format_name, *p)) {
301 return 1;
302 }
303 }
304 }
Markus Armbrustereb852012009-10-27 18:41:44 +0100305 return 0;
306}
307
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800308BlockDriver *bdrv_find_whitelisted_format(const char *format_name,
309 bool read_only)
Markus Armbrustereb852012009-10-27 18:41:44 +0100310{
311 BlockDriver *drv = bdrv_find_format(format_name);
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800312 return drv && bdrv_is_whitelisted(drv, read_only) ? drv : NULL;
Markus Armbrustereb852012009-10-27 18:41:44 +0100313}
314
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800315typedef struct CreateCo {
316 BlockDriver *drv;
317 char *filename;
Chunyan Liu83d05212014-06-05 17:20:51 +0800318 QemuOpts *opts;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800319 int ret;
Max Reitzcc84d902013-09-06 17:14:26 +0200320 Error *err;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800321} CreateCo;
322
323static void coroutine_fn bdrv_create_co_entry(void *opaque)
324{
Max Reitzcc84d902013-09-06 17:14:26 +0200325 Error *local_err = NULL;
326 int ret;
327
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800328 CreateCo *cco = opaque;
329 assert(cco->drv);
330
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800331 ret = cco->drv->bdrv_create(cco->filename, cco->opts, &local_err);
Markus Armbruster84d18f02014-01-30 15:07:28 +0100332 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200333 error_propagate(&cco->err, local_err);
334 }
335 cco->ret = ret;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800336}
337
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200338int bdrv_create(BlockDriver *drv, const char* filename,
Chunyan Liu83d05212014-06-05 17:20:51 +0800339 QemuOpts *opts, Error **errp)
bellardea2384d2004-08-01 21:59:26 +0000340{
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800341 int ret;
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200342
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800343 Coroutine *co;
344 CreateCo cco = {
345 .drv = drv,
346 .filename = g_strdup(filename),
Chunyan Liu83d05212014-06-05 17:20:51 +0800347 .opts = opts,
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800348 .ret = NOT_DONE,
Max Reitzcc84d902013-09-06 17:14:26 +0200349 .err = NULL,
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800350 };
351
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800352 if (!drv->bdrv_create) {
Max Reitzcc84d902013-09-06 17:14:26 +0200353 error_setg(errp, "Driver '%s' does not support image creation", drv->format_name);
Luiz Capitulino80168bf2012-10-17 16:45:25 -0300354 ret = -ENOTSUP;
355 goto out;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800356 }
357
358 if (qemu_in_coroutine()) {
359 /* Fast-path if already in coroutine context */
360 bdrv_create_co_entry(&cco);
361 } else {
362 co = qemu_coroutine_create(bdrv_create_co_entry);
363 qemu_coroutine_enter(co, &cco);
364 while (cco.ret == NOT_DONE) {
Paolo Bonzinib47ec2c2014-07-07 15:18:01 +0200365 aio_poll(qemu_get_aio_context(), true);
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800366 }
367 }
368
369 ret = cco.ret;
Max Reitzcc84d902013-09-06 17:14:26 +0200370 if (ret < 0) {
Markus Armbruster84d18f02014-01-30 15:07:28 +0100371 if (cco.err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200372 error_propagate(errp, cco.err);
373 } else {
374 error_setg_errno(errp, -ret, "Could not create image");
375 }
376 }
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800377
Luiz Capitulino80168bf2012-10-17 16:45:25 -0300378out:
379 g_free(cco.filename);
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800380 return ret;
bellardea2384d2004-08-01 21:59:26 +0000381}
382
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800383int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200384{
385 BlockDriver *drv;
Max Reitzcc84d902013-09-06 17:14:26 +0200386 Error *local_err = NULL;
387 int ret;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200388
Max Reitzb65a5e12015-02-05 13:58:12 -0500389 drv = bdrv_find_protocol(filename, true, errp);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200390 if (drv == NULL) {
Stefan Hajnoczi16905d72010-11-30 15:14:14 +0000391 return -ENOENT;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200392 }
393
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800394 ret = bdrv_create(drv, filename, opts, &local_err);
Markus Armbruster84d18f02014-01-30 15:07:28 +0100395 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200396 error_propagate(errp, local_err);
397 }
398 return ret;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200399}
400
Ekaterina Tumanova892b7de2015-02-16 12:47:54 +0100401/**
402 * Try to get @bs's logical and physical block size.
403 * On success, store them in @bsz struct and return 0.
404 * On failure return -errno.
405 * @bs must not be empty.
406 */
407int bdrv_probe_blocksizes(BlockDriverState *bs, BlockSizes *bsz)
408{
409 BlockDriver *drv = bs->drv;
410
411 if (drv && drv->bdrv_probe_blocksizes) {
412 return drv->bdrv_probe_blocksizes(bs, bsz);
413 }
414
415 return -ENOTSUP;
416}
417
418/**
419 * Try to get @bs's geometry (cyls, heads, sectors).
420 * On success, store them in @geo struct and return 0.
421 * On failure return -errno.
422 * @bs must not be empty.
423 */
424int bdrv_probe_geometry(BlockDriverState *bs, HDGeometry *geo)
425{
426 BlockDriver *drv = bs->drv;
427
428 if (drv && drv->bdrv_probe_geometry) {
429 return drv->bdrv_probe_geometry(bs, geo);
430 }
431
432 return -ENOTSUP;
433}
434
Jim Meyeringeba25052012-05-28 09:27:54 +0200435/*
436 * Create a uniquely-named empty temporary file.
437 * Return 0 upon success, otherwise a negative errno value.
438 */
439int get_tmp_filename(char *filename, int size)
440{
bellardd5249392004-08-03 21:14:23 +0000441#ifdef _WIN32
bellard3b9f94e2007-01-07 17:27:07 +0000442 char temp_dir[MAX_PATH];
Jim Meyeringeba25052012-05-28 09:27:54 +0200443 /* GetTempFileName requires that its output buffer (4th param)
444 have length MAX_PATH or greater. */
445 assert(size >= MAX_PATH);
446 return (GetTempPath(MAX_PATH, temp_dir)
447 && GetTempFileName(temp_dir, "qem", 0, filename)
448 ? 0 : -GetLastError());
bellardd5249392004-08-03 21:14:23 +0000449#else
bellardea2384d2004-08-01 21:59:26 +0000450 int fd;
blueswir17ccfb2e2008-09-14 06:45:34 +0000451 const char *tmpdir;
aurel320badc1e2008-03-10 00:05:34 +0000452 tmpdir = getenv("TMPDIR");
Amit Shah69bef792014-02-26 15:12:37 +0530453 if (!tmpdir) {
454 tmpdir = "/var/tmp";
455 }
Jim Meyeringeba25052012-05-28 09:27:54 +0200456 if (snprintf(filename, size, "%s/vl.XXXXXX", tmpdir) >= size) {
457 return -EOVERFLOW;
458 }
bellardea2384d2004-08-01 21:59:26 +0000459 fd = mkstemp(filename);
Dunrong Huangfe235a02012-09-05 21:26:22 +0800460 if (fd < 0) {
461 return -errno;
462 }
463 if (close(fd) != 0) {
464 unlink(filename);
Jim Meyeringeba25052012-05-28 09:27:54 +0200465 return -errno;
466 }
467 return 0;
bellardd5249392004-08-03 21:14:23 +0000468#endif
Jim Meyeringeba25052012-05-28 09:27:54 +0200469}
bellardea2384d2004-08-01 21:59:26 +0000470
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200471/*
472 * Detect host devices. By convention, /dev/cdrom[N] is always
473 * recognized as a host CDROM.
474 */
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200475static BlockDriver *find_hdev_driver(const char *filename)
476{
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200477 int score_max = 0, score;
478 BlockDriver *drv = NULL, *d;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200479
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100480 QLIST_FOREACH(d, &bdrv_drivers, list) {
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200481 if (d->bdrv_probe_device) {
482 score = d->bdrv_probe_device(filename);
483 if (score > score_max) {
484 score_max = score;
485 drv = d;
486 }
487 }
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200488 }
489
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200490 return drv;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200491}
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200492
Kevin Wolf98289622013-07-10 15:47:39 +0200493BlockDriver *bdrv_find_protocol(const char *filename,
Max Reitzb65a5e12015-02-05 13:58:12 -0500494 bool allow_protocol_prefix,
495 Error **errp)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200496{
497 BlockDriver *drv1;
498 char protocol[128];
499 int len;
500 const char *p;
501
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200502 /* TODO Drivers without bdrv_file_open must be specified explicitly */
503
Christoph Hellwig39508e72010-06-23 12:25:17 +0200504 /*
505 * XXX(hch): we really should not let host device detection
506 * override an explicit protocol specification, but moving this
507 * later breaks access to device names with colons in them.
508 * Thanks to the brain-dead persistent naming schemes on udev-
509 * based Linux systems those actually are quite common.
510 */
511 drv1 = find_hdev_driver(filename);
512 if (drv1) {
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200513 return drv1;
514 }
Christoph Hellwig39508e72010-06-23 12:25:17 +0200515
Kevin Wolf98289622013-07-10 15:47:39 +0200516 if (!path_has_protocol(filename) || !allow_protocol_prefix) {
Max Reitzef810432014-12-02 18:32:42 +0100517 return &bdrv_file;
Christoph Hellwig39508e72010-06-23 12:25:17 +0200518 }
Kevin Wolf98289622013-07-10 15:47:39 +0200519
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000520 p = strchr(filename, ':');
521 assert(p != NULL);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200522 len = p - filename;
523 if (len > sizeof(protocol) - 1)
524 len = sizeof(protocol) - 1;
525 memcpy(protocol, filename, len);
526 protocol[len] = '\0';
527 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
528 if (drv1->protocol_name &&
529 !strcmp(drv1->protocol_name, protocol)) {
530 return drv1;
531 }
532 }
Max Reitzb65a5e12015-02-05 13:58:12 -0500533
534 error_setg(errp, "Unknown protocol '%s'", protocol);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200535 return NULL;
536}
537
Markus Armbrusterc6684242014-11-20 16:27:10 +0100538/*
539 * Guess image format by probing its contents.
540 * This is not a good idea when your image is raw (CVE-2008-2004), but
541 * we do it anyway for backward compatibility.
542 *
543 * @buf contains the image's first @buf_size bytes.
Kevin Wolf7cddd372014-11-20 16:27:11 +0100544 * @buf_size is the buffer size in bytes (generally BLOCK_PROBE_BUF_SIZE,
545 * but can be smaller if the image file is smaller)
Markus Armbrusterc6684242014-11-20 16:27:10 +0100546 * @filename is its filename.
547 *
548 * For all block drivers, call the bdrv_probe() method to get its
549 * probing score.
550 * Return the first block driver with the highest probing score.
551 */
Kevin Wolf38f3ef52014-11-20 16:27:12 +0100552BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size,
553 const char *filename)
Markus Armbrusterc6684242014-11-20 16:27:10 +0100554{
555 int score_max = 0, score;
556 BlockDriver *drv = NULL, *d;
557
558 QLIST_FOREACH(d, &bdrv_drivers, list) {
559 if (d->bdrv_probe) {
560 score = d->bdrv_probe(buf, buf_size, filename);
561 if (score > score_max) {
562 score_max = score;
563 drv = d;
564 }
565 }
566 }
567
568 return drv;
569}
570
Kevin Wolff500a6d2012-11-12 17:35:27 +0100571static int find_image_format(BlockDriverState *bs, const char *filename,
Max Reitz34b5d2c2013-09-05 14:45:29 +0200572 BlockDriver **pdrv, Error **errp)
bellardea2384d2004-08-01 21:59:26 +0000573{
Markus Armbrusterc6684242014-11-20 16:27:10 +0100574 BlockDriver *drv;
Kevin Wolf7cddd372014-11-20 16:27:11 +0100575 uint8_t buf[BLOCK_PROBE_BUF_SIZE];
Kevin Wolff500a6d2012-11-12 17:35:27 +0100576 int ret = 0;
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700577
Kevin Wolf08a00552010-06-01 18:37:31 +0200578 /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
Paolo Bonzini8e895592013-01-10 15:39:27 +0100579 if (bs->sg || !bdrv_is_inserted(bs) || bdrv_getlength(bs) == 0) {
Max Reitzef810432014-12-02 18:32:42 +0100580 *pdrv = &bdrv_raw;
Stefan Weilc98ac352010-07-21 21:51:51 +0200581 return ret;
Nicholas A. Bellinger1a396852010-05-27 08:56:28 -0700582 }
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700583
bellard83f64092006-08-01 16:21:11 +0000584 ret = bdrv_pread(bs, 0, buf, sizeof(buf));
bellard83f64092006-08-01 16:21:11 +0000585 if (ret < 0) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200586 error_setg_errno(errp, -ret, "Could not read image for determining its "
587 "format");
Stefan Weilc98ac352010-07-21 21:51:51 +0200588 *pdrv = NULL;
589 return ret;
bellard83f64092006-08-01 16:21:11 +0000590 }
591
Markus Armbrusterc6684242014-11-20 16:27:10 +0100592 drv = bdrv_probe_all(buf, ret, filename);
Stefan Weilc98ac352010-07-21 21:51:51 +0200593 if (!drv) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200594 error_setg(errp, "Could not determine image format: No compatible "
595 "driver found");
Stefan Weilc98ac352010-07-21 21:51:51 +0200596 ret = -ENOENT;
597 }
598 *pdrv = drv;
599 return ret;
bellardea2384d2004-08-01 21:59:26 +0000600}
601
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100602/**
603 * Set the current 'total_sectors' value
Markus Armbruster65a9bb22014-06-26 13:23:17 +0200604 * Return 0 on success, -errno on error.
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100605 */
606static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
607{
608 BlockDriver *drv = bs->drv;
609
Nicholas Bellinger396759a2010-05-17 09:46:04 -0700610 /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
611 if (bs->sg)
612 return 0;
613
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100614 /* query actual device if possible, otherwise just trust the hint */
615 if (drv->bdrv_getlength) {
616 int64_t length = drv->bdrv_getlength(bs);
617 if (length < 0) {
618 return length;
619 }
Fam Zheng7e382002013-11-06 19:48:06 +0800620 hint = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE);
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100621 }
622
623 bs->total_sectors = hint;
624 return 0;
625}
626
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100627/**
Paolo Bonzini9e8f1832013-02-08 14:06:11 +0100628 * Set open flags for a given discard mode
629 *
630 * Return 0 on success, -1 if the discard mode was invalid.
631 */
632int bdrv_parse_discard_flags(const char *mode, int *flags)
633{
634 *flags &= ~BDRV_O_UNMAP;
635
636 if (!strcmp(mode, "off") || !strcmp(mode, "ignore")) {
637 /* do nothing */
638 } else if (!strcmp(mode, "on") || !strcmp(mode, "unmap")) {
639 *flags |= BDRV_O_UNMAP;
640 } else {
641 return -1;
642 }
643
644 return 0;
645}
646
647/**
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100648 * Set open flags for a given cache mode
649 *
650 * Return 0 on success, -1 if the cache mode was invalid.
651 */
652int bdrv_parse_cache_flags(const char *mode, int *flags)
653{
654 *flags &= ~BDRV_O_CACHE_MASK;
655
656 if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
657 *flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
Stefan Hajnoczi92196b22011-08-04 12:26:52 +0100658 } else if (!strcmp(mode, "directsync")) {
659 *flags |= BDRV_O_NOCACHE;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100660 } else if (!strcmp(mode, "writeback")) {
661 *flags |= BDRV_O_CACHE_WB;
662 } else if (!strcmp(mode, "unsafe")) {
663 *flags |= BDRV_O_CACHE_WB;
664 *flags |= BDRV_O_NO_FLUSH;
665 } else if (!strcmp(mode, "writethrough")) {
666 /* this is the default */
667 } else {
668 return -1;
669 }
670
671 return 0;
672}
673
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200674/*
Kevin Wolfb1e6fc02014-05-06 12:11:42 +0200675 * Returns the flags that a temporary snapshot should get, based on the
676 * originally requested flags (the originally requested image will have flags
677 * like a backing file)
678 */
679static int bdrv_temp_snapshot_flags(int flags)
680{
681 return (flags & ~BDRV_O_SNAPSHOT) | BDRV_O_TEMPORARY;
682}
683
684/*
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200685 * Returns the flags that bs->file should get, based on the given flags for
686 * the parent BDS
687 */
688static int bdrv_inherited_flags(int flags)
689{
690 /* Enable protocol handling, disable format probing for bs->file */
691 flags |= BDRV_O_PROTOCOL;
692
693 /* Our block drivers take care to send flushes and respect unmap policy,
694 * so we can enable both unconditionally on lower layers. */
695 flags |= BDRV_O_CACHE_WB | BDRV_O_UNMAP;
696
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200697 /* Clear flags that only apply to the top layer */
Kevin Wolf5669b442014-04-11 21:36:45 +0200698 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ);
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200699
700 return flags;
701}
702
Kevin Wolf317fc442014-04-25 13:27:34 +0200703/*
704 * Returns the flags that bs->backing_hd should get, based on the given flags
705 * for the parent BDS
706 */
707static int bdrv_backing_flags(int flags)
708{
709 /* backing files always opened read-only */
710 flags &= ~(BDRV_O_RDWR | BDRV_O_COPY_ON_READ);
711
712 /* snapshot=on is handled on the top layer */
Kevin Wolf8bfea152014-04-11 19:16:36 +0200713 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_TEMPORARY);
Kevin Wolf317fc442014-04-25 13:27:34 +0200714
715 return flags;
716}
717
Kevin Wolf7b272452012-11-12 17:05:39 +0100718static int bdrv_open_flags(BlockDriverState *bs, int flags)
719{
720 int open_flags = flags | BDRV_O_CACHE_WB;
721
722 /*
723 * Clear flags that are internal to the block layer before opening the
724 * image.
725 */
Kevin Wolf20cca272014-06-04 14:33:27 +0200726 open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_PROTOCOL);
Kevin Wolf7b272452012-11-12 17:05:39 +0100727
728 /*
729 * Snapshots should be writable.
730 */
Kevin Wolf8bfea152014-04-11 19:16:36 +0200731 if (flags & BDRV_O_TEMPORARY) {
Kevin Wolf7b272452012-11-12 17:05:39 +0100732 open_flags |= BDRV_O_RDWR;
733 }
734
735 return open_flags;
736}
737
Kevin Wolf636ea372014-01-24 14:11:52 +0100738static void bdrv_assign_node_name(BlockDriverState *bs,
739 const char *node_name,
740 Error **errp)
Benoît Canet6913c0c2014-01-23 21:31:33 +0100741{
742 if (!node_name) {
Kevin Wolf636ea372014-01-24 14:11:52 +0100743 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100744 }
745
Kevin Wolf9aebf3b2014-09-25 09:54:02 +0200746 /* Check for empty string or invalid characters */
Markus Armbrusterf5bebbb2014-09-30 13:59:30 +0200747 if (!id_wellformed(node_name)) {
Kevin Wolf9aebf3b2014-09-25 09:54:02 +0200748 error_setg(errp, "Invalid node name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100749 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100750 }
751
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100752 /* takes care of avoiding namespaces collisions */
Markus Armbruster7f06d472014-10-07 13:59:12 +0200753 if (blk_by_name(node_name)) {
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100754 error_setg(errp, "node-name=%s is conflicting with a device id",
755 node_name);
Kevin Wolf636ea372014-01-24 14:11:52 +0100756 return;
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100757 }
758
Benoît Canet6913c0c2014-01-23 21:31:33 +0100759 /* takes care of avoiding duplicates node names */
760 if (bdrv_find_node(node_name)) {
761 error_setg(errp, "Duplicate node name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100762 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100763 }
764
765 /* copy node name into the bs and insert it into the graph list */
766 pstrcpy(bs->node_name, sizeof(bs->node_name), node_name);
767 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs, node_list);
Benoît Canet6913c0c2014-01-23 21:31:33 +0100768}
769
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200770/*
Kevin Wolf57915332010-04-14 15:24:50 +0200771 * Common part for opening disk images and files
Kevin Wolfb6ad4912013-03-15 10:35:04 +0100772 *
773 * Removes all processed options from *options.
Kevin Wolf57915332010-04-14 15:24:50 +0200774 */
Kevin Wolff500a6d2012-11-12 17:35:27 +0100775static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
Max Reitz34b5d2c2013-09-05 14:45:29 +0200776 QDict *options, int flags, BlockDriver *drv, Error **errp)
Kevin Wolf57915332010-04-14 15:24:50 +0200777{
778 int ret, open_flags;
Kevin Wolf035fccd2013-04-09 14:34:19 +0200779 const char *filename;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100780 const char *node_name = NULL;
Max Reitz34b5d2c2013-09-05 14:45:29 +0200781 Error *local_err = NULL;
Kevin Wolf57915332010-04-14 15:24:50 +0200782
783 assert(drv != NULL);
Paolo Bonzini64058752012-05-08 16:51:49 +0200784 assert(bs->file == NULL);
Kevin Wolf707ff822013-03-06 12:20:31 +0100785 assert(options != NULL && bs->options != options);
Kevin Wolf57915332010-04-14 15:24:50 +0200786
Kevin Wolf45673672013-04-22 17:48:40 +0200787 if (file != NULL) {
788 filename = file->filename;
789 } else {
790 filename = qdict_get_try_str(options, "filename");
791 }
792
Kevin Wolf765003d2014-02-03 14:49:42 +0100793 if (drv->bdrv_needs_filename && !filename) {
794 error_setg(errp, "The '%s' block driver requires a file name",
795 drv->format_name);
796 return -EINVAL;
797 }
798
Kevin Wolf45673672013-04-22 17:48:40 +0200799 trace_bdrv_open_common(bs, filename ?: "", flags, drv->format_name);
Stefan Hajnoczi28dcee12011-09-22 20:14:12 +0100800
Benoît Canet6913c0c2014-01-23 21:31:33 +0100801 node_name = qdict_get_try_str(options, "node-name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100802 bdrv_assign_node_name(bs, node_name, &local_err);
Markus Armbruster0fb63952014-04-25 16:50:31 +0200803 if (local_err) {
Kevin Wolf636ea372014-01-24 14:11:52 +0100804 error_propagate(errp, local_err);
805 return -EINVAL;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100806 }
807 qdict_del(options, "node-name");
808
Kevin Wolf5d186eb2013-03-27 17:28:18 +0100809 /* bdrv_open() with directly using a protocol as drv. This layer is already
810 * opened, so assign it to bs (while file becomes a closed BlockDriverState)
811 * and return immediately. */
812 if (file != NULL && drv->bdrv_file_open) {
813 bdrv_swap(file, bs);
814 return 0;
815 }
816
Kevin Wolf57915332010-04-14 15:24:50 +0200817 bs->open_flags = flags;
Paolo Bonzini1b7fd722011-11-29 11:35:47 +0100818 bs->guest_block_size = 512;
Paolo Bonzinic25f53b2011-11-29 12:42:20 +0100819 bs->request_alignment = 512;
Asias He0d51b4d2013-08-22 15:24:14 +0800820 bs->zero_beyond_eof = true;
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800821 open_flags = bdrv_open_flags(bs, flags);
822 bs->read_only = !(open_flags & BDRV_O_RDWR);
823
824 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, bs->read_only)) {
Kevin Wolf8f94a6e2013-10-10 11:45:55 +0200825 error_setg(errp,
826 !bs->read_only && bdrv_is_whitelisted(drv, true)
827 ? "Driver '%s' can only be used for read-only devices"
828 : "Driver '%s' is not whitelisted",
829 drv->format_name);
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800830 return -ENOTSUP;
831 }
Kevin Wolf57915332010-04-14 15:24:50 +0200832
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000833 assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */
Kevin Wolf0ebd24e2013-09-19 15:12:18 +0200834 if (flags & BDRV_O_COPY_ON_READ) {
835 if (!bs->read_only) {
836 bdrv_enable_copy_on_read(bs);
837 } else {
838 error_setg(errp, "Can't use copy-on-read on read-only device");
839 return -EINVAL;
840 }
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000841 }
842
Kevin Wolfc2ad1b02013-03-18 16:40:51 +0100843 if (filename != NULL) {
844 pstrcpy(bs->filename, sizeof(bs->filename), filename);
845 } else {
846 bs->filename[0] = '\0';
847 }
Max Reitz91af7012014-07-18 20:24:56 +0200848 pstrcpy(bs->exact_filename, sizeof(bs->exact_filename), bs->filename);
Kevin Wolf57915332010-04-14 15:24:50 +0200849
Kevin Wolf57915332010-04-14 15:24:50 +0200850 bs->drv = drv;
Anthony Liguori7267c092011-08-20 22:09:37 -0500851 bs->opaque = g_malloc0(drv->instance_size);
Kevin Wolf57915332010-04-14 15:24:50 +0200852
Stefan Hajnoczi03f541b2011-10-27 10:54:28 +0100853 bs->enable_write_cache = !!(flags & BDRV_O_CACHE_WB);
Stefan Hajnoczie7c63792011-10-27 10:54:27 +0100854
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200855 /* Open the image, either directly or using a protocol */
856 if (drv->bdrv_file_open) {
Kevin Wolf5d186eb2013-03-27 17:28:18 +0100857 assert(file == NULL);
Benoît Canet030be322013-09-24 17:07:04 +0200858 assert(!drv->bdrv_needs_filename || filename != NULL);
Max Reitz34b5d2c2013-09-05 14:45:29 +0200859 ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
Kevin Wolff500a6d2012-11-12 17:35:27 +0100860 } else {
Kevin Wolf2af5ef72013-04-09 13:19:18 +0200861 if (file == NULL) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200862 error_setg(errp, "Can't use '%s' as a block driver for the "
863 "protocol level", drv->format_name);
Kevin Wolf2af5ef72013-04-09 13:19:18 +0200864 ret = -EINVAL;
865 goto free_and_fail;
866 }
Kevin Wolff500a6d2012-11-12 17:35:27 +0100867 bs->file = file;
Max Reitz34b5d2c2013-09-05 14:45:29 +0200868 ret = drv->bdrv_open(bs, options, open_flags, &local_err);
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200869 }
870
Kevin Wolf57915332010-04-14 15:24:50 +0200871 if (ret < 0) {
Markus Armbruster84d18f02014-01-30 15:07:28 +0100872 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200873 error_propagate(errp, local_err);
Dunrong Huang2fa9aa52013-09-24 18:14:01 +0800874 } else if (bs->filename[0]) {
875 error_setg_errno(errp, -ret, "Could not open '%s'", bs->filename);
Max Reitz34b5d2c2013-09-05 14:45:29 +0200876 } else {
877 error_setg_errno(errp, -ret, "Could not open image");
878 }
Kevin Wolf57915332010-04-14 15:24:50 +0200879 goto free_and_fail;
880 }
881
Markus Armbrustera1f688f2015-03-13 21:09:40 +0100882 if (bs->encrypted) {
883 error_report("Encrypted images are deprecated");
884 error_printf("Support for them will be removed in a future release.\n"
885 "You can use 'qemu-img convert' to convert your image"
886 " to an unencrypted one.\n");
887 }
888
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100889 ret = refresh_total_sectors(bs, bs->total_sectors);
890 if (ret < 0) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200891 error_setg_errno(errp, -ret, "Could not refresh total sector count");
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100892 goto free_and_fail;
Kevin Wolf57915332010-04-14 15:24:50 +0200893 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100894
Kevin Wolf3baca892014-07-16 17:48:16 +0200895 bdrv_refresh_limits(bs, &local_err);
896 if (local_err) {
897 error_propagate(errp, local_err);
898 ret = -EINVAL;
899 goto free_and_fail;
900 }
901
Paolo Bonzinic25f53b2011-11-29 12:42:20 +0100902 assert(bdrv_opt_mem_align(bs) != 0);
Denis V. Lunev4196d2f2015-05-12 17:30:55 +0300903 assert(bdrv_min_mem_align(bs) != 0);
Kevin Wolf47ea2de2014-03-05 15:49:55 +0100904 assert((bs->request_alignment != 0) || bs->sg);
Kevin Wolf57915332010-04-14 15:24:50 +0200905 return 0;
906
907free_and_fail:
Kevin Wolff500a6d2012-11-12 17:35:27 +0100908 bs->file = NULL;
Anthony Liguori7267c092011-08-20 22:09:37 -0500909 g_free(bs->opaque);
Kevin Wolf57915332010-04-14 15:24:50 +0200910 bs->opaque = NULL;
911 bs->drv = NULL;
912 return ret;
913}
914
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200915static QDict *parse_json_filename(const char *filename, Error **errp)
916{
917 QObject *options_obj;
918 QDict *options;
919 int ret;
920
921 ret = strstart(filename, "json:", &filename);
922 assert(ret);
923
924 options_obj = qobject_from_json(filename);
925 if (!options_obj) {
926 error_setg(errp, "Could not parse the JSON options");
927 return NULL;
928 }
929
930 if (qobject_type(options_obj) != QTYPE_QDICT) {
931 qobject_decref(options_obj);
932 error_setg(errp, "Invalid JSON object given");
933 return NULL;
934 }
935
936 options = qobject_to_qdict(options_obj);
937 qdict_flatten(options);
938
939 return options;
940}
941
Kevin Wolf57915332010-04-14 15:24:50 +0200942/*
Kevin Wolff54120f2014-05-26 11:09:59 +0200943 * Fills in default options for opening images and converts the legacy
944 * filename/flags pair to option QDict entries.
945 */
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200946static int bdrv_fill_options(QDict **options, const char **pfilename, int flags,
Kevin Wolf17b005f2014-05-27 10:50:29 +0200947 BlockDriver *drv, Error **errp)
Kevin Wolff54120f2014-05-26 11:09:59 +0200948{
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200949 const char *filename = *pfilename;
Kevin Wolff54120f2014-05-26 11:09:59 +0200950 const char *drvname;
Kevin Wolf462f5bc2014-05-26 11:39:55 +0200951 bool protocol = flags & BDRV_O_PROTOCOL;
Kevin Wolff54120f2014-05-26 11:09:59 +0200952 bool parse_filename = false;
953 Error *local_err = NULL;
Kevin Wolff54120f2014-05-26 11:09:59 +0200954
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200955 /* Parse json: pseudo-protocol */
956 if (filename && g_str_has_prefix(filename, "json:")) {
957 QDict *json_options = parse_json_filename(filename, &local_err);
958 if (local_err) {
959 error_propagate(errp, local_err);
960 return -EINVAL;
961 }
962
963 /* Options given in the filename have lower priority than options
964 * specified directly */
965 qdict_join(*options, json_options, false);
966 QDECREF(json_options);
967 *pfilename = filename = NULL;
968 }
969
Kevin Wolff54120f2014-05-26 11:09:59 +0200970 /* Fetch the file name from the options QDict if necessary */
Kevin Wolf17b005f2014-05-27 10:50:29 +0200971 if (protocol && filename) {
Kevin Wolff54120f2014-05-26 11:09:59 +0200972 if (!qdict_haskey(*options, "filename")) {
973 qdict_put(*options, "filename", qstring_from_str(filename));
974 parse_filename = true;
975 } else {
976 error_setg(errp, "Can't specify 'file' and 'filename' options at "
977 "the same time");
978 return -EINVAL;
979 }
980 }
981
982 /* Find the right block driver */
983 filename = qdict_get_try_str(*options, "filename");
984 drvname = qdict_get_try_str(*options, "driver");
985
Kevin Wolf17b005f2014-05-27 10:50:29 +0200986 if (drv) {
987 if (drvname) {
988 error_setg(errp, "Driver specified twice");
989 return -EINVAL;
990 }
991 drvname = drv->format_name;
992 qdict_put(*options, "driver", qstring_from_str(drvname));
993 } else {
994 if (!drvname && protocol) {
995 if (filename) {
Max Reitzb65a5e12015-02-05 13:58:12 -0500996 drv = bdrv_find_protocol(filename, parse_filename, errp);
Kevin Wolf17b005f2014-05-27 10:50:29 +0200997 if (!drv) {
Kevin Wolf17b005f2014-05-27 10:50:29 +0200998 return -EINVAL;
999 }
1000
1001 drvname = drv->format_name;
1002 qdict_put(*options, "driver", qstring_from_str(drvname));
1003 } else {
1004 error_setg(errp, "Must specify either driver or file");
Kevin Wolff54120f2014-05-26 11:09:59 +02001005 return -EINVAL;
1006 }
Kevin Wolf17b005f2014-05-27 10:50:29 +02001007 } else if (drvname) {
1008 drv = bdrv_find_format(drvname);
1009 if (!drv) {
1010 error_setg(errp, "Unknown driver '%s'", drvname);
1011 return -ENOENT;
1012 }
Kevin Wolff54120f2014-05-26 11:09:59 +02001013 }
1014 }
1015
Kevin Wolf17b005f2014-05-27 10:50:29 +02001016 assert(drv || !protocol);
Kevin Wolff54120f2014-05-26 11:09:59 +02001017
1018 /* Driver-specific filename parsing */
Kevin Wolf17b005f2014-05-27 10:50:29 +02001019 if (drv && drv->bdrv_parse_filename && parse_filename) {
Kevin Wolff54120f2014-05-26 11:09:59 +02001020 drv->bdrv_parse_filename(filename, *options, &local_err);
1021 if (local_err) {
1022 error_propagate(errp, local_err);
1023 return -EINVAL;
1024 }
1025
1026 if (!drv->bdrv_needs_filename) {
1027 qdict_del(*options, "filename");
1028 }
1029 }
1030
1031 return 0;
1032}
1033
Fam Zheng8d24cce2014-05-23 21:29:45 +08001034void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd)
1035{
1036
Fam Zheng826b6ca2014-05-23 21:29:47 +08001037 if (bs->backing_hd) {
1038 assert(bs->backing_blocker);
1039 bdrv_op_unblock_all(bs->backing_hd, bs->backing_blocker);
1040 } else if (backing_hd) {
1041 error_setg(&bs->backing_blocker,
Alberto Garcia81e5f782015-04-08 12:29:19 +03001042 "node is used as backing hd of '%s'",
1043 bdrv_get_device_or_node_name(bs));
Fam Zheng826b6ca2014-05-23 21:29:47 +08001044 }
1045
Fam Zheng8d24cce2014-05-23 21:29:45 +08001046 bs->backing_hd = backing_hd;
1047 if (!backing_hd) {
Fam Zheng826b6ca2014-05-23 21:29:47 +08001048 error_free(bs->backing_blocker);
1049 bs->backing_blocker = NULL;
Fam Zheng8d24cce2014-05-23 21:29:45 +08001050 goto out;
1051 }
1052 bs->open_flags &= ~BDRV_O_NO_BACKING;
1053 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filename);
1054 pstrcpy(bs->backing_format, sizeof(bs->backing_format),
1055 backing_hd->drv ? backing_hd->drv->format_name : "");
Fam Zheng826b6ca2014-05-23 21:29:47 +08001056
1057 bdrv_op_block_all(bs->backing_hd, bs->backing_blocker);
1058 /* Otherwise we won't be able to commit due to check in bdrv_commit */
Fam Zhengbb000212014-09-11 13:14:00 +08001059 bdrv_op_unblock(bs->backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET,
Fam Zheng826b6ca2014-05-23 21:29:47 +08001060 bs->backing_blocker);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001061out:
Kevin Wolf3baca892014-07-16 17:48:16 +02001062 bdrv_refresh_limits(bs, NULL);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001063}
1064
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001065/*
1066 * Opens the backing file for a BlockDriverState if not yet open
1067 *
1068 * options is a QDict of options to pass to the block drivers, or NULL for an
1069 * empty set of options. The reference to the QDict is transferred to this
1070 * function (even on failure), so if the caller intends to reuse the dictionary,
1071 * it needs to use QINCREF() before calling bdrv_file_open.
1072 */
Max Reitz34b5d2c2013-09-05 14:45:29 +02001073int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
Paolo Bonzini9156df12012-10-18 16:49:17 +02001074{
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001075 char *backing_filename = g_malloc0(PATH_MAX);
Kevin Wolf317fc442014-04-25 13:27:34 +02001076 int ret = 0;
Fam Zheng8d24cce2014-05-23 21:29:45 +08001077 BlockDriverState *backing_hd;
Max Reitz34b5d2c2013-09-05 14:45:29 +02001078 Error *local_err = NULL;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001079
1080 if (bs->backing_hd != NULL) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001081 QDECREF(options);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001082 goto free_exit;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001083 }
1084
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001085 /* NULL means an empty set of options */
1086 if (options == NULL) {
1087 options = qdict_new();
1088 }
1089
Paolo Bonzini9156df12012-10-18 16:49:17 +02001090 bs->open_flags &= ~BDRV_O_NO_BACKING;
Kevin Wolf1cb6f502013-04-12 20:27:07 +02001091 if (qdict_haskey(options, "file.filename")) {
1092 backing_filename[0] = '\0';
1093 } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001094 QDECREF(options);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001095 goto free_exit;
Fam Zhengdbecebd2013-09-22 20:05:06 +08001096 } else {
Max Reitz9f074292014-11-26 17:20:26 +01001097 bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX,
1098 &local_err);
1099 if (local_err) {
1100 ret = -EINVAL;
1101 error_propagate(errp, local_err);
1102 QDECREF(options);
1103 goto free_exit;
1104 }
Paolo Bonzini9156df12012-10-18 16:49:17 +02001105 }
1106
Kevin Wolf8ee79e72014-06-04 15:09:35 +02001107 if (!bs->drv || !bs->drv->supports_backing) {
1108 ret = -EINVAL;
1109 error_setg(errp, "Driver doesn't support backing files");
1110 QDECREF(options);
1111 goto free_exit;
1112 }
1113
Markus Armbrustere4e99862014-10-07 13:59:03 +02001114 backing_hd = bdrv_new();
Fam Zheng8d24cce2014-05-23 21:29:45 +08001115
Kevin Wolfc5f6e492014-11-25 18:12:42 +01001116 if (bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
1117 qdict_put(options, "driver", qstring_from_str(bs->backing_format));
Paolo Bonzini9156df12012-10-18 16:49:17 +02001118 }
1119
Max Reitzf67503e2014-02-18 18:33:05 +01001120 assert(bs->backing_hd == NULL);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001121 ret = bdrv_open(&backing_hd,
Max Reitzddf56362014-02-18 18:33:06 +01001122 *backing_filename ? backing_filename : NULL, NULL, options,
Kevin Wolfc5f6e492014-11-25 18:12:42 +01001123 bdrv_backing_flags(bs->open_flags), NULL, &local_err);
Paolo Bonzini9156df12012-10-18 16:49:17 +02001124 if (ret < 0) {
Fam Zheng8d24cce2014-05-23 21:29:45 +08001125 bdrv_unref(backing_hd);
1126 backing_hd = NULL;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001127 bs->open_flags |= BDRV_O_NO_BACKING;
Fam Zhengb04b6b62013-11-08 11:26:49 +08001128 error_setg(errp, "Could not open backing file: %s",
1129 error_get_pretty(local_err));
1130 error_free(local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001131 goto free_exit;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001132 }
Fam Zheng8d24cce2014-05-23 21:29:45 +08001133 bdrv_set_backing_hd(bs, backing_hd);
Peter Feinerd80ac652014-01-08 19:43:25 +00001134
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001135free_exit:
1136 g_free(backing_filename);
1137 return ret;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001138}
1139
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001140/*
Max Reitzda557aa2013-12-20 19:28:11 +01001141 * Opens a disk image whose options are given as BlockdevRef in another block
1142 * device's options.
1143 *
Max Reitzda557aa2013-12-20 19:28:11 +01001144 * If allow_none is true, no image will be opened if filename is false and no
1145 * BlockdevRef is given. *pbs will remain unchanged and 0 will be returned.
1146 *
1147 * bdrev_key specifies the key for the image's BlockdevRef in the options QDict.
1148 * That QDict has to be flattened; therefore, if the BlockdevRef is a QDict
1149 * itself, all options starting with "${bdref_key}." are considered part of the
1150 * BlockdevRef.
1151 *
1152 * The BlockdevRef will be removed from the options QDict.
Max Reitzf67503e2014-02-18 18:33:05 +01001153 *
1154 * To conform with the behavior of bdrv_open(), *pbs has to be NULL.
Max Reitzda557aa2013-12-20 19:28:11 +01001155 */
1156int bdrv_open_image(BlockDriverState **pbs, const char *filename,
1157 QDict *options, const char *bdref_key, int flags,
Max Reitzf7d9fd82014-02-18 18:33:12 +01001158 bool allow_none, Error **errp)
Max Reitzda557aa2013-12-20 19:28:11 +01001159{
1160 QDict *image_options;
1161 int ret;
1162 char *bdref_key_dot;
1163 const char *reference;
1164
Max Reitzf67503e2014-02-18 18:33:05 +01001165 assert(pbs);
1166 assert(*pbs == NULL);
1167
Max Reitzda557aa2013-12-20 19:28:11 +01001168 bdref_key_dot = g_strdup_printf("%s.", bdref_key);
1169 qdict_extract_subqdict(options, &image_options, bdref_key_dot);
1170 g_free(bdref_key_dot);
1171
1172 reference = qdict_get_try_str(options, bdref_key);
1173 if (!filename && !reference && !qdict_size(image_options)) {
1174 if (allow_none) {
1175 ret = 0;
1176 } else {
1177 error_setg(errp, "A block device must be specified for \"%s\"",
1178 bdref_key);
1179 ret = -EINVAL;
1180 }
Markus Armbrusterb20e61e2014-05-28 11:16:57 +02001181 QDECREF(image_options);
Max Reitzda557aa2013-12-20 19:28:11 +01001182 goto done;
1183 }
1184
Max Reitzf7d9fd82014-02-18 18:33:12 +01001185 ret = bdrv_open(pbs, filename, reference, image_options, flags, NULL, errp);
Max Reitzda557aa2013-12-20 19:28:11 +01001186
1187done:
1188 qdict_del(options, bdref_key);
1189 return ret;
1190}
1191
Chen Gang6b8aeca2014-06-23 23:28:23 +08001192int bdrv_append_temp_snapshot(BlockDriverState *bs, int flags, Error **errp)
Kevin Wolfb9988752014-04-03 12:09:34 +02001193{
1194 /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001195 char *tmp_filename = g_malloc0(PATH_MAX + 1);
Kevin Wolfb9988752014-04-03 12:09:34 +02001196 int64_t total_size;
Chunyan Liu83d05212014-06-05 17:20:51 +08001197 QemuOpts *opts = NULL;
Kevin Wolfb9988752014-04-03 12:09:34 +02001198 QDict *snapshot_options;
1199 BlockDriverState *bs_snapshot;
1200 Error *local_err;
1201 int ret;
1202
1203 /* if snapshot, we create a temporary backing file and open it
1204 instead of opening 'filename' directly */
1205
1206 /* Get the required size from the image */
Kevin Wolff1877432014-04-04 17:07:19 +02001207 total_size = bdrv_getlength(bs);
1208 if (total_size < 0) {
Chen Gang6b8aeca2014-06-23 23:28:23 +08001209 ret = total_size;
Kevin Wolff1877432014-04-04 17:07:19 +02001210 error_setg_errno(errp, -total_size, "Could not get image size");
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001211 goto out;
Kevin Wolff1877432014-04-04 17:07:19 +02001212 }
Kevin Wolfb9988752014-04-03 12:09:34 +02001213
1214 /* Create the temporary image */
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001215 ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
Kevin Wolfb9988752014-04-03 12:09:34 +02001216 if (ret < 0) {
1217 error_setg_errno(errp, -ret, "Could not get temporary filename");
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001218 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001219 }
1220
Max Reitzef810432014-12-02 18:32:42 +01001221 opts = qemu_opts_create(bdrv_qcow2.create_opts, NULL, 0,
Chunyan Liuc282e1f2014-06-05 17:21:11 +08001222 &error_abort);
Markus Armbruster39101f22015-02-12 16:46:36 +01001223 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size, &error_abort);
Max Reitzef810432014-12-02 18:32:42 +01001224 ret = bdrv_create(&bdrv_qcow2, tmp_filename, opts, &local_err);
Chunyan Liu83d05212014-06-05 17:20:51 +08001225 qemu_opts_del(opts);
Kevin Wolfb9988752014-04-03 12:09:34 +02001226 if (ret < 0) {
1227 error_setg_errno(errp, -ret, "Could not create temporary overlay "
1228 "'%s': %s", tmp_filename,
1229 error_get_pretty(local_err));
1230 error_free(local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001231 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001232 }
1233
1234 /* Prepare a new options QDict for the temporary file */
1235 snapshot_options = qdict_new();
1236 qdict_put(snapshot_options, "file.driver",
1237 qstring_from_str("file"));
1238 qdict_put(snapshot_options, "file.filename",
1239 qstring_from_str(tmp_filename));
1240
Markus Armbrustere4e99862014-10-07 13:59:03 +02001241 bs_snapshot = bdrv_new();
Kevin Wolfb9988752014-04-03 12:09:34 +02001242
1243 ret = bdrv_open(&bs_snapshot, NULL, NULL, snapshot_options,
Max Reitzef810432014-12-02 18:32:42 +01001244 flags, &bdrv_qcow2, &local_err);
Kevin Wolfb9988752014-04-03 12:09:34 +02001245 if (ret < 0) {
1246 error_propagate(errp, local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001247 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001248 }
1249
1250 bdrv_append(bs_snapshot, bs);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001251
1252out:
1253 g_free(tmp_filename);
Chen Gang6b8aeca2014-06-23 23:28:23 +08001254 return ret;
Kevin Wolfb9988752014-04-03 12:09:34 +02001255}
1256
Max Reitzda557aa2013-12-20 19:28:11 +01001257/*
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001258 * Opens a disk image (raw, qcow2, vmdk, ...)
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001259 *
1260 * options is a QDict of options to pass to the block drivers, or NULL for an
1261 * empty set of options. The reference to the QDict belongs to the block layer
1262 * after the call (even on failure), so if the caller intends to reuse the
1263 * dictionary, it needs to use QINCREF() before calling bdrv_open.
Max Reitzf67503e2014-02-18 18:33:05 +01001264 *
1265 * If *pbs is NULL, a new BDS will be created with a pointer to it stored there.
1266 * If it is not NULL, the referenced BDS will be reused.
Max Reitzddf56362014-02-18 18:33:06 +01001267 *
1268 * The reference parameter may be used to specify an existing block device which
1269 * should be opened. If specified, neither options nor a filename may be given,
1270 * nor can an existing BDS be reused (that is, *pbs has to be NULL).
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001271 */
Max Reitzddf56362014-02-18 18:33:06 +01001272int bdrv_open(BlockDriverState **pbs, const char *filename,
1273 const char *reference, QDict *options, int flags,
1274 BlockDriver *drv, Error **errp)
bellardea2384d2004-08-01 21:59:26 +00001275{
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001276 int ret;
Max Reitzf67503e2014-02-18 18:33:05 +01001277 BlockDriverState *file = NULL, *bs;
Kevin Wolf74fe54f2013-07-09 11:09:02 +02001278 const char *drvname;
Max Reitz34b5d2c2013-09-05 14:45:29 +02001279 Error *local_err = NULL;
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001280 int snapshot_flags = 0;
bellard712e7872005-04-28 21:09:32 +00001281
Max Reitzf67503e2014-02-18 18:33:05 +01001282 assert(pbs);
1283
Max Reitzddf56362014-02-18 18:33:06 +01001284 if (reference) {
1285 bool options_non_empty = options ? qdict_size(options) : false;
1286 QDECREF(options);
1287
1288 if (*pbs) {
1289 error_setg(errp, "Cannot reuse an existing BDS when referencing "
1290 "another block device");
1291 return -EINVAL;
1292 }
1293
1294 if (filename || options_non_empty) {
1295 error_setg(errp, "Cannot reference an existing block device with "
1296 "additional options or a new filename");
1297 return -EINVAL;
1298 }
1299
1300 bs = bdrv_lookup_bs(reference, reference, errp);
1301 if (!bs) {
1302 return -ENODEV;
1303 }
1304 bdrv_ref(bs);
1305 *pbs = bs;
1306 return 0;
1307 }
1308
Max Reitzf67503e2014-02-18 18:33:05 +01001309 if (*pbs) {
1310 bs = *pbs;
1311 } else {
Markus Armbrustere4e99862014-10-07 13:59:03 +02001312 bs = bdrv_new();
Max Reitzf67503e2014-02-18 18:33:05 +01001313 }
1314
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001315 /* NULL means an empty set of options */
1316 if (options == NULL) {
1317 options = qdict_new();
1318 }
1319
Kevin Wolf17b005f2014-05-27 10:50:29 +02001320 ret = bdrv_fill_options(&options, &filename, flags, drv, &local_err);
Kevin Wolf462f5bc2014-05-26 11:39:55 +02001321 if (local_err) {
1322 goto fail;
1323 }
1324
Kevin Wolf76c591b2014-06-04 14:19:44 +02001325 /* Find the right image format driver */
1326 drv = NULL;
1327 drvname = qdict_get_try_str(options, "driver");
1328 if (drvname) {
1329 drv = bdrv_find_format(drvname);
1330 qdict_del(options, "driver");
1331 if (!drv) {
1332 error_setg(errp, "Unknown driver: '%s'", drvname);
1333 ret = -EINVAL;
1334 goto fail;
1335 }
1336 }
1337
1338 assert(drvname || !(flags & BDRV_O_PROTOCOL));
1339 if (drv && !drv->bdrv_file_open) {
1340 /* If the user explicitly wants a format driver here, we'll need to add
1341 * another layer for the protocol in bs->file */
1342 flags &= ~BDRV_O_PROTOCOL;
1343 }
1344
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001345 bs->options = options;
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001346 options = qdict_clone_shallow(options);
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001347
Kevin Wolff4788ad2014-06-03 16:44:19 +02001348 /* Open image file without format layer */
1349 if ((flags & BDRV_O_PROTOCOL) == 0) {
1350 if (flags & BDRV_O_RDWR) {
1351 flags |= BDRV_O_ALLOW_RDWR;
1352 }
1353 if (flags & BDRV_O_SNAPSHOT) {
1354 snapshot_flags = bdrv_temp_snapshot_flags(flags);
1355 flags = bdrv_backing_flags(flags);
1356 }
1357
1358 assert(file == NULL);
1359 ret = bdrv_open_image(&file, filename, options, "file",
1360 bdrv_inherited_flags(flags),
1361 true, &local_err);
1362 if (ret < 0) {
Max Reitz5469a2a2014-02-18 18:33:10 +01001363 goto fail;
1364 }
1365 }
1366
Kevin Wolf76c591b2014-06-04 14:19:44 +02001367 /* Image format probing */
Kevin Wolf38f3ef52014-11-20 16:27:12 +01001368 bs->probed = !drv;
Kevin Wolf76c591b2014-06-04 14:19:44 +02001369 if (!drv && file) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001370 ret = find_image_format(file, filename, &drv, &local_err);
1371 if (ret < 0) {
Kevin Wolf8bfea152014-04-11 19:16:36 +02001372 goto fail;
Max Reitz2a05cbe2013-12-20 19:28:10 +01001373 }
Kevin Wolf76c591b2014-06-04 14:19:44 +02001374 } else if (!drv) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001375 error_setg(errp, "Must specify either driver or file");
1376 ret = -EINVAL;
Kevin Wolf8bfea152014-04-11 19:16:36 +02001377 goto fail;
Kevin Wolff500a6d2012-11-12 17:35:27 +01001378 }
1379
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001380 /* Open the image */
Max Reitz34b5d2c2013-09-05 14:45:29 +02001381 ret = bdrv_open_common(bs, file, options, flags, drv, &local_err);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001382 if (ret < 0) {
Kevin Wolf8bfea152014-04-11 19:16:36 +02001383 goto fail;
Christoph Hellwig69873072010-01-20 18:13:25 +01001384 }
1385
Max Reitz2a05cbe2013-12-20 19:28:10 +01001386 if (file && (bs->file != file)) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001387 bdrv_unref(file);
Kevin Wolff500a6d2012-11-12 17:35:27 +01001388 file = NULL;
1389 }
1390
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001391 /* If there is a backing file, use it */
Paolo Bonzini9156df12012-10-18 16:49:17 +02001392 if ((flags & BDRV_O_NO_BACKING) == 0) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001393 QDict *backing_options;
1394
Benoît Canet5726d872013-09-25 13:30:01 +02001395 qdict_extract_subqdict(options, &backing_options, "backing.");
Max Reitz34b5d2c2013-09-05 14:45:29 +02001396 ret = bdrv_open_backing_file(bs, backing_options, &local_err);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001397 if (ret < 0) {
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001398 goto close_and_fail;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001399 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001400 }
1401
Max Reitz91af7012014-07-18 20:24:56 +02001402 bdrv_refresh_filename(bs);
1403
Kevin Wolfb9988752014-04-03 12:09:34 +02001404 /* For snapshot=on, create a temporary qcow2 overlay. bs points to the
1405 * temporary snapshot afterwards. */
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001406 if (snapshot_flags) {
Chen Gang6b8aeca2014-06-23 23:28:23 +08001407 ret = bdrv_append_temp_snapshot(bs, snapshot_flags, &local_err);
Kevin Wolfb9988752014-04-03 12:09:34 +02001408 if (local_err) {
Kevin Wolfb9988752014-04-03 12:09:34 +02001409 goto close_and_fail;
1410 }
1411 }
1412
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001413 /* Check if any unknown options were used */
Max Reitz5acd9d82014-02-18 18:33:11 +01001414 if (options && (qdict_size(options) != 0)) {
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001415 const QDictEntry *entry = qdict_first(options);
Max Reitz5acd9d82014-02-18 18:33:11 +01001416 if (flags & BDRV_O_PROTOCOL) {
1417 error_setg(errp, "Block protocol '%s' doesn't support the option "
1418 "'%s'", drv->format_name, entry->key);
1419 } else {
1420 error_setg(errp, "Block format '%s' used by device '%s' doesn't "
1421 "support the option '%s'", drv->format_name,
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001422 bdrv_get_device_name(bs), entry->key);
Max Reitz5acd9d82014-02-18 18:33:11 +01001423 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001424
1425 ret = -EINVAL;
1426 goto close_and_fail;
1427 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001428
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001429 if (!bdrv_key_required(bs)) {
Markus Armbrustera7f53e22014-10-07 13:59:25 +02001430 if (bs->blk) {
1431 blk_dev_change_media_cb(bs->blk, true);
1432 }
Markus Armbrusterc3adb582014-03-14 09:22:48 +01001433 } else if (!runstate_check(RUN_STATE_PRELAUNCH)
1434 && !runstate_check(RUN_STATE_INMIGRATE)
1435 && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
1436 error_setg(errp,
1437 "Guest must be stopped for opening of encrypted image");
1438 ret = -EBUSY;
1439 goto close_and_fail;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001440 }
1441
Markus Armbrusterc3adb582014-03-14 09:22:48 +01001442 QDECREF(options);
Max Reitzf67503e2014-02-18 18:33:05 +01001443 *pbs = bs;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001444 return 0;
1445
Kevin Wolf8bfea152014-04-11 19:16:36 +02001446fail:
Kevin Wolff500a6d2012-11-12 17:35:27 +01001447 if (file != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001448 bdrv_unref(file);
Kevin Wolff500a6d2012-11-12 17:35:27 +01001449 }
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001450 QDECREF(bs->options);
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001451 QDECREF(options);
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001452 bs->options = NULL;
Max Reitzf67503e2014-02-18 18:33:05 +01001453 if (!*pbs) {
1454 /* If *pbs is NULL, a new BDS has been created in this function and
1455 needs to be freed now. Otherwise, it does not need to be closed,
1456 since it has not really been opened yet. */
1457 bdrv_unref(bs);
1458 }
Markus Armbruster84d18f02014-01-30 15:07:28 +01001459 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001460 error_propagate(errp, local_err);
1461 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001462 return ret;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001463
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001464close_and_fail:
Max Reitzf67503e2014-02-18 18:33:05 +01001465 /* See fail path, but now the BDS has to be always closed */
1466 if (*pbs) {
1467 bdrv_close(bs);
1468 } else {
1469 bdrv_unref(bs);
1470 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001471 QDECREF(options);
Markus Armbruster84d18f02014-01-30 15:07:28 +01001472 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001473 error_propagate(errp, local_err);
1474 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001475 return ret;
1476}
1477
Jeff Codye971aa12012-09-20 15:13:19 -04001478typedef struct BlockReopenQueueEntry {
1479 bool prepared;
1480 BDRVReopenState state;
1481 QSIMPLEQ_ENTRY(BlockReopenQueueEntry) entry;
1482} BlockReopenQueueEntry;
1483
1484/*
1485 * Adds a BlockDriverState to a simple queue for an atomic, transactional
1486 * reopen of multiple devices.
1487 *
1488 * bs_queue can either be an existing BlockReopenQueue that has had QSIMPLE_INIT
1489 * already performed, or alternatively may be NULL a new BlockReopenQueue will
1490 * be created and initialized. This newly created BlockReopenQueue should be
1491 * passed back in for subsequent calls that are intended to be of the same
1492 * atomic 'set'.
1493 *
1494 * bs is the BlockDriverState to add to the reopen queue.
1495 *
1496 * flags contains the open flags for the associated bs
1497 *
1498 * returns a pointer to bs_queue, which is either the newly allocated
1499 * bs_queue, or the existing bs_queue being used.
1500 *
1501 */
1502BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
1503 BlockDriverState *bs, int flags)
1504{
1505 assert(bs != NULL);
1506
1507 BlockReopenQueueEntry *bs_entry;
1508 if (bs_queue == NULL) {
1509 bs_queue = g_new0(BlockReopenQueue, 1);
1510 QSIMPLEQ_INIT(bs_queue);
1511 }
1512
Kevin Wolff1f25a22014-04-25 19:04:55 +02001513 /* bdrv_open() masks this flag out */
1514 flags &= ~BDRV_O_PROTOCOL;
1515
Jeff Codye971aa12012-09-20 15:13:19 -04001516 if (bs->file) {
Kevin Wolff1f25a22014-04-25 19:04:55 +02001517 bdrv_reopen_queue(bs_queue, bs->file, bdrv_inherited_flags(flags));
Jeff Codye971aa12012-09-20 15:13:19 -04001518 }
1519
1520 bs_entry = g_new0(BlockReopenQueueEntry, 1);
1521 QSIMPLEQ_INSERT_TAIL(bs_queue, bs_entry, entry);
1522
1523 bs_entry->state.bs = bs;
1524 bs_entry->state.flags = flags;
1525
1526 return bs_queue;
1527}
1528
1529/*
1530 * Reopen multiple BlockDriverStates atomically & transactionally.
1531 *
1532 * The queue passed in (bs_queue) must have been built up previous
1533 * via bdrv_reopen_queue().
1534 *
1535 * Reopens all BDS specified in the queue, with the appropriate
1536 * flags. All devices are prepared for reopen, and failure of any
1537 * device will cause all device changes to be abandonded, and intermediate
1538 * data cleaned up.
1539 *
1540 * If all devices prepare successfully, then the changes are committed
1541 * to all devices.
1542 *
1543 */
1544int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
1545{
1546 int ret = -1;
1547 BlockReopenQueueEntry *bs_entry, *next;
1548 Error *local_err = NULL;
1549
1550 assert(bs_queue != NULL);
1551
1552 bdrv_drain_all();
1553
1554 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1555 if (bdrv_reopen_prepare(&bs_entry->state, bs_queue, &local_err)) {
1556 error_propagate(errp, local_err);
1557 goto cleanup;
1558 }
1559 bs_entry->prepared = true;
1560 }
1561
1562 /* If we reach this point, we have success and just need to apply the
1563 * changes
1564 */
1565 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1566 bdrv_reopen_commit(&bs_entry->state);
1567 }
1568
1569 ret = 0;
1570
1571cleanup:
1572 QSIMPLEQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
1573 if (ret && bs_entry->prepared) {
1574 bdrv_reopen_abort(&bs_entry->state);
1575 }
1576 g_free(bs_entry);
1577 }
1578 g_free(bs_queue);
1579 return ret;
1580}
1581
1582
1583/* Reopen a single BlockDriverState with the specified flags. */
1584int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp)
1585{
1586 int ret = -1;
1587 Error *local_err = NULL;
1588 BlockReopenQueue *queue = bdrv_reopen_queue(NULL, bs, bdrv_flags);
1589
1590 ret = bdrv_reopen_multiple(queue, &local_err);
1591 if (local_err != NULL) {
1592 error_propagate(errp, local_err);
1593 }
1594 return ret;
1595}
1596
1597
1598/*
1599 * Prepares a BlockDriverState for reopen. All changes are staged in the
1600 * 'opaque' field of the BDRVReopenState, which is used and allocated by
1601 * the block driver layer .bdrv_reopen_prepare()
1602 *
1603 * bs is the BlockDriverState to reopen
1604 * flags are the new open flags
1605 * queue is the reopen queue
1606 *
1607 * Returns 0 on success, non-zero on error. On error errp will be set
1608 * as well.
1609 *
1610 * On failure, bdrv_reopen_abort() will be called to clean up any data.
1611 * It is the responsibility of the caller to then call the abort() or
1612 * commit() for any other BDS that have been left in a prepare() state
1613 *
1614 */
1615int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
1616 Error **errp)
1617{
1618 int ret = -1;
1619 Error *local_err = NULL;
1620 BlockDriver *drv;
1621
1622 assert(reopen_state != NULL);
1623 assert(reopen_state->bs->drv != NULL);
1624 drv = reopen_state->bs->drv;
1625
1626 /* if we are to stay read-only, do not allow permission change
1627 * to r/w */
1628 if (!(reopen_state->bs->open_flags & BDRV_O_ALLOW_RDWR) &&
1629 reopen_state->flags & BDRV_O_RDWR) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03001630 error_setg(errp, "Node '%s' is read only",
1631 bdrv_get_device_or_node_name(reopen_state->bs));
Jeff Codye971aa12012-09-20 15:13:19 -04001632 goto error;
1633 }
1634
1635
1636 ret = bdrv_flush(reopen_state->bs);
1637 if (ret) {
1638 error_set(errp, ERROR_CLASS_GENERIC_ERROR, "Error (%s) flushing drive",
1639 strerror(-ret));
1640 goto error;
1641 }
1642
1643 if (drv->bdrv_reopen_prepare) {
1644 ret = drv->bdrv_reopen_prepare(reopen_state, queue, &local_err);
1645 if (ret) {
1646 if (local_err != NULL) {
1647 error_propagate(errp, local_err);
1648 } else {
Luiz Capitulinod8b68952013-06-10 11:29:27 -04001649 error_setg(errp, "failed while preparing to reopen image '%s'",
1650 reopen_state->bs->filename);
Jeff Codye971aa12012-09-20 15:13:19 -04001651 }
1652 goto error;
1653 }
1654 } else {
1655 /* It is currently mandatory to have a bdrv_reopen_prepare()
1656 * handler for each supported drv. */
Alberto Garcia81e5f782015-04-08 12:29:19 +03001657 error_setg(errp, "Block format '%s' used by node '%s' "
1658 "does not support reopening files", drv->format_name,
1659 bdrv_get_device_or_node_name(reopen_state->bs));
Jeff Codye971aa12012-09-20 15:13:19 -04001660 ret = -1;
1661 goto error;
1662 }
1663
1664 ret = 0;
1665
1666error:
1667 return ret;
1668}
1669
1670/*
1671 * Takes the staged changes for the reopen from bdrv_reopen_prepare(), and
1672 * makes them final by swapping the staging BlockDriverState contents into
1673 * the active BlockDriverState contents.
1674 */
1675void bdrv_reopen_commit(BDRVReopenState *reopen_state)
1676{
1677 BlockDriver *drv;
1678
1679 assert(reopen_state != NULL);
1680 drv = reopen_state->bs->drv;
1681 assert(drv != NULL);
1682
1683 /* If there are any driver level actions to take */
1684 if (drv->bdrv_reopen_commit) {
1685 drv->bdrv_reopen_commit(reopen_state);
1686 }
1687
1688 /* set BDS specific flags now */
1689 reopen_state->bs->open_flags = reopen_state->flags;
1690 reopen_state->bs->enable_write_cache = !!(reopen_state->flags &
1691 BDRV_O_CACHE_WB);
1692 reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
Kevin Wolf355ef4a2013-12-11 20:14:09 +01001693
Kevin Wolf3baca892014-07-16 17:48:16 +02001694 bdrv_refresh_limits(reopen_state->bs, NULL);
Jeff Codye971aa12012-09-20 15:13:19 -04001695}
1696
1697/*
1698 * Abort the reopen, and delete and free the staged changes in
1699 * reopen_state
1700 */
1701void bdrv_reopen_abort(BDRVReopenState *reopen_state)
1702{
1703 BlockDriver *drv;
1704
1705 assert(reopen_state != NULL);
1706 drv = reopen_state->bs->drv;
1707 assert(drv != NULL);
1708
1709 if (drv->bdrv_reopen_abort) {
1710 drv->bdrv_reopen_abort(reopen_state);
1711 }
1712}
1713
1714
bellardfc01f7e2003-06-30 10:03:06 +00001715void bdrv_close(BlockDriverState *bs)
1716{
Max Reitz33384422014-06-20 21:57:33 +02001717 BdrvAioNotifier *ban, *ban_next;
1718
Paolo Bonzini3cbc0022012-10-19 11:36:48 +02001719 if (bs->job) {
1720 block_job_cancel_sync(bs->job);
1721 }
Stefan Hajnoczi58fda172013-07-02 15:36:25 +02001722 bdrv_drain_all(); /* complete I/O */
1723 bdrv_flush(bs);
1724 bdrv_drain_all(); /* in case flush left pending I/O */
Paolo Bonzinid7d512f2012-08-23 11:20:36 +02001725 notifier_list_notify(&bs->close_notifiers, bs);
Kevin Wolf7094f122012-04-11 11:06:37 +02001726
Paolo Bonzini3cbc0022012-10-19 11:36:48 +02001727 if (bs->drv) {
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +01001728 if (bs->backing_hd) {
Fam Zheng826b6ca2014-05-23 21:29:47 +08001729 BlockDriverState *backing_hd = bs->backing_hd;
1730 bdrv_set_backing_hd(bs, NULL);
1731 bdrv_unref(backing_hd);
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +01001732 }
bellardea2384d2004-08-01 21:59:26 +00001733 bs->drv->bdrv_close(bs);
Anthony Liguori7267c092011-08-20 22:09:37 -05001734 g_free(bs->opaque);
bellardea2384d2004-08-01 21:59:26 +00001735 bs->opaque = NULL;
1736 bs->drv = NULL;
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +00001737 bs->copy_on_read = 0;
Paolo Bonzinia275fa42012-05-08 16:51:43 +02001738 bs->backing_file[0] = '\0';
1739 bs->backing_format[0] = '\0';
Paolo Bonzini64058752012-05-08 16:51:49 +02001740 bs->total_sectors = 0;
1741 bs->encrypted = 0;
1742 bs->valid_key = 0;
1743 bs->sg = 0;
Asias He0d51b4d2013-08-22 15:24:14 +08001744 bs->zero_beyond_eof = false;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001745 QDECREF(bs->options);
1746 bs->options = NULL;
Max Reitz91af7012014-07-18 20:24:56 +02001747 QDECREF(bs->full_open_options);
1748 bs->full_open_options = NULL;
bellardb3380822004-03-14 21:38:54 +00001749
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001750 if (bs->file != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001751 bdrv_unref(bs->file);
Paolo Bonzini0ac93772012-05-08 16:51:44 +02001752 bs->file = NULL;
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001753 }
bellardb3380822004-03-14 21:38:54 +00001754 }
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001755
Markus Armbrustera7f53e22014-10-07 13:59:25 +02001756 if (bs->blk) {
1757 blk_dev_change_media_cb(bs->blk, false);
1758 }
Pavel Hrdina9ca11152012-08-09 12:44:48 +02001759
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001760 /*throttling disk I/O limits*/
1761 if (bs->io_limits_enabled) {
1762 bdrv_io_limits_disable(bs);
1763 }
Max Reitz33384422014-06-20 21:57:33 +02001764
1765 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
1766 g_free(ban);
1767 }
1768 QLIST_INIT(&bs->aio_notifiers);
bellardb3380822004-03-14 21:38:54 +00001769}
1770
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001771void bdrv_close_all(void)
1772{
1773 BlockDriverState *bs;
1774
Benoît Canetdc364f42014-01-23 21:31:32 +01001775 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02001776 AioContext *aio_context = bdrv_get_aio_context(bs);
1777
1778 aio_context_acquire(aio_context);
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001779 bdrv_close(bs);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02001780 aio_context_release(aio_context);
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001781 }
1782}
1783
Benoît Canetdc364f42014-01-23 21:31:32 +01001784/* make a BlockDriverState anonymous by removing from bdrv_state and
1785 * graph_bdrv_state list.
Ryan Harperd22b2f42011-03-29 20:51:47 -05001786 Also, NULL terminate the device_name to prevent double remove */
1787void bdrv_make_anon(BlockDriverState *bs)
1788{
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001789 /*
1790 * Take care to remove bs from bdrv_states only when it's actually
1791 * in it. Note that bs->device_list.tqe_prev is initially null,
1792 * and gets set to non-null by QTAILQ_INSERT_TAIL(). Establish
1793 * the useful invariant "bs in bdrv_states iff bs->tqe_prev" by
1794 * resetting it to null on remove.
1795 */
1796 if (bs->device_list.tqe_prev) {
Benoît Canetdc364f42014-01-23 21:31:32 +01001797 QTAILQ_REMOVE(&bdrv_states, bs, device_list);
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001798 bs->device_list.tqe_prev = NULL;
Ryan Harperd22b2f42011-03-29 20:51:47 -05001799 }
Benoît Canetdc364f42014-01-23 21:31:32 +01001800 if (bs->node_name[0] != '\0') {
1801 QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
1802 }
1803 bs->node_name[0] = '\0';
Ryan Harperd22b2f42011-03-29 20:51:47 -05001804}
1805
Paolo Bonzinie023b2e2012-05-08 16:51:41 +02001806static void bdrv_rebind(BlockDriverState *bs)
1807{
1808 if (bs->drv && bs->drv->bdrv_rebind) {
1809 bs->drv->bdrv_rebind(bs);
1810 }
1811}
1812
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001813static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
1814 BlockDriverState *bs_src)
1815{
1816 /* move some fields that need to stay attached to the device */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001817
1818 /* dev info */
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01001819 bs_dest->guest_block_size = bs_src->guest_block_size;
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001820 bs_dest->copy_on_read = bs_src->copy_on_read;
1821
1822 bs_dest->enable_write_cache = bs_src->enable_write_cache;
1823
Benoît Canetcc0681c2013-09-02 14:14:39 +02001824 /* i/o throttled req */
Alberto Garcia76f4afb2015-06-08 18:17:44 +02001825 bs_dest->throttle_state = bs_src->throttle_state,
1826 bs_dest->io_limits_enabled = bs_src->io_limits_enabled;
1827 bs_dest->pending_reqs[0] = bs_src->pending_reqs[0];
1828 bs_dest->pending_reqs[1] = bs_src->pending_reqs[1];
1829 bs_dest->throttled_reqs[0] = bs_src->throttled_reqs[0];
1830 bs_dest->throttled_reqs[1] = bs_src->throttled_reqs[1];
1831 memcpy(&bs_dest->round_robin,
1832 &bs_src->round_robin,
1833 sizeof(bs_dest->round_robin));
Benoît Canet0e5b0a22015-06-08 18:17:41 +02001834 memcpy(&bs_dest->throttle_timers,
1835 &bs_src->throttle_timers,
1836 sizeof(ThrottleTimers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001837
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001838 /* r/w error */
1839 bs_dest->on_read_error = bs_src->on_read_error;
1840 bs_dest->on_write_error = bs_src->on_write_error;
1841
1842 /* i/o status */
1843 bs_dest->iostatus_enabled = bs_src->iostatus_enabled;
1844 bs_dest->iostatus = bs_src->iostatus;
1845
1846 /* dirty bitmap */
Fam Zhenge4654d22013-11-13 18:29:43 +08001847 bs_dest->dirty_bitmaps = bs_src->dirty_bitmaps;
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001848
Fam Zheng9fcb0252013-08-23 09:14:46 +08001849 /* reference count */
1850 bs_dest->refcnt = bs_src->refcnt;
1851
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001852 /* job */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001853 bs_dest->job = bs_src->job;
1854
1855 /* keep the same entry in bdrv_states */
Benoît Canetdc364f42014-01-23 21:31:32 +01001856 bs_dest->device_list = bs_src->device_list;
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001857 bs_dest->blk = bs_src->blk;
1858
Fam Zhengfbe40ff2014-05-23 21:29:42 +08001859 memcpy(bs_dest->op_blockers, bs_src->op_blockers,
1860 sizeof(bs_dest->op_blockers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001861}
1862
1863/*
1864 * Swap bs contents for two image chains while they are live,
1865 * while keeping required fields on the BlockDriverState that is
1866 * actually attached to a device.
1867 *
1868 * This will modify the BlockDriverState fields, and swap contents
1869 * between bs_new and bs_old. Both bs_new and bs_old are modified.
1870 *
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001871 * bs_new must not be attached to a BlockBackend.
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001872 *
1873 * This function does not create any image files.
1874 */
1875void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
1876{
1877 BlockDriverState tmp;
1878
Benoît Canet90ce8a02014-03-05 23:48:29 +01001879 /* The code needs to swap the node_name but simply swapping node_list won't
1880 * work so first remove the nodes from the graph list, do the swap then
1881 * insert them back if needed.
1882 */
1883 if (bs_new->node_name[0] != '\0') {
1884 QTAILQ_REMOVE(&graph_bdrv_states, bs_new, node_list);
1885 }
1886 if (bs_old->node_name[0] != '\0') {
1887 QTAILQ_REMOVE(&graph_bdrv_states, bs_old, node_list);
1888 }
1889
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001890 /* bs_new must be unattached and shouldn't have anything fancy enabled */
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001891 assert(!bs_new->blk);
Fam Zhenge4654d22013-11-13 18:29:43 +08001892 assert(QLIST_EMPTY(&bs_new->dirty_bitmaps));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001893 assert(bs_new->job == NULL);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001894 assert(bs_new->io_limits_enabled == false);
Benoît Canet0e5b0a22015-06-08 18:17:41 +02001895 assert(!throttle_timers_are_initialized(&bs_new->throttle_timers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001896
1897 tmp = *bs_new;
1898 *bs_new = *bs_old;
1899 *bs_old = tmp;
1900
1901 /* there are some fields that should not be swapped, move them back */
1902 bdrv_move_feature_fields(&tmp, bs_old);
1903 bdrv_move_feature_fields(bs_old, bs_new);
1904 bdrv_move_feature_fields(bs_new, &tmp);
1905
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001906 /* bs_new must remain unattached */
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001907 assert(!bs_new->blk);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001908
1909 /* Check a few fields that should remain attached to the device */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001910 assert(bs_new->job == NULL);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001911 assert(bs_new->io_limits_enabled == false);
Benoît Canet0e5b0a22015-06-08 18:17:41 +02001912 assert(!throttle_timers_are_initialized(&bs_new->throttle_timers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001913
Benoît Canet90ce8a02014-03-05 23:48:29 +01001914 /* insert the nodes back into the graph node list if needed */
1915 if (bs_new->node_name[0] != '\0') {
1916 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_new, node_list);
1917 }
1918 if (bs_old->node_name[0] != '\0') {
1919 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_old, node_list);
1920 }
1921
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001922 bdrv_rebind(bs_new);
1923 bdrv_rebind(bs_old);
1924}
1925
Jeff Cody8802d1f2012-02-28 15:54:06 -05001926/*
1927 * Add new bs contents at the top of an image chain while the chain is
1928 * live, while keeping required fields on the top layer.
1929 *
1930 * This will modify the BlockDriverState fields, and swap contents
1931 * between bs_new and bs_top. Both bs_new and bs_top are modified.
1932 *
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001933 * bs_new must not be attached to a BlockBackend.
Jeff Codyf6801b82012-03-27 16:30:19 -04001934 *
Jeff Cody8802d1f2012-02-28 15:54:06 -05001935 * This function does not create any image files.
1936 */
1937void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
1938{
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001939 bdrv_swap(bs_new, bs_top);
Jeff Cody8802d1f2012-02-28 15:54:06 -05001940
1941 /* The contents of 'tmp' will become bs_top, as we are
1942 * swapping bs_new and bs_top contents. */
Fam Zheng8d24cce2014-05-23 21:29:45 +08001943 bdrv_set_backing_hd(bs_top, bs_new);
Jeff Cody8802d1f2012-02-28 15:54:06 -05001944}
1945
Fam Zheng4f6fd342013-08-23 09:14:47 +08001946static void bdrv_delete(BlockDriverState *bs)
bellardb3380822004-03-14 21:38:54 +00001947{
Paolo Bonzini3e914652012-03-30 13:17:11 +02001948 assert(!bs->job);
Fam Zheng3718d8a2014-05-23 21:29:43 +08001949 assert(bdrv_op_blocker_is_empty(bs));
Fam Zheng4f6fd342013-08-23 09:14:47 +08001950 assert(!bs->refcnt);
Fam Zhenge4654d22013-11-13 18:29:43 +08001951 assert(QLIST_EMPTY(&bs->dirty_bitmaps));
Markus Armbruster18846de2010-06-29 16:58:30 +02001952
Stefan Hajnoczie1b5c522013-06-27 15:32:26 +02001953 bdrv_close(bs);
1954
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001955 /* remove from list, if necessary */
Ryan Harperd22b2f42011-03-29 20:51:47 -05001956 bdrv_make_anon(bs);
aurel3234c6f052008-04-08 19:51:21 +00001957
Anthony Liguori7267c092011-08-20 22:09:37 -05001958 g_free(bs);
bellardfc01f7e2003-06-30 10:03:06 +00001959}
1960
aliguorie97fc192009-04-21 23:11:50 +00001961/*
1962 * Run consistency checks on an image
1963 *
Kevin Wolfe076f332010-06-29 11:43:13 +02001964 * Returns 0 if the check could be completed (it doesn't mean that the image is
Stefan Weila1c72732011-04-28 17:20:38 +02001965 * free of errors) or -errno when an internal error occurred. The results of the
Kevin Wolfe076f332010-06-29 11:43:13 +02001966 * check are stored in res.
aliguorie97fc192009-04-21 23:11:50 +00001967 */
Kevin Wolf4534ff52012-05-11 16:07:02 +02001968int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix)
aliguorie97fc192009-04-21 23:11:50 +00001969{
Max Reitz908bcd52014-08-07 22:47:55 +02001970 if (bs->drv == NULL) {
1971 return -ENOMEDIUM;
1972 }
aliguorie97fc192009-04-21 23:11:50 +00001973 if (bs->drv->bdrv_check == NULL) {
1974 return -ENOTSUP;
1975 }
1976
Kevin Wolfe076f332010-06-29 11:43:13 +02001977 memset(res, 0, sizeof(*res));
Kevin Wolf4534ff52012-05-11 16:07:02 +02001978 return bs->drv->bdrv_check(bs, res, fix);
aliguorie97fc192009-04-21 23:11:50 +00001979}
1980
Kevin Wolf8a426612010-07-16 17:17:01 +02001981#define COMMIT_BUF_SECTORS 2048
1982
bellard33e39632003-07-06 17:15:21 +00001983/* commit COW file into the raw image */
1984int bdrv_commit(BlockDriverState *bs)
1985{
bellard19cb3732006-08-19 11:45:59 +00001986 BlockDriver *drv = bs->drv;
Jeff Cody72706ea2014-01-24 09:02:35 -05001987 int64_t sector, total_sectors, length, backing_length;
Kevin Wolf8a426612010-07-16 17:17:01 +02001988 int n, ro, open_flags;
Jeff Cody0bce5972012-09-20 15:13:34 -04001989 int ret = 0;
Jeff Cody72706ea2014-01-24 09:02:35 -05001990 uint8_t *buf = NULL;
bellard33e39632003-07-06 17:15:21 +00001991
bellard19cb3732006-08-19 11:45:59 +00001992 if (!drv)
1993 return -ENOMEDIUM;
Liu Yuan6bb45152014-09-01 13:35:21 +08001994
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001995 if (!bs->backing_hd) {
1996 return -ENOTSUP;
bellard33e39632003-07-06 17:15:21 +00001997 }
1998
Fam Zhengbb000212014-09-11 13:14:00 +08001999 if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, NULL) ||
2000 bdrv_op_is_blocked(bs->backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET, NULL)) {
Stefan Hajnoczi2d3735d2012-01-18 14:40:41 +00002001 return -EBUSY;
2002 }
2003
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002004 ro = bs->backing_hd->read_only;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002005 open_flags = bs->backing_hd->open_flags;
2006
2007 if (ro) {
Jeff Cody0bce5972012-09-20 15:13:34 -04002008 if (bdrv_reopen(bs->backing_hd, open_flags | BDRV_O_RDWR, NULL)) {
2009 return -EACCES;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002010 }
bellard33e39632003-07-06 17:15:21 +00002011 }
bellardea2384d2004-08-01 21:59:26 +00002012
Jeff Cody72706ea2014-01-24 09:02:35 -05002013 length = bdrv_getlength(bs);
2014 if (length < 0) {
2015 ret = length;
2016 goto ro_cleanup;
2017 }
2018
2019 backing_length = bdrv_getlength(bs->backing_hd);
2020 if (backing_length < 0) {
2021 ret = backing_length;
2022 goto ro_cleanup;
2023 }
2024
2025 /* If our top snapshot is larger than the backing file image,
2026 * grow the backing file image if possible. If not possible,
2027 * we must return an error */
2028 if (length > backing_length) {
2029 ret = bdrv_truncate(bs->backing_hd, length);
2030 if (ret < 0) {
2031 goto ro_cleanup;
2032 }
2033 }
2034
2035 total_sectors = length >> BDRV_SECTOR_BITS;
Kevin Wolf857d4f42014-05-20 13:16:51 +02002036
2037 /* qemu_try_blockalign() for bs will choose an alignment that works for
2038 * bs->backing_hd as well, so no need to compare the alignment manually. */
2039 buf = qemu_try_blockalign(bs, COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
2040 if (buf == NULL) {
2041 ret = -ENOMEM;
2042 goto ro_cleanup;
2043 }
bellardea2384d2004-08-01 21:59:26 +00002044
Kevin Wolf8a426612010-07-16 17:17:01 +02002045 for (sector = 0; sector < total_sectors; sector += n) {
Paolo Bonzinid6636402013-09-04 19:00:25 +02002046 ret = bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n);
2047 if (ret < 0) {
2048 goto ro_cleanup;
2049 }
2050 if (ret) {
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002051 ret = bdrv_read(bs, sector, buf, n);
2052 if (ret < 0) {
Kevin Wolf8a426612010-07-16 17:17:01 +02002053 goto ro_cleanup;
2054 }
2055
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002056 ret = bdrv_write(bs->backing_hd, sector, buf, n);
2057 if (ret < 0) {
Kevin Wolf8a426612010-07-16 17:17:01 +02002058 goto ro_cleanup;
2059 }
bellardea2384d2004-08-01 21:59:26 +00002060 }
2061 }
bellard95389c82005-12-18 18:28:15 +00002062
Christoph Hellwig1d449522010-01-17 12:32:30 +01002063 if (drv->bdrv_make_empty) {
2064 ret = drv->bdrv_make_empty(bs);
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002065 if (ret < 0) {
2066 goto ro_cleanup;
2067 }
Christoph Hellwig1d449522010-01-17 12:32:30 +01002068 bdrv_flush(bs);
2069 }
bellard95389c82005-12-18 18:28:15 +00002070
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01002071 /*
2072 * Make sure all data we wrote to the backing device is actually
2073 * stable on disk.
2074 */
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002075 if (bs->backing_hd) {
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01002076 bdrv_flush(bs->backing_hd);
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002077 }
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002078
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002079 ret = 0;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002080ro_cleanup:
Kevin Wolf857d4f42014-05-20 13:16:51 +02002081 qemu_vfree(buf);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002082
2083 if (ro) {
Jeff Cody0bce5972012-09-20 15:13:34 -04002084 /* ignoring error return here */
2085 bdrv_reopen(bs->backing_hd, open_flags & ~BDRV_O_RDWR, NULL);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002086 }
2087
Christoph Hellwig1d449522010-01-17 12:32:30 +01002088 return ret;
bellard33e39632003-07-06 17:15:21 +00002089}
2090
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002091int bdrv_commit_all(void)
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002092{
2093 BlockDriverState *bs;
2094
Benoît Canetdc364f42014-01-23 21:31:32 +01002095 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002096 AioContext *aio_context = bdrv_get_aio_context(bs);
2097
2098 aio_context_acquire(aio_context);
Jeff Cody272d2d82013-02-26 09:55:48 -05002099 if (bs->drv && bs->backing_hd) {
2100 int ret = bdrv_commit(bs);
2101 if (ret < 0) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002102 aio_context_release(aio_context);
Jeff Cody272d2d82013-02-26 09:55:48 -05002103 return ret;
2104 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002105 }
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002106 aio_context_release(aio_context);
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002107 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002108 return 0;
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002109}
2110
Kevin Wolf756e6732010-01-12 12:55:17 +01002111/*
2112 * Return values:
2113 * 0 - success
2114 * -EINVAL - backing format specified, but no file
2115 * -ENOSPC - can't update the backing file because no space is left in the
2116 * image file header
2117 * -ENOTSUP - format driver doesn't support changing the backing file
2118 */
2119int bdrv_change_backing_file(BlockDriverState *bs,
2120 const char *backing_file, const char *backing_fmt)
2121{
2122 BlockDriver *drv = bs->drv;
Paolo Bonzini469ef352012-04-12 14:01:02 +02002123 int ret;
Kevin Wolf756e6732010-01-12 12:55:17 +01002124
Paolo Bonzini5f377792012-04-12 14:01:01 +02002125 /* Backing file format doesn't make sense without a backing file */
2126 if (backing_fmt && !backing_file) {
2127 return -EINVAL;
2128 }
2129
Kevin Wolf756e6732010-01-12 12:55:17 +01002130 if (drv->bdrv_change_backing_file != NULL) {
Paolo Bonzini469ef352012-04-12 14:01:02 +02002131 ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
Kevin Wolf756e6732010-01-12 12:55:17 +01002132 } else {
Paolo Bonzini469ef352012-04-12 14:01:02 +02002133 ret = -ENOTSUP;
Kevin Wolf756e6732010-01-12 12:55:17 +01002134 }
Paolo Bonzini469ef352012-04-12 14:01:02 +02002135
2136 if (ret == 0) {
2137 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_file ?: "");
2138 pstrcpy(bs->backing_format, sizeof(bs->backing_format), backing_fmt ?: "");
2139 }
2140 return ret;
Kevin Wolf756e6732010-01-12 12:55:17 +01002141}
2142
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002143/*
2144 * Finds the image layer in the chain that has 'bs' as its backing file.
2145 *
2146 * active is the current topmost image.
2147 *
2148 * Returns NULL if bs is not found in active's image chain,
2149 * or if active == bs.
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002150 *
2151 * Returns the bottommost base image if bs == NULL.
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002152 */
2153BlockDriverState *bdrv_find_overlay(BlockDriverState *active,
2154 BlockDriverState *bs)
2155{
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002156 while (active && bs != active->backing_hd) {
2157 active = active->backing_hd;
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002158 }
2159
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002160 return active;
2161}
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002162
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002163/* Given a BDS, searches for the base layer. */
2164BlockDriverState *bdrv_find_base(BlockDriverState *bs)
2165{
2166 return bdrv_find_overlay(bs, NULL);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002167}
2168
2169typedef struct BlkIntermediateStates {
2170 BlockDriverState *bs;
2171 QSIMPLEQ_ENTRY(BlkIntermediateStates) entry;
2172} BlkIntermediateStates;
2173
2174
2175/*
2176 * Drops images above 'base' up to and including 'top', and sets the image
2177 * above 'top' to have base as its backing file.
2178 *
2179 * Requires that the overlay to 'top' is opened r/w, so that the backing file
2180 * information in 'bs' can be properly updated.
2181 *
2182 * E.g., this will convert the following chain:
2183 * bottom <- base <- intermediate <- top <- active
2184 *
2185 * to
2186 *
2187 * bottom <- base <- active
2188 *
2189 * It is allowed for bottom==base, in which case it converts:
2190 *
2191 * base <- intermediate <- top <- active
2192 *
2193 * to
2194 *
2195 * base <- active
2196 *
Jeff Cody54e26902014-06-25 15:40:10 -04002197 * If backing_file_str is non-NULL, it will be used when modifying top's
2198 * overlay image metadata.
2199 *
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002200 * Error conditions:
2201 * if active == top, that is considered an error
2202 *
2203 */
2204int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
Jeff Cody54e26902014-06-25 15:40:10 -04002205 BlockDriverState *base, const char *backing_file_str)
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002206{
2207 BlockDriverState *intermediate;
2208 BlockDriverState *base_bs = NULL;
2209 BlockDriverState *new_top_bs = NULL;
2210 BlkIntermediateStates *intermediate_state, *next;
2211 int ret = -EIO;
2212
2213 QSIMPLEQ_HEAD(states_to_delete, BlkIntermediateStates) states_to_delete;
2214 QSIMPLEQ_INIT(&states_to_delete);
2215
2216 if (!top->drv || !base->drv) {
2217 goto exit;
2218 }
2219
2220 new_top_bs = bdrv_find_overlay(active, top);
2221
2222 if (new_top_bs == NULL) {
2223 /* we could not find the image above 'top', this is an error */
2224 goto exit;
2225 }
2226
2227 /* special case of new_top_bs->backing_hd already pointing to base - nothing
2228 * to do, no intermediate images */
2229 if (new_top_bs->backing_hd == base) {
2230 ret = 0;
2231 goto exit;
2232 }
2233
2234 intermediate = top;
2235
2236 /* now we will go down through the list, and add each BDS we find
2237 * into our deletion queue, until we hit the 'base'
2238 */
2239 while (intermediate) {
Markus Armbruster5839e532014-08-19 10:31:08 +02002240 intermediate_state = g_new0(BlkIntermediateStates, 1);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002241 intermediate_state->bs = intermediate;
2242 QSIMPLEQ_INSERT_TAIL(&states_to_delete, intermediate_state, entry);
2243
2244 if (intermediate->backing_hd == base) {
2245 base_bs = intermediate->backing_hd;
2246 break;
2247 }
2248 intermediate = intermediate->backing_hd;
2249 }
2250 if (base_bs == NULL) {
2251 /* something went wrong, we did not end at the base. safely
2252 * unravel everything, and exit with error */
2253 goto exit;
2254 }
2255
2256 /* success - we can delete the intermediate states, and link top->base */
Jeff Cody54e26902014-06-25 15:40:10 -04002257 backing_file_str = backing_file_str ? backing_file_str : base_bs->filename;
2258 ret = bdrv_change_backing_file(new_top_bs, backing_file_str,
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002259 base_bs->drv ? base_bs->drv->format_name : "");
2260 if (ret) {
2261 goto exit;
2262 }
Fam Zheng920beae2014-05-23 21:29:46 +08002263 bdrv_set_backing_hd(new_top_bs, base_bs);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002264
2265 QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
2266 /* so that bdrv_close() does not recursively close the chain */
Fam Zheng920beae2014-05-23 21:29:46 +08002267 bdrv_set_backing_hd(intermediate_state->bs, NULL);
Fam Zheng4f6fd342013-08-23 09:14:47 +08002268 bdrv_unref(intermediate_state->bs);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002269 }
2270 ret = 0;
2271
2272exit:
2273 QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
2274 g_free(intermediate_state);
2275 }
2276 return ret;
2277}
2278
bellard83f64092006-08-01 16:21:11 +00002279/**
bellard83f64092006-08-01 16:21:11 +00002280 * Truncate file to 'offset' bytes (needed only for file protocols)
2281 */
2282int bdrv_truncate(BlockDriverState *bs, int64_t offset)
2283{
2284 BlockDriver *drv = bs->drv;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002285 int ret;
bellard83f64092006-08-01 16:21:11 +00002286 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002287 return -ENOMEDIUM;
bellard83f64092006-08-01 16:21:11 +00002288 if (!drv->bdrv_truncate)
2289 return -ENOTSUP;
Naphtali Sprei59f26892009-10-26 16:25:16 +02002290 if (bs->read_only)
2291 return -EACCES;
Jeff Cody9c75e162014-06-25 16:55:30 -04002292
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002293 ret = drv->bdrv_truncate(bs, offset);
2294 if (ret == 0) {
2295 ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
John Snowce1ffea2015-04-17 19:50:03 -04002296 bdrv_dirty_bitmap_truncate(bs);
Markus Armbrustera7f53e22014-10-07 13:59:25 +02002297 if (bs->blk) {
2298 blk_dev_resize_cb(bs->blk);
2299 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002300 }
2301 return ret;
bellard83f64092006-08-01 16:21:11 +00002302}
2303
2304/**
Fam Zheng4a1d5e12011-07-12 19:56:39 +08002305 * Length of a allocated file in bytes. Sparse files are counted by actual
2306 * allocated space. Return < 0 if error or unknown.
2307 */
2308int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
2309{
2310 BlockDriver *drv = bs->drv;
2311 if (!drv) {
2312 return -ENOMEDIUM;
2313 }
2314 if (drv->bdrv_get_allocated_file_size) {
2315 return drv->bdrv_get_allocated_file_size(bs);
2316 }
2317 if (bs->file) {
2318 return bdrv_get_allocated_file_size(bs->file);
2319 }
2320 return -ENOTSUP;
2321}
2322
2323/**
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002324 * Return number of sectors on success, -errno on error.
bellard83f64092006-08-01 16:21:11 +00002325 */
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002326int64_t bdrv_nb_sectors(BlockDriverState *bs)
bellard83f64092006-08-01 16:21:11 +00002327{
2328 BlockDriver *drv = bs->drv;
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002329
bellard83f64092006-08-01 16:21:11 +00002330 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002331 return -ENOMEDIUM;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002332
Kevin Wolfb94a2612013-10-29 12:18:58 +01002333 if (drv->has_variable_length) {
2334 int ret = refresh_total_sectors(bs, bs->total_sectors);
2335 if (ret < 0) {
2336 return ret;
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01002337 }
bellard83f64092006-08-01 16:21:11 +00002338 }
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002339 return bs->total_sectors;
2340}
2341
2342/**
2343 * Return length in bytes on success, -errno on error.
2344 * The length is always a multiple of BDRV_SECTOR_SIZE.
2345 */
2346int64_t bdrv_getlength(BlockDriverState *bs)
2347{
2348 int64_t ret = bdrv_nb_sectors(bs);
2349
Fam Zheng4a9c9ea2015-05-15 16:36:05 +08002350 ret = ret > INT64_MAX / BDRV_SECTOR_SIZE ? -EFBIG : ret;
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002351 return ret < 0 ? ret : ret * BDRV_SECTOR_SIZE;
bellardfc01f7e2003-06-30 10:03:06 +00002352}
2353
bellard19cb3732006-08-19 11:45:59 +00002354/* return 0 as number of sectors if no device present or error */
ths96b8f132007-12-17 01:35:20 +00002355void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
bellardfc01f7e2003-06-30 10:03:06 +00002356{
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002357 int64_t nb_sectors = bdrv_nb_sectors(bs);
2358
2359 *nb_sectors_ptr = nb_sectors < 0 ? 0 : nb_sectors;
bellardfc01f7e2003-06-30 10:03:06 +00002360}
bellardcf989512004-02-16 21:56:36 +00002361
Paolo Bonziniff06f5f2012-09-28 17:22:54 +02002362void bdrv_set_on_error(BlockDriverState *bs, BlockdevOnError on_read_error,
2363 BlockdevOnError on_write_error)
Markus Armbrusterabd7f682010-06-02 18:55:17 +02002364{
2365 bs->on_read_error = on_read_error;
2366 bs->on_write_error = on_write_error;
2367}
2368
Paolo Bonzini1ceee0d2012-09-28 17:22:56 +02002369BlockdevOnError bdrv_get_on_error(BlockDriverState *bs, bool is_read)
Markus Armbrusterabd7f682010-06-02 18:55:17 +02002370{
2371 return is_read ? bs->on_read_error : bs->on_write_error;
2372}
2373
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002374BlockErrorAction bdrv_get_error_action(BlockDriverState *bs, bool is_read, int error)
2375{
2376 BlockdevOnError on_err = is_read ? bs->on_read_error : bs->on_write_error;
2377
2378 switch (on_err) {
2379 case BLOCKDEV_ON_ERROR_ENOSPC:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002380 return (error == ENOSPC) ?
2381 BLOCK_ERROR_ACTION_STOP : BLOCK_ERROR_ACTION_REPORT;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002382 case BLOCKDEV_ON_ERROR_STOP:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002383 return BLOCK_ERROR_ACTION_STOP;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002384 case BLOCKDEV_ON_ERROR_REPORT:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002385 return BLOCK_ERROR_ACTION_REPORT;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002386 case BLOCKDEV_ON_ERROR_IGNORE:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002387 return BLOCK_ERROR_ACTION_IGNORE;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002388 default:
2389 abort();
2390 }
2391}
2392
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002393static void send_qmp_error_event(BlockDriverState *bs,
2394 BlockErrorAction action,
2395 bool is_read, int error)
2396{
Peter Maydell573742a2014-10-10 20:33:03 +01002397 IoOperationType optype;
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002398
Peter Maydell573742a2014-10-10 20:33:03 +01002399 optype = is_read ? IO_OPERATION_TYPE_READ : IO_OPERATION_TYPE_WRITE;
2400 qapi_event_send_block_io_error(bdrv_get_device_name(bs), optype, action,
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002401 bdrv_iostatus_is_enabled(bs),
Luiz Capitulino624ff572014-09-11 10:25:48 -04002402 error == ENOSPC, strerror(error),
2403 &error_abort);
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002404}
2405
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002406/* This is done by device models because, while the block layer knows
2407 * about the error, it does not know whether an operation comes from
2408 * the device or the block layer (from a job, for example).
2409 */
2410void bdrv_error_action(BlockDriverState *bs, BlockErrorAction action,
2411 bool is_read, int error)
2412{
2413 assert(error >= 0);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002414
Wenchao Xiaa5895692014-06-18 08:43:30 +02002415 if (action == BLOCK_ERROR_ACTION_STOP) {
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002416 /* First set the iostatus, so that "info block" returns an iostatus
2417 * that matches the events raised so far (an additional error iostatus
2418 * is fine, but not a lost one).
2419 */
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002420 bdrv_iostatus_set_err(bs, error);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002421
2422 /* Then raise the request to stop the VM and the event.
2423 * qemu_system_vmstop_request_prepare has two effects. First,
2424 * it ensures that the STOP event always comes after the
2425 * BLOCK_IO_ERROR event. Second, it ensures that even if management
2426 * can observe the STOP event and do a "cont" before the STOP
2427 * event is issued, the VM will not stop. In this case, vm_start()
2428 * also ensures that the STOP/RESUME pair of events is emitted.
2429 */
2430 qemu_system_vmstop_request_prepare();
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002431 send_qmp_error_event(bs, action, is_read, error);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002432 qemu_system_vmstop_request(RUN_STATE_IO_ERROR);
2433 } else {
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002434 send_qmp_error_event(bs, action, is_read, error);
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002435 }
2436}
2437
bellardb3380822004-03-14 21:38:54 +00002438int bdrv_is_read_only(BlockDriverState *bs)
2439{
2440 return bs->read_only;
2441}
2442
ths985a03b2007-12-24 16:10:43 +00002443int bdrv_is_sg(BlockDriverState *bs)
2444{
2445 return bs->sg;
2446}
2447
Christoph Hellwige900a7b2009-09-04 19:01:15 +02002448int bdrv_enable_write_cache(BlockDriverState *bs)
2449{
2450 return bs->enable_write_cache;
2451}
2452
Paolo Bonzini425b0142012-06-06 00:04:52 +02002453void bdrv_set_enable_write_cache(BlockDriverState *bs, bool wce)
2454{
2455 bs->enable_write_cache = wce;
Jeff Cody55b110f2012-09-20 15:13:18 -04002456
2457 /* so a reopen() will preserve wce */
2458 if (wce) {
2459 bs->open_flags |= BDRV_O_CACHE_WB;
2460 } else {
2461 bs->open_flags &= ~BDRV_O_CACHE_WB;
2462 }
Paolo Bonzini425b0142012-06-06 00:04:52 +02002463}
2464
bellardea2384d2004-08-01 21:59:26 +00002465int bdrv_is_encrypted(BlockDriverState *bs)
2466{
2467 if (bs->backing_hd && bs->backing_hd->encrypted)
2468 return 1;
2469 return bs->encrypted;
2470}
2471
aliguoric0f4ce72009-03-05 23:01:01 +00002472int bdrv_key_required(BlockDriverState *bs)
2473{
2474 BlockDriverState *backing_hd = bs->backing_hd;
2475
2476 if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
2477 return 1;
2478 return (bs->encrypted && !bs->valid_key);
2479}
2480
bellardea2384d2004-08-01 21:59:26 +00002481int bdrv_set_key(BlockDriverState *bs, const char *key)
2482{
2483 int ret;
2484 if (bs->backing_hd && bs->backing_hd->encrypted) {
2485 ret = bdrv_set_key(bs->backing_hd, key);
2486 if (ret < 0)
2487 return ret;
2488 if (!bs->encrypted)
2489 return 0;
2490 }
Shahar Havivifd04a2a2010-03-06 00:26:13 +02002491 if (!bs->encrypted) {
2492 return -EINVAL;
2493 } else if (!bs->drv || !bs->drv->bdrv_set_key) {
2494 return -ENOMEDIUM;
2495 }
aliguoric0f4ce72009-03-05 23:01:01 +00002496 ret = bs->drv->bdrv_set_key(bs, key);
aliguoribb5fc202009-03-05 23:01:15 +00002497 if (ret < 0) {
2498 bs->valid_key = 0;
2499 } else if (!bs->valid_key) {
2500 bs->valid_key = 1;
Markus Armbrustera7f53e22014-10-07 13:59:25 +02002501 if (bs->blk) {
2502 /* call the change callback now, we skipped it on open */
2503 blk_dev_change_media_cb(bs->blk, true);
2504 }
aliguoribb5fc202009-03-05 23:01:15 +00002505 }
aliguoric0f4ce72009-03-05 23:01:01 +00002506 return ret;
bellardea2384d2004-08-01 21:59:26 +00002507}
2508
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002509/*
2510 * Provide an encryption key for @bs.
2511 * If @key is non-null:
2512 * If @bs is not encrypted, fail.
2513 * Else if the key is invalid, fail.
2514 * Else set @bs's key to @key, replacing the existing key, if any.
2515 * If @key is null:
2516 * If @bs is encrypted and still lacks a key, fail.
2517 * Else do nothing.
2518 * On failure, store an error object through @errp if non-null.
2519 */
2520void bdrv_add_key(BlockDriverState *bs, const char *key, Error **errp)
2521{
2522 if (key) {
2523 if (!bdrv_is_encrypted(bs)) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03002524 error_setg(errp, "Node '%s' is not encrypted",
2525 bdrv_get_device_or_node_name(bs));
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002526 } else if (bdrv_set_key(bs, key) < 0) {
2527 error_set(errp, QERR_INVALID_PASSWORD);
2528 }
2529 } else {
2530 if (bdrv_key_required(bs)) {
Markus Armbrusterb1ca6392015-01-29 10:37:01 +01002531 error_set(errp, ERROR_CLASS_DEVICE_ENCRYPTED,
2532 "'%s' (%s) is encrypted",
Alberto Garcia81e5f782015-04-08 12:29:19 +03002533 bdrv_get_device_or_node_name(bs),
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002534 bdrv_get_encrypted_filename(bs));
2535 }
2536 }
2537}
2538
Markus Armbrusterf8d6bba2012-06-13 10:11:48 +02002539const char *bdrv_get_format_name(BlockDriverState *bs)
bellardea2384d2004-08-01 21:59:26 +00002540{
Markus Armbrusterf8d6bba2012-06-13 10:11:48 +02002541 return bs->drv ? bs->drv->format_name : NULL;
bellardea2384d2004-08-01 21:59:26 +00002542}
2543
Stefan Hajnocziada42402014-08-27 12:08:55 +01002544static int qsort_strcmp(const void *a, const void *b)
2545{
2546 return strcmp(a, b);
2547}
2548
ths5fafdf22007-09-16 21:08:06 +00002549void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
bellardea2384d2004-08-01 21:59:26 +00002550 void *opaque)
2551{
2552 BlockDriver *drv;
Jeff Codye855e4f2014-04-28 18:29:54 -04002553 int count = 0;
Stefan Hajnocziada42402014-08-27 12:08:55 +01002554 int i;
Jeff Codye855e4f2014-04-28 18:29:54 -04002555 const char **formats = NULL;
bellardea2384d2004-08-01 21:59:26 +00002556
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +01002557 QLIST_FOREACH(drv, &bdrv_drivers, list) {
Jeff Codye855e4f2014-04-28 18:29:54 -04002558 if (drv->format_name) {
2559 bool found = false;
2560 int i = count;
2561 while (formats && i && !found) {
2562 found = !strcmp(formats[--i], drv->format_name);
2563 }
2564
2565 if (!found) {
Markus Armbruster5839e532014-08-19 10:31:08 +02002566 formats = g_renew(const char *, formats, count + 1);
Jeff Codye855e4f2014-04-28 18:29:54 -04002567 formats[count++] = drv->format_name;
Jeff Codye855e4f2014-04-28 18:29:54 -04002568 }
2569 }
bellardea2384d2004-08-01 21:59:26 +00002570 }
Stefan Hajnocziada42402014-08-27 12:08:55 +01002571
2572 qsort(formats, count, sizeof(formats[0]), qsort_strcmp);
2573
2574 for (i = 0; i < count; i++) {
2575 it(opaque, formats[i]);
2576 }
2577
Jeff Codye855e4f2014-04-28 18:29:54 -04002578 g_free(formats);
bellardea2384d2004-08-01 21:59:26 +00002579}
2580
Benoît Canetdc364f42014-01-23 21:31:32 +01002581/* This function is to find a node in the bs graph */
2582BlockDriverState *bdrv_find_node(const char *node_name)
2583{
2584 BlockDriverState *bs;
2585
2586 assert(node_name);
2587
2588 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
2589 if (!strcmp(node_name, bs->node_name)) {
2590 return bs;
2591 }
2592 }
2593 return NULL;
2594}
2595
Benoît Canetc13163f2014-01-23 21:31:34 +01002596/* Put this QMP function here so it can access the static graph_bdrv_states. */
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002597BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp)
Benoît Canetc13163f2014-01-23 21:31:34 +01002598{
2599 BlockDeviceInfoList *list, *entry;
2600 BlockDriverState *bs;
2601
2602 list = NULL;
2603 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002604 BlockDeviceInfo *info = bdrv_block_device_info(bs, errp);
2605 if (!info) {
2606 qapi_free_BlockDeviceInfoList(list);
2607 return NULL;
2608 }
Benoît Canetc13163f2014-01-23 21:31:34 +01002609 entry = g_malloc0(sizeof(*entry));
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002610 entry->value = info;
Benoît Canetc13163f2014-01-23 21:31:34 +01002611 entry->next = list;
2612 list = entry;
2613 }
2614
2615 return list;
2616}
2617
Benoît Canet12d3ba82014-01-23 21:31:35 +01002618BlockDriverState *bdrv_lookup_bs(const char *device,
2619 const char *node_name,
2620 Error **errp)
2621{
Markus Armbruster7f06d472014-10-07 13:59:12 +02002622 BlockBackend *blk;
2623 BlockDriverState *bs;
Benoît Canet12d3ba82014-01-23 21:31:35 +01002624
Benoît Canet12d3ba82014-01-23 21:31:35 +01002625 if (device) {
Markus Armbruster7f06d472014-10-07 13:59:12 +02002626 blk = blk_by_name(device);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002627
Markus Armbruster7f06d472014-10-07 13:59:12 +02002628 if (blk) {
2629 return blk_bs(blk);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002630 }
Benoît Canet12d3ba82014-01-23 21:31:35 +01002631 }
2632
Benoît Canetdd67fa52014-02-12 17:15:06 +01002633 if (node_name) {
2634 bs = bdrv_find_node(node_name);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002635
Benoît Canetdd67fa52014-02-12 17:15:06 +01002636 if (bs) {
2637 return bs;
2638 }
Benoît Canet12d3ba82014-01-23 21:31:35 +01002639 }
2640
Benoît Canetdd67fa52014-02-12 17:15:06 +01002641 error_setg(errp, "Cannot find device=%s nor node_name=%s",
2642 device ? device : "",
2643 node_name ? node_name : "");
2644 return NULL;
Benoît Canet12d3ba82014-01-23 21:31:35 +01002645}
2646
Jeff Cody5a6684d2014-06-25 15:40:09 -04002647/* If 'base' is in the same chain as 'top', return true. Otherwise,
2648 * return false. If either argument is NULL, return false. */
2649bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
2650{
2651 while (top && top != base) {
2652 top = top->backing_hd;
2653 }
2654
2655 return top != NULL;
2656}
2657
Fam Zheng04df7652014-10-31 11:32:54 +08002658BlockDriverState *bdrv_next_node(BlockDriverState *bs)
2659{
2660 if (!bs) {
2661 return QTAILQ_FIRST(&graph_bdrv_states);
2662 }
2663 return QTAILQ_NEXT(bs, node_list);
2664}
2665
Markus Armbruster2f399b02010-06-02 18:55:20 +02002666BlockDriverState *bdrv_next(BlockDriverState *bs)
2667{
2668 if (!bs) {
2669 return QTAILQ_FIRST(&bdrv_states);
2670 }
Benoît Canetdc364f42014-01-23 21:31:32 +01002671 return QTAILQ_NEXT(bs, device_list);
Markus Armbruster2f399b02010-06-02 18:55:20 +02002672}
2673
Fam Zheng20a9e772014-10-31 11:32:55 +08002674const char *bdrv_get_node_name(const BlockDriverState *bs)
2675{
2676 return bs->node_name;
2677}
2678
Markus Armbruster7f06d472014-10-07 13:59:12 +02002679/* TODO check what callers really want: bs->node_name or blk_name() */
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02002680const char *bdrv_get_device_name(const BlockDriverState *bs)
bellardea2384d2004-08-01 21:59:26 +00002681{
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02002682 return bs->blk ? blk_name(bs->blk) : "";
bellardea2384d2004-08-01 21:59:26 +00002683}
2684
Alberto Garcia9b2aa842015-04-08 12:29:18 +03002685/* This can be used to identify nodes that might not have a device
2686 * name associated. Since node and device names live in the same
2687 * namespace, the result is unambiguous. The exception is if both are
2688 * absent, then this returns an empty (non-null) string. */
2689const char *bdrv_get_device_or_node_name(const BlockDriverState *bs)
2690{
2691 return bs->blk ? blk_name(bs->blk) : bs->node_name;
2692}
2693
Markus Armbrusterc8433282012-06-05 16:49:24 +02002694int bdrv_get_flags(BlockDriverState *bs)
2695{
2696 return bs->open_flags;
2697}
2698
Peter Lieven3ac21622013-06-28 12:47:42 +02002699int bdrv_has_zero_init_1(BlockDriverState *bs)
2700{
2701 return 1;
2702}
2703
Kevin Wolff2feebb2010-04-14 17:30:35 +02002704int bdrv_has_zero_init(BlockDriverState *bs)
2705{
2706 assert(bs->drv);
2707
Paolo Bonzini11212d82013-09-04 19:00:27 +02002708 /* If BS is a copy on write image, it is initialized to
2709 the contents of the base image, which may not be zeroes. */
2710 if (bs->backing_hd) {
2711 return 0;
2712 }
Kevin Wolf336c1c12010-07-28 11:26:29 +02002713 if (bs->drv->bdrv_has_zero_init) {
2714 return bs->drv->bdrv_has_zero_init(bs);
Kevin Wolff2feebb2010-04-14 17:30:35 +02002715 }
2716
Peter Lieven3ac21622013-06-28 12:47:42 +02002717 /* safe default */
2718 return 0;
Kevin Wolff2feebb2010-04-14 17:30:35 +02002719}
2720
Peter Lieven4ce78692013-10-24 12:06:54 +02002721bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs)
2722{
2723 BlockDriverInfo bdi;
2724
2725 if (bs->backing_hd) {
2726 return false;
2727 }
2728
2729 if (bdrv_get_info(bs, &bdi) == 0) {
2730 return bdi.unallocated_blocks_are_zero;
2731 }
2732
2733 return false;
2734}
2735
2736bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs)
2737{
2738 BlockDriverInfo bdi;
2739
2740 if (bs->backing_hd || !(bs->open_flags & BDRV_O_UNMAP)) {
2741 return false;
2742 }
2743
2744 if (bdrv_get_info(bs, &bdi) == 0) {
2745 return bdi.can_write_zeroes_with_unmap;
2746 }
2747
2748 return false;
2749}
2750
aliguori045df332009-03-05 23:00:48 +00002751const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
2752{
2753 if (bs->backing_hd && bs->backing_hd->encrypted)
2754 return bs->backing_file;
2755 else if (bs->encrypted)
2756 return bs->filename;
2757 else
2758 return NULL;
2759}
2760
ths5fafdf22007-09-16 21:08:06 +00002761void bdrv_get_backing_filename(BlockDriverState *bs,
bellard83f64092006-08-01 16:21:11 +00002762 char *filename, int filename_size)
bellardea2384d2004-08-01 21:59:26 +00002763{
Kevin Wolf3574c602011-10-26 11:02:11 +02002764 pstrcpy(filename, filename_size, bs->backing_file);
bellardea2384d2004-08-01 21:59:26 +00002765}
2766
bellardfaea38e2006-08-05 21:31:00 +00002767int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
2768{
2769 BlockDriver *drv = bs->drv;
2770 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002771 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00002772 if (!drv->bdrv_get_info)
2773 return -ENOTSUP;
2774 memset(bdi, 0, sizeof(*bdi));
2775 return drv->bdrv_get_info(bs, bdi);
2776}
2777
Max Reitzeae041f2013-10-09 10:46:16 +02002778ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs)
2779{
2780 BlockDriver *drv = bs->drv;
2781 if (drv && drv->bdrv_get_specific_info) {
2782 return drv->bdrv_get_specific_info(bs);
2783 }
2784 return NULL;
2785}
2786
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002787void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event)
2788{
Kevin Wolfbf736fe2013-06-05 15:17:55 +02002789 if (!bs || !bs->drv || !bs->drv->bdrv_debug_event) {
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002790 return;
2791 }
2792
Kevin Wolfbf736fe2013-06-05 15:17:55 +02002793 bs->drv->bdrv_debug_event(bs, event);
Kevin Wolf41c695c2012-12-06 14:32:58 +01002794}
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002795
Kevin Wolf41c695c2012-12-06 14:32:58 +01002796int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
2797 const char *tag)
2798{
2799 while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) {
2800 bs = bs->file;
2801 }
2802
2803 if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) {
2804 return bs->drv->bdrv_debug_breakpoint(bs, event, tag);
2805 }
2806
2807 return -ENOTSUP;
2808}
2809
Fam Zheng4cc70e92013-11-20 10:01:54 +08002810int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag)
2811{
2812 while (bs && bs->drv && !bs->drv->bdrv_debug_remove_breakpoint) {
2813 bs = bs->file;
2814 }
2815
2816 if (bs && bs->drv && bs->drv->bdrv_debug_remove_breakpoint) {
2817 return bs->drv->bdrv_debug_remove_breakpoint(bs, tag);
2818 }
2819
2820 return -ENOTSUP;
2821}
2822
Kevin Wolf41c695c2012-12-06 14:32:58 +01002823int bdrv_debug_resume(BlockDriverState *bs, const char *tag)
2824{
Max Reitz938789e2014-03-10 23:44:08 +01002825 while (bs && (!bs->drv || !bs->drv->bdrv_debug_resume)) {
Kevin Wolf41c695c2012-12-06 14:32:58 +01002826 bs = bs->file;
2827 }
2828
2829 if (bs && bs->drv && bs->drv->bdrv_debug_resume) {
2830 return bs->drv->bdrv_debug_resume(bs, tag);
2831 }
2832
2833 return -ENOTSUP;
2834}
2835
2836bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag)
2837{
2838 while (bs && bs->drv && !bs->drv->bdrv_debug_is_suspended) {
2839 bs = bs->file;
2840 }
2841
2842 if (bs && bs->drv && bs->drv->bdrv_debug_is_suspended) {
2843 return bs->drv->bdrv_debug_is_suspended(bs, tag);
2844 }
2845
2846 return false;
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002847}
2848
Blue Swirl199630b2010-07-25 20:49:34 +00002849int bdrv_is_snapshot(BlockDriverState *bs)
2850{
2851 return !!(bs->open_flags & BDRV_O_SNAPSHOT);
2852}
2853
Jeff Codyb1b1d782012-10-16 15:49:09 -04002854/* backing_file can either be relative, or absolute, or a protocol. If it is
2855 * relative, it must be relative to the chain. So, passing in bs->filename
2856 * from a BDS as backing_file should not be done, as that may be relative to
2857 * the CWD rather than the chain. */
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002858BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
2859 const char *backing_file)
2860{
Jeff Codyb1b1d782012-10-16 15:49:09 -04002861 char *filename_full = NULL;
2862 char *backing_file_full = NULL;
2863 char *filename_tmp = NULL;
2864 int is_protocol = 0;
2865 BlockDriverState *curr_bs = NULL;
2866 BlockDriverState *retval = NULL;
2867
2868 if (!bs || !bs->drv || !backing_file) {
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002869 return NULL;
2870 }
2871
Jeff Codyb1b1d782012-10-16 15:49:09 -04002872 filename_full = g_malloc(PATH_MAX);
2873 backing_file_full = g_malloc(PATH_MAX);
2874 filename_tmp = g_malloc(PATH_MAX);
2875
2876 is_protocol = path_has_protocol(backing_file);
2877
2878 for (curr_bs = bs; curr_bs->backing_hd; curr_bs = curr_bs->backing_hd) {
2879
2880 /* If either of the filename paths is actually a protocol, then
2881 * compare unmodified paths; otherwise make paths relative */
2882 if (is_protocol || path_has_protocol(curr_bs->backing_file)) {
2883 if (strcmp(backing_file, curr_bs->backing_file) == 0) {
2884 retval = curr_bs->backing_hd;
2885 break;
2886 }
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002887 } else {
Jeff Codyb1b1d782012-10-16 15:49:09 -04002888 /* If not an absolute filename path, make it relative to the current
2889 * image's filename path */
2890 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
2891 backing_file);
2892
2893 /* We are going to compare absolute pathnames */
2894 if (!realpath(filename_tmp, filename_full)) {
2895 continue;
2896 }
2897
2898 /* We need to make sure the backing filename we are comparing against
2899 * is relative to the current image filename (or absolute) */
2900 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
2901 curr_bs->backing_file);
2902
2903 if (!realpath(filename_tmp, backing_file_full)) {
2904 continue;
2905 }
2906
2907 if (strcmp(backing_file_full, filename_full) == 0) {
2908 retval = curr_bs->backing_hd;
2909 break;
2910 }
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002911 }
2912 }
2913
Jeff Codyb1b1d782012-10-16 15:49:09 -04002914 g_free(filename_full);
2915 g_free(backing_file_full);
2916 g_free(filename_tmp);
2917 return retval;
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002918}
2919
Benoît Canetf198fd12012-08-02 10:22:47 +02002920int bdrv_get_backing_file_depth(BlockDriverState *bs)
2921{
2922 if (!bs->drv) {
2923 return 0;
2924 }
2925
2926 if (!bs->backing_hd) {
2927 return 0;
2928 }
2929
2930 return 1 + bdrv_get_backing_file_depth(bs->backing_hd);
2931}
2932
bellardea2384d2004-08-01 21:59:26 +00002933void bdrv_init(void)
2934{
Anthony Liguori5efa9d52009-05-09 17:03:42 -05002935 module_call_init(MODULE_INIT_BLOCK);
bellardea2384d2004-08-01 21:59:26 +00002936}
pbrookce1a14d2006-08-07 02:38:06 +00002937
Markus Armbrustereb852012009-10-27 18:41:44 +01002938void bdrv_init_with_whitelist(void)
2939{
2940 use_bdrv_whitelist = 1;
2941 bdrv_init();
2942}
2943
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002944void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
Anthony Liguori0f154232011-11-14 15:09:45 -06002945{
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002946 Error *local_err = NULL;
2947 int ret;
2948
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002949 if (!bs->drv) {
2950 return;
Anthony Liguori0f154232011-11-14 15:09:45 -06002951 }
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002952
Alexey Kardashevskiy7ea2d262014-10-09 13:50:46 +11002953 if (!(bs->open_flags & BDRV_O_INCOMING)) {
2954 return;
2955 }
2956 bs->open_flags &= ~BDRV_O_INCOMING;
2957
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002958 if (bs->drv->bdrv_invalidate_cache) {
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002959 bs->drv->bdrv_invalidate_cache(bs, &local_err);
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002960 } else if (bs->file) {
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002961 bdrv_invalidate_cache(bs->file, &local_err);
2962 }
2963 if (local_err) {
2964 error_propagate(errp, local_err);
2965 return;
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002966 }
2967
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002968 ret = refresh_total_sectors(bs, bs->total_sectors);
2969 if (ret < 0) {
2970 error_setg_errno(errp, -ret, "Could not refresh total sector count");
2971 return;
2972 }
Anthony Liguori0f154232011-11-14 15:09:45 -06002973}
2974
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002975void bdrv_invalidate_cache_all(Error **errp)
Anthony Liguori0f154232011-11-14 15:09:45 -06002976{
2977 BlockDriverState *bs;
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002978 Error *local_err = NULL;
Anthony Liguori0f154232011-11-14 15:09:45 -06002979
Benoît Canetdc364f42014-01-23 21:31:32 +01002980 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002981 AioContext *aio_context = bdrv_get_aio_context(bs);
2982
2983 aio_context_acquire(aio_context);
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002984 bdrv_invalidate_cache(bs, &local_err);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002985 aio_context_release(aio_context);
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002986 if (local_err) {
2987 error_propagate(errp, local_err);
2988 return;
2989 }
Anthony Liguori0f154232011-11-14 15:09:45 -06002990 }
2991}
2992
Kevin Wolff9f05dc2011-07-15 13:50:26 +02002993/**************************************************************/
bellard19cb3732006-08-19 11:45:59 +00002994/* removable device support */
2995
2996/**
2997 * Return TRUE if the media is present
2998 */
2999int bdrv_is_inserted(BlockDriverState *bs)
3000{
3001 BlockDriver *drv = bs->drv;
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003002
bellard19cb3732006-08-19 11:45:59 +00003003 if (!drv)
3004 return 0;
3005 if (!drv->bdrv_is_inserted)
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003006 return 1;
3007 return drv->bdrv_is_inserted(bs);
bellard19cb3732006-08-19 11:45:59 +00003008}
3009
3010/**
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003011 * Return whether the media changed since the last call to this
3012 * function, or -ENOTSUP if we don't know. Most drivers don't know.
bellard19cb3732006-08-19 11:45:59 +00003013 */
3014int bdrv_media_changed(BlockDriverState *bs)
3015{
3016 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003017
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003018 if (drv && drv->bdrv_media_changed) {
3019 return drv->bdrv_media_changed(bs);
3020 }
3021 return -ENOTSUP;
bellard19cb3732006-08-19 11:45:59 +00003022}
3023
3024/**
3025 * If eject_flag is TRUE, eject the media. Otherwise, close the tray
3026 */
Luiz Capitulinof36f3942012-02-03 16:24:53 -02003027void bdrv_eject(BlockDriverState *bs, bool eject_flag)
bellard19cb3732006-08-19 11:45:59 +00003028{
3029 BlockDriver *drv = bs->drv;
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003030 const char *device_name;
bellard19cb3732006-08-19 11:45:59 +00003031
Markus Armbruster822e1cd2011-07-20 18:23:42 +02003032 if (drv && drv->bdrv_eject) {
3033 drv->bdrv_eject(bs, eject_flag);
bellard19cb3732006-08-19 11:45:59 +00003034 }
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02003035
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003036 device_name = bdrv_get_device_name(bs);
3037 if (device_name[0] != '\0') {
3038 qapi_event_send_device_tray_moved(device_name,
Wenchao Xiaa5ee7bd2014-06-18 08:43:44 +02003039 eject_flag, &error_abort);
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02003040 }
bellard19cb3732006-08-19 11:45:59 +00003041}
3042
bellard19cb3732006-08-19 11:45:59 +00003043/**
3044 * Lock or unlock the media (if it is locked, the user won't be able
3045 * to eject it manually).
3046 */
Markus Armbruster025e8492011-09-06 18:58:47 +02003047void bdrv_lock_medium(BlockDriverState *bs, bool locked)
bellard19cb3732006-08-19 11:45:59 +00003048{
3049 BlockDriver *drv = bs->drv;
3050
Markus Armbruster025e8492011-09-06 18:58:47 +02003051 trace_bdrv_lock_medium(bs, locked);
Stefan Hajnoczib8c6d092011-03-29 20:04:40 +01003052
Markus Armbruster025e8492011-09-06 18:58:47 +02003053 if (drv && drv->bdrv_lock_medium) {
3054 drv->bdrv_lock_medium(bs, locked);
bellard19cb3732006-08-19 11:45:59 +00003055 }
3056}
ths985a03b2007-12-24 16:10:43 +00003057
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01003058void bdrv_set_guest_block_size(BlockDriverState *bs, int align)
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003059{
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01003060 bs->guest_block_size = align;
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003061}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003062
Fam Zheng0db6e542015-04-17 19:49:50 -04003063BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs, const char *name)
3064{
3065 BdrvDirtyBitmap *bm;
3066
3067 assert(name);
3068 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
3069 if (bm->name && !strcmp(name, bm->name)) {
3070 return bm;
3071 }
3072 }
3073 return NULL;
3074}
3075
John Snow20dca812015-04-17 19:50:02 -04003076void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap)
Fam Zheng0db6e542015-04-17 19:49:50 -04003077{
John Snow9bd2b082015-04-17 19:49:57 -04003078 assert(!bdrv_dirty_bitmap_frozen(bitmap));
Fam Zheng0db6e542015-04-17 19:49:50 -04003079 g_free(bitmap->name);
3080 bitmap->name = NULL;
3081}
3082
3083BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
John Snow5fba6c02015-04-17 19:49:51 -04003084 uint32_t granularity,
Fam Zheng0db6e542015-04-17 19:49:50 -04003085 const char *name,
Fam Zhengb8afb522014-04-16 09:34:30 +08003086 Error **errp)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003087{
3088 int64_t bitmap_size;
Fam Zhenge4654d22013-11-13 18:29:43 +08003089 BdrvDirtyBitmap *bitmap;
John Snow5fba6c02015-04-17 19:49:51 -04003090 uint32_t sector_granularity;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003091
Paolo Bonzini50717e92013-01-21 17:09:45 +01003092 assert((granularity & (granularity - 1)) == 0);
3093
Fam Zheng0db6e542015-04-17 19:49:50 -04003094 if (name && bdrv_find_dirty_bitmap(bs, name)) {
3095 error_setg(errp, "Bitmap already exists: %s", name);
3096 return NULL;
3097 }
John Snow5fba6c02015-04-17 19:49:51 -04003098 sector_granularity = granularity >> BDRV_SECTOR_BITS;
3099 assert(sector_granularity);
Markus Armbruster57322b72014-06-26 13:23:22 +02003100 bitmap_size = bdrv_nb_sectors(bs);
Fam Zhengb8afb522014-04-16 09:34:30 +08003101 if (bitmap_size < 0) {
3102 error_setg_errno(errp, -bitmap_size, "could not get length of device");
3103 errno = -bitmap_size;
3104 return NULL;
3105 }
Markus Armbruster5839e532014-08-19 10:31:08 +02003106 bitmap = g_new0(BdrvDirtyBitmap, 1);
John Snow5fba6c02015-04-17 19:49:51 -04003107 bitmap->bitmap = hbitmap_alloc(bitmap_size, ctz32(sector_granularity));
John Snowe74e6b72015-04-17 19:49:59 -04003108 bitmap->size = bitmap_size;
Fam Zheng0db6e542015-04-17 19:49:50 -04003109 bitmap->name = g_strdup(name);
John Snowb8e6fb72015-04-17 19:49:56 -04003110 bitmap->disabled = false;
Fam Zhenge4654d22013-11-13 18:29:43 +08003111 QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
3112 return bitmap;
3113}
3114
John Snow9bd2b082015-04-17 19:49:57 -04003115bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
3116{
3117 return bitmap->successor;
3118}
3119
John Snowb8e6fb72015-04-17 19:49:56 -04003120bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
3121{
John Snow9bd2b082015-04-17 19:49:57 -04003122 return !(bitmap->disabled || bitmap->successor);
3123}
3124
John Snow9abe3bd2015-05-12 15:53:01 -04003125DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap)
3126{
3127 if (bdrv_dirty_bitmap_frozen(bitmap)) {
3128 return DIRTY_BITMAP_STATUS_FROZEN;
3129 } else if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3130 return DIRTY_BITMAP_STATUS_DISABLED;
3131 } else {
3132 return DIRTY_BITMAP_STATUS_ACTIVE;
3133 }
3134}
3135
John Snow9bd2b082015-04-17 19:49:57 -04003136/**
3137 * Create a successor bitmap destined to replace this bitmap after an operation.
3138 * Requires that the bitmap is not frozen and has no successor.
3139 */
3140int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
3141 BdrvDirtyBitmap *bitmap, Error **errp)
3142{
3143 uint64_t granularity;
3144 BdrvDirtyBitmap *child;
3145
3146 if (bdrv_dirty_bitmap_frozen(bitmap)) {
3147 error_setg(errp, "Cannot create a successor for a bitmap that is "
3148 "currently frozen");
3149 return -1;
3150 }
3151 assert(!bitmap->successor);
3152
3153 /* Create an anonymous successor */
3154 granularity = bdrv_dirty_bitmap_granularity(bitmap);
3155 child = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
3156 if (!child) {
3157 return -1;
3158 }
3159
3160 /* Successor will be on or off based on our current state. */
3161 child->disabled = bitmap->disabled;
3162
3163 /* Install the successor and freeze the parent */
3164 bitmap->successor = child;
3165 return 0;
3166}
3167
3168/**
3169 * For a bitmap with a successor, yield our name to the successor,
3170 * delete the old bitmap, and return a handle to the new bitmap.
3171 */
3172BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
3173 BdrvDirtyBitmap *bitmap,
3174 Error **errp)
3175{
3176 char *name;
3177 BdrvDirtyBitmap *successor = bitmap->successor;
3178
3179 if (successor == NULL) {
3180 error_setg(errp, "Cannot relinquish control if "
3181 "there's no successor present");
3182 return NULL;
3183 }
3184
3185 name = bitmap->name;
3186 bitmap->name = NULL;
3187 successor->name = name;
3188 bitmap->successor = NULL;
3189 bdrv_release_dirty_bitmap(bs, bitmap);
3190
3191 return successor;
3192}
3193
3194/**
3195 * In cases of failure where we can no longer safely delete the parent,
3196 * we may wish to re-join the parent and child/successor.
3197 * The merged parent will be un-frozen, but not explicitly re-enabled.
3198 */
3199BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
3200 BdrvDirtyBitmap *parent,
3201 Error **errp)
3202{
3203 BdrvDirtyBitmap *successor = parent->successor;
3204
3205 if (!successor) {
3206 error_setg(errp, "Cannot reclaim a successor when none is present");
3207 return NULL;
3208 }
3209
3210 if (!hbitmap_merge(parent->bitmap, successor->bitmap)) {
3211 error_setg(errp, "Merging of parent and successor bitmap failed");
3212 return NULL;
3213 }
3214 bdrv_release_dirty_bitmap(bs, successor);
3215 parent->successor = NULL;
3216
3217 return parent;
John Snowb8e6fb72015-04-17 19:49:56 -04003218}
3219
John Snowce1ffea2015-04-17 19:50:03 -04003220/**
3221 * Truncates _all_ bitmaps attached to a BDS.
3222 */
3223static void bdrv_dirty_bitmap_truncate(BlockDriverState *bs)
3224{
3225 BdrvDirtyBitmap *bitmap;
3226 uint64_t size = bdrv_nb_sectors(bs);
3227
3228 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
3229 if (bdrv_dirty_bitmap_frozen(bitmap)) {
3230 continue;
3231 }
3232 hbitmap_truncate(bitmap->bitmap, size);
3233 }
3234}
3235
Fam Zhenge4654d22013-11-13 18:29:43 +08003236void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
3237{
3238 BdrvDirtyBitmap *bm, *next;
3239 QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
3240 if (bm == bitmap) {
John Snow9bd2b082015-04-17 19:49:57 -04003241 assert(!bdrv_dirty_bitmap_frozen(bm));
Fam Zhenge4654d22013-11-13 18:29:43 +08003242 QLIST_REMOVE(bitmap, list);
3243 hbitmap_free(bitmap->bitmap);
Fam Zheng0db6e542015-04-17 19:49:50 -04003244 g_free(bitmap->name);
Fam Zhenge4654d22013-11-13 18:29:43 +08003245 g_free(bitmap);
3246 return;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003247 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003248 }
3249}
3250
John Snowb8e6fb72015-04-17 19:49:56 -04003251void bdrv_disable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3252{
John Snow9bd2b082015-04-17 19:49:57 -04003253 assert(!bdrv_dirty_bitmap_frozen(bitmap));
John Snowb8e6fb72015-04-17 19:49:56 -04003254 bitmap->disabled = true;
3255}
3256
3257void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3258{
John Snow9bd2b082015-04-17 19:49:57 -04003259 assert(!bdrv_dirty_bitmap_frozen(bitmap));
John Snowb8e6fb72015-04-17 19:49:56 -04003260 bitmap->disabled = false;
3261}
3262
Fam Zheng21b56832013-11-13 18:29:44 +08003263BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
3264{
3265 BdrvDirtyBitmap *bm;
3266 BlockDirtyInfoList *list = NULL;
3267 BlockDirtyInfoList **plist = &list;
3268
3269 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
Markus Armbruster5839e532014-08-19 10:31:08 +02003270 BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
3271 BlockDirtyInfoList *entry = g_new0(BlockDirtyInfoList, 1);
John Snow20dca812015-04-17 19:50:02 -04003272 info->count = bdrv_get_dirty_count(bm);
John Snow592fdd02015-04-17 19:49:53 -04003273 info->granularity = bdrv_dirty_bitmap_granularity(bm);
Fam Zheng0db6e542015-04-17 19:49:50 -04003274 info->has_name = !!bm->name;
3275 info->name = g_strdup(bm->name);
John Snow9abe3bd2015-05-12 15:53:01 -04003276 info->status = bdrv_dirty_bitmap_status(bm);
Fam Zheng21b56832013-11-13 18:29:44 +08003277 entry->value = info;
3278 *plist = entry;
3279 plist = &entry->next;
3280 }
3281
3282 return list;
3283}
3284
Fam Zhenge4654d22013-11-13 18:29:43 +08003285int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003286{
Fam Zhenge4654d22013-11-13 18:29:43 +08003287 if (bitmap) {
3288 return hbitmap_get(bitmap->bitmap, sector);
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003289 } else {
3290 return 0;
3291 }
3292}
3293
John Snow341ebc22015-04-17 19:49:52 -04003294/**
3295 * Chooses a default granularity based on the existing cluster size,
3296 * but clamped between [4K, 64K]. Defaults to 64K in the case that there
3297 * is no cluster size information available.
3298 */
3299uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs)
3300{
3301 BlockDriverInfo bdi;
3302 uint32_t granularity;
3303
3304 if (bdrv_get_info(bs, &bdi) >= 0 && bdi.cluster_size > 0) {
3305 granularity = MAX(4096, bdi.cluster_size);
3306 granularity = MIN(65536, granularity);
3307 } else {
3308 granularity = 65536;
3309 }
3310
3311 return granularity;
3312}
3313
John Snow592fdd02015-04-17 19:49:53 -04003314uint32_t bdrv_dirty_bitmap_granularity(BdrvDirtyBitmap *bitmap)
3315{
3316 return BDRV_SECTOR_SIZE << hbitmap_granularity(bitmap->bitmap);
3317}
3318
John Snow20dca812015-04-17 19:50:02 -04003319void bdrv_dirty_iter_init(BdrvDirtyBitmap *bitmap, HBitmapIter *hbi)
Paolo Bonzini1755da12012-10-18 16:49:18 +02003320{
Fam Zhenge4654d22013-11-13 18:29:43 +08003321 hbitmap_iter_init(hbi, bitmap->bitmap, 0);
Paolo Bonzini1755da12012-10-18 16:49:18 +02003322}
3323
John Snow20dca812015-04-17 19:50:02 -04003324void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003325 int64_t cur_sector, int nr_sectors)
3326{
John Snowb8e6fb72015-04-17 19:49:56 -04003327 assert(bdrv_dirty_bitmap_enabled(bitmap));
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003328 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
3329}
3330
John Snow20dca812015-04-17 19:50:02 -04003331void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003332 int64_t cur_sector, int nr_sectors)
3333{
John Snowb8e6fb72015-04-17 19:49:56 -04003334 assert(bdrv_dirty_bitmap_enabled(bitmap));
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003335 hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
3336}
3337
John Snowe74e6b72015-04-17 19:49:59 -04003338void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3339{
3340 assert(bdrv_dirty_bitmap_enabled(bitmap));
3341 hbitmap_reset(bitmap->bitmap, 0, bitmap->size);
3342}
3343
Stefan Hajnoczie0c47b62015-04-28 14:27:50 +01003344void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,
3345 int nr_sectors)
Paolo Bonzini1755da12012-10-18 16:49:18 +02003346{
Fam Zhenge4654d22013-11-13 18:29:43 +08003347 BdrvDirtyBitmap *bitmap;
3348 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
John Snowb8e6fb72015-04-17 19:49:56 -04003349 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3350 continue;
3351 }
Fam Zhenge4654d22013-11-13 18:29:43 +08003352 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
Paolo Bonzini8f0720e2013-01-21 17:09:41 +01003353 }
Liran Schouraaa0eb72010-01-26 10:31:48 +02003354}
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003355
Stefan Hajnoczie0c47b62015-04-28 14:27:50 +01003356void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
3357 int nr_sectors)
Fam Zhenge4654d22013-11-13 18:29:43 +08003358{
3359 BdrvDirtyBitmap *bitmap;
3360 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
John Snowb8e6fb72015-04-17 19:49:56 -04003361 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3362 continue;
3363 }
Fam Zhenge4654d22013-11-13 18:29:43 +08003364 hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
3365 }
3366}
3367
John Snowd58d8452015-04-17 19:49:58 -04003368/**
3369 * Advance an HBitmapIter to an arbitrary offset.
3370 */
3371void bdrv_set_dirty_iter(HBitmapIter *hbi, int64_t offset)
3372{
3373 assert(hbi->hb);
3374 hbitmap_iter_init(hbi, hbi->hb, offset);
3375}
3376
John Snow20dca812015-04-17 19:50:02 -04003377int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
Fam Zhenge4654d22013-11-13 18:29:43 +08003378{
3379 return hbitmap_count(bitmap->bitmap);
3380}
3381
Fam Zheng9fcb0252013-08-23 09:14:46 +08003382/* Get a reference to bs */
3383void bdrv_ref(BlockDriverState *bs)
3384{
3385 bs->refcnt++;
3386}
3387
3388/* Release a previously grabbed reference to bs.
3389 * If after releasing, reference count is zero, the BlockDriverState is
3390 * deleted. */
3391void bdrv_unref(BlockDriverState *bs)
3392{
Jeff Cody9a4d5ca2014-07-23 17:22:57 -04003393 if (!bs) {
3394 return;
3395 }
Fam Zheng9fcb0252013-08-23 09:14:46 +08003396 assert(bs->refcnt > 0);
3397 if (--bs->refcnt == 0) {
3398 bdrv_delete(bs);
3399 }
3400}
3401
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003402struct BdrvOpBlocker {
3403 Error *reason;
3404 QLIST_ENTRY(BdrvOpBlocker) list;
3405};
3406
3407bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
3408{
3409 BdrvOpBlocker *blocker;
3410 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3411 if (!QLIST_EMPTY(&bs->op_blockers[op])) {
3412 blocker = QLIST_FIRST(&bs->op_blockers[op]);
3413 if (errp) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03003414 error_setg(errp, "Node '%s' is busy: %s",
3415 bdrv_get_device_or_node_name(bs),
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003416 error_get_pretty(blocker->reason));
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003417 }
3418 return true;
3419 }
3420 return false;
3421}
3422
3423void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason)
3424{
3425 BdrvOpBlocker *blocker;
3426 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3427
Markus Armbruster5839e532014-08-19 10:31:08 +02003428 blocker = g_new0(BdrvOpBlocker, 1);
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003429 blocker->reason = reason;
3430 QLIST_INSERT_HEAD(&bs->op_blockers[op], blocker, list);
3431}
3432
3433void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason)
3434{
3435 BdrvOpBlocker *blocker, *next;
3436 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3437 QLIST_FOREACH_SAFE(blocker, &bs->op_blockers[op], list, next) {
3438 if (blocker->reason == reason) {
3439 QLIST_REMOVE(blocker, list);
3440 g_free(blocker);
3441 }
3442 }
3443}
3444
3445void bdrv_op_block_all(BlockDriverState *bs, Error *reason)
3446{
3447 int i;
3448 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3449 bdrv_op_block(bs, i, reason);
3450 }
3451}
3452
3453void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason)
3454{
3455 int i;
3456 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3457 bdrv_op_unblock(bs, i, reason);
3458 }
3459}
3460
3461bool bdrv_op_blocker_is_empty(BlockDriverState *bs)
3462{
3463 int i;
3464
3465 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3466 if (!QLIST_EMPTY(&bs->op_blockers[i])) {
3467 return false;
3468 }
3469 }
3470 return true;
3471}
3472
Luiz Capitulino28a72822011-09-26 17:43:50 -03003473void bdrv_iostatus_enable(BlockDriverState *bs)
3474{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003475 bs->iostatus_enabled = true;
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003476 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003477}
3478
3479/* The I/O status is only enabled if the drive explicitly
3480 * enables it _and_ the VM is configured to stop on errors */
3481bool bdrv_iostatus_is_enabled(const BlockDriverState *bs)
3482{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003483 return (bs->iostatus_enabled &&
Paolo Bonzini92aa5c62012-09-28 17:22:55 +02003484 (bs->on_write_error == BLOCKDEV_ON_ERROR_ENOSPC ||
3485 bs->on_write_error == BLOCKDEV_ON_ERROR_STOP ||
3486 bs->on_read_error == BLOCKDEV_ON_ERROR_STOP));
Luiz Capitulino28a72822011-09-26 17:43:50 -03003487}
3488
3489void bdrv_iostatus_disable(BlockDriverState *bs)
3490{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003491 bs->iostatus_enabled = false;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003492}
3493
3494void bdrv_iostatus_reset(BlockDriverState *bs)
3495{
3496 if (bdrv_iostatus_is_enabled(bs)) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003497 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Paolo Bonzini3bd293c2012-10-18 16:49:27 +02003498 if (bs->job) {
3499 block_job_iostatus_reset(bs->job);
3500 }
Luiz Capitulino28a72822011-09-26 17:43:50 -03003501 }
3502}
3503
Luiz Capitulino28a72822011-09-26 17:43:50 -03003504void bdrv_iostatus_set_err(BlockDriverState *bs, int error)
3505{
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003506 assert(bdrv_iostatus_is_enabled(bs));
3507 if (bs->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003508 bs->iostatus = error == ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOSPACE :
3509 BLOCK_DEVICE_IO_STATUS_FAILED;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003510 }
3511}
3512
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003513void bdrv_img_create(const char *filename, const char *fmt,
3514 const char *base_filename, const char *base_fmt,
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003515 char *options, uint64_t img_size, int flags,
3516 Error **errp, bool quiet)
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003517{
Chunyan Liu83d05212014-06-05 17:20:51 +08003518 QemuOptsList *create_opts = NULL;
3519 QemuOpts *opts = NULL;
3520 const char *backing_fmt, *backing_file;
3521 int64_t size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003522 BlockDriver *drv, *proto_drv;
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003523 BlockDriver *backing_drv = NULL;
Max Reitzcc84d902013-09-06 17:14:26 +02003524 Error *local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003525 int ret = 0;
3526
3527 /* Find driver and parse its options */
3528 drv = bdrv_find_format(fmt);
3529 if (!drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003530 error_setg(errp, "Unknown file format '%s'", fmt);
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003531 return;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003532 }
3533
Max Reitzb65a5e12015-02-05 13:58:12 -05003534 proto_drv = bdrv_find_protocol(filename, true, errp);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003535 if (!proto_drv) {
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003536 return;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003537 }
3538
Max Reitzc6149722014-12-02 18:32:45 +01003539 if (!drv->create_opts) {
3540 error_setg(errp, "Format driver '%s' does not support image creation",
3541 drv->format_name);
3542 return;
3543 }
3544
3545 if (!proto_drv->create_opts) {
3546 error_setg(errp, "Protocol driver '%s' does not support image creation",
3547 proto_drv->format_name);
3548 return;
3549 }
3550
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003551 create_opts = qemu_opts_append(create_opts, drv->create_opts);
3552 create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003553
3554 /* Create parameter list with default values */
Chunyan Liu83d05212014-06-05 17:20:51 +08003555 opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
Markus Armbruster39101f22015-02-12 16:46:36 +01003556 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003557
3558 /* Parse -o options */
3559 if (options) {
Markus Armbrusterdc523cd342015-02-12 18:37:11 +01003560 qemu_opts_do_parse(opts, options, NULL, &local_err);
3561 if (local_err) {
3562 error_report_err(local_err);
3563 local_err = NULL;
Chunyan Liu83d05212014-06-05 17:20:51 +08003564 error_setg(errp, "Invalid options for file format '%s'", fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003565 goto out;
3566 }
3567 }
3568
3569 if (base_filename) {
Markus Armbrusterf43e47d2015-02-12 17:52:20 +01003570 qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
Markus Armbruster6be41942015-02-12 17:49:02 +01003571 if (local_err) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003572 error_setg(errp, "Backing file not supported for file format '%s'",
3573 fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003574 goto out;
3575 }
3576 }
3577
3578 if (base_fmt) {
Markus Armbrusterf43e47d2015-02-12 17:52:20 +01003579 qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
Markus Armbruster6be41942015-02-12 17:49:02 +01003580 if (local_err) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003581 error_setg(errp, "Backing file format not supported for file "
3582 "format '%s'", fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003583 goto out;
3584 }
3585 }
3586
Chunyan Liu83d05212014-06-05 17:20:51 +08003587 backing_file = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
3588 if (backing_file) {
3589 if (!strcmp(filename, backing_file)) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003590 error_setg(errp, "Error: Trying to create an image with the "
3591 "same filename as the backing file");
Jes Sorensen792da932010-12-16 13:52:17 +01003592 goto out;
3593 }
3594 }
3595
Chunyan Liu83d05212014-06-05 17:20:51 +08003596 backing_fmt = qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT);
3597 if (backing_fmt) {
3598 backing_drv = bdrv_find_format(backing_fmt);
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003599 if (!backing_drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003600 error_setg(errp, "Unknown backing file format '%s'",
Chunyan Liu83d05212014-06-05 17:20:51 +08003601 backing_fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003602 goto out;
3603 }
3604 }
3605
3606 // The size for the image must always be specified, with one exception:
3607 // If we are using a backing file, we can obtain the size from there
Chunyan Liu83d05212014-06-05 17:20:51 +08003608 size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, 0);
3609 if (size == -1) {
3610 if (backing_file) {
Max Reitz66f6b812013-12-03 14:57:52 +01003611 BlockDriverState *bs;
Max Reitz29168012014-11-26 17:20:27 +01003612 char *full_backing = g_new0(char, PATH_MAX);
Markus Armbruster52bf1e72014-06-26 13:23:25 +02003613 int64_t size;
Paolo Bonzini63090da2012-04-12 14:01:03 +02003614 int back_flags;
3615
Max Reitz29168012014-11-26 17:20:27 +01003616 bdrv_get_full_backing_filename_from_filename(filename, backing_file,
3617 full_backing, PATH_MAX,
3618 &local_err);
3619 if (local_err) {
3620 g_free(full_backing);
3621 goto out;
3622 }
3623
Paolo Bonzini63090da2012-04-12 14:01:03 +02003624 /* backing files always opened read-only */
3625 back_flags =
3626 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003627
Max Reitzf67503e2014-02-18 18:33:05 +01003628 bs = NULL;
Max Reitz29168012014-11-26 17:20:27 +01003629 ret = bdrv_open(&bs, full_backing, NULL, NULL, back_flags,
Max Reitzcc84d902013-09-06 17:14:26 +02003630 backing_drv, &local_err);
Max Reitz29168012014-11-26 17:20:27 +01003631 g_free(full_backing);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003632 if (ret < 0) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003633 goto out;
3634 }
Markus Armbruster52bf1e72014-06-26 13:23:25 +02003635 size = bdrv_getlength(bs);
3636 if (size < 0) {
3637 error_setg_errno(errp, -size, "Could not get size of '%s'",
3638 backing_file);
3639 bdrv_unref(bs);
3640 goto out;
3641 }
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003642
Markus Armbruster39101f22015-02-12 16:46:36 +01003643 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, size, &error_abort);
Max Reitz66f6b812013-12-03 14:57:52 +01003644
3645 bdrv_unref(bs);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003646 } else {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003647 error_setg(errp, "Image creation needs a size parameter");
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003648 goto out;
3649 }
3650 }
3651
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003652 if (!quiet) {
Fam Zheng43c5d8f2014-12-09 15:38:04 +08003653 printf("Formatting '%s', fmt=%s", filename, fmt);
3654 qemu_opts_print(opts, " ");
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003655 puts("");
3656 }
Chunyan Liu83d05212014-06-05 17:20:51 +08003657
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003658 ret = bdrv_create(drv, filename, opts, &local_err);
Chunyan Liu83d05212014-06-05 17:20:51 +08003659
Max Reitzcc84d902013-09-06 17:14:26 +02003660 if (ret == -EFBIG) {
3661 /* This is generally a better message than whatever the driver would
3662 * deliver (especially because of the cluster_size_hint), since that
3663 * is most probably not much different from "image too large". */
3664 const char *cluster_size_hint = "";
Chunyan Liu83d05212014-06-05 17:20:51 +08003665 if (qemu_opt_get_size(opts, BLOCK_OPT_CLUSTER_SIZE, 0)) {
Max Reitzcc84d902013-09-06 17:14:26 +02003666 cluster_size_hint = " (try using a larger cluster size)";
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003667 }
Max Reitzcc84d902013-09-06 17:14:26 +02003668 error_setg(errp, "The image size is too large for file format '%s'"
3669 "%s", fmt, cluster_size_hint);
3670 error_free(local_err);
3671 local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003672 }
3673
3674out:
Chunyan Liu83d05212014-06-05 17:20:51 +08003675 qemu_opts_del(opts);
3676 qemu_opts_free(create_opts);
Markus Armbruster84d18f02014-01-30 15:07:28 +01003677 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +02003678 error_propagate(errp, local_err);
3679 }
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003680}
Stefan Hajnoczi85d126f2013-03-07 13:41:48 +01003681
3682AioContext *bdrv_get_aio_context(BlockDriverState *bs)
3683{
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003684 return bs->aio_context;
3685}
3686
3687void bdrv_detach_aio_context(BlockDriverState *bs)
3688{
Max Reitz33384422014-06-20 21:57:33 +02003689 BdrvAioNotifier *baf;
3690
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003691 if (!bs->drv) {
3692 return;
3693 }
3694
Max Reitz33384422014-06-20 21:57:33 +02003695 QLIST_FOREACH(baf, &bs->aio_notifiers, list) {
3696 baf->detach_aio_context(baf->opaque);
3697 }
3698
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003699 if (bs->io_limits_enabled) {
Benoît Canet0e5b0a22015-06-08 18:17:41 +02003700 throttle_timers_detach_aio_context(&bs->throttle_timers);
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003701 }
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003702 if (bs->drv->bdrv_detach_aio_context) {
3703 bs->drv->bdrv_detach_aio_context(bs);
3704 }
3705 if (bs->file) {
3706 bdrv_detach_aio_context(bs->file);
3707 }
3708 if (bs->backing_hd) {
3709 bdrv_detach_aio_context(bs->backing_hd);
3710 }
3711
3712 bs->aio_context = NULL;
3713}
3714
3715void bdrv_attach_aio_context(BlockDriverState *bs,
3716 AioContext *new_context)
3717{
Max Reitz33384422014-06-20 21:57:33 +02003718 BdrvAioNotifier *ban;
3719
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003720 if (!bs->drv) {
3721 return;
3722 }
3723
3724 bs->aio_context = new_context;
3725
3726 if (bs->backing_hd) {
3727 bdrv_attach_aio_context(bs->backing_hd, new_context);
3728 }
3729 if (bs->file) {
3730 bdrv_attach_aio_context(bs->file, new_context);
3731 }
3732 if (bs->drv->bdrv_attach_aio_context) {
3733 bs->drv->bdrv_attach_aio_context(bs, new_context);
3734 }
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003735 if (bs->io_limits_enabled) {
Benoît Canet0e5b0a22015-06-08 18:17:41 +02003736 throttle_timers_attach_aio_context(&bs->throttle_timers, new_context);
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003737 }
Max Reitz33384422014-06-20 21:57:33 +02003738
3739 QLIST_FOREACH(ban, &bs->aio_notifiers, list) {
3740 ban->attached_aio_context(new_context, ban->opaque);
3741 }
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003742}
3743
3744void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
3745{
3746 bdrv_drain_all(); /* ensure there are no in-flight requests */
3747
3748 bdrv_detach_aio_context(bs);
3749
3750 /* This function executes in the old AioContext so acquire the new one in
3751 * case it runs in a different thread.
3752 */
3753 aio_context_acquire(new_context);
3754 bdrv_attach_aio_context(bs, new_context);
3755 aio_context_release(new_context);
Stefan Hajnoczi85d126f2013-03-07 13:41:48 +01003756}
Stefan Hajnoczid616b222013-06-24 17:13:10 +02003757
Max Reitz33384422014-06-20 21:57:33 +02003758void bdrv_add_aio_context_notifier(BlockDriverState *bs,
3759 void (*attached_aio_context)(AioContext *new_context, void *opaque),
3760 void (*detach_aio_context)(void *opaque), void *opaque)
3761{
3762 BdrvAioNotifier *ban = g_new(BdrvAioNotifier, 1);
3763 *ban = (BdrvAioNotifier){
3764 .attached_aio_context = attached_aio_context,
3765 .detach_aio_context = detach_aio_context,
3766 .opaque = opaque
3767 };
3768
3769 QLIST_INSERT_HEAD(&bs->aio_notifiers, ban, list);
3770}
3771
3772void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
3773 void (*attached_aio_context)(AioContext *,
3774 void *),
3775 void (*detach_aio_context)(void *),
3776 void *opaque)
3777{
3778 BdrvAioNotifier *ban, *ban_next;
3779
3780 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
3781 if (ban->attached_aio_context == attached_aio_context &&
3782 ban->detach_aio_context == detach_aio_context &&
3783 ban->opaque == opaque)
3784 {
3785 QLIST_REMOVE(ban, list);
3786 g_free(ban);
3787
3788 return;
3789 }
3790 }
3791
3792 abort();
3793}
3794
Max Reitz77485432014-10-27 11:12:50 +01003795int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
3796 BlockDriverAmendStatusCB *status_cb)
Max Reitz6f176b42013-09-03 10:09:50 +02003797{
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003798 if (!bs->drv->bdrv_amend_options) {
Max Reitz6f176b42013-09-03 10:09:50 +02003799 return -ENOTSUP;
3800 }
Max Reitz77485432014-10-27 11:12:50 +01003801 return bs->drv->bdrv_amend_options(bs, opts, status_cb);
Max Reitz6f176b42013-09-03 10:09:50 +02003802}
Benoît Canetf6186f42013-10-02 14:33:48 +02003803
Benoît Canetb5042a32014-03-03 19:11:34 +01003804/* This function will be called by the bdrv_recurse_is_first_non_filter method
3805 * of block filter and by bdrv_is_first_non_filter.
3806 * It is used to test if the given bs is the candidate or recurse more in the
3807 * node graph.
Benoît Canet212a5a82014-01-23 21:31:36 +01003808 */
Benoît Canet212a5a82014-01-23 21:31:36 +01003809bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
3810 BlockDriverState *candidate)
Benoît Canetf6186f42013-10-02 14:33:48 +02003811{
Benoît Canetb5042a32014-03-03 19:11:34 +01003812 /* return false if basic checks fails */
3813 if (!bs || !bs->drv) {
3814 return false;
3815 }
3816
3817 /* the code reached a non block filter driver -> check if the bs is
3818 * the same as the candidate. It's the recursion termination condition.
3819 */
3820 if (!bs->drv->is_filter) {
3821 return bs == candidate;
3822 }
3823 /* Down this path the driver is a block filter driver */
3824
3825 /* If the block filter recursion method is defined use it to recurse down
3826 * the node graph.
3827 */
3828 if (bs->drv->bdrv_recurse_is_first_non_filter) {
Benoît Canet212a5a82014-01-23 21:31:36 +01003829 return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate);
3830 }
3831
Benoît Canetb5042a32014-03-03 19:11:34 +01003832 /* the driver is a block filter but don't allow to recurse -> return false
3833 */
3834 return false;
Benoît Canet212a5a82014-01-23 21:31:36 +01003835}
3836
3837/* This function checks if the candidate is the first non filter bs down it's
3838 * bs chain. Since we don't have pointers to parents it explore all bs chains
3839 * from the top. Some filters can choose not to pass down the recursion.
3840 */
3841bool bdrv_is_first_non_filter(BlockDriverState *candidate)
3842{
3843 BlockDriverState *bs;
3844
3845 /* walk down the bs forest recursively */
3846 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
3847 bool perm;
3848
Benoît Canetb5042a32014-03-03 19:11:34 +01003849 /* try to recurse in this top level bs */
Kevin Wolfe6dc8a12014-02-04 11:45:31 +01003850 perm = bdrv_recurse_is_first_non_filter(bs, candidate);
Benoît Canet212a5a82014-01-23 21:31:36 +01003851
3852 /* candidate is the first non filter */
3853 if (perm) {
3854 return true;
3855 }
3856 }
3857
3858 return false;
Benoît Canetf6186f42013-10-02 14:33:48 +02003859}
Benoît Canet09158f02014-06-27 18:25:25 +02003860
3861BlockDriverState *check_to_replace_node(const char *node_name, Error **errp)
3862{
3863 BlockDriverState *to_replace_bs = bdrv_find_node(node_name);
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003864 AioContext *aio_context;
3865
Benoît Canet09158f02014-06-27 18:25:25 +02003866 if (!to_replace_bs) {
3867 error_setg(errp, "Node name '%s' not found", node_name);
3868 return NULL;
3869 }
3870
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003871 aio_context = bdrv_get_aio_context(to_replace_bs);
3872 aio_context_acquire(aio_context);
3873
Benoît Canet09158f02014-06-27 18:25:25 +02003874 if (bdrv_op_is_blocked(to_replace_bs, BLOCK_OP_TYPE_REPLACE, errp)) {
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003875 to_replace_bs = NULL;
3876 goto out;
Benoît Canet09158f02014-06-27 18:25:25 +02003877 }
3878
3879 /* We don't want arbitrary node of the BDS chain to be replaced only the top
3880 * most non filter in order to prevent data corruption.
3881 * Another benefit is that this tests exclude backing files which are
3882 * blocked by the backing blockers.
3883 */
3884 if (!bdrv_is_first_non_filter(to_replace_bs)) {
3885 error_setg(errp, "Only top most non filter can be replaced");
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003886 to_replace_bs = NULL;
3887 goto out;
Benoît Canet09158f02014-06-27 18:25:25 +02003888 }
3889
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003890out:
3891 aio_context_release(aio_context);
Benoît Canet09158f02014-06-27 18:25:25 +02003892 return to_replace_bs;
3893}
Ming Lei448ad912014-07-04 18:04:33 +08003894
Max Reitz91af7012014-07-18 20:24:56 +02003895static bool append_open_options(QDict *d, BlockDriverState *bs)
3896{
3897 const QDictEntry *entry;
3898 bool found_any = false;
3899
3900 for (entry = qdict_first(bs->options); entry;
3901 entry = qdict_next(bs->options, entry))
3902 {
3903 /* Only take options for this level and exclude all non-driver-specific
3904 * options */
3905 if (!strchr(qdict_entry_key(entry), '.') &&
3906 strcmp(qdict_entry_key(entry), "node-name"))
3907 {
3908 qobject_incref(qdict_entry_value(entry));
3909 qdict_put_obj(d, qdict_entry_key(entry), qdict_entry_value(entry));
3910 found_any = true;
3911 }
3912 }
3913
3914 return found_any;
3915}
3916
3917/* Updates the following BDS fields:
3918 * - exact_filename: A filename which may be used for opening a block device
3919 * which (mostly) equals the given BDS (even without any
3920 * other options; so reading and writing must return the same
3921 * results, but caching etc. may be different)
3922 * - full_open_options: Options which, when given when opening a block device
3923 * (without a filename), result in a BDS (mostly)
3924 * equalling the given one
3925 * - filename: If exact_filename is set, it is copied here. Otherwise,
3926 * full_open_options is converted to a JSON object, prefixed with
3927 * "json:" (for use through the JSON pseudo protocol) and put here.
3928 */
3929void bdrv_refresh_filename(BlockDriverState *bs)
3930{
3931 BlockDriver *drv = bs->drv;
3932 QDict *opts;
3933
3934 if (!drv) {
3935 return;
3936 }
3937
3938 /* This BDS's file name will most probably depend on its file's name, so
3939 * refresh that first */
3940 if (bs->file) {
3941 bdrv_refresh_filename(bs->file);
3942 }
3943
3944 if (drv->bdrv_refresh_filename) {
3945 /* Obsolete information is of no use here, so drop the old file name
3946 * information before refreshing it */
3947 bs->exact_filename[0] = '\0';
3948 if (bs->full_open_options) {
3949 QDECREF(bs->full_open_options);
3950 bs->full_open_options = NULL;
3951 }
3952
3953 drv->bdrv_refresh_filename(bs);
3954 } else if (bs->file) {
3955 /* Try to reconstruct valid information from the underlying file */
3956 bool has_open_options;
3957
3958 bs->exact_filename[0] = '\0';
3959 if (bs->full_open_options) {
3960 QDECREF(bs->full_open_options);
3961 bs->full_open_options = NULL;
3962 }
3963
3964 opts = qdict_new();
3965 has_open_options = append_open_options(opts, bs);
3966
3967 /* If no specific options have been given for this BDS, the filename of
3968 * the underlying file should suffice for this one as well */
3969 if (bs->file->exact_filename[0] && !has_open_options) {
3970 strcpy(bs->exact_filename, bs->file->exact_filename);
3971 }
3972 /* Reconstructing the full options QDict is simple for most format block
3973 * drivers, as long as the full options are known for the underlying
3974 * file BDS. The full options QDict of that file BDS should somehow
3975 * contain a representation of the filename, therefore the following
3976 * suffices without querying the (exact_)filename of this BDS. */
3977 if (bs->file->full_open_options) {
3978 qdict_put_obj(opts, "driver",
3979 QOBJECT(qstring_from_str(drv->format_name)));
3980 QINCREF(bs->file->full_open_options);
3981 qdict_put_obj(opts, "file", QOBJECT(bs->file->full_open_options));
3982
3983 bs->full_open_options = opts;
3984 } else {
3985 QDECREF(opts);
3986 }
3987 } else if (!bs->full_open_options && qdict_size(bs->options)) {
3988 /* There is no underlying file BDS (at least referenced by BDS.file),
3989 * so the full options QDict should be equal to the options given
3990 * specifically for this block device when it was opened (plus the
3991 * driver specification).
3992 * Because those options don't change, there is no need to update
3993 * full_open_options when it's already set. */
3994
3995 opts = qdict_new();
3996 append_open_options(opts, bs);
3997 qdict_put_obj(opts, "driver",
3998 QOBJECT(qstring_from_str(drv->format_name)));
3999
4000 if (bs->exact_filename[0]) {
4001 /* This may not work for all block protocol drivers (some may
4002 * require this filename to be parsed), but we have to find some
4003 * default solution here, so just include it. If some block driver
4004 * does not support pure options without any filename at all or
4005 * needs some special format of the options QDict, it needs to
4006 * implement the driver-specific bdrv_refresh_filename() function.
4007 */
4008 qdict_put_obj(opts, "filename",
4009 QOBJECT(qstring_from_str(bs->exact_filename)));
4010 }
4011
4012 bs->full_open_options = opts;
4013 }
4014
4015 if (bs->exact_filename[0]) {
4016 pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename);
4017 } else if (bs->full_open_options) {
4018 QString *json = qobject_to_json(QOBJECT(bs->full_open_options));
4019 snprintf(bs->filename, sizeof(bs->filename), "json:%s",
4020 qstring_get_str(json));
4021 QDECREF(json);
4022 }
4023}
Benoît Canet5366d0c2014-09-05 15:46:18 +02004024
4025/* This accessor function purpose is to allow the device models to access the
4026 * BlockAcctStats structure embedded inside a BlockDriverState without being
4027 * aware of the BlockDriverState structure layout.
4028 * It will go away when the BlockAcctStats structure will be moved inside
4029 * the device models.
4030 */
4031BlockAcctStats *bdrv_get_stats(BlockDriverState *bs)
4032{
4033 return &bs->stats;
4034}