blob: ad8b0c756f6c6b79d8773f00f90748b9fd109b67 [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 Wolf18edf282015-04-07 17:12:56 +0200770static QemuOptsList bdrv_runtime_opts = {
771 .name = "bdrv_common",
772 .head = QTAILQ_HEAD_INITIALIZER(bdrv_runtime_opts.head),
773 .desc = {
774 {
775 .name = "node-name",
776 .type = QEMU_OPT_STRING,
777 .help = "Node name of the block device node",
778 },
779 { /* end of list */ }
780 },
781};
782
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200783/*
Kevin Wolf57915332010-04-14 15:24:50 +0200784 * Common part for opening disk images and files
Kevin Wolfb6ad4912013-03-15 10:35:04 +0100785 *
786 * Removes all processed options from *options.
Kevin Wolf57915332010-04-14 15:24:50 +0200787 */
Kevin Wolff500a6d2012-11-12 17:35:27 +0100788static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
Max Reitz34b5d2c2013-09-05 14:45:29 +0200789 QDict *options, int flags, BlockDriver *drv, Error **errp)
Kevin Wolf57915332010-04-14 15:24:50 +0200790{
791 int ret, open_flags;
Kevin Wolf035fccd2013-04-09 14:34:19 +0200792 const char *filename;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100793 const char *node_name = NULL;
Kevin Wolf18edf282015-04-07 17:12:56 +0200794 QemuOpts *opts;
Max Reitz34b5d2c2013-09-05 14:45:29 +0200795 Error *local_err = NULL;
Kevin Wolf57915332010-04-14 15:24:50 +0200796
797 assert(drv != NULL);
Paolo Bonzini64058752012-05-08 16:51:49 +0200798 assert(bs->file == NULL);
Kevin Wolf707ff822013-03-06 12:20:31 +0100799 assert(options != NULL && bs->options != options);
Kevin Wolf57915332010-04-14 15:24:50 +0200800
Kevin Wolf45673672013-04-22 17:48:40 +0200801 if (file != NULL) {
802 filename = file->filename;
803 } else {
804 filename = qdict_get_try_str(options, "filename");
805 }
806
Kevin Wolf765003d2014-02-03 14:49:42 +0100807 if (drv->bdrv_needs_filename && !filename) {
808 error_setg(errp, "The '%s' block driver requires a file name",
809 drv->format_name);
810 return -EINVAL;
811 }
812
Kevin Wolf45673672013-04-22 17:48:40 +0200813 trace_bdrv_open_common(bs, filename ?: "", flags, drv->format_name);
Stefan Hajnoczi28dcee12011-09-22 20:14:12 +0100814
Kevin Wolf18edf282015-04-07 17:12:56 +0200815 opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
816 qemu_opts_absorb_qdict(opts, options, &local_err);
817 if (local_err) {
818 error_propagate(errp, local_err);
819 ret = -EINVAL;
820 goto fail_opts;
821 }
822
823 node_name = qemu_opt_get(opts, "node-name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100824 bdrv_assign_node_name(bs, node_name, &local_err);
Markus Armbruster0fb63952014-04-25 16:50:31 +0200825 if (local_err) {
Kevin Wolf636ea372014-01-24 14:11:52 +0100826 error_propagate(errp, local_err);
Kevin Wolf18edf282015-04-07 17:12:56 +0200827 ret = -EINVAL;
828 goto fail_opts;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100829 }
Benoît Canet6913c0c2014-01-23 21:31:33 +0100830
Kevin Wolf57915332010-04-14 15:24:50 +0200831 bs->open_flags = flags;
Paolo Bonzini1b7fd722011-11-29 11:35:47 +0100832 bs->guest_block_size = 512;
Paolo Bonzinic25f53b2011-11-29 12:42:20 +0100833 bs->request_alignment = 512;
Asias He0d51b4d2013-08-22 15:24:14 +0800834 bs->zero_beyond_eof = true;
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800835 open_flags = bdrv_open_flags(bs, flags);
836 bs->read_only = !(open_flags & BDRV_O_RDWR);
837
838 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, bs->read_only)) {
Kevin Wolf8f94a6e2013-10-10 11:45:55 +0200839 error_setg(errp,
840 !bs->read_only && bdrv_is_whitelisted(drv, true)
841 ? "Driver '%s' can only be used for read-only devices"
842 : "Driver '%s' is not whitelisted",
843 drv->format_name);
Kevin Wolf18edf282015-04-07 17:12:56 +0200844 ret = -ENOTSUP;
845 goto fail_opts;
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800846 }
Kevin Wolf57915332010-04-14 15:24:50 +0200847
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000848 assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */
Kevin Wolf0ebd24e2013-09-19 15:12:18 +0200849 if (flags & BDRV_O_COPY_ON_READ) {
850 if (!bs->read_only) {
851 bdrv_enable_copy_on_read(bs);
852 } else {
853 error_setg(errp, "Can't use copy-on-read on read-only device");
Kevin Wolf18edf282015-04-07 17:12:56 +0200854 ret = -EINVAL;
855 goto fail_opts;
Kevin Wolf0ebd24e2013-09-19 15:12:18 +0200856 }
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000857 }
858
Kevin Wolfc2ad1b02013-03-18 16:40:51 +0100859 if (filename != NULL) {
860 pstrcpy(bs->filename, sizeof(bs->filename), filename);
861 } else {
862 bs->filename[0] = '\0';
863 }
Max Reitz91af7012014-07-18 20:24:56 +0200864 pstrcpy(bs->exact_filename, sizeof(bs->exact_filename), bs->filename);
Kevin Wolf57915332010-04-14 15:24:50 +0200865
Kevin Wolf57915332010-04-14 15:24:50 +0200866 bs->drv = drv;
Anthony Liguori7267c092011-08-20 22:09:37 -0500867 bs->opaque = g_malloc0(drv->instance_size);
Kevin Wolf57915332010-04-14 15:24:50 +0200868
Stefan Hajnoczi03f541b2011-10-27 10:54:28 +0100869 bs->enable_write_cache = !!(flags & BDRV_O_CACHE_WB);
Stefan Hajnoczie7c63792011-10-27 10:54:27 +0100870
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200871 /* Open the image, either directly or using a protocol */
872 if (drv->bdrv_file_open) {
Kevin Wolf5d186eb2013-03-27 17:28:18 +0100873 assert(file == NULL);
Benoît Canet030be322013-09-24 17:07:04 +0200874 assert(!drv->bdrv_needs_filename || filename != NULL);
Max Reitz34b5d2c2013-09-05 14:45:29 +0200875 ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
Kevin Wolff500a6d2012-11-12 17:35:27 +0100876 } else {
Kevin Wolf2af5ef72013-04-09 13:19:18 +0200877 if (file == NULL) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200878 error_setg(errp, "Can't use '%s' as a block driver for the "
879 "protocol level", drv->format_name);
Kevin Wolf2af5ef72013-04-09 13:19:18 +0200880 ret = -EINVAL;
881 goto free_and_fail;
882 }
Kevin Wolff500a6d2012-11-12 17:35:27 +0100883 bs->file = file;
Max Reitz34b5d2c2013-09-05 14:45:29 +0200884 ret = drv->bdrv_open(bs, options, open_flags, &local_err);
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200885 }
886
Kevin Wolf57915332010-04-14 15:24:50 +0200887 if (ret < 0) {
Markus Armbruster84d18f02014-01-30 15:07:28 +0100888 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200889 error_propagate(errp, local_err);
Dunrong Huang2fa9aa52013-09-24 18:14:01 +0800890 } else if (bs->filename[0]) {
891 error_setg_errno(errp, -ret, "Could not open '%s'", bs->filename);
Max Reitz34b5d2c2013-09-05 14:45:29 +0200892 } else {
893 error_setg_errno(errp, -ret, "Could not open image");
894 }
Kevin Wolf57915332010-04-14 15:24:50 +0200895 goto free_and_fail;
896 }
897
Markus Armbrustera1f688f2015-03-13 21:09:40 +0100898 if (bs->encrypted) {
899 error_report("Encrypted images are deprecated");
900 error_printf("Support for them will be removed in a future release.\n"
901 "You can use 'qemu-img convert' to convert your image"
902 " to an unencrypted one.\n");
903 }
904
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100905 ret = refresh_total_sectors(bs, bs->total_sectors);
906 if (ret < 0) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200907 error_setg_errno(errp, -ret, "Could not refresh total sector count");
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100908 goto free_and_fail;
Kevin Wolf57915332010-04-14 15:24:50 +0200909 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100910
Kevin Wolf3baca892014-07-16 17:48:16 +0200911 bdrv_refresh_limits(bs, &local_err);
912 if (local_err) {
913 error_propagate(errp, local_err);
914 ret = -EINVAL;
915 goto free_and_fail;
916 }
917
Paolo Bonzinic25f53b2011-11-29 12:42:20 +0100918 assert(bdrv_opt_mem_align(bs) != 0);
Denis V. Lunev4196d2f2015-05-12 17:30:55 +0300919 assert(bdrv_min_mem_align(bs) != 0);
Kevin Wolf47ea2de2014-03-05 15:49:55 +0100920 assert((bs->request_alignment != 0) || bs->sg);
Kevin Wolf18edf282015-04-07 17:12:56 +0200921
922 qemu_opts_del(opts);
Kevin Wolf57915332010-04-14 15:24:50 +0200923 return 0;
924
925free_and_fail:
Kevin Wolff500a6d2012-11-12 17:35:27 +0100926 bs->file = NULL;
Anthony Liguori7267c092011-08-20 22:09:37 -0500927 g_free(bs->opaque);
Kevin Wolf57915332010-04-14 15:24:50 +0200928 bs->opaque = NULL;
929 bs->drv = NULL;
Kevin Wolf18edf282015-04-07 17:12:56 +0200930fail_opts:
931 qemu_opts_del(opts);
Kevin Wolf57915332010-04-14 15:24:50 +0200932 return ret;
933}
934
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200935static QDict *parse_json_filename(const char *filename, Error **errp)
936{
937 QObject *options_obj;
938 QDict *options;
939 int ret;
940
941 ret = strstart(filename, "json:", &filename);
942 assert(ret);
943
944 options_obj = qobject_from_json(filename);
945 if (!options_obj) {
946 error_setg(errp, "Could not parse the JSON options");
947 return NULL;
948 }
949
950 if (qobject_type(options_obj) != QTYPE_QDICT) {
951 qobject_decref(options_obj);
952 error_setg(errp, "Invalid JSON object given");
953 return NULL;
954 }
955
956 options = qobject_to_qdict(options_obj);
957 qdict_flatten(options);
958
959 return options;
960}
961
Kevin Wolf57915332010-04-14 15:24:50 +0200962/*
Kevin Wolff54120f2014-05-26 11:09:59 +0200963 * Fills in default options for opening images and converts the legacy
964 * filename/flags pair to option QDict entries.
Max Reitz53a29512015-03-19 14:53:16 -0400965 * The BDRV_O_PROTOCOL flag in *flags will be set or cleared accordingly if a
966 * block driver has been specified explicitly.
Kevin Wolff54120f2014-05-26 11:09:59 +0200967 */
Max Reitz53a29512015-03-19 14:53:16 -0400968static int bdrv_fill_options(QDict **options, const char **pfilename,
969 int *flags, BlockDriver *drv, Error **errp)
Kevin Wolff54120f2014-05-26 11:09:59 +0200970{
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200971 const char *filename = *pfilename;
Kevin Wolff54120f2014-05-26 11:09:59 +0200972 const char *drvname;
Max Reitz53a29512015-03-19 14:53:16 -0400973 bool protocol = *flags & BDRV_O_PROTOCOL;
Kevin Wolff54120f2014-05-26 11:09:59 +0200974 bool parse_filename = false;
Max Reitz53a29512015-03-19 14:53:16 -0400975 BlockDriver *tmp_drv;
Kevin Wolff54120f2014-05-26 11:09:59 +0200976 Error *local_err = NULL;
Kevin Wolff54120f2014-05-26 11:09:59 +0200977
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200978 /* Parse json: pseudo-protocol */
979 if (filename && g_str_has_prefix(filename, "json:")) {
980 QDict *json_options = parse_json_filename(filename, &local_err);
981 if (local_err) {
982 error_propagate(errp, local_err);
983 return -EINVAL;
984 }
985
986 /* Options given in the filename have lower priority than options
987 * specified directly */
988 qdict_join(*options, json_options, false);
989 QDECREF(json_options);
990 *pfilename = filename = NULL;
991 }
992
Max Reitz53a29512015-03-19 14:53:16 -0400993 drvname = qdict_get_try_str(*options, "driver");
994
995 /* If the user has explicitly specified the driver, this choice should
996 * override the BDRV_O_PROTOCOL flag */
997 tmp_drv = drv;
998 if (!tmp_drv && drvname) {
999 tmp_drv = bdrv_find_format(drvname);
1000 }
1001 if (tmp_drv) {
1002 protocol = tmp_drv->bdrv_file_open;
1003 }
1004
1005 if (protocol) {
1006 *flags |= BDRV_O_PROTOCOL;
1007 } else {
1008 *flags &= ~BDRV_O_PROTOCOL;
1009 }
1010
Kevin Wolff54120f2014-05-26 11:09:59 +02001011 /* Fetch the file name from the options QDict if necessary */
Kevin Wolf17b005f2014-05-27 10:50:29 +02001012 if (protocol && filename) {
Kevin Wolff54120f2014-05-26 11:09:59 +02001013 if (!qdict_haskey(*options, "filename")) {
1014 qdict_put(*options, "filename", qstring_from_str(filename));
1015 parse_filename = true;
1016 } else {
1017 error_setg(errp, "Can't specify 'file' and 'filename' options at "
1018 "the same time");
1019 return -EINVAL;
1020 }
1021 }
1022
1023 /* Find the right block driver */
1024 filename = qdict_get_try_str(*options, "filename");
Kevin Wolff54120f2014-05-26 11:09:59 +02001025
Kevin Wolf17b005f2014-05-27 10:50:29 +02001026 if (drv) {
1027 if (drvname) {
1028 error_setg(errp, "Driver specified twice");
1029 return -EINVAL;
1030 }
1031 drvname = drv->format_name;
1032 qdict_put(*options, "driver", qstring_from_str(drvname));
1033 } else {
1034 if (!drvname && protocol) {
1035 if (filename) {
Max Reitzb65a5e12015-02-05 13:58:12 -05001036 drv = bdrv_find_protocol(filename, parse_filename, errp);
Kevin Wolf17b005f2014-05-27 10:50:29 +02001037 if (!drv) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001038 return -EINVAL;
1039 }
1040
1041 drvname = drv->format_name;
1042 qdict_put(*options, "driver", qstring_from_str(drvname));
1043 } else {
1044 error_setg(errp, "Must specify either driver or file");
Kevin Wolff54120f2014-05-26 11:09:59 +02001045 return -EINVAL;
1046 }
Kevin Wolf17b005f2014-05-27 10:50:29 +02001047 } else if (drvname) {
1048 drv = bdrv_find_format(drvname);
1049 if (!drv) {
1050 error_setg(errp, "Unknown driver '%s'", drvname);
1051 return -ENOENT;
1052 }
Kevin Wolff54120f2014-05-26 11:09:59 +02001053 }
1054 }
1055
Kevin Wolf17b005f2014-05-27 10:50:29 +02001056 assert(drv || !protocol);
Kevin Wolff54120f2014-05-26 11:09:59 +02001057
1058 /* Driver-specific filename parsing */
Kevin Wolf17b005f2014-05-27 10:50:29 +02001059 if (drv && drv->bdrv_parse_filename && parse_filename) {
Kevin Wolff54120f2014-05-26 11:09:59 +02001060 drv->bdrv_parse_filename(filename, *options, &local_err);
1061 if (local_err) {
1062 error_propagate(errp, local_err);
1063 return -EINVAL;
1064 }
1065
1066 if (!drv->bdrv_needs_filename) {
1067 qdict_del(*options, "filename");
1068 }
1069 }
1070
1071 return 0;
1072}
1073
Fam Zheng8d24cce2014-05-23 21:29:45 +08001074void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd)
1075{
1076
Fam Zheng826b6ca2014-05-23 21:29:47 +08001077 if (bs->backing_hd) {
1078 assert(bs->backing_blocker);
1079 bdrv_op_unblock_all(bs->backing_hd, bs->backing_blocker);
1080 } else if (backing_hd) {
1081 error_setg(&bs->backing_blocker,
Alberto Garcia81e5f782015-04-08 12:29:19 +03001082 "node is used as backing hd of '%s'",
1083 bdrv_get_device_or_node_name(bs));
Fam Zheng826b6ca2014-05-23 21:29:47 +08001084 }
1085
Fam Zheng8d24cce2014-05-23 21:29:45 +08001086 bs->backing_hd = backing_hd;
1087 if (!backing_hd) {
Fam Zheng826b6ca2014-05-23 21:29:47 +08001088 error_free(bs->backing_blocker);
1089 bs->backing_blocker = NULL;
Fam Zheng8d24cce2014-05-23 21:29:45 +08001090 goto out;
1091 }
1092 bs->open_flags &= ~BDRV_O_NO_BACKING;
1093 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filename);
1094 pstrcpy(bs->backing_format, sizeof(bs->backing_format),
1095 backing_hd->drv ? backing_hd->drv->format_name : "");
Fam Zheng826b6ca2014-05-23 21:29:47 +08001096
1097 bdrv_op_block_all(bs->backing_hd, bs->backing_blocker);
1098 /* Otherwise we won't be able to commit due to check in bdrv_commit */
Fam Zhengbb000212014-09-11 13:14:00 +08001099 bdrv_op_unblock(bs->backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET,
Fam Zheng826b6ca2014-05-23 21:29:47 +08001100 bs->backing_blocker);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001101out:
Kevin Wolf3baca892014-07-16 17:48:16 +02001102 bdrv_refresh_limits(bs, NULL);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001103}
1104
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001105/*
1106 * Opens the backing file for a BlockDriverState if not yet open
1107 *
1108 * options is a QDict of options to pass to the block drivers, or NULL for an
1109 * empty set of options. The reference to the QDict is transferred to this
1110 * function (even on failure), so if the caller intends to reuse the dictionary,
1111 * it needs to use QINCREF() before calling bdrv_file_open.
1112 */
Max Reitz34b5d2c2013-09-05 14:45:29 +02001113int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
Paolo Bonzini9156df12012-10-18 16:49:17 +02001114{
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001115 char *backing_filename = g_malloc0(PATH_MAX);
Kevin Wolf317fc442014-04-25 13:27:34 +02001116 int ret = 0;
Fam Zheng8d24cce2014-05-23 21:29:45 +08001117 BlockDriverState *backing_hd;
Max Reitz34b5d2c2013-09-05 14:45:29 +02001118 Error *local_err = NULL;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001119
1120 if (bs->backing_hd != NULL) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001121 QDECREF(options);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001122 goto free_exit;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001123 }
1124
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001125 /* NULL means an empty set of options */
1126 if (options == NULL) {
1127 options = qdict_new();
1128 }
1129
Paolo Bonzini9156df12012-10-18 16:49:17 +02001130 bs->open_flags &= ~BDRV_O_NO_BACKING;
Kevin Wolf1cb6f502013-04-12 20:27:07 +02001131 if (qdict_haskey(options, "file.filename")) {
1132 backing_filename[0] = '\0';
1133 } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001134 QDECREF(options);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001135 goto free_exit;
Fam Zhengdbecebd2013-09-22 20:05:06 +08001136 } else {
Max Reitz9f074292014-11-26 17:20:26 +01001137 bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX,
1138 &local_err);
1139 if (local_err) {
1140 ret = -EINVAL;
1141 error_propagate(errp, local_err);
1142 QDECREF(options);
1143 goto free_exit;
1144 }
Paolo Bonzini9156df12012-10-18 16:49:17 +02001145 }
1146
Kevin Wolf8ee79e72014-06-04 15:09:35 +02001147 if (!bs->drv || !bs->drv->supports_backing) {
1148 ret = -EINVAL;
1149 error_setg(errp, "Driver doesn't support backing files");
1150 QDECREF(options);
1151 goto free_exit;
1152 }
1153
Markus Armbrustere4e99862014-10-07 13:59:03 +02001154 backing_hd = bdrv_new();
Fam Zheng8d24cce2014-05-23 21:29:45 +08001155
Kevin Wolfc5f6e492014-11-25 18:12:42 +01001156 if (bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
1157 qdict_put(options, "driver", qstring_from_str(bs->backing_format));
Paolo Bonzini9156df12012-10-18 16:49:17 +02001158 }
1159
Max Reitzf67503e2014-02-18 18:33:05 +01001160 assert(bs->backing_hd == NULL);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001161 ret = bdrv_open(&backing_hd,
Max Reitzddf56362014-02-18 18:33:06 +01001162 *backing_filename ? backing_filename : NULL, NULL, options,
Kevin Wolfc5f6e492014-11-25 18:12:42 +01001163 bdrv_backing_flags(bs->open_flags), NULL, &local_err);
Paolo Bonzini9156df12012-10-18 16:49:17 +02001164 if (ret < 0) {
Fam Zheng8d24cce2014-05-23 21:29:45 +08001165 bdrv_unref(backing_hd);
1166 backing_hd = NULL;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001167 bs->open_flags |= BDRV_O_NO_BACKING;
Fam Zhengb04b6b62013-11-08 11:26:49 +08001168 error_setg(errp, "Could not open backing file: %s",
1169 error_get_pretty(local_err));
1170 error_free(local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001171 goto free_exit;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001172 }
Fam Zheng8d24cce2014-05-23 21:29:45 +08001173 bdrv_set_backing_hd(bs, backing_hd);
Peter Feinerd80ac652014-01-08 19:43:25 +00001174
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001175free_exit:
1176 g_free(backing_filename);
1177 return ret;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001178}
1179
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001180/*
Max Reitzda557aa2013-12-20 19:28:11 +01001181 * Opens a disk image whose options are given as BlockdevRef in another block
1182 * device's options.
1183 *
Max Reitzda557aa2013-12-20 19:28:11 +01001184 * If allow_none is true, no image will be opened if filename is false and no
1185 * BlockdevRef is given. *pbs will remain unchanged and 0 will be returned.
1186 *
1187 * bdrev_key specifies the key for the image's BlockdevRef in the options QDict.
1188 * That QDict has to be flattened; therefore, if the BlockdevRef is a QDict
1189 * itself, all options starting with "${bdref_key}." are considered part of the
1190 * BlockdevRef.
1191 *
1192 * The BlockdevRef will be removed from the options QDict.
Max Reitzf67503e2014-02-18 18:33:05 +01001193 *
1194 * To conform with the behavior of bdrv_open(), *pbs has to be NULL.
Max Reitzda557aa2013-12-20 19:28:11 +01001195 */
1196int bdrv_open_image(BlockDriverState **pbs, const char *filename,
1197 QDict *options, const char *bdref_key, int flags,
Max Reitzf7d9fd82014-02-18 18:33:12 +01001198 bool allow_none, Error **errp)
Max Reitzda557aa2013-12-20 19:28:11 +01001199{
1200 QDict *image_options;
1201 int ret;
1202 char *bdref_key_dot;
1203 const char *reference;
1204
Max Reitzf67503e2014-02-18 18:33:05 +01001205 assert(pbs);
1206 assert(*pbs == NULL);
1207
Max Reitzda557aa2013-12-20 19:28:11 +01001208 bdref_key_dot = g_strdup_printf("%s.", bdref_key);
1209 qdict_extract_subqdict(options, &image_options, bdref_key_dot);
1210 g_free(bdref_key_dot);
1211
1212 reference = qdict_get_try_str(options, bdref_key);
1213 if (!filename && !reference && !qdict_size(image_options)) {
1214 if (allow_none) {
1215 ret = 0;
1216 } else {
1217 error_setg(errp, "A block device must be specified for \"%s\"",
1218 bdref_key);
1219 ret = -EINVAL;
1220 }
Markus Armbrusterb20e61e2014-05-28 11:16:57 +02001221 QDECREF(image_options);
Max Reitzda557aa2013-12-20 19:28:11 +01001222 goto done;
1223 }
1224
Max Reitzf7d9fd82014-02-18 18:33:12 +01001225 ret = bdrv_open(pbs, filename, reference, image_options, flags, NULL, errp);
Max Reitzda557aa2013-12-20 19:28:11 +01001226
1227done:
1228 qdict_del(options, bdref_key);
1229 return ret;
1230}
1231
Chen Gang6b8aeca2014-06-23 23:28:23 +08001232int bdrv_append_temp_snapshot(BlockDriverState *bs, int flags, Error **errp)
Kevin Wolfb9988752014-04-03 12:09:34 +02001233{
1234 /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001235 char *tmp_filename = g_malloc0(PATH_MAX + 1);
Kevin Wolfb9988752014-04-03 12:09:34 +02001236 int64_t total_size;
Chunyan Liu83d05212014-06-05 17:20:51 +08001237 QemuOpts *opts = NULL;
Kevin Wolfb9988752014-04-03 12:09:34 +02001238 QDict *snapshot_options;
1239 BlockDriverState *bs_snapshot;
1240 Error *local_err;
1241 int ret;
1242
1243 /* if snapshot, we create a temporary backing file and open it
1244 instead of opening 'filename' directly */
1245
1246 /* Get the required size from the image */
Kevin Wolff1877432014-04-04 17:07:19 +02001247 total_size = bdrv_getlength(bs);
1248 if (total_size < 0) {
Chen Gang6b8aeca2014-06-23 23:28:23 +08001249 ret = total_size;
Kevin Wolff1877432014-04-04 17:07:19 +02001250 error_setg_errno(errp, -total_size, "Could not get image size");
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001251 goto out;
Kevin Wolff1877432014-04-04 17:07:19 +02001252 }
Kevin Wolfb9988752014-04-03 12:09:34 +02001253
1254 /* Create the temporary image */
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001255 ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
Kevin Wolfb9988752014-04-03 12:09:34 +02001256 if (ret < 0) {
1257 error_setg_errno(errp, -ret, "Could not get temporary filename");
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001258 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001259 }
1260
Max Reitzef810432014-12-02 18:32:42 +01001261 opts = qemu_opts_create(bdrv_qcow2.create_opts, NULL, 0,
Chunyan Liuc282e1f2014-06-05 17:21:11 +08001262 &error_abort);
Markus Armbruster39101f22015-02-12 16:46:36 +01001263 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size, &error_abort);
Max Reitzef810432014-12-02 18:32:42 +01001264 ret = bdrv_create(&bdrv_qcow2, tmp_filename, opts, &local_err);
Chunyan Liu83d05212014-06-05 17:20:51 +08001265 qemu_opts_del(opts);
Kevin Wolfb9988752014-04-03 12:09:34 +02001266 if (ret < 0) {
1267 error_setg_errno(errp, -ret, "Could not create temporary overlay "
1268 "'%s': %s", tmp_filename,
1269 error_get_pretty(local_err));
1270 error_free(local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001271 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001272 }
1273
1274 /* Prepare a new options QDict for the temporary file */
1275 snapshot_options = qdict_new();
1276 qdict_put(snapshot_options, "file.driver",
1277 qstring_from_str("file"));
1278 qdict_put(snapshot_options, "file.filename",
1279 qstring_from_str(tmp_filename));
1280
Markus Armbrustere4e99862014-10-07 13:59:03 +02001281 bs_snapshot = bdrv_new();
Kevin Wolfb9988752014-04-03 12:09:34 +02001282
1283 ret = bdrv_open(&bs_snapshot, NULL, NULL, snapshot_options,
Max Reitzef810432014-12-02 18:32:42 +01001284 flags, &bdrv_qcow2, &local_err);
Kevin Wolfb9988752014-04-03 12:09:34 +02001285 if (ret < 0) {
1286 error_propagate(errp, local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001287 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001288 }
1289
1290 bdrv_append(bs_snapshot, bs);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001291
1292out:
1293 g_free(tmp_filename);
Chen Gang6b8aeca2014-06-23 23:28:23 +08001294 return ret;
Kevin Wolfb9988752014-04-03 12:09:34 +02001295}
1296
Max Reitzda557aa2013-12-20 19:28:11 +01001297/*
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001298 * Opens a disk image (raw, qcow2, vmdk, ...)
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001299 *
1300 * options is a QDict of options to pass to the block drivers, or NULL for an
1301 * empty set of options. The reference to the QDict belongs to the block layer
1302 * after the call (even on failure), so if the caller intends to reuse the
1303 * dictionary, it needs to use QINCREF() before calling bdrv_open.
Max Reitzf67503e2014-02-18 18:33:05 +01001304 *
1305 * If *pbs is NULL, a new BDS will be created with a pointer to it stored there.
1306 * If it is not NULL, the referenced BDS will be reused.
Max Reitzddf56362014-02-18 18:33:06 +01001307 *
1308 * The reference parameter may be used to specify an existing block device which
1309 * should be opened. If specified, neither options nor a filename may be given,
1310 * nor can an existing BDS be reused (that is, *pbs has to be NULL).
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001311 */
Max Reitzddf56362014-02-18 18:33:06 +01001312int bdrv_open(BlockDriverState **pbs, const char *filename,
1313 const char *reference, QDict *options, int flags,
1314 BlockDriver *drv, Error **errp)
bellardea2384d2004-08-01 21:59:26 +00001315{
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001316 int ret;
Max Reitzf67503e2014-02-18 18:33:05 +01001317 BlockDriverState *file = NULL, *bs;
Kevin Wolf74fe54f2013-07-09 11:09:02 +02001318 const char *drvname;
Max Reitz34b5d2c2013-09-05 14:45:29 +02001319 Error *local_err = NULL;
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001320 int snapshot_flags = 0;
bellard712e7872005-04-28 21:09:32 +00001321
Max Reitzf67503e2014-02-18 18:33:05 +01001322 assert(pbs);
1323
Max Reitzddf56362014-02-18 18:33:06 +01001324 if (reference) {
1325 bool options_non_empty = options ? qdict_size(options) : false;
1326 QDECREF(options);
1327
1328 if (*pbs) {
1329 error_setg(errp, "Cannot reuse an existing BDS when referencing "
1330 "another block device");
1331 return -EINVAL;
1332 }
1333
1334 if (filename || options_non_empty) {
1335 error_setg(errp, "Cannot reference an existing block device with "
1336 "additional options or a new filename");
1337 return -EINVAL;
1338 }
1339
1340 bs = bdrv_lookup_bs(reference, reference, errp);
1341 if (!bs) {
1342 return -ENODEV;
1343 }
1344 bdrv_ref(bs);
1345 *pbs = bs;
1346 return 0;
1347 }
1348
Max Reitzf67503e2014-02-18 18:33:05 +01001349 if (*pbs) {
1350 bs = *pbs;
1351 } else {
Markus Armbrustere4e99862014-10-07 13:59:03 +02001352 bs = bdrv_new();
Max Reitzf67503e2014-02-18 18:33:05 +01001353 }
1354
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001355 /* NULL means an empty set of options */
1356 if (options == NULL) {
1357 options = qdict_new();
1358 }
1359
Max Reitz53a29512015-03-19 14:53:16 -04001360 ret = bdrv_fill_options(&options, &filename, &flags, drv, &local_err);
Kevin Wolf462f5bc2014-05-26 11:39:55 +02001361 if (local_err) {
1362 goto fail;
1363 }
1364
Kevin Wolf76c591b2014-06-04 14:19:44 +02001365 /* Find the right image format driver */
1366 drv = NULL;
1367 drvname = qdict_get_try_str(options, "driver");
1368 if (drvname) {
1369 drv = bdrv_find_format(drvname);
1370 qdict_del(options, "driver");
1371 if (!drv) {
1372 error_setg(errp, "Unknown driver: '%s'", drvname);
1373 ret = -EINVAL;
1374 goto fail;
1375 }
1376 }
1377
1378 assert(drvname || !(flags & BDRV_O_PROTOCOL));
Kevin Wolf76c591b2014-06-04 14:19:44 +02001379
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001380 bs->options = options;
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001381 options = qdict_clone_shallow(options);
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001382
Kevin Wolff4788ad2014-06-03 16:44:19 +02001383 /* Open image file without format layer */
1384 if ((flags & BDRV_O_PROTOCOL) == 0) {
1385 if (flags & BDRV_O_RDWR) {
1386 flags |= BDRV_O_ALLOW_RDWR;
1387 }
1388 if (flags & BDRV_O_SNAPSHOT) {
1389 snapshot_flags = bdrv_temp_snapshot_flags(flags);
1390 flags = bdrv_backing_flags(flags);
1391 }
1392
1393 assert(file == NULL);
1394 ret = bdrv_open_image(&file, filename, options, "file",
1395 bdrv_inherited_flags(flags),
1396 true, &local_err);
1397 if (ret < 0) {
Max Reitz5469a2a2014-02-18 18:33:10 +01001398 goto fail;
1399 }
1400 }
1401
Kevin Wolf76c591b2014-06-04 14:19:44 +02001402 /* Image format probing */
Kevin Wolf38f3ef52014-11-20 16:27:12 +01001403 bs->probed = !drv;
Kevin Wolf76c591b2014-06-04 14:19:44 +02001404 if (!drv && file) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001405 ret = find_image_format(file, filename, &drv, &local_err);
1406 if (ret < 0) {
Kevin Wolf8bfea152014-04-11 19:16:36 +02001407 goto fail;
Max Reitz2a05cbe2013-12-20 19:28:10 +01001408 }
Kevin Wolf76c591b2014-06-04 14:19:44 +02001409 } else if (!drv) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001410 error_setg(errp, "Must specify either driver or file");
1411 ret = -EINVAL;
Kevin Wolf8bfea152014-04-11 19:16:36 +02001412 goto fail;
Kevin Wolff500a6d2012-11-12 17:35:27 +01001413 }
1414
Max Reitz53a29512015-03-19 14:53:16 -04001415 /* BDRV_O_PROTOCOL must be set iff a protocol BDS is about to be created */
1416 assert(!!(flags & BDRV_O_PROTOCOL) == !!drv->bdrv_file_open);
1417 /* file must be NULL if a protocol BDS is about to be created
1418 * (the inverse results in an error message from bdrv_open_common()) */
1419 assert(!(flags & BDRV_O_PROTOCOL) || !file);
1420
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001421 /* Open the image */
Max Reitz34b5d2c2013-09-05 14:45:29 +02001422 ret = bdrv_open_common(bs, file, options, flags, drv, &local_err);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001423 if (ret < 0) {
Kevin Wolf8bfea152014-04-11 19:16:36 +02001424 goto fail;
Christoph Hellwig69873072010-01-20 18:13:25 +01001425 }
1426
Max Reitz2a05cbe2013-12-20 19:28:10 +01001427 if (file && (bs->file != file)) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001428 bdrv_unref(file);
Kevin Wolff500a6d2012-11-12 17:35:27 +01001429 file = NULL;
1430 }
1431
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001432 /* If there is a backing file, use it */
Paolo Bonzini9156df12012-10-18 16:49:17 +02001433 if ((flags & BDRV_O_NO_BACKING) == 0) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001434 QDict *backing_options;
1435
Benoît Canet5726d872013-09-25 13:30:01 +02001436 qdict_extract_subqdict(options, &backing_options, "backing.");
Max Reitz34b5d2c2013-09-05 14:45:29 +02001437 ret = bdrv_open_backing_file(bs, backing_options, &local_err);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001438 if (ret < 0) {
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001439 goto close_and_fail;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001440 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001441 }
1442
Max Reitz91af7012014-07-18 20:24:56 +02001443 bdrv_refresh_filename(bs);
1444
Kevin Wolfb9988752014-04-03 12:09:34 +02001445 /* For snapshot=on, create a temporary qcow2 overlay. bs points to the
1446 * temporary snapshot afterwards. */
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001447 if (snapshot_flags) {
Chen Gang6b8aeca2014-06-23 23:28:23 +08001448 ret = bdrv_append_temp_snapshot(bs, snapshot_flags, &local_err);
Kevin Wolfb9988752014-04-03 12:09:34 +02001449 if (local_err) {
Kevin Wolfb9988752014-04-03 12:09:34 +02001450 goto close_and_fail;
1451 }
1452 }
1453
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001454 /* Check if any unknown options were used */
Max Reitz5acd9d82014-02-18 18:33:11 +01001455 if (options && (qdict_size(options) != 0)) {
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001456 const QDictEntry *entry = qdict_first(options);
Max Reitz5acd9d82014-02-18 18:33:11 +01001457 if (flags & BDRV_O_PROTOCOL) {
1458 error_setg(errp, "Block protocol '%s' doesn't support the option "
1459 "'%s'", drv->format_name, entry->key);
1460 } else {
1461 error_setg(errp, "Block format '%s' used by device '%s' doesn't "
1462 "support the option '%s'", drv->format_name,
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001463 bdrv_get_device_name(bs), entry->key);
Max Reitz5acd9d82014-02-18 18:33:11 +01001464 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001465
1466 ret = -EINVAL;
1467 goto close_and_fail;
1468 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001469
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001470 if (!bdrv_key_required(bs)) {
Markus Armbrustera7f53e22014-10-07 13:59:25 +02001471 if (bs->blk) {
1472 blk_dev_change_media_cb(bs->blk, true);
1473 }
Markus Armbrusterc3adb582014-03-14 09:22:48 +01001474 } else if (!runstate_check(RUN_STATE_PRELAUNCH)
1475 && !runstate_check(RUN_STATE_INMIGRATE)
1476 && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
1477 error_setg(errp,
1478 "Guest must be stopped for opening of encrypted image");
1479 ret = -EBUSY;
1480 goto close_and_fail;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001481 }
1482
Markus Armbrusterc3adb582014-03-14 09:22:48 +01001483 QDECREF(options);
Max Reitzf67503e2014-02-18 18:33:05 +01001484 *pbs = bs;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001485 return 0;
1486
Kevin Wolf8bfea152014-04-11 19:16:36 +02001487fail:
Kevin Wolff500a6d2012-11-12 17:35:27 +01001488 if (file != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001489 bdrv_unref(file);
Kevin Wolff500a6d2012-11-12 17:35:27 +01001490 }
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001491 QDECREF(bs->options);
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001492 QDECREF(options);
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001493 bs->options = NULL;
Max Reitzf67503e2014-02-18 18:33:05 +01001494 if (!*pbs) {
1495 /* If *pbs is NULL, a new BDS has been created in this function and
1496 needs to be freed now. Otherwise, it does not need to be closed,
1497 since it has not really been opened yet. */
1498 bdrv_unref(bs);
1499 }
Markus Armbruster84d18f02014-01-30 15:07:28 +01001500 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001501 error_propagate(errp, local_err);
1502 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001503 return ret;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001504
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001505close_and_fail:
Max Reitzf67503e2014-02-18 18:33:05 +01001506 /* See fail path, but now the BDS has to be always closed */
1507 if (*pbs) {
1508 bdrv_close(bs);
1509 } else {
1510 bdrv_unref(bs);
1511 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001512 QDECREF(options);
Markus Armbruster84d18f02014-01-30 15:07:28 +01001513 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001514 error_propagate(errp, local_err);
1515 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001516 return ret;
1517}
1518
Jeff Codye971aa12012-09-20 15:13:19 -04001519typedef struct BlockReopenQueueEntry {
1520 bool prepared;
1521 BDRVReopenState state;
1522 QSIMPLEQ_ENTRY(BlockReopenQueueEntry) entry;
1523} BlockReopenQueueEntry;
1524
1525/*
1526 * Adds a BlockDriverState to a simple queue for an atomic, transactional
1527 * reopen of multiple devices.
1528 *
1529 * bs_queue can either be an existing BlockReopenQueue that has had QSIMPLE_INIT
1530 * already performed, or alternatively may be NULL a new BlockReopenQueue will
1531 * be created and initialized. This newly created BlockReopenQueue should be
1532 * passed back in for subsequent calls that are intended to be of the same
1533 * atomic 'set'.
1534 *
1535 * bs is the BlockDriverState to add to the reopen queue.
1536 *
1537 * flags contains the open flags for the associated bs
1538 *
1539 * returns a pointer to bs_queue, which is either the newly allocated
1540 * bs_queue, or the existing bs_queue being used.
1541 *
1542 */
1543BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
1544 BlockDriverState *bs, int flags)
1545{
1546 assert(bs != NULL);
1547
1548 BlockReopenQueueEntry *bs_entry;
1549 if (bs_queue == NULL) {
1550 bs_queue = g_new0(BlockReopenQueue, 1);
1551 QSIMPLEQ_INIT(bs_queue);
1552 }
1553
Kevin Wolff1f25a22014-04-25 19:04:55 +02001554 /* bdrv_open() masks this flag out */
1555 flags &= ~BDRV_O_PROTOCOL;
1556
Jeff Codye971aa12012-09-20 15:13:19 -04001557 if (bs->file) {
Kevin Wolff1f25a22014-04-25 19:04:55 +02001558 bdrv_reopen_queue(bs_queue, bs->file, bdrv_inherited_flags(flags));
Jeff Codye971aa12012-09-20 15:13:19 -04001559 }
1560
1561 bs_entry = g_new0(BlockReopenQueueEntry, 1);
1562 QSIMPLEQ_INSERT_TAIL(bs_queue, bs_entry, entry);
1563
1564 bs_entry->state.bs = bs;
1565 bs_entry->state.flags = flags;
1566
1567 return bs_queue;
1568}
1569
1570/*
1571 * Reopen multiple BlockDriverStates atomically & transactionally.
1572 *
1573 * The queue passed in (bs_queue) must have been built up previous
1574 * via bdrv_reopen_queue().
1575 *
1576 * Reopens all BDS specified in the queue, with the appropriate
1577 * flags. All devices are prepared for reopen, and failure of any
1578 * device will cause all device changes to be abandonded, and intermediate
1579 * data cleaned up.
1580 *
1581 * If all devices prepare successfully, then the changes are committed
1582 * to all devices.
1583 *
1584 */
1585int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
1586{
1587 int ret = -1;
1588 BlockReopenQueueEntry *bs_entry, *next;
1589 Error *local_err = NULL;
1590
1591 assert(bs_queue != NULL);
1592
1593 bdrv_drain_all();
1594
1595 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1596 if (bdrv_reopen_prepare(&bs_entry->state, bs_queue, &local_err)) {
1597 error_propagate(errp, local_err);
1598 goto cleanup;
1599 }
1600 bs_entry->prepared = true;
1601 }
1602
1603 /* If we reach this point, we have success and just need to apply the
1604 * changes
1605 */
1606 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1607 bdrv_reopen_commit(&bs_entry->state);
1608 }
1609
1610 ret = 0;
1611
1612cleanup:
1613 QSIMPLEQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
1614 if (ret && bs_entry->prepared) {
1615 bdrv_reopen_abort(&bs_entry->state);
1616 }
1617 g_free(bs_entry);
1618 }
1619 g_free(bs_queue);
1620 return ret;
1621}
1622
1623
1624/* Reopen a single BlockDriverState with the specified flags. */
1625int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp)
1626{
1627 int ret = -1;
1628 Error *local_err = NULL;
1629 BlockReopenQueue *queue = bdrv_reopen_queue(NULL, bs, bdrv_flags);
1630
1631 ret = bdrv_reopen_multiple(queue, &local_err);
1632 if (local_err != NULL) {
1633 error_propagate(errp, local_err);
1634 }
1635 return ret;
1636}
1637
1638
1639/*
1640 * Prepares a BlockDriverState for reopen. All changes are staged in the
1641 * 'opaque' field of the BDRVReopenState, which is used and allocated by
1642 * the block driver layer .bdrv_reopen_prepare()
1643 *
1644 * bs is the BlockDriverState to reopen
1645 * flags are the new open flags
1646 * queue is the reopen queue
1647 *
1648 * Returns 0 on success, non-zero on error. On error errp will be set
1649 * as well.
1650 *
1651 * On failure, bdrv_reopen_abort() will be called to clean up any data.
1652 * It is the responsibility of the caller to then call the abort() or
1653 * commit() for any other BDS that have been left in a prepare() state
1654 *
1655 */
1656int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
1657 Error **errp)
1658{
1659 int ret = -1;
1660 Error *local_err = NULL;
1661 BlockDriver *drv;
1662
1663 assert(reopen_state != NULL);
1664 assert(reopen_state->bs->drv != NULL);
1665 drv = reopen_state->bs->drv;
1666
1667 /* if we are to stay read-only, do not allow permission change
1668 * to r/w */
1669 if (!(reopen_state->bs->open_flags & BDRV_O_ALLOW_RDWR) &&
1670 reopen_state->flags & BDRV_O_RDWR) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03001671 error_setg(errp, "Node '%s' is read only",
1672 bdrv_get_device_or_node_name(reopen_state->bs));
Jeff Codye971aa12012-09-20 15:13:19 -04001673 goto error;
1674 }
1675
1676
1677 ret = bdrv_flush(reopen_state->bs);
1678 if (ret) {
1679 error_set(errp, ERROR_CLASS_GENERIC_ERROR, "Error (%s) flushing drive",
1680 strerror(-ret));
1681 goto error;
1682 }
1683
1684 if (drv->bdrv_reopen_prepare) {
1685 ret = drv->bdrv_reopen_prepare(reopen_state, queue, &local_err);
1686 if (ret) {
1687 if (local_err != NULL) {
1688 error_propagate(errp, local_err);
1689 } else {
Luiz Capitulinod8b68952013-06-10 11:29:27 -04001690 error_setg(errp, "failed while preparing to reopen image '%s'",
1691 reopen_state->bs->filename);
Jeff Codye971aa12012-09-20 15:13:19 -04001692 }
1693 goto error;
1694 }
1695 } else {
1696 /* It is currently mandatory to have a bdrv_reopen_prepare()
1697 * handler for each supported drv. */
Alberto Garcia81e5f782015-04-08 12:29:19 +03001698 error_setg(errp, "Block format '%s' used by node '%s' "
1699 "does not support reopening files", drv->format_name,
1700 bdrv_get_device_or_node_name(reopen_state->bs));
Jeff Codye971aa12012-09-20 15:13:19 -04001701 ret = -1;
1702 goto error;
1703 }
1704
1705 ret = 0;
1706
1707error:
1708 return ret;
1709}
1710
1711/*
1712 * Takes the staged changes for the reopen from bdrv_reopen_prepare(), and
1713 * makes them final by swapping the staging BlockDriverState contents into
1714 * the active BlockDriverState contents.
1715 */
1716void bdrv_reopen_commit(BDRVReopenState *reopen_state)
1717{
1718 BlockDriver *drv;
1719
1720 assert(reopen_state != NULL);
1721 drv = reopen_state->bs->drv;
1722 assert(drv != NULL);
1723
1724 /* If there are any driver level actions to take */
1725 if (drv->bdrv_reopen_commit) {
1726 drv->bdrv_reopen_commit(reopen_state);
1727 }
1728
1729 /* set BDS specific flags now */
1730 reopen_state->bs->open_flags = reopen_state->flags;
1731 reopen_state->bs->enable_write_cache = !!(reopen_state->flags &
1732 BDRV_O_CACHE_WB);
1733 reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
Kevin Wolf355ef4a2013-12-11 20:14:09 +01001734
Kevin Wolf3baca892014-07-16 17:48:16 +02001735 bdrv_refresh_limits(reopen_state->bs, NULL);
Jeff Codye971aa12012-09-20 15:13:19 -04001736}
1737
1738/*
1739 * Abort the reopen, and delete and free the staged changes in
1740 * reopen_state
1741 */
1742void bdrv_reopen_abort(BDRVReopenState *reopen_state)
1743{
1744 BlockDriver *drv;
1745
1746 assert(reopen_state != NULL);
1747 drv = reopen_state->bs->drv;
1748 assert(drv != NULL);
1749
1750 if (drv->bdrv_reopen_abort) {
1751 drv->bdrv_reopen_abort(reopen_state);
1752 }
1753}
1754
1755
bellardfc01f7e2003-06-30 10:03:06 +00001756void bdrv_close(BlockDriverState *bs)
1757{
Max Reitz33384422014-06-20 21:57:33 +02001758 BdrvAioNotifier *ban, *ban_next;
1759
Paolo Bonzini3cbc0022012-10-19 11:36:48 +02001760 if (bs->job) {
1761 block_job_cancel_sync(bs->job);
1762 }
Stefan Hajnoczi58fda172013-07-02 15:36:25 +02001763 bdrv_drain_all(); /* complete I/O */
1764 bdrv_flush(bs);
1765 bdrv_drain_all(); /* in case flush left pending I/O */
Paolo Bonzinid7d512f2012-08-23 11:20:36 +02001766 notifier_list_notify(&bs->close_notifiers, bs);
Kevin Wolf7094f122012-04-11 11:06:37 +02001767
Paolo Bonzini3cbc0022012-10-19 11:36:48 +02001768 if (bs->drv) {
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +01001769 if (bs->backing_hd) {
Fam Zheng826b6ca2014-05-23 21:29:47 +08001770 BlockDriverState *backing_hd = bs->backing_hd;
1771 bdrv_set_backing_hd(bs, NULL);
1772 bdrv_unref(backing_hd);
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +01001773 }
bellardea2384d2004-08-01 21:59:26 +00001774 bs->drv->bdrv_close(bs);
Anthony Liguori7267c092011-08-20 22:09:37 -05001775 g_free(bs->opaque);
bellardea2384d2004-08-01 21:59:26 +00001776 bs->opaque = NULL;
1777 bs->drv = NULL;
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +00001778 bs->copy_on_read = 0;
Paolo Bonzinia275fa42012-05-08 16:51:43 +02001779 bs->backing_file[0] = '\0';
1780 bs->backing_format[0] = '\0';
Paolo Bonzini64058752012-05-08 16:51:49 +02001781 bs->total_sectors = 0;
1782 bs->encrypted = 0;
1783 bs->valid_key = 0;
1784 bs->sg = 0;
Asias He0d51b4d2013-08-22 15:24:14 +08001785 bs->zero_beyond_eof = false;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001786 QDECREF(bs->options);
1787 bs->options = NULL;
Max Reitz91af7012014-07-18 20:24:56 +02001788 QDECREF(bs->full_open_options);
1789 bs->full_open_options = NULL;
bellardb3380822004-03-14 21:38:54 +00001790
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001791 if (bs->file != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001792 bdrv_unref(bs->file);
Paolo Bonzini0ac93772012-05-08 16:51:44 +02001793 bs->file = NULL;
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001794 }
bellardb3380822004-03-14 21:38:54 +00001795 }
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001796
Markus Armbrustera7f53e22014-10-07 13:59:25 +02001797 if (bs->blk) {
1798 blk_dev_change_media_cb(bs->blk, false);
1799 }
Pavel Hrdina9ca11152012-08-09 12:44:48 +02001800
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001801 /*throttling disk I/O limits*/
1802 if (bs->io_limits_enabled) {
1803 bdrv_io_limits_disable(bs);
1804 }
Max Reitz33384422014-06-20 21:57:33 +02001805
1806 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
1807 g_free(ban);
1808 }
1809 QLIST_INIT(&bs->aio_notifiers);
bellardb3380822004-03-14 21:38:54 +00001810}
1811
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001812void bdrv_close_all(void)
1813{
1814 BlockDriverState *bs;
1815
Benoît Canetdc364f42014-01-23 21:31:32 +01001816 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02001817 AioContext *aio_context = bdrv_get_aio_context(bs);
1818
1819 aio_context_acquire(aio_context);
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001820 bdrv_close(bs);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02001821 aio_context_release(aio_context);
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001822 }
1823}
1824
Benoît Canetdc364f42014-01-23 21:31:32 +01001825/* make a BlockDriverState anonymous by removing from bdrv_state and
1826 * graph_bdrv_state list.
Ryan Harperd22b2f42011-03-29 20:51:47 -05001827 Also, NULL terminate the device_name to prevent double remove */
1828void bdrv_make_anon(BlockDriverState *bs)
1829{
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001830 /*
1831 * Take care to remove bs from bdrv_states only when it's actually
1832 * in it. Note that bs->device_list.tqe_prev is initially null,
1833 * and gets set to non-null by QTAILQ_INSERT_TAIL(). Establish
1834 * the useful invariant "bs in bdrv_states iff bs->tqe_prev" by
1835 * resetting it to null on remove.
1836 */
1837 if (bs->device_list.tqe_prev) {
Benoît Canetdc364f42014-01-23 21:31:32 +01001838 QTAILQ_REMOVE(&bdrv_states, bs, device_list);
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001839 bs->device_list.tqe_prev = NULL;
Ryan Harperd22b2f42011-03-29 20:51:47 -05001840 }
Benoît Canetdc364f42014-01-23 21:31:32 +01001841 if (bs->node_name[0] != '\0') {
1842 QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
1843 }
1844 bs->node_name[0] = '\0';
Ryan Harperd22b2f42011-03-29 20:51:47 -05001845}
1846
Paolo Bonzinie023b2e2012-05-08 16:51:41 +02001847static void bdrv_rebind(BlockDriverState *bs)
1848{
1849 if (bs->drv && bs->drv->bdrv_rebind) {
1850 bs->drv->bdrv_rebind(bs);
1851 }
1852}
1853
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001854static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
1855 BlockDriverState *bs_src)
1856{
1857 /* move some fields that need to stay attached to the device */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001858
1859 /* dev info */
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01001860 bs_dest->guest_block_size = bs_src->guest_block_size;
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001861 bs_dest->copy_on_read = bs_src->copy_on_read;
1862
1863 bs_dest->enable_write_cache = bs_src->enable_write_cache;
1864
Benoît Canetcc0681c2013-09-02 14:14:39 +02001865 /* i/o throttled req */
1866 memcpy(&bs_dest->throttle_state,
1867 &bs_src->throttle_state,
1868 sizeof(ThrottleState));
1869 bs_dest->throttled_reqs[0] = bs_src->throttled_reqs[0];
1870 bs_dest->throttled_reqs[1] = bs_src->throttled_reqs[1];
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001871 bs_dest->io_limits_enabled = bs_src->io_limits_enabled;
1872
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001873 /* r/w error */
1874 bs_dest->on_read_error = bs_src->on_read_error;
1875 bs_dest->on_write_error = bs_src->on_write_error;
1876
1877 /* i/o status */
1878 bs_dest->iostatus_enabled = bs_src->iostatus_enabled;
1879 bs_dest->iostatus = bs_src->iostatus;
1880
1881 /* dirty bitmap */
Fam Zhenge4654d22013-11-13 18:29:43 +08001882 bs_dest->dirty_bitmaps = bs_src->dirty_bitmaps;
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001883
Fam Zheng9fcb0252013-08-23 09:14:46 +08001884 /* reference count */
1885 bs_dest->refcnt = bs_src->refcnt;
1886
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001887 /* job */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001888 bs_dest->job = bs_src->job;
1889
1890 /* keep the same entry in bdrv_states */
Benoît Canetdc364f42014-01-23 21:31:32 +01001891 bs_dest->device_list = bs_src->device_list;
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001892 bs_dest->blk = bs_src->blk;
1893
Fam Zhengfbe40ff2014-05-23 21:29:42 +08001894 memcpy(bs_dest->op_blockers, bs_src->op_blockers,
1895 sizeof(bs_dest->op_blockers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001896}
1897
1898/*
1899 * Swap bs contents for two image chains while they are live,
1900 * while keeping required fields on the BlockDriverState that is
1901 * actually attached to a device.
1902 *
1903 * This will modify the BlockDriverState fields, and swap contents
1904 * between bs_new and bs_old. Both bs_new and bs_old are modified.
1905 *
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001906 * bs_new must not be attached to a BlockBackend.
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001907 *
1908 * This function does not create any image files.
1909 */
1910void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
1911{
1912 BlockDriverState tmp;
1913
Benoît Canet90ce8a02014-03-05 23:48:29 +01001914 /* The code needs to swap the node_name but simply swapping node_list won't
1915 * work so first remove the nodes from the graph list, do the swap then
1916 * insert them back if needed.
1917 */
1918 if (bs_new->node_name[0] != '\0') {
1919 QTAILQ_REMOVE(&graph_bdrv_states, bs_new, node_list);
1920 }
1921 if (bs_old->node_name[0] != '\0') {
1922 QTAILQ_REMOVE(&graph_bdrv_states, bs_old, node_list);
1923 }
1924
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001925 /* bs_new must be unattached and shouldn't have anything fancy enabled */
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001926 assert(!bs_new->blk);
Fam Zhenge4654d22013-11-13 18:29:43 +08001927 assert(QLIST_EMPTY(&bs_new->dirty_bitmaps));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001928 assert(bs_new->job == NULL);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001929 assert(bs_new->io_limits_enabled == false);
Benoît Canetcc0681c2013-09-02 14:14:39 +02001930 assert(!throttle_have_timer(&bs_new->throttle_state));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001931
1932 tmp = *bs_new;
1933 *bs_new = *bs_old;
1934 *bs_old = tmp;
1935
1936 /* there are some fields that should not be swapped, move them back */
1937 bdrv_move_feature_fields(&tmp, bs_old);
1938 bdrv_move_feature_fields(bs_old, bs_new);
1939 bdrv_move_feature_fields(bs_new, &tmp);
1940
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001941 /* bs_new must remain unattached */
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001942 assert(!bs_new->blk);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001943
1944 /* Check a few fields that should remain attached to the device */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001945 assert(bs_new->job == NULL);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001946 assert(bs_new->io_limits_enabled == false);
Benoît Canetcc0681c2013-09-02 14:14:39 +02001947 assert(!throttle_have_timer(&bs_new->throttle_state));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001948
Benoît Canet90ce8a02014-03-05 23:48:29 +01001949 /* insert the nodes back into the graph node list if needed */
1950 if (bs_new->node_name[0] != '\0') {
1951 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_new, node_list);
1952 }
1953 if (bs_old->node_name[0] != '\0') {
1954 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_old, node_list);
1955 }
1956
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001957 bdrv_rebind(bs_new);
1958 bdrv_rebind(bs_old);
1959}
1960
Jeff Cody8802d1f2012-02-28 15:54:06 -05001961/*
1962 * Add new bs contents at the top of an image chain while the chain is
1963 * live, while keeping required fields on the top layer.
1964 *
1965 * This will modify the BlockDriverState fields, and swap contents
1966 * between bs_new and bs_top. Both bs_new and bs_top are modified.
1967 *
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001968 * bs_new must not be attached to a BlockBackend.
Jeff Codyf6801b82012-03-27 16:30:19 -04001969 *
Jeff Cody8802d1f2012-02-28 15:54:06 -05001970 * This function does not create any image files.
1971 */
1972void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
1973{
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001974 bdrv_swap(bs_new, bs_top);
Jeff Cody8802d1f2012-02-28 15:54:06 -05001975
1976 /* The contents of 'tmp' will become bs_top, as we are
1977 * swapping bs_new and bs_top contents. */
Fam Zheng8d24cce2014-05-23 21:29:45 +08001978 bdrv_set_backing_hd(bs_top, bs_new);
Jeff Cody8802d1f2012-02-28 15:54:06 -05001979}
1980
Fam Zheng4f6fd342013-08-23 09:14:47 +08001981static void bdrv_delete(BlockDriverState *bs)
bellardb3380822004-03-14 21:38:54 +00001982{
Paolo Bonzini3e914652012-03-30 13:17:11 +02001983 assert(!bs->job);
Fam Zheng3718d8a2014-05-23 21:29:43 +08001984 assert(bdrv_op_blocker_is_empty(bs));
Fam Zheng4f6fd342013-08-23 09:14:47 +08001985 assert(!bs->refcnt);
Fam Zhenge4654d22013-11-13 18:29:43 +08001986 assert(QLIST_EMPTY(&bs->dirty_bitmaps));
Markus Armbruster18846de2010-06-29 16:58:30 +02001987
Stefan Hajnoczie1b5c522013-06-27 15:32:26 +02001988 bdrv_close(bs);
1989
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001990 /* remove from list, if necessary */
Ryan Harperd22b2f42011-03-29 20:51:47 -05001991 bdrv_make_anon(bs);
aurel3234c6f052008-04-08 19:51:21 +00001992
Anthony Liguori7267c092011-08-20 22:09:37 -05001993 g_free(bs);
bellardfc01f7e2003-06-30 10:03:06 +00001994}
1995
aliguorie97fc192009-04-21 23:11:50 +00001996/*
1997 * Run consistency checks on an image
1998 *
Kevin Wolfe076f332010-06-29 11:43:13 +02001999 * Returns 0 if the check could be completed (it doesn't mean that the image is
Stefan Weila1c72732011-04-28 17:20:38 +02002000 * free of errors) or -errno when an internal error occurred. The results of the
Kevin Wolfe076f332010-06-29 11:43:13 +02002001 * check are stored in res.
aliguorie97fc192009-04-21 23:11:50 +00002002 */
Kevin Wolf4534ff52012-05-11 16:07:02 +02002003int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix)
aliguorie97fc192009-04-21 23:11:50 +00002004{
Max Reitz908bcd52014-08-07 22:47:55 +02002005 if (bs->drv == NULL) {
2006 return -ENOMEDIUM;
2007 }
aliguorie97fc192009-04-21 23:11:50 +00002008 if (bs->drv->bdrv_check == NULL) {
2009 return -ENOTSUP;
2010 }
2011
Kevin Wolfe076f332010-06-29 11:43:13 +02002012 memset(res, 0, sizeof(*res));
Kevin Wolf4534ff52012-05-11 16:07:02 +02002013 return bs->drv->bdrv_check(bs, res, fix);
aliguorie97fc192009-04-21 23:11:50 +00002014}
2015
Kevin Wolf8a426612010-07-16 17:17:01 +02002016#define COMMIT_BUF_SECTORS 2048
2017
bellard33e39632003-07-06 17:15:21 +00002018/* commit COW file into the raw image */
2019int bdrv_commit(BlockDriverState *bs)
2020{
bellard19cb3732006-08-19 11:45:59 +00002021 BlockDriver *drv = bs->drv;
Jeff Cody72706ea2014-01-24 09:02:35 -05002022 int64_t sector, total_sectors, length, backing_length;
Kevin Wolf8a426612010-07-16 17:17:01 +02002023 int n, ro, open_flags;
Jeff Cody0bce5972012-09-20 15:13:34 -04002024 int ret = 0;
Jeff Cody72706ea2014-01-24 09:02:35 -05002025 uint8_t *buf = NULL;
bellard33e39632003-07-06 17:15:21 +00002026
bellard19cb3732006-08-19 11:45:59 +00002027 if (!drv)
2028 return -ENOMEDIUM;
Liu Yuan6bb45152014-09-01 13:35:21 +08002029
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002030 if (!bs->backing_hd) {
2031 return -ENOTSUP;
bellard33e39632003-07-06 17:15:21 +00002032 }
2033
Fam Zhengbb000212014-09-11 13:14:00 +08002034 if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, NULL) ||
2035 bdrv_op_is_blocked(bs->backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET, NULL)) {
Stefan Hajnoczi2d3735d2012-01-18 14:40:41 +00002036 return -EBUSY;
2037 }
2038
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002039 ro = bs->backing_hd->read_only;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002040 open_flags = bs->backing_hd->open_flags;
2041
2042 if (ro) {
Jeff Cody0bce5972012-09-20 15:13:34 -04002043 if (bdrv_reopen(bs->backing_hd, open_flags | BDRV_O_RDWR, NULL)) {
2044 return -EACCES;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002045 }
bellard33e39632003-07-06 17:15:21 +00002046 }
bellardea2384d2004-08-01 21:59:26 +00002047
Jeff Cody72706ea2014-01-24 09:02:35 -05002048 length = bdrv_getlength(bs);
2049 if (length < 0) {
2050 ret = length;
2051 goto ro_cleanup;
2052 }
2053
2054 backing_length = bdrv_getlength(bs->backing_hd);
2055 if (backing_length < 0) {
2056 ret = backing_length;
2057 goto ro_cleanup;
2058 }
2059
2060 /* If our top snapshot is larger than the backing file image,
2061 * grow the backing file image if possible. If not possible,
2062 * we must return an error */
2063 if (length > backing_length) {
2064 ret = bdrv_truncate(bs->backing_hd, length);
2065 if (ret < 0) {
2066 goto ro_cleanup;
2067 }
2068 }
2069
2070 total_sectors = length >> BDRV_SECTOR_BITS;
Kevin Wolf857d4f42014-05-20 13:16:51 +02002071
2072 /* qemu_try_blockalign() for bs will choose an alignment that works for
2073 * bs->backing_hd as well, so no need to compare the alignment manually. */
2074 buf = qemu_try_blockalign(bs, COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
2075 if (buf == NULL) {
2076 ret = -ENOMEM;
2077 goto ro_cleanup;
2078 }
bellardea2384d2004-08-01 21:59:26 +00002079
Kevin Wolf8a426612010-07-16 17:17:01 +02002080 for (sector = 0; sector < total_sectors; sector += n) {
Paolo Bonzinid6636402013-09-04 19:00:25 +02002081 ret = bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n);
2082 if (ret < 0) {
2083 goto ro_cleanup;
2084 }
2085 if (ret) {
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002086 ret = bdrv_read(bs, sector, buf, n);
2087 if (ret < 0) {
Kevin Wolf8a426612010-07-16 17:17:01 +02002088 goto ro_cleanup;
2089 }
2090
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002091 ret = bdrv_write(bs->backing_hd, sector, buf, n);
2092 if (ret < 0) {
Kevin Wolf8a426612010-07-16 17:17:01 +02002093 goto ro_cleanup;
2094 }
bellardea2384d2004-08-01 21:59:26 +00002095 }
2096 }
bellard95389c82005-12-18 18:28:15 +00002097
Christoph Hellwig1d449522010-01-17 12:32:30 +01002098 if (drv->bdrv_make_empty) {
2099 ret = drv->bdrv_make_empty(bs);
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002100 if (ret < 0) {
2101 goto ro_cleanup;
2102 }
Christoph Hellwig1d449522010-01-17 12:32:30 +01002103 bdrv_flush(bs);
2104 }
bellard95389c82005-12-18 18:28:15 +00002105
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01002106 /*
2107 * Make sure all data we wrote to the backing device is actually
2108 * stable on disk.
2109 */
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002110 if (bs->backing_hd) {
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01002111 bdrv_flush(bs->backing_hd);
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002112 }
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002113
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002114 ret = 0;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002115ro_cleanup:
Kevin Wolf857d4f42014-05-20 13:16:51 +02002116 qemu_vfree(buf);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002117
2118 if (ro) {
Jeff Cody0bce5972012-09-20 15:13:34 -04002119 /* ignoring error return here */
2120 bdrv_reopen(bs->backing_hd, open_flags & ~BDRV_O_RDWR, NULL);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002121 }
2122
Christoph Hellwig1d449522010-01-17 12:32:30 +01002123 return ret;
bellard33e39632003-07-06 17:15:21 +00002124}
2125
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002126int bdrv_commit_all(void)
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002127{
2128 BlockDriverState *bs;
2129
Benoît Canetdc364f42014-01-23 21:31:32 +01002130 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002131 AioContext *aio_context = bdrv_get_aio_context(bs);
2132
2133 aio_context_acquire(aio_context);
Jeff Cody272d2d82013-02-26 09:55:48 -05002134 if (bs->drv && bs->backing_hd) {
2135 int ret = bdrv_commit(bs);
2136 if (ret < 0) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002137 aio_context_release(aio_context);
Jeff Cody272d2d82013-02-26 09:55:48 -05002138 return ret;
2139 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002140 }
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002141 aio_context_release(aio_context);
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002142 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002143 return 0;
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002144}
2145
Kevin Wolf756e6732010-01-12 12:55:17 +01002146/*
2147 * Return values:
2148 * 0 - success
2149 * -EINVAL - backing format specified, but no file
2150 * -ENOSPC - can't update the backing file because no space is left in the
2151 * image file header
2152 * -ENOTSUP - format driver doesn't support changing the backing file
2153 */
2154int bdrv_change_backing_file(BlockDriverState *bs,
2155 const char *backing_file, const char *backing_fmt)
2156{
2157 BlockDriver *drv = bs->drv;
Paolo Bonzini469ef352012-04-12 14:01:02 +02002158 int ret;
Kevin Wolf756e6732010-01-12 12:55:17 +01002159
Paolo Bonzini5f377792012-04-12 14:01:01 +02002160 /* Backing file format doesn't make sense without a backing file */
2161 if (backing_fmt && !backing_file) {
2162 return -EINVAL;
2163 }
2164
Kevin Wolf756e6732010-01-12 12:55:17 +01002165 if (drv->bdrv_change_backing_file != NULL) {
Paolo Bonzini469ef352012-04-12 14:01:02 +02002166 ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
Kevin Wolf756e6732010-01-12 12:55:17 +01002167 } else {
Paolo Bonzini469ef352012-04-12 14:01:02 +02002168 ret = -ENOTSUP;
Kevin Wolf756e6732010-01-12 12:55:17 +01002169 }
Paolo Bonzini469ef352012-04-12 14:01:02 +02002170
2171 if (ret == 0) {
2172 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_file ?: "");
2173 pstrcpy(bs->backing_format, sizeof(bs->backing_format), backing_fmt ?: "");
2174 }
2175 return ret;
Kevin Wolf756e6732010-01-12 12:55:17 +01002176}
2177
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002178/*
2179 * Finds the image layer in the chain that has 'bs' as its backing file.
2180 *
2181 * active is the current topmost image.
2182 *
2183 * Returns NULL if bs is not found in active's image chain,
2184 * or if active == bs.
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002185 *
2186 * Returns the bottommost base image if bs == NULL.
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002187 */
2188BlockDriverState *bdrv_find_overlay(BlockDriverState *active,
2189 BlockDriverState *bs)
2190{
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002191 while (active && bs != active->backing_hd) {
2192 active = active->backing_hd;
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002193 }
2194
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002195 return active;
2196}
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002197
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002198/* Given a BDS, searches for the base layer. */
2199BlockDriverState *bdrv_find_base(BlockDriverState *bs)
2200{
2201 return bdrv_find_overlay(bs, NULL);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002202}
2203
2204typedef struct BlkIntermediateStates {
2205 BlockDriverState *bs;
2206 QSIMPLEQ_ENTRY(BlkIntermediateStates) entry;
2207} BlkIntermediateStates;
2208
2209
2210/*
2211 * Drops images above 'base' up to and including 'top', and sets the image
2212 * above 'top' to have base as its backing file.
2213 *
2214 * Requires that the overlay to 'top' is opened r/w, so that the backing file
2215 * information in 'bs' can be properly updated.
2216 *
2217 * E.g., this will convert the following chain:
2218 * bottom <- base <- intermediate <- top <- active
2219 *
2220 * to
2221 *
2222 * bottom <- base <- active
2223 *
2224 * It is allowed for bottom==base, in which case it converts:
2225 *
2226 * base <- intermediate <- top <- active
2227 *
2228 * to
2229 *
2230 * base <- active
2231 *
Jeff Cody54e26902014-06-25 15:40:10 -04002232 * If backing_file_str is non-NULL, it will be used when modifying top's
2233 * overlay image metadata.
2234 *
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002235 * Error conditions:
2236 * if active == top, that is considered an error
2237 *
2238 */
2239int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
Jeff Cody54e26902014-06-25 15:40:10 -04002240 BlockDriverState *base, const char *backing_file_str)
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002241{
2242 BlockDriverState *intermediate;
2243 BlockDriverState *base_bs = NULL;
2244 BlockDriverState *new_top_bs = NULL;
2245 BlkIntermediateStates *intermediate_state, *next;
2246 int ret = -EIO;
2247
2248 QSIMPLEQ_HEAD(states_to_delete, BlkIntermediateStates) states_to_delete;
2249 QSIMPLEQ_INIT(&states_to_delete);
2250
2251 if (!top->drv || !base->drv) {
2252 goto exit;
2253 }
2254
2255 new_top_bs = bdrv_find_overlay(active, top);
2256
2257 if (new_top_bs == NULL) {
2258 /* we could not find the image above 'top', this is an error */
2259 goto exit;
2260 }
2261
2262 /* special case of new_top_bs->backing_hd already pointing to base - nothing
2263 * to do, no intermediate images */
2264 if (new_top_bs->backing_hd == base) {
2265 ret = 0;
2266 goto exit;
2267 }
2268
2269 intermediate = top;
2270
2271 /* now we will go down through the list, and add each BDS we find
2272 * into our deletion queue, until we hit the 'base'
2273 */
2274 while (intermediate) {
Markus Armbruster5839e532014-08-19 10:31:08 +02002275 intermediate_state = g_new0(BlkIntermediateStates, 1);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002276 intermediate_state->bs = intermediate;
2277 QSIMPLEQ_INSERT_TAIL(&states_to_delete, intermediate_state, entry);
2278
2279 if (intermediate->backing_hd == base) {
2280 base_bs = intermediate->backing_hd;
2281 break;
2282 }
2283 intermediate = intermediate->backing_hd;
2284 }
2285 if (base_bs == NULL) {
2286 /* something went wrong, we did not end at the base. safely
2287 * unravel everything, and exit with error */
2288 goto exit;
2289 }
2290
2291 /* success - we can delete the intermediate states, and link top->base */
Jeff Cody54e26902014-06-25 15:40:10 -04002292 backing_file_str = backing_file_str ? backing_file_str : base_bs->filename;
2293 ret = bdrv_change_backing_file(new_top_bs, backing_file_str,
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002294 base_bs->drv ? base_bs->drv->format_name : "");
2295 if (ret) {
2296 goto exit;
2297 }
Fam Zheng920beae2014-05-23 21:29:46 +08002298 bdrv_set_backing_hd(new_top_bs, base_bs);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002299
2300 QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
2301 /* so that bdrv_close() does not recursively close the chain */
Fam Zheng920beae2014-05-23 21:29:46 +08002302 bdrv_set_backing_hd(intermediate_state->bs, NULL);
Fam Zheng4f6fd342013-08-23 09:14:47 +08002303 bdrv_unref(intermediate_state->bs);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002304 }
2305 ret = 0;
2306
2307exit:
2308 QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
2309 g_free(intermediate_state);
2310 }
2311 return ret;
2312}
2313
bellard83f64092006-08-01 16:21:11 +00002314/**
bellard83f64092006-08-01 16:21:11 +00002315 * Truncate file to 'offset' bytes (needed only for file protocols)
2316 */
2317int bdrv_truncate(BlockDriverState *bs, int64_t offset)
2318{
2319 BlockDriver *drv = bs->drv;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002320 int ret;
bellard83f64092006-08-01 16:21:11 +00002321 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002322 return -ENOMEDIUM;
bellard83f64092006-08-01 16:21:11 +00002323 if (!drv->bdrv_truncate)
2324 return -ENOTSUP;
Naphtali Sprei59f26892009-10-26 16:25:16 +02002325 if (bs->read_only)
2326 return -EACCES;
Jeff Cody9c75e162014-06-25 16:55:30 -04002327
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002328 ret = drv->bdrv_truncate(bs, offset);
2329 if (ret == 0) {
2330 ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
John Snowce1ffea2015-04-17 19:50:03 -04002331 bdrv_dirty_bitmap_truncate(bs);
Markus Armbrustera7f53e22014-10-07 13:59:25 +02002332 if (bs->blk) {
2333 blk_dev_resize_cb(bs->blk);
2334 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002335 }
2336 return ret;
bellard83f64092006-08-01 16:21:11 +00002337}
2338
2339/**
Fam Zheng4a1d5e12011-07-12 19:56:39 +08002340 * Length of a allocated file in bytes. Sparse files are counted by actual
2341 * allocated space. Return < 0 if error or unknown.
2342 */
2343int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
2344{
2345 BlockDriver *drv = bs->drv;
2346 if (!drv) {
2347 return -ENOMEDIUM;
2348 }
2349 if (drv->bdrv_get_allocated_file_size) {
2350 return drv->bdrv_get_allocated_file_size(bs);
2351 }
2352 if (bs->file) {
2353 return bdrv_get_allocated_file_size(bs->file);
2354 }
2355 return -ENOTSUP;
2356}
2357
2358/**
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002359 * Return number of sectors on success, -errno on error.
bellard83f64092006-08-01 16:21:11 +00002360 */
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002361int64_t bdrv_nb_sectors(BlockDriverState *bs)
bellard83f64092006-08-01 16:21:11 +00002362{
2363 BlockDriver *drv = bs->drv;
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002364
bellard83f64092006-08-01 16:21:11 +00002365 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002366 return -ENOMEDIUM;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002367
Kevin Wolfb94a2612013-10-29 12:18:58 +01002368 if (drv->has_variable_length) {
2369 int ret = refresh_total_sectors(bs, bs->total_sectors);
2370 if (ret < 0) {
2371 return ret;
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01002372 }
bellard83f64092006-08-01 16:21:11 +00002373 }
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002374 return bs->total_sectors;
2375}
2376
2377/**
2378 * Return length in bytes on success, -errno on error.
2379 * The length is always a multiple of BDRV_SECTOR_SIZE.
2380 */
2381int64_t bdrv_getlength(BlockDriverState *bs)
2382{
2383 int64_t ret = bdrv_nb_sectors(bs);
2384
Fam Zheng4a9c9ea2015-05-15 16:36:05 +08002385 ret = ret > INT64_MAX / BDRV_SECTOR_SIZE ? -EFBIG : ret;
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002386 return ret < 0 ? ret : ret * BDRV_SECTOR_SIZE;
bellardfc01f7e2003-06-30 10:03:06 +00002387}
2388
bellard19cb3732006-08-19 11:45:59 +00002389/* return 0 as number of sectors if no device present or error */
ths96b8f132007-12-17 01:35:20 +00002390void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
bellardfc01f7e2003-06-30 10:03:06 +00002391{
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002392 int64_t nb_sectors = bdrv_nb_sectors(bs);
2393
2394 *nb_sectors_ptr = nb_sectors < 0 ? 0 : nb_sectors;
bellardfc01f7e2003-06-30 10:03:06 +00002395}
bellardcf989512004-02-16 21:56:36 +00002396
Paolo Bonziniff06f5f2012-09-28 17:22:54 +02002397void bdrv_set_on_error(BlockDriverState *bs, BlockdevOnError on_read_error,
2398 BlockdevOnError on_write_error)
Markus Armbrusterabd7f682010-06-02 18:55:17 +02002399{
2400 bs->on_read_error = on_read_error;
2401 bs->on_write_error = on_write_error;
2402}
2403
Paolo Bonzini1ceee0d2012-09-28 17:22:56 +02002404BlockdevOnError bdrv_get_on_error(BlockDriverState *bs, bool is_read)
Markus Armbrusterabd7f682010-06-02 18:55:17 +02002405{
2406 return is_read ? bs->on_read_error : bs->on_write_error;
2407}
2408
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002409BlockErrorAction bdrv_get_error_action(BlockDriverState *bs, bool is_read, int error)
2410{
2411 BlockdevOnError on_err = is_read ? bs->on_read_error : bs->on_write_error;
2412
2413 switch (on_err) {
2414 case BLOCKDEV_ON_ERROR_ENOSPC:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002415 return (error == ENOSPC) ?
2416 BLOCK_ERROR_ACTION_STOP : BLOCK_ERROR_ACTION_REPORT;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002417 case BLOCKDEV_ON_ERROR_STOP:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002418 return BLOCK_ERROR_ACTION_STOP;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002419 case BLOCKDEV_ON_ERROR_REPORT:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002420 return BLOCK_ERROR_ACTION_REPORT;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002421 case BLOCKDEV_ON_ERROR_IGNORE:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002422 return BLOCK_ERROR_ACTION_IGNORE;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002423 default:
2424 abort();
2425 }
2426}
2427
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002428static void send_qmp_error_event(BlockDriverState *bs,
2429 BlockErrorAction action,
2430 bool is_read, int error)
2431{
Peter Maydell573742a2014-10-10 20:33:03 +01002432 IoOperationType optype;
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002433
Peter Maydell573742a2014-10-10 20:33:03 +01002434 optype = is_read ? IO_OPERATION_TYPE_READ : IO_OPERATION_TYPE_WRITE;
2435 qapi_event_send_block_io_error(bdrv_get_device_name(bs), optype, action,
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002436 bdrv_iostatus_is_enabled(bs),
Luiz Capitulino624ff572014-09-11 10:25:48 -04002437 error == ENOSPC, strerror(error),
2438 &error_abort);
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002439}
2440
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002441/* This is done by device models because, while the block layer knows
2442 * about the error, it does not know whether an operation comes from
2443 * the device or the block layer (from a job, for example).
2444 */
2445void bdrv_error_action(BlockDriverState *bs, BlockErrorAction action,
2446 bool is_read, int error)
2447{
2448 assert(error >= 0);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002449
Wenchao Xiaa5895692014-06-18 08:43:30 +02002450 if (action == BLOCK_ERROR_ACTION_STOP) {
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002451 /* First set the iostatus, so that "info block" returns an iostatus
2452 * that matches the events raised so far (an additional error iostatus
2453 * is fine, but not a lost one).
2454 */
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002455 bdrv_iostatus_set_err(bs, error);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002456
2457 /* Then raise the request to stop the VM and the event.
2458 * qemu_system_vmstop_request_prepare has two effects. First,
2459 * it ensures that the STOP event always comes after the
2460 * BLOCK_IO_ERROR event. Second, it ensures that even if management
2461 * can observe the STOP event and do a "cont" before the STOP
2462 * event is issued, the VM will not stop. In this case, vm_start()
2463 * also ensures that the STOP/RESUME pair of events is emitted.
2464 */
2465 qemu_system_vmstop_request_prepare();
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002466 send_qmp_error_event(bs, action, is_read, error);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002467 qemu_system_vmstop_request(RUN_STATE_IO_ERROR);
2468 } else {
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002469 send_qmp_error_event(bs, action, is_read, error);
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002470 }
2471}
2472
bellardb3380822004-03-14 21:38:54 +00002473int bdrv_is_read_only(BlockDriverState *bs)
2474{
2475 return bs->read_only;
2476}
2477
ths985a03b2007-12-24 16:10:43 +00002478int bdrv_is_sg(BlockDriverState *bs)
2479{
2480 return bs->sg;
2481}
2482
Christoph Hellwige900a7b2009-09-04 19:01:15 +02002483int bdrv_enable_write_cache(BlockDriverState *bs)
2484{
2485 return bs->enable_write_cache;
2486}
2487
Paolo Bonzini425b0142012-06-06 00:04:52 +02002488void bdrv_set_enable_write_cache(BlockDriverState *bs, bool wce)
2489{
2490 bs->enable_write_cache = wce;
Jeff Cody55b110f2012-09-20 15:13:18 -04002491
2492 /* so a reopen() will preserve wce */
2493 if (wce) {
2494 bs->open_flags |= BDRV_O_CACHE_WB;
2495 } else {
2496 bs->open_flags &= ~BDRV_O_CACHE_WB;
2497 }
Paolo Bonzini425b0142012-06-06 00:04:52 +02002498}
2499
bellardea2384d2004-08-01 21:59:26 +00002500int bdrv_is_encrypted(BlockDriverState *bs)
2501{
2502 if (bs->backing_hd && bs->backing_hd->encrypted)
2503 return 1;
2504 return bs->encrypted;
2505}
2506
aliguoric0f4ce72009-03-05 23:01:01 +00002507int bdrv_key_required(BlockDriverState *bs)
2508{
2509 BlockDriverState *backing_hd = bs->backing_hd;
2510
2511 if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
2512 return 1;
2513 return (bs->encrypted && !bs->valid_key);
2514}
2515
bellardea2384d2004-08-01 21:59:26 +00002516int bdrv_set_key(BlockDriverState *bs, const char *key)
2517{
2518 int ret;
2519 if (bs->backing_hd && bs->backing_hd->encrypted) {
2520 ret = bdrv_set_key(bs->backing_hd, key);
2521 if (ret < 0)
2522 return ret;
2523 if (!bs->encrypted)
2524 return 0;
2525 }
Shahar Havivifd04a2a2010-03-06 00:26:13 +02002526 if (!bs->encrypted) {
2527 return -EINVAL;
2528 } else if (!bs->drv || !bs->drv->bdrv_set_key) {
2529 return -ENOMEDIUM;
2530 }
aliguoric0f4ce72009-03-05 23:01:01 +00002531 ret = bs->drv->bdrv_set_key(bs, key);
aliguoribb5fc202009-03-05 23:01:15 +00002532 if (ret < 0) {
2533 bs->valid_key = 0;
2534 } else if (!bs->valid_key) {
2535 bs->valid_key = 1;
Markus Armbrustera7f53e22014-10-07 13:59:25 +02002536 if (bs->blk) {
2537 /* call the change callback now, we skipped it on open */
2538 blk_dev_change_media_cb(bs->blk, true);
2539 }
aliguoribb5fc202009-03-05 23:01:15 +00002540 }
aliguoric0f4ce72009-03-05 23:01:01 +00002541 return ret;
bellardea2384d2004-08-01 21:59:26 +00002542}
2543
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002544/*
2545 * Provide an encryption key for @bs.
2546 * If @key is non-null:
2547 * If @bs is not encrypted, fail.
2548 * Else if the key is invalid, fail.
2549 * Else set @bs's key to @key, replacing the existing key, if any.
2550 * If @key is null:
2551 * If @bs is encrypted and still lacks a key, fail.
2552 * Else do nothing.
2553 * On failure, store an error object through @errp if non-null.
2554 */
2555void bdrv_add_key(BlockDriverState *bs, const char *key, Error **errp)
2556{
2557 if (key) {
2558 if (!bdrv_is_encrypted(bs)) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03002559 error_setg(errp, "Node '%s' is not encrypted",
2560 bdrv_get_device_or_node_name(bs));
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002561 } else if (bdrv_set_key(bs, key) < 0) {
2562 error_set(errp, QERR_INVALID_PASSWORD);
2563 }
2564 } else {
2565 if (bdrv_key_required(bs)) {
Markus Armbrusterb1ca6392015-01-29 10:37:01 +01002566 error_set(errp, ERROR_CLASS_DEVICE_ENCRYPTED,
2567 "'%s' (%s) is encrypted",
Alberto Garcia81e5f782015-04-08 12:29:19 +03002568 bdrv_get_device_or_node_name(bs),
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002569 bdrv_get_encrypted_filename(bs));
2570 }
2571 }
2572}
2573
Markus Armbrusterf8d6bba2012-06-13 10:11:48 +02002574const char *bdrv_get_format_name(BlockDriverState *bs)
bellardea2384d2004-08-01 21:59:26 +00002575{
Markus Armbrusterf8d6bba2012-06-13 10:11:48 +02002576 return bs->drv ? bs->drv->format_name : NULL;
bellardea2384d2004-08-01 21:59:26 +00002577}
2578
Stefan Hajnocziada42402014-08-27 12:08:55 +01002579static int qsort_strcmp(const void *a, const void *b)
2580{
2581 return strcmp(a, b);
2582}
2583
ths5fafdf22007-09-16 21:08:06 +00002584void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
bellardea2384d2004-08-01 21:59:26 +00002585 void *opaque)
2586{
2587 BlockDriver *drv;
Jeff Codye855e4f2014-04-28 18:29:54 -04002588 int count = 0;
Stefan Hajnocziada42402014-08-27 12:08:55 +01002589 int i;
Jeff Codye855e4f2014-04-28 18:29:54 -04002590 const char **formats = NULL;
bellardea2384d2004-08-01 21:59:26 +00002591
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +01002592 QLIST_FOREACH(drv, &bdrv_drivers, list) {
Jeff Codye855e4f2014-04-28 18:29:54 -04002593 if (drv->format_name) {
2594 bool found = false;
2595 int i = count;
2596 while (formats && i && !found) {
2597 found = !strcmp(formats[--i], drv->format_name);
2598 }
2599
2600 if (!found) {
Markus Armbruster5839e532014-08-19 10:31:08 +02002601 formats = g_renew(const char *, formats, count + 1);
Jeff Codye855e4f2014-04-28 18:29:54 -04002602 formats[count++] = drv->format_name;
Jeff Codye855e4f2014-04-28 18:29:54 -04002603 }
2604 }
bellardea2384d2004-08-01 21:59:26 +00002605 }
Stefan Hajnocziada42402014-08-27 12:08:55 +01002606
2607 qsort(formats, count, sizeof(formats[0]), qsort_strcmp);
2608
2609 for (i = 0; i < count; i++) {
2610 it(opaque, formats[i]);
2611 }
2612
Jeff Codye855e4f2014-04-28 18:29:54 -04002613 g_free(formats);
bellardea2384d2004-08-01 21:59:26 +00002614}
2615
Benoît Canetdc364f42014-01-23 21:31:32 +01002616/* This function is to find a node in the bs graph */
2617BlockDriverState *bdrv_find_node(const char *node_name)
2618{
2619 BlockDriverState *bs;
2620
2621 assert(node_name);
2622
2623 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
2624 if (!strcmp(node_name, bs->node_name)) {
2625 return bs;
2626 }
2627 }
2628 return NULL;
2629}
2630
Benoît Canetc13163f2014-01-23 21:31:34 +01002631/* Put this QMP function here so it can access the static graph_bdrv_states. */
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002632BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp)
Benoît Canetc13163f2014-01-23 21:31:34 +01002633{
2634 BlockDeviceInfoList *list, *entry;
2635 BlockDriverState *bs;
2636
2637 list = NULL;
2638 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002639 BlockDeviceInfo *info = bdrv_block_device_info(bs, errp);
2640 if (!info) {
2641 qapi_free_BlockDeviceInfoList(list);
2642 return NULL;
2643 }
Benoît Canetc13163f2014-01-23 21:31:34 +01002644 entry = g_malloc0(sizeof(*entry));
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002645 entry->value = info;
Benoît Canetc13163f2014-01-23 21:31:34 +01002646 entry->next = list;
2647 list = entry;
2648 }
2649
2650 return list;
2651}
2652
Benoît Canet12d3ba82014-01-23 21:31:35 +01002653BlockDriverState *bdrv_lookup_bs(const char *device,
2654 const char *node_name,
2655 Error **errp)
2656{
Markus Armbruster7f06d472014-10-07 13:59:12 +02002657 BlockBackend *blk;
2658 BlockDriverState *bs;
Benoît Canet12d3ba82014-01-23 21:31:35 +01002659
Benoît Canet12d3ba82014-01-23 21:31:35 +01002660 if (device) {
Markus Armbruster7f06d472014-10-07 13:59:12 +02002661 blk = blk_by_name(device);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002662
Markus Armbruster7f06d472014-10-07 13:59:12 +02002663 if (blk) {
2664 return blk_bs(blk);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002665 }
Benoît Canet12d3ba82014-01-23 21:31:35 +01002666 }
2667
Benoît Canetdd67fa52014-02-12 17:15:06 +01002668 if (node_name) {
2669 bs = bdrv_find_node(node_name);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002670
Benoît Canetdd67fa52014-02-12 17:15:06 +01002671 if (bs) {
2672 return bs;
2673 }
Benoît Canet12d3ba82014-01-23 21:31:35 +01002674 }
2675
Benoît Canetdd67fa52014-02-12 17:15:06 +01002676 error_setg(errp, "Cannot find device=%s nor node_name=%s",
2677 device ? device : "",
2678 node_name ? node_name : "");
2679 return NULL;
Benoît Canet12d3ba82014-01-23 21:31:35 +01002680}
2681
Jeff Cody5a6684d2014-06-25 15:40:09 -04002682/* If 'base' is in the same chain as 'top', return true. Otherwise,
2683 * return false. If either argument is NULL, return false. */
2684bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
2685{
2686 while (top && top != base) {
2687 top = top->backing_hd;
2688 }
2689
2690 return top != NULL;
2691}
2692
Fam Zheng04df7652014-10-31 11:32:54 +08002693BlockDriverState *bdrv_next_node(BlockDriverState *bs)
2694{
2695 if (!bs) {
2696 return QTAILQ_FIRST(&graph_bdrv_states);
2697 }
2698 return QTAILQ_NEXT(bs, node_list);
2699}
2700
Markus Armbruster2f399b02010-06-02 18:55:20 +02002701BlockDriverState *bdrv_next(BlockDriverState *bs)
2702{
2703 if (!bs) {
2704 return QTAILQ_FIRST(&bdrv_states);
2705 }
Benoît Canetdc364f42014-01-23 21:31:32 +01002706 return QTAILQ_NEXT(bs, device_list);
Markus Armbruster2f399b02010-06-02 18:55:20 +02002707}
2708
Fam Zheng20a9e772014-10-31 11:32:55 +08002709const char *bdrv_get_node_name(const BlockDriverState *bs)
2710{
2711 return bs->node_name;
2712}
2713
Markus Armbruster7f06d472014-10-07 13:59:12 +02002714/* TODO check what callers really want: bs->node_name or blk_name() */
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02002715const char *bdrv_get_device_name(const BlockDriverState *bs)
bellardea2384d2004-08-01 21:59:26 +00002716{
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02002717 return bs->blk ? blk_name(bs->blk) : "";
bellardea2384d2004-08-01 21:59:26 +00002718}
2719
Alberto Garcia9b2aa842015-04-08 12:29:18 +03002720/* This can be used to identify nodes that might not have a device
2721 * name associated. Since node and device names live in the same
2722 * namespace, the result is unambiguous. The exception is if both are
2723 * absent, then this returns an empty (non-null) string. */
2724const char *bdrv_get_device_or_node_name(const BlockDriverState *bs)
2725{
2726 return bs->blk ? blk_name(bs->blk) : bs->node_name;
2727}
2728
Markus Armbrusterc8433282012-06-05 16:49:24 +02002729int bdrv_get_flags(BlockDriverState *bs)
2730{
2731 return bs->open_flags;
2732}
2733
Peter Lieven3ac21622013-06-28 12:47:42 +02002734int bdrv_has_zero_init_1(BlockDriverState *bs)
2735{
2736 return 1;
2737}
2738
Kevin Wolff2feebb2010-04-14 17:30:35 +02002739int bdrv_has_zero_init(BlockDriverState *bs)
2740{
2741 assert(bs->drv);
2742
Paolo Bonzini11212d82013-09-04 19:00:27 +02002743 /* If BS is a copy on write image, it is initialized to
2744 the contents of the base image, which may not be zeroes. */
2745 if (bs->backing_hd) {
2746 return 0;
2747 }
Kevin Wolf336c1c12010-07-28 11:26:29 +02002748 if (bs->drv->bdrv_has_zero_init) {
2749 return bs->drv->bdrv_has_zero_init(bs);
Kevin Wolff2feebb2010-04-14 17:30:35 +02002750 }
2751
Peter Lieven3ac21622013-06-28 12:47:42 +02002752 /* safe default */
2753 return 0;
Kevin Wolff2feebb2010-04-14 17:30:35 +02002754}
2755
Peter Lieven4ce78692013-10-24 12:06:54 +02002756bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs)
2757{
2758 BlockDriverInfo bdi;
2759
2760 if (bs->backing_hd) {
2761 return false;
2762 }
2763
2764 if (bdrv_get_info(bs, &bdi) == 0) {
2765 return bdi.unallocated_blocks_are_zero;
2766 }
2767
2768 return false;
2769}
2770
2771bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs)
2772{
2773 BlockDriverInfo bdi;
2774
2775 if (bs->backing_hd || !(bs->open_flags & BDRV_O_UNMAP)) {
2776 return false;
2777 }
2778
2779 if (bdrv_get_info(bs, &bdi) == 0) {
2780 return bdi.can_write_zeroes_with_unmap;
2781 }
2782
2783 return false;
2784}
2785
aliguori045df332009-03-05 23:00:48 +00002786const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
2787{
2788 if (bs->backing_hd && bs->backing_hd->encrypted)
2789 return bs->backing_file;
2790 else if (bs->encrypted)
2791 return bs->filename;
2792 else
2793 return NULL;
2794}
2795
ths5fafdf22007-09-16 21:08:06 +00002796void bdrv_get_backing_filename(BlockDriverState *bs,
bellard83f64092006-08-01 16:21:11 +00002797 char *filename, int filename_size)
bellardea2384d2004-08-01 21:59:26 +00002798{
Kevin Wolf3574c602011-10-26 11:02:11 +02002799 pstrcpy(filename, filename_size, bs->backing_file);
bellardea2384d2004-08-01 21:59:26 +00002800}
2801
bellardfaea38e2006-08-05 21:31:00 +00002802int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
2803{
2804 BlockDriver *drv = bs->drv;
2805 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002806 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00002807 if (!drv->bdrv_get_info)
2808 return -ENOTSUP;
2809 memset(bdi, 0, sizeof(*bdi));
2810 return drv->bdrv_get_info(bs, bdi);
2811}
2812
Max Reitzeae041f2013-10-09 10:46:16 +02002813ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs)
2814{
2815 BlockDriver *drv = bs->drv;
2816 if (drv && drv->bdrv_get_specific_info) {
2817 return drv->bdrv_get_specific_info(bs);
2818 }
2819 return NULL;
2820}
2821
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002822void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event)
2823{
Kevin Wolfbf736fe2013-06-05 15:17:55 +02002824 if (!bs || !bs->drv || !bs->drv->bdrv_debug_event) {
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002825 return;
2826 }
2827
Kevin Wolfbf736fe2013-06-05 15:17:55 +02002828 bs->drv->bdrv_debug_event(bs, event);
Kevin Wolf41c695c2012-12-06 14:32:58 +01002829}
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002830
Kevin Wolf41c695c2012-12-06 14:32:58 +01002831int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
2832 const char *tag)
2833{
2834 while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) {
2835 bs = bs->file;
2836 }
2837
2838 if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) {
2839 return bs->drv->bdrv_debug_breakpoint(bs, event, tag);
2840 }
2841
2842 return -ENOTSUP;
2843}
2844
Fam Zheng4cc70e92013-11-20 10:01:54 +08002845int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag)
2846{
2847 while (bs && bs->drv && !bs->drv->bdrv_debug_remove_breakpoint) {
2848 bs = bs->file;
2849 }
2850
2851 if (bs && bs->drv && bs->drv->bdrv_debug_remove_breakpoint) {
2852 return bs->drv->bdrv_debug_remove_breakpoint(bs, tag);
2853 }
2854
2855 return -ENOTSUP;
2856}
2857
Kevin Wolf41c695c2012-12-06 14:32:58 +01002858int bdrv_debug_resume(BlockDriverState *bs, const char *tag)
2859{
Max Reitz938789e2014-03-10 23:44:08 +01002860 while (bs && (!bs->drv || !bs->drv->bdrv_debug_resume)) {
Kevin Wolf41c695c2012-12-06 14:32:58 +01002861 bs = bs->file;
2862 }
2863
2864 if (bs && bs->drv && bs->drv->bdrv_debug_resume) {
2865 return bs->drv->bdrv_debug_resume(bs, tag);
2866 }
2867
2868 return -ENOTSUP;
2869}
2870
2871bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag)
2872{
2873 while (bs && bs->drv && !bs->drv->bdrv_debug_is_suspended) {
2874 bs = bs->file;
2875 }
2876
2877 if (bs && bs->drv && bs->drv->bdrv_debug_is_suspended) {
2878 return bs->drv->bdrv_debug_is_suspended(bs, tag);
2879 }
2880
2881 return false;
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002882}
2883
Blue Swirl199630b2010-07-25 20:49:34 +00002884int bdrv_is_snapshot(BlockDriverState *bs)
2885{
2886 return !!(bs->open_flags & BDRV_O_SNAPSHOT);
2887}
2888
Jeff Codyb1b1d782012-10-16 15:49:09 -04002889/* backing_file can either be relative, or absolute, or a protocol. If it is
2890 * relative, it must be relative to the chain. So, passing in bs->filename
2891 * from a BDS as backing_file should not be done, as that may be relative to
2892 * the CWD rather than the chain. */
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002893BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
2894 const char *backing_file)
2895{
Jeff Codyb1b1d782012-10-16 15:49:09 -04002896 char *filename_full = NULL;
2897 char *backing_file_full = NULL;
2898 char *filename_tmp = NULL;
2899 int is_protocol = 0;
2900 BlockDriverState *curr_bs = NULL;
2901 BlockDriverState *retval = NULL;
2902
2903 if (!bs || !bs->drv || !backing_file) {
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002904 return NULL;
2905 }
2906
Jeff Codyb1b1d782012-10-16 15:49:09 -04002907 filename_full = g_malloc(PATH_MAX);
2908 backing_file_full = g_malloc(PATH_MAX);
2909 filename_tmp = g_malloc(PATH_MAX);
2910
2911 is_protocol = path_has_protocol(backing_file);
2912
2913 for (curr_bs = bs; curr_bs->backing_hd; curr_bs = curr_bs->backing_hd) {
2914
2915 /* If either of the filename paths is actually a protocol, then
2916 * compare unmodified paths; otherwise make paths relative */
2917 if (is_protocol || path_has_protocol(curr_bs->backing_file)) {
2918 if (strcmp(backing_file, curr_bs->backing_file) == 0) {
2919 retval = curr_bs->backing_hd;
2920 break;
2921 }
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002922 } else {
Jeff Codyb1b1d782012-10-16 15:49:09 -04002923 /* If not an absolute filename path, make it relative to the current
2924 * image's filename path */
2925 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
2926 backing_file);
2927
2928 /* We are going to compare absolute pathnames */
2929 if (!realpath(filename_tmp, filename_full)) {
2930 continue;
2931 }
2932
2933 /* We need to make sure the backing filename we are comparing against
2934 * is relative to the current image filename (or absolute) */
2935 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
2936 curr_bs->backing_file);
2937
2938 if (!realpath(filename_tmp, backing_file_full)) {
2939 continue;
2940 }
2941
2942 if (strcmp(backing_file_full, filename_full) == 0) {
2943 retval = curr_bs->backing_hd;
2944 break;
2945 }
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002946 }
2947 }
2948
Jeff Codyb1b1d782012-10-16 15:49:09 -04002949 g_free(filename_full);
2950 g_free(backing_file_full);
2951 g_free(filename_tmp);
2952 return retval;
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002953}
2954
Benoît Canetf198fd12012-08-02 10:22:47 +02002955int bdrv_get_backing_file_depth(BlockDriverState *bs)
2956{
2957 if (!bs->drv) {
2958 return 0;
2959 }
2960
2961 if (!bs->backing_hd) {
2962 return 0;
2963 }
2964
2965 return 1 + bdrv_get_backing_file_depth(bs->backing_hd);
2966}
2967
bellardea2384d2004-08-01 21:59:26 +00002968void bdrv_init(void)
2969{
Anthony Liguori5efa9d52009-05-09 17:03:42 -05002970 module_call_init(MODULE_INIT_BLOCK);
bellardea2384d2004-08-01 21:59:26 +00002971}
pbrookce1a14d2006-08-07 02:38:06 +00002972
Markus Armbrustereb852012009-10-27 18:41:44 +01002973void bdrv_init_with_whitelist(void)
2974{
2975 use_bdrv_whitelist = 1;
2976 bdrv_init();
2977}
2978
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002979void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
Anthony Liguori0f154232011-11-14 15:09:45 -06002980{
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002981 Error *local_err = NULL;
2982 int ret;
2983
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002984 if (!bs->drv) {
2985 return;
Anthony Liguori0f154232011-11-14 15:09:45 -06002986 }
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002987
Alexey Kardashevskiy7ea2d262014-10-09 13:50:46 +11002988 if (!(bs->open_flags & BDRV_O_INCOMING)) {
2989 return;
2990 }
2991 bs->open_flags &= ~BDRV_O_INCOMING;
2992
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002993 if (bs->drv->bdrv_invalidate_cache) {
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002994 bs->drv->bdrv_invalidate_cache(bs, &local_err);
Kevin Wolf3456a8d2014-03-11 10:58:39 +01002995 } else if (bs->file) {
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01002996 bdrv_invalidate_cache(bs->file, &local_err);
2997 }
2998 if (local_err) {
2999 error_propagate(errp, local_err);
3000 return;
Kevin Wolf3456a8d2014-03-11 10:58:39 +01003001 }
3002
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003003 ret = refresh_total_sectors(bs, bs->total_sectors);
3004 if (ret < 0) {
3005 error_setg_errno(errp, -ret, "Could not refresh total sector count");
3006 return;
3007 }
Anthony Liguori0f154232011-11-14 15:09:45 -06003008}
3009
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003010void bdrv_invalidate_cache_all(Error **errp)
Anthony Liguori0f154232011-11-14 15:09:45 -06003011{
3012 BlockDriverState *bs;
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003013 Error *local_err = NULL;
Anthony Liguori0f154232011-11-14 15:09:45 -06003014
Benoît Canetdc364f42014-01-23 21:31:32 +01003015 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02003016 AioContext *aio_context = bdrv_get_aio_context(bs);
3017
3018 aio_context_acquire(aio_context);
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003019 bdrv_invalidate_cache(bs, &local_err);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02003020 aio_context_release(aio_context);
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003021 if (local_err) {
3022 error_propagate(errp, local_err);
3023 return;
3024 }
Anthony Liguori0f154232011-11-14 15:09:45 -06003025 }
3026}
3027
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003028/**************************************************************/
bellard19cb3732006-08-19 11:45:59 +00003029/* removable device support */
3030
3031/**
3032 * Return TRUE if the media is present
3033 */
3034int bdrv_is_inserted(BlockDriverState *bs)
3035{
3036 BlockDriver *drv = bs->drv;
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003037
bellard19cb3732006-08-19 11:45:59 +00003038 if (!drv)
3039 return 0;
3040 if (!drv->bdrv_is_inserted)
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003041 return 1;
3042 return drv->bdrv_is_inserted(bs);
bellard19cb3732006-08-19 11:45:59 +00003043}
3044
3045/**
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003046 * Return whether the media changed since the last call to this
3047 * function, or -ENOTSUP if we don't know. Most drivers don't know.
bellard19cb3732006-08-19 11:45:59 +00003048 */
3049int bdrv_media_changed(BlockDriverState *bs)
3050{
3051 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003052
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003053 if (drv && drv->bdrv_media_changed) {
3054 return drv->bdrv_media_changed(bs);
3055 }
3056 return -ENOTSUP;
bellard19cb3732006-08-19 11:45:59 +00003057}
3058
3059/**
3060 * If eject_flag is TRUE, eject the media. Otherwise, close the tray
3061 */
Luiz Capitulinof36f3942012-02-03 16:24:53 -02003062void bdrv_eject(BlockDriverState *bs, bool eject_flag)
bellard19cb3732006-08-19 11:45:59 +00003063{
3064 BlockDriver *drv = bs->drv;
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003065 const char *device_name;
bellard19cb3732006-08-19 11:45:59 +00003066
Markus Armbruster822e1cd2011-07-20 18:23:42 +02003067 if (drv && drv->bdrv_eject) {
3068 drv->bdrv_eject(bs, eject_flag);
bellard19cb3732006-08-19 11:45:59 +00003069 }
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02003070
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003071 device_name = bdrv_get_device_name(bs);
3072 if (device_name[0] != '\0') {
3073 qapi_event_send_device_tray_moved(device_name,
Wenchao Xiaa5ee7bd2014-06-18 08:43:44 +02003074 eject_flag, &error_abort);
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02003075 }
bellard19cb3732006-08-19 11:45:59 +00003076}
3077
bellard19cb3732006-08-19 11:45:59 +00003078/**
3079 * Lock or unlock the media (if it is locked, the user won't be able
3080 * to eject it manually).
3081 */
Markus Armbruster025e8492011-09-06 18:58:47 +02003082void bdrv_lock_medium(BlockDriverState *bs, bool locked)
bellard19cb3732006-08-19 11:45:59 +00003083{
3084 BlockDriver *drv = bs->drv;
3085
Markus Armbruster025e8492011-09-06 18:58:47 +02003086 trace_bdrv_lock_medium(bs, locked);
Stefan Hajnoczib8c6d092011-03-29 20:04:40 +01003087
Markus Armbruster025e8492011-09-06 18:58:47 +02003088 if (drv && drv->bdrv_lock_medium) {
3089 drv->bdrv_lock_medium(bs, locked);
bellard19cb3732006-08-19 11:45:59 +00003090 }
3091}
ths985a03b2007-12-24 16:10:43 +00003092
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01003093void bdrv_set_guest_block_size(BlockDriverState *bs, int align)
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003094{
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01003095 bs->guest_block_size = align;
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003096}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003097
Fam Zheng0db6e542015-04-17 19:49:50 -04003098BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs, const char *name)
3099{
3100 BdrvDirtyBitmap *bm;
3101
3102 assert(name);
3103 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
3104 if (bm->name && !strcmp(name, bm->name)) {
3105 return bm;
3106 }
3107 }
3108 return NULL;
3109}
3110
John Snow20dca812015-04-17 19:50:02 -04003111void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap)
Fam Zheng0db6e542015-04-17 19:49:50 -04003112{
John Snow9bd2b082015-04-17 19:49:57 -04003113 assert(!bdrv_dirty_bitmap_frozen(bitmap));
Fam Zheng0db6e542015-04-17 19:49:50 -04003114 g_free(bitmap->name);
3115 bitmap->name = NULL;
3116}
3117
3118BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
John Snow5fba6c02015-04-17 19:49:51 -04003119 uint32_t granularity,
Fam Zheng0db6e542015-04-17 19:49:50 -04003120 const char *name,
Fam Zhengb8afb522014-04-16 09:34:30 +08003121 Error **errp)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003122{
3123 int64_t bitmap_size;
Fam Zhenge4654d22013-11-13 18:29:43 +08003124 BdrvDirtyBitmap *bitmap;
John Snow5fba6c02015-04-17 19:49:51 -04003125 uint32_t sector_granularity;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003126
Paolo Bonzini50717e92013-01-21 17:09:45 +01003127 assert((granularity & (granularity - 1)) == 0);
3128
Fam Zheng0db6e542015-04-17 19:49:50 -04003129 if (name && bdrv_find_dirty_bitmap(bs, name)) {
3130 error_setg(errp, "Bitmap already exists: %s", name);
3131 return NULL;
3132 }
John Snow5fba6c02015-04-17 19:49:51 -04003133 sector_granularity = granularity >> BDRV_SECTOR_BITS;
3134 assert(sector_granularity);
Markus Armbruster57322b72014-06-26 13:23:22 +02003135 bitmap_size = bdrv_nb_sectors(bs);
Fam Zhengb8afb522014-04-16 09:34:30 +08003136 if (bitmap_size < 0) {
3137 error_setg_errno(errp, -bitmap_size, "could not get length of device");
3138 errno = -bitmap_size;
3139 return NULL;
3140 }
Markus Armbruster5839e532014-08-19 10:31:08 +02003141 bitmap = g_new0(BdrvDirtyBitmap, 1);
John Snow5fba6c02015-04-17 19:49:51 -04003142 bitmap->bitmap = hbitmap_alloc(bitmap_size, ctz32(sector_granularity));
John Snowe74e6b72015-04-17 19:49:59 -04003143 bitmap->size = bitmap_size;
Fam Zheng0db6e542015-04-17 19:49:50 -04003144 bitmap->name = g_strdup(name);
John Snowb8e6fb72015-04-17 19:49:56 -04003145 bitmap->disabled = false;
Fam Zhenge4654d22013-11-13 18:29:43 +08003146 QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
3147 return bitmap;
3148}
3149
John Snow9bd2b082015-04-17 19:49:57 -04003150bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
3151{
3152 return bitmap->successor;
3153}
3154
John Snowb8e6fb72015-04-17 19:49:56 -04003155bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
3156{
John Snow9bd2b082015-04-17 19:49:57 -04003157 return !(bitmap->disabled || bitmap->successor);
3158}
3159
John Snow9abe3bd2015-05-12 15:53:01 -04003160DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap)
3161{
3162 if (bdrv_dirty_bitmap_frozen(bitmap)) {
3163 return DIRTY_BITMAP_STATUS_FROZEN;
3164 } else if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3165 return DIRTY_BITMAP_STATUS_DISABLED;
3166 } else {
3167 return DIRTY_BITMAP_STATUS_ACTIVE;
3168 }
3169}
3170
John Snow9bd2b082015-04-17 19:49:57 -04003171/**
3172 * Create a successor bitmap destined to replace this bitmap after an operation.
3173 * Requires that the bitmap is not frozen and has no successor.
3174 */
3175int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
3176 BdrvDirtyBitmap *bitmap, Error **errp)
3177{
3178 uint64_t granularity;
3179 BdrvDirtyBitmap *child;
3180
3181 if (bdrv_dirty_bitmap_frozen(bitmap)) {
3182 error_setg(errp, "Cannot create a successor for a bitmap that is "
3183 "currently frozen");
3184 return -1;
3185 }
3186 assert(!bitmap->successor);
3187
3188 /* Create an anonymous successor */
3189 granularity = bdrv_dirty_bitmap_granularity(bitmap);
3190 child = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
3191 if (!child) {
3192 return -1;
3193 }
3194
3195 /* Successor will be on or off based on our current state. */
3196 child->disabled = bitmap->disabled;
3197
3198 /* Install the successor and freeze the parent */
3199 bitmap->successor = child;
3200 return 0;
3201}
3202
3203/**
3204 * For a bitmap with a successor, yield our name to the successor,
3205 * delete the old bitmap, and return a handle to the new bitmap.
3206 */
3207BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
3208 BdrvDirtyBitmap *bitmap,
3209 Error **errp)
3210{
3211 char *name;
3212 BdrvDirtyBitmap *successor = bitmap->successor;
3213
3214 if (successor == NULL) {
3215 error_setg(errp, "Cannot relinquish control if "
3216 "there's no successor present");
3217 return NULL;
3218 }
3219
3220 name = bitmap->name;
3221 bitmap->name = NULL;
3222 successor->name = name;
3223 bitmap->successor = NULL;
3224 bdrv_release_dirty_bitmap(bs, bitmap);
3225
3226 return successor;
3227}
3228
3229/**
3230 * In cases of failure where we can no longer safely delete the parent,
3231 * we may wish to re-join the parent and child/successor.
3232 * The merged parent will be un-frozen, but not explicitly re-enabled.
3233 */
3234BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
3235 BdrvDirtyBitmap *parent,
3236 Error **errp)
3237{
3238 BdrvDirtyBitmap *successor = parent->successor;
3239
3240 if (!successor) {
3241 error_setg(errp, "Cannot reclaim a successor when none is present");
3242 return NULL;
3243 }
3244
3245 if (!hbitmap_merge(parent->bitmap, successor->bitmap)) {
3246 error_setg(errp, "Merging of parent and successor bitmap failed");
3247 return NULL;
3248 }
3249 bdrv_release_dirty_bitmap(bs, successor);
3250 parent->successor = NULL;
3251
3252 return parent;
John Snowb8e6fb72015-04-17 19:49:56 -04003253}
3254
John Snowce1ffea2015-04-17 19:50:03 -04003255/**
3256 * Truncates _all_ bitmaps attached to a BDS.
3257 */
3258static void bdrv_dirty_bitmap_truncate(BlockDriverState *bs)
3259{
3260 BdrvDirtyBitmap *bitmap;
3261 uint64_t size = bdrv_nb_sectors(bs);
3262
3263 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
John Snow06207b02015-06-10 13:24:54 -04003264 assert(!bdrv_dirty_bitmap_frozen(bitmap));
John Snowce1ffea2015-04-17 19:50:03 -04003265 hbitmap_truncate(bitmap->bitmap, size);
John Snow5270b6a2015-06-08 16:49:15 -04003266 bitmap->size = size;
John Snowce1ffea2015-04-17 19:50:03 -04003267 }
3268}
3269
Fam Zhenge4654d22013-11-13 18:29:43 +08003270void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
3271{
3272 BdrvDirtyBitmap *bm, *next;
3273 QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
3274 if (bm == bitmap) {
John Snow9bd2b082015-04-17 19:49:57 -04003275 assert(!bdrv_dirty_bitmap_frozen(bm));
Fam Zhenge4654d22013-11-13 18:29:43 +08003276 QLIST_REMOVE(bitmap, list);
3277 hbitmap_free(bitmap->bitmap);
Fam Zheng0db6e542015-04-17 19:49:50 -04003278 g_free(bitmap->name);
Fam Zhenge4654d22013-11-13 18:29:43 +08003279 g_free(bitmap);
3280 return;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003281 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003282 }
3283}
3284
John Snowb8e6fb72015-04-17 19:49:56 -04003285void bdrv_disable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3286{
John Snow9bd2b082015-04-17 19:49:57 -04003287 assert(!bdrv_dirty_bitmap_frozen(bitmap));
John Snowb8e6fb72015-04-17 19:49:56 -04003288 bitmap->disabled = true;
3289}
3290
3291void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3292{
John Snow9bd2b082015-04-17 19:49:57 -04003293 assert(!bdrv_dirty_bitmap_frozen(bitmap));
John Snowb8e6fb72015-04-17 19:49:56 -04003294 bitmap->disabled = false;
3295}
3296
Fam Zheng21b56832013-11-13 18:29:44 +08003297BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
3298{
3299 BdrvDirtyBitmap *bm;
3300 BlockDirtyInfoList *list = NULL;
3301 BlockDirtyInfoList **plist = &list;
3302
3303 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
Markus Armbruster5839e532014-08-19 10:31:08 +02003304 BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
3305 BlockDirtyInfoList *entry = g_new0(BlockDirtyInfoList, 1);
John Snow20dca812015-04-17 19:50:02 -04003306 info->count = bdrv_get_dirty_count(bm);
John Snow592fdd02015-04-17 19:49:53 -04003307 info->granularity = bdrv_dirty_bitmap_granularity(bm);
Fam Zheng0db6e542015-04-17 19:49:50 -04003308 info->has_name = !!bm->name;
3309 info->name = g_strdup(bm->name);
John Snow9abe3bd2015-05-12 15:53:01 -04003310 info->status = bdrv_dirty_bitmap_status(bm);
Fam Zheng21b56832013-11-13 18:29:44 +08003311 entry->value = info;
3312 *plist = entry;
3313 plist = &entry->next;
3314 }
3315
3316 return list;
3317}
3318
Fam Zhenge4654d22013-11-13 18:29:43 +08003319int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003320{
Fam Zhenge4654d22013-11-13 18:29:43 +08003321 if (bitmap) {
3322 return hbitmap_get(bitmap->bitmap, sector);
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003323 } else {
3324 return 0;
3325 }
3326}
3327
John Snow341ebc22015-04-17 19:49:52 -04003328/**
3329 * Chooses a default granularity based on the existing cluster size,
3330 * but clamped between [4K, 64K]. Defaults to 64K in the case that there
3331 * is no cluster size information available.
3332 */
3333uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs)
3334{
3335 BlockDriverInfo bdi;
3336 uint32_t granularity;
3337
3338 if (bdrv_get_info(bs, &bdi) >= 0 && bdi.cluster_size > 0) {
3339 granularity = MAX(4096, bdi.cluster_size);
3340 granularity = MIN(65536, granularity);
3341 } else {
3342 granularity = 65536;
3343 }
3344
3345 return granularity;
3346}
3347
John Snow592fdd02015-04-17 19:49:53 -04003348uint32_t bdrv_dirty_bitmap_granularity(BdrvDirtyBitmap *bitmap)
3349{
3350 return BDRV_SECTOR_SIZE << hbitmap_granularity(bitmap->bitmap);
3351}
3352
John Snow20dca812015-04-17 19:50:02 -04003353void bdrv_dirty_iter_init(BdrvDirtyBitmap *bitmap, HBitmapIter *hbi)
Paolo Bonzini1755da12012-10-18 16:49:18 +02003354{
Fam Zhenge4654d22013-11-13 18:29:43 +08003355 hbitmap_iter_init(hbi, bitmap->bitmap, 0);
Paolo Bonzini1755da12012-10-18 16:49:18 +02003356}
3357
John Snow20dca812015-04-17 19:50:02 -04003358void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003359 int64_t cur_sector, int nr_sectors)
3360{
John Snowb8e6fb72015-04-17 19:49:56 -04003361 assert(bdrv_dirty_bitmap_enabled(bitmap));
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003362 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
3363}
3364
John Snow20dca812015-04-17 19:50:02 -04003365void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003366 int64_t cur_sector, int nr_sectors)
3367{
John Snowb8e6fb72015-04-17 19:49:56 -04003368 assert(bdrv_dirty_bitmap_enabled(bitmap));
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003369 hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
3370}
3371
John Snowe74e6b72015-04-17 19:49:59 -04003372void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3373{
3374 assert(bdrv_dirty_bitmap_enabled(bitmap));
3375 hbitmap_reset(bitmap->bitmap, 0, bitmap->size);
3376}
3377
Stefan Hajnoczie0c47b62015-04-28 14:27:50 +01003378void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,
3379 int nr_sectors)
Paolo Bonzini1755da12012-10-18 16:49:18 +02003380{
Fam Zhenge4654d22013-11-13 18:29:43 +08003381 BdrvDirtyBitmap *bitmap;
3382 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
John Snowb8e6fb72015-04-17 19:49:56 -04003383 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3384 continue;
3385 }
Fam Zhenge4654d22013-11-13 18:29:43 +08003386 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
Paolo Bonzini8f0720e2013-01-21 17:09:41 +01003387 }
Liran Schouraaa0eb72010-01-26 10:31:48 +02003388}
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003389
Stefan Hajnoczie0c47b62015-04-28 14:27:50 +01003390void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
3391 int nr_sectors)
Fam Zhenge4654d22013-11-13 18:29:43 +08003392{
3393 BdrvDirtyBitmap *bitmap;
3394 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
John Snowb8e6fb72015-04-17 19:49:56 -04003395 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3396 continue;
3397 }
Fam Zhenge4654d22013-11-13 18:29:43 +08003398 hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
3399 }
3400}
3401
John Snowd58d8452015-04-17 19:49:58 -04003402/**
3403 * Advance an HBitmapIter to an arbitrary offset.
3404 */
3405void bdrv_set_dirty_iter(HBitmapIter *hbi, int64_t offset)
3406{
3407 assert(hbi->hb);
3408 hbitmap_iter_init(hbi, hbi->hb, offset);
3409}
3410
John Snow20dca812015-04-17 19:50:02 -04003411int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
Fam Zhenge4654d22013-11-13 18:29:43 +08003412{
3413 return hbitmap_count(bitmap->bitmap);
3414}
3415
Fam Zheng9fcb0252013-08-23 09:14:46 +08003416/* Get a reference to bs */
3417void bdrv_ref(BlockDriverState *bs)
3418{
3419 bs->refcnt++;
3420}
3421
3422/* Release a previously grabbed reference to bs.
3423 * If after releasing, reference count is zero, the BlockDriverState is
3424 * deleted. */
3425void bdrv_unref(BlockDriverState *bs)
3426{
Jeff Cody9a4d5ca2014-07-23 17:22:57 -04003427 if (!bs) {
3428 return;
3429 }
Fam Zheng9fcb0252013-08-23 09:14:46 +08003430 assert(bs->refcnt > 0);
3431 if (--bs->refcnt == 0) {
3432 bdrv_delete(bs);
3433 }
3434}
3435
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003436struct BdrvOpBlocker {
3437 Error *reason;
3438 QLIST_ENTRY(BdrvOpBlocker) list;
3439};
3440
3441bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
3442{
3443 BdrvOpBlocker *blocker;
3444 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3445 if (!QLIST_EMPTY(&bs->op_blockers[op])) {
3446 blocker = QLIST_FIRST(&bs->op_blockers[op]);
3447 if (errp) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03003448 error_setg(errp, "Node '%s' is busy: %s",
3449 bdrv_get_device_or_node_name(bs),
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003450 error_get_pretty(blocker->reason));
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003451 }
3452 return true;
3453 }
3454 return false;
3455}
3456
3457void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason)
3458{
3459 BdrvOpBlocker *blocker;
3460 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3461
Markus Armbruster5839e532014-08-19 10:31:08 +02003462 blocker = g_new0(BdrvOpBlocker, 1);
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003463 blocker->reason = reason;
3464 QLIST_INSERT_HEAD(&bs->op_blockers[op], blocker, list);
3465}
3466
3467void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason)
3468{
3469 BdrvOpBlocker *blocker, *next;
3470 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3471 QLIST_FOREACH_SAFE(blocker, &bs->op_blockers[op], list, next) {
3472 if (blocker->reason == reason) {
3473 QLIST_REMOVE(blocker, list);
3474 g_free(blocker);
3475 }
3476 }
3477}
3478
3479void bdrv_op_block_all(BlockDriverState *bs, Error *reason)
3480{
3481 int i;
3482 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3483 bdrv_op_block(bs, i, reason);
3484 }
3485}
3486
3487void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason)
3488{
3489 int i;
3490 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3491 bdrv_op_unblock(bs, i, reason);
3492 }
3493}
3494
3495bool bdrv_op_blocker_is_empty(BlockDriverState *bs)
3496{
3497 int i;
3498
3499 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3500 if (!QLIST_EMPTY(&bs->op_blockers[i])) {
3501 return false;
3502 }
3503 }
3504 return true;
3505}
3506
Luiz Capitulino28a72822011-09-26 17:43:50 -03003507void bdrv_iostatus_enable(BlockDriverState *bs)
3508{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003509 bs->iostatus_enabled = true;
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003510 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003511}
3512
3513/* The I/O status is only enabled if the drive explicitly
3514 * enables it _and_ the VM is configured to stop on errors */
3515bool bdrv_iostatus_is_enabled(const BlockDriverState *bs)
3516{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003517 return (bs->iostatus_enabled &&
Paolo Bonzini92aa5c62012-09-28 17:22:55 +02003518 (bs->on_write_error == BLOCKDEV_ON_ERROR_ENOSPC ||
3519 bs->on_write_error == BLOCKDEV_ON_ERROR_STOP ||
3520 bs->on_read_error == BLOCKDEV_ON_ERROR_STOP));
Luiz Capitulino28a72822011-09-26 17:43:50 -03003521}
3522
3523void bdrv_iostatus_disable(BlockDriverState *bs)
3524{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003525 bs->iostatus_enabled = false;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003526}
3527
3528void bdrv_iostatus_reset(BlockDriverState *bs)
3529{
3530 if (bdrv_iostatus_is_enabled(bs)) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003531 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Paolo Bonzini3bd293c2012-10-18 16:49:27 +02003532 if (bs->job) {
3533 block_job_iostatus_reset(bs->job);
3534 }
Luiz Capitulino28a72822011-09-26 17:43:50 -03003535 }
3536}
3537
Luiz Capitulino28a72822011-09-26 17:43:50 -03003538void bdrv_iostatus_set_err(BlockDriverState *bs, int error)
3539{
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003540 assert(bdrv_iostatus_is_enabled(bs));
3541 if (bs->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003542 bs->iostatus = error == ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOSPACE :
3543 BLOCK_DEVICE_IO_STATUS_FAILED;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003544 }
3545}
3546
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003547void bdrv_img_create(const char *filename, const char *fmt,
3548 const char *base_filename, const char *base_fmt,
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003549 char *options, uint64_t img_size, int flags,
3550 Error **errp, bool quiet)
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003551{
Chunyan Liu83d05212014-06-05 17:20:51 +08003552 QemuOptsList *create_opts = NULL;
3553 QemuOpts *opts = NULL;
3554 const char *backing_fmt, *backing_file;
3555 int64_t size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003556 BlockDriver *drv, *proto_drv;
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003557 BlockDriver *backing_drv = NULL;
Max Reitzcc84d902013-09-06 17:14:26 +02003558 Error *local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003559 int ret = 0;
3560
3561 /* Find driver and parse its options */
3562 drv = bdrv_find_format(fmt);
3563 if (!drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003564 error_setg(errp, "Unknown file format '%s'", fmt);
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003565 return;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003566 }
3567
Max Reitzb65a5e12015-02-05 13:58:12 -05003568 proto_drv = bdrv_find_protocol(filename, true, errp);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003569 if (!proto_drv) {
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003570 return;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003571 }
3572
Max Reitzc6149722014-12-02 18:32:45 +01003573 if (!drv->create_opts) {
3574 error_setg(errp, "Format driver '%s' does not support image creation",
3575 drv->format_name);
3576 return;
3577 }
3578
3579 if (!proto_drv->create_opts) {
3580 error_setg(errp, "Protocol driver '%s' does not support image creation",
3581 proto_drv->format_name);
3582 return;
3583 }
3584
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003585 create_opts = qemu_opts_append(create_opts, drv->create_opts);
3586 create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003587
3588 /* Create parameter list with default values */
Chunyan Liu83d05212014-06-05 17:20:51 +08003589 opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
Markus Armbruster39101f22015-02-12 16:46:36 +01003590 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003591
3592 /* Parse -o options */
3593 if (options) {
Markus Armbrusterdc523cd342015-02-12 18:37:11 +01003594 qemu_opts_do_parse(opts, options, NULL, &local_err);
3595 if (local_err) {
3596 error_report_err(local_err);
3597 local_err = NULL;
Chunyan Liu83d05212014-06-05 17:20:51 +08003598 error_setg(errp, "Invalid options for file format '%s'", fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003599 goto out;
3600 }
3601 }
3602
3603 if (base_filename) {
Markus Armbrusterf43e47d2015-02-12 17:52:20 +01003604 qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
Markus Armbruster6be41942015-02-12 17:49:02 +01003605 if (local_err) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003606 error_setg(errp, "Backing file not supported for file format '%s'",
3607 fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003608 goto out;
3609 }
3610 }
3611
3612 if (base_fmt) {
Markus Armbrusterf43e47d2015-02-12 17:52:20 +01003613 qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
Markus Armbruster6be41942015-02-12 17:49:02 +01003614 if (local_err) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003615 error_setg(errp, "Backing file format not supported for file "
3616 "format '%s'", fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003617 goto out;
3618 }
3619 }
3620
Chunyan Liu83d05212014-06-05 17:20:51 +08003621 backing_file = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
3622 if (backing_file) {
3623 if (!strcmp(filename, backing_file)) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003624 error_setg(errp, "Error: Trying to create an image with the "
3625 "same filename as the backing file");
Jes Sorensen792da932010-12-16 13:52:17 +01003626 goto out;
3627 }
3628 }
3629
Chunyan Liu83d05212014-06-05 17:20:51 +08003630 backing_fmt = qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT);
3631 if (backing_fmt) {
3632 backing_drv = bdrv_find_format(backing_fmt);
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003633 if (!backing_drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003634 error_setg(errp, "Unknown backing file format '%s'",
Chunyan Liu83d05212014-06-05 17:20:51 +08003635 backing_fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003636 goto out;
3637 }
3638 }
3639
3640 // The size for the image must always be specified, with one exception:
3641 // If we are using a backing file, we can obtain the size from there
Chunyan Liu83d05212014-06-05 17:20:51 +08003642 size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, 0);
3643 if (size == -1) {
3644 if (backing_file) {
Max Reitz66f6b812013-12-03 14:57:52 +01003645 BlockDriverState *bs;
Max Reitz29168012014-11-26 17:20:27 +01003646 char *full_backing = g_new0(char, PATH_MAX);
Markus Armbruster52bf1e72014-06-26 13:23:25 +02003647 int64_t size;
Paolo Bonzini63090da2012-04-12 14:01:03 +02003648 int back_flags;
3649
Max Reitz29168012014-11-26 17:20:27 +01003650 bdrv_get_full_backing_filename_from_filename(filename, backing_file,
3651 full_backing, PATH_MAX,
3652 &local_err);
3653 if (local_err) {
3654 g_free(full_backing);
3655 goto out;
3656 }
3657
Paolo Bonzini63090da2012-04-12 14:01:03 +02003658 /* backing files always opened read-only */
3659 back_flags =
3660 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003661
Max Reitzf67503e2014-02-18 18:33:05 +01003662 bs = NULL;
Max Reitz29168012014-11-26 17:20:27 +01003663 ret = bdrv_open(&bs, full_backing, NULL, NULL, back_flags,
Max Reitzcc84d902013-09-06 17:14:26 +02003664 backing_drv, &local_err);
Max Reitz29168012014-11-26 17:20:27 +01003665 g_free(full_backing);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003666 if (ret < 0) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003667 goto out;
3668 }
Markus Armbruster52bf1e72014-06-26 13:23:25 +02003669 size = bdrv_getlength(bs);
3670 if (size < 0) {
3671 error_setg_errno(errp, -size, "Could not get size of '%s'",
3672 backing_file);
3673 bdrv_unref(bs);
3674 goto out;
3675 }
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003676
Markus Armbruster39101f22015-02-12 16:46:36 +01003677 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, size, &error_abort);
Max Reitz66f6b812013-12-03 14:57:52 +01003678
3679 bdrv_unref(bs);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003680 } else {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003681 error_setg(errp, "Image creation needs a size parameter");
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003682 goto out;
3683 }
3684 }
3685
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003686 if (!quiet) {
Fam Zheng43c5d8f2014-12-09 15:38:04 +08003687 printf("Formatting '%s', fmt=%s", filename, fmt);
3688 qemu_opts_print(opts, " ");
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003689 puts("");
3690 }
Chunyan Liu83d05212014-06-05 17:20:51 +08003691
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003692 ret = bdrv_create(drv, filename, opts, &local_err);
Chunyan Liu83d05212014-06-05 17:20:51 +08003693
Max Reitzcc84d902013-09-06 17:14:26 +02003694 if (ret == -EFBIG) {
3695 /* This is generally a better message than whatever the driver would
3696 * deliver (especially because of the cluster_size_hint), since that
3697 * is most probably not much different from "image too large". */
3698 const char *cluster_size_hint = "";
Chunyan Liu83d05212014-06-05 17:20:51 +08003699 if (qemu_opt_get_size(opts, BLOCK_OPT_CLUSTER_SIZE, 0)) {
Max Reitzcc84d902013-09-06 17:14:26 +02003700 cluster_size_hint = " (try using a larger cluster size)";
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003701 }
Max Reitzcc84d902013-09-06 17:14:26 +02003702 error_setg(errp, "The image size is too large for file format '%s'"
3703 "%s", fmt, cluster_size_hint);
3704 error_free(local_err);
3705 local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003706 }
3707
3708out:
Chunyan Liu83d05212014-06-05 17:20:51 +08003709 qemu_opts_del(opts);
3710 qemu_opts_free(create_opts);
Markus Armbruster84d18f02014-01-30 15:07:28 +01003711 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +02003712 error_propagate(errp, local_err);
3713 }
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003714}
Stefan Hajnoczi85d126f2013-03-07 13:41:48 +01003715
3716AioContext *bdrv_get_aio_context(BlockDriverState *bs)
3717{
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003718 return bs->aio_context;
3719}
3720
3721void bdrv_detach_aio_context(BlockDriverState *bs)
3722{
Max Reitz33384422014-06-20 21:57:33 +02003723 BdrvAioNotifier *baf;
3724
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003725 if (!bs->drv) {
3726 return;
3727 }
3728
Max Reitz33384422014-06-20 21:57:33 +02003729 QLIST_FOREACH(baf, &bs->aio_notifiers, list) {
3730 baf->detach_aio_context(baf->opaque);
3731 }
3732
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003733 if (bs->io_limits_enabled) {
3734 throttle_detach_aio_context(&bs->throttle_state);
3735 }
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003736 if (bs->drv->bdrv_detach_aio_context) {
3737 bs->drv->bdrv_detach_aio_context(bs);
3738 }
3739 if (bs->file) {
3740 bdrv_detach_aio_context(bs->file);
3741 }
3742 if (bs->backing_hd) {
3743 bdrv_detach_aio_context(bs->backing_hd);
3744 }
3745
3746 bs->aio_context = NULL;
3747}
3748
3749void bdrv_attach_aio_context(BlockDriverState *bs,
3750 AioContext *new_context)
3751{
Max Reitz33384422014-06-20 21:57:33 +02003752 BdrvAioNotifier *ban;
3753
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003754 if (!bs->drv) {
3755 return;
3756 }
3757
3758 bs->aio_context = new_context;
3759
3760 if (bs->backing_hd) {
3761 bdrv_attach_aio_context(bs->backing_hd, new_context);
3762 }
3763 if (bs->file) {
3764 bdrv_attach_aio_context(bs->file, new_context);
3765 }
3766 if (bs->drv->bdrv_attach_aio_context) {
3767 bs->drv->bdrv_attach_aio_context(bs, new_context);
3768 }
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003769 if (bs->io_limits_enabled) {
3770 throttle_attach_aio_context(&bs->throttle_state, new_context);
3771 }
Max Reitz33384422014-06-20 21:57:33 +02003772
3773 QLIST_FOREACH(ban, &bs->aio_notifiers, list) {
3774 ban->attached_aio_context(new_context, ban->opaque);
3775 }
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003776}
3777
3778void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
3779{
3780 bdrv_drain_all(); /* ensure there are no in-flight requests */
3781
3782 bdrv_detach_aio_context(bs);
3783
3784 /* This function executes in the old AioContext so acquire the new one in
3785 * case it runs in a different thread.
3786 */
3787 aio_context_acquire(new_context);
3788 bdrv_attach_aio_context(bs, new_context);
3789 aio_context_release(new_context);
Stefan Hajnoczi85d126f2013-03-07 13:41:48 +01003790}
Stefan Hajnoczid616b222013-06-24 17:13:10 +02003791
Max Reitz33384422014-06-20 21:57:33 +02003792void bdrv_add_aio_context_notifier(BlockDriverState *bs,
3793 void (*attached_aio_context)(AioContext *new_context, void *opaque),
3794 void (*detach_aio_context)(void *opaque), void *opaque)
3795{
3796 BdrvAioNotifier *ban = g_new(BdrvAioNotifier, 1);
3797 *ban = (BdrvAioNotifier){
3798 .attached_aio_context = attached_aio_context,
3799 .detach_aio_context = detach_aio_context,
3800 .opaque = opaque
3801 };
3802
3803 QLIST_INSERT_HEAD(&bs->aio_notifiers, ban, list);
3804}
3805
3806void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
3807 void (*attached_aio_context)(AioContext *,
3808 void *),
3809 void (*detach_aio_context)(void *),
3810 void *opaque)
3811{
3812 BdrvAioNotifier *ban, *ban_next;
3813
3814 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
3815 if (ban->attached_aio_context == attached_aio_context &&
3816 ban->detach_aio_context == detach_aio_context &&
3817 ban->opaque == opaque)
3818 {
3819 QLIST_REMOVE(ban, list);
3820 g_free(ban);
3821
3822 return;
3823 }
3824 }
3825
3826 abort();
3827}
3828
Max Reitz77485432014-10-27 11:12:50 +01003829int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
3830 BlockDriverAmendStatusCB *status_cb)
Max Reitz6f176b42013-09-03 10:09:50 +02003831{
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003832 if (!bs->drv->bdrv_amend_options) {
Max Reitz6f176b42013-09-03 10:09:50 +02003833 return -ENOTSUP;
3834 }
Max Reitz77485432014-10-27 11:12:50 +01003835 return bs->drv->bdrv_amend_options(bs, opts, status_cb);
Max Reitz6f176b42013-09-03 10:09:50 +02003836}
Benoît Canetf6186f42013-10-02 14:33:48 +02003837
Benoît Canetb5042a32014-03-03 19:11:34 +01003838/* This function will be called by the bdrv_recurse_is_first_non_filter method
3839 * of block filter and by bdrv_is_first_non_filter.
3840 * It is used to test if the given bs is the candidate or recurse more in the
3841 * node graph.
Benoît Canet212a5a82014-01-23 21:31:36 +01003842 */
Benoît Canet212a5a82014-01-23 21:31:36 +01003843bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
3844 BlockDriverState *candidate)
Benoît Canetf6186f42013-10-02 14:33:48 +02003845{
Benoît Canetb5042a32014-03-03 19:11:34 +01003846 /* return false if basic checks fails */
3847 if (!bs || !bs->drv) {
3848 return false;
3849 }
3850
3851 /* the code reached a non block filter driver -> check if the bs is
3852 * the same as the candidate. It's the recursion termination condition.
3853 */
3854 if (!bs->drv->is_filter) {
3855 return bs == candidate;
3856 }
3857 /* Down this path the driver is a block filter driver */
3858
3859 /* If the block filter recursion method is defined use it to recurse down
3860 * the node graph.
3861 */
3862 if (bs->drv->bdrv_recurse_is_first_non_filter) {
Benoît Canet212a5a82014-01-23 21:31:36 +01003863 return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate);
3864 }
3865
Benoît Canetb5042a32014-03-03 19:11:34 +01003866 /* the driver is a block filter but don't allow to recurse -> return false
3867 */
3868 return false;
Benoît Canet212a5a82014-01-23 21:31:36 +01003869}
3870
3871/* This function checks if the candidate is the first non filter bs down it's
3872 * bs chain. Since we don't have pointers to parents it explore all bs chains
3873 * from the top. Some filters can choose not to pass down the recursion.
3874 */
3875bool bdrv_is_first_non_filter(BlockDriverState *candidate)
3876{
3877 BlockDriverState *bs;
3878
3879 /* walk down the bs forest recursively */
3880 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
3881 bool perm;
3882
Benoît Canetb5042a32014-03-03 19:11:34 +01003883 /* try to recurse in this top level bs */
Kevin Wolfe6dc8a12014-02-04 11:45:31 +01003884 perm = bdrv_recurse_is_first_non_filter(bs, candidate);
Benoît Canet212a5a82014-01-23 21:31:36 +01003885
3886 /* candidate is the first non filter */
3887 if (perm) {
3888 return true;
3889 }
3890 }
3891
3892 return false;
Benoît Canetf6186f42013-10-02 14:33:48 +02003893}
Benoît Canet09158f02014-06-27 18:25:25 +02003894
3895BlockDriverState *check_to_replace_node(const char *node_name, Error **errp)
3896{
3897 BlockDriverState *to_replace_bs = bdrv_find_node(node_name);
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003898 AioContext *aio_context;
3899
Benoît Canet09158f02014-06-27 18:25:25 +02003900 if (!to_replace_bs) {
3901 error_setg(errp, "Node name '%s' not found", node_name);
3902 return NULL;
3903 }
3904
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003905 aio_context = bdrv_get_aio_context(to_replace_bs);
3906 aio_context_acquire(aio_context);
3907
Benoît Canet09158f02014-06-27 18:25:25 +02003908 if (bdrv_op_is_blocked(to_replace_bs, BLOCK_OP_TYPE_REPLACE, errp)) {
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003909 to_replace_bs = NULL;
3910 goto out;
Benoît Canet09158f02014-06-27 18:25:25 +02003911 }
3912
3913 /* We don't want arbitrary node of the BDS chain to be replaced only the top
3914 * most non filter in order to prevent data corruption.
3915 * Another benefit is that this tests exclude backing files which are
3916 * blocked by the backing blockers.
3917 */
3918 if (!bdrv_is_first_non_filter(to_replace_bs)) {
3919 error_setg(errp, "Only top most non filter can be replaced");
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003920 to_replace_bs = NULL;
3921 goto out;
Benoît Canet09158f02014-06-27 18:25:25 +02003922 }
3923
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003924out:
3925 aio_context_release(aio_context);
Benoît Canet09158f02014-06-27 18:25:25 +02003926 return to_replace_bs;
3927}
Ming Lei448ad912014-07-04 18:04:33 +08003928
Max Reitz91af7012014-07-18 20:24:56 +02003929static bool append_open_options(QDict *d, BlockDriverState *bs)
3930{
3931 const QDictEntry *entry;
3932 bool found_any = false;
3933
3934 for (entry = qdict_first(bs->options); entry;
3935 entry = qdict_next(bs->options, entry))
3936 {
3937 /* Only take options for this level and exclude all non-driver-specific
3938 * options */
3939 if (!strchr(qdict_entry_key(entry), '.') &&
3940 strcmp(qdict_entry_key(entry), "node-name"))
3941 {
3942 qobject_incref(qdict_entry_value(entry));
3943 qdict_put_obj(d, qdict_entry_key(entry), qdict_entry_value(entry));
3944 found_any = true;
3945 }
3946 }
3947
3948 return found_any;
3949}
3950
3951/* Updates the following BDS fields:
3952 * - exact_filename: A filename which may be used for opening a block device
3953 * which (mostly) equals the given BDS (even without any
3954 * other options; so reading and writing must return the same
3955 * results, but caching etc. may be different)
3956 * - full_open_options: Options which, when given when opening a block device
3957 * (without a filename), result in a BDS (mostly)
3958 * equalling the given one
3959 * - filename: If exact_filename is set, it is copied here. Otherwise,
3960 * full_open_options is converted to a JSON object, prefixed with
3961 * "json:" (for use through the JSON pseudo protocol) and put here.
3962 */
3963void bdrv_refresh_filename(BlockDriverState *bs)
3964{
3965 BlockDriver *drv = bs->drv;
3966 QDict *opts;
3967
3968 if (!drv) {
3969 return;
3970 }
3971
3972 /* This BDS's file name will most probably depend on its file's name, so
3973 * refresh that first */
3974 if (bs->file) {
3975 bdrv_refresh_filename(bs->file);
3976 }
3977
3978 if (drv->bdrv_refresh_filename) {
3979 /* Obsolete information is of no use here, so drop the old file name
3980 * information before refreshing it */
3981 bs->exact_filename[0] = '\0';
3982 if (bs->full_open_options) {
3983 QDECREF(bs->full_open_options);
3984 bs->full_open_options = NULL;
3985 }
3986
3987 drv->bdrv_refresh_filename(bs);
3988 } else if (bs->file) {
3989 /* Try to reconstruct valid information from the underlying file */
3990 bool has_open_options;
3991
3992 bs->exact_filename[0] = '\0';
3993 if (bs->full_open_options) {
3994 QDECREF(bs->full_open_options);
3995 bs->full_open_options = NULL;
3996 }
3997
3998 opts = qdict_new();
3999 has_open_options = append_open_options(opts, bs);
4000
4001 /* If no specific options have been given for this BDS, the filename of
4002 * the underlying file should suffice for this one as well */
4003 if (bs->file->exact_filename[0] && !has_open_options) {
4004 strcpy(bs->exact_filename, bs->file->exact_filename);
4005 }
4006 /* Reconstructing the full options QDict is simple for most format block
4007 * drivers, as long as the full options are known for the underlying
4008 * file BDS. The full options QDict of that file BDS should somehow
4009 * contain a representation of the filename, therefore the following
4010 * suffices without querying the (exact_)filename of this BDS. */
4011 if (bs->file->full_open_options) {
4012 qdict_put_obj(opts, "driver",
4013 QOBJECT(qstring_from_str(drv->format_name)));
4014 QINCREF(bs->file->full_open_options);
4015 qdict_put_obj(opts, "file", QOBJECT(bs->file->full_open_options));
4016
4017 bs->full_open_options = opts;
4018 } else {
4019 QDECREF(opts);
4020 }
4021 } else if (!bs->full_open_options && qdict_size(bs->options)) {
4022 /* There is no underlying file BDS (at least referenced by BDS.file),
4023 * so the full options QDict should be equal to the options given
4024 * specifically for this block device when it was opened (plus the
4025 * driver specification).
4026 * Because those options don't change, there is no need to update
4027 * full_open_options when it's already set. */
4028
4029 opts = qdict_new();
4030 append_open_options(opts, bs);
4031 qdict_put_obj(opts, "driver",
4032 QOBJECT(qstring_from_str(drv->format_name)));
4033
4034 if (bs->exact_filename[0]) {
4035 /* This may not work for all block protocol drivers (some may
4036 * require this filename to be parsed), but we have to find some
4037 * default solution here, so just include it. If some block driver
4038 * does not support pure options without any filename at all or
4039 * needs some special format of the options QDict, it needs to
4040 * implement the driver-specific bdrv_refresh_filename() function.
4041 */
4042 qdict_put_obj(opts, "filename",
4043 QOBJECT(qstring_from_str(bs->exact_filename)));
4044 }
4045
4046 bs->full_open_options = opts;
4047 }
4048
4049 if (bs->exact_filename[0]) {
4050 pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename);
4051 } else if (bs->full_open_options) {
4052 QString *json = qobject_to_json(QOBJECT(bs->full_open_options));
4053 snprintf(bs->filename, sizeof(bs->filename), "json:%s",
4054 qstring_get_str(json));
4055 QDECREF(json);
4056 }
4057}
Benoît Canet5366d0c2014-09-05 15:46:18 +02004058
4059/* This accessor function purpose is to allow the device models to access the
4060 * BlockAcctStats structure embedded inside a BlockDriverState without being
4061 * aware of the BlockDriverState structure layout.
4062 * It will go away when the BlockAcctStats structure will be moved inside
4063 * the device models.
4064 */
4065BlockAcctStats *bdrv_get_stats(BlockDriverState *bs)
4066{
4067 return &bs->stats;
4068}