blob: 3c04446f7fd0e3c69b86e7e8682b5b9976c2b775 [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
Kevin Wolff3930ed2015-04-08 13:43:47 +020082static int bdrv_open_inherit(BlockDriverState **pbs, const char *filename,
83 const char *reference, QDict *options, int flags,
84 BlockDriverState *parent,
85 const BdrvChildRole *child_role,
86 BlockDriver *drv, Error **errp);
87
John Snowce1ffea2015-04-17 19:50:03 -040088static void bdrv_dirty_bitmap_truncate(BlockDriverState *bs);
Markus Armbrustereb852012009-10-27 18:41:44 +010089/* If non-zero, use only whitelisted block drivers */
90static int use_bdrv_whitelist;
91
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +000092#ifdef _WIN32
93static int is_windows_drive_prefix(const char *filename)
94{
95 return (((filename[0] >= 'a' && filename[0] <= 'z') ||
96 (filename[0] >= 'A' && filename[0] <= 'Z')) &&
97 filename[1] == ':');
98}
99
100int is_windows_drive(const char *filename)
101{
102 if (is_windows_drive_prefix(filename) &&
103 filename[2] == '\0')
104 return 1;
105 if (strstart(filename, "\\\\.\\", NULL) ||
106 strstart(filename, "//./", NULL))
107 return 1;
108 return 0;
109}
110#endif
111
Kevin Wolf339064d2013-11-28 10:23:32 +0100112size_t bdrv_opt_mem_align(BlockDriverState *bs)
113{
114 if (!bs || !bs->drv) {
Denis V. Lunev459b4e62015-05-12 17:30:56 +0300115 /* page size or 4k (hdd sector size) should be on the safe side */
116 return MAX(4096, getpagesize());
Kevin Wolf339064d2013-11-28 10:23:32 +0100117 }
118
119 return bs->bl.opt_mem_alignment;
120}
121
Denis V. Lunev4196d2f2015-05-12 17:30:55 +0300122size_t bdrv_min_mem_align(BlockDriverState *bs)
123{
124 if (!bs || !bs->drv) {
Denis V. Lunev459b4e62015-05-12 17:30:56 +0300125 /* page size or 4k (hdd sector size) should be on the safe side */
126 return MAX(4096, getpagesize());
Denis V. Lunev4196d2f2015-05-12 17:30:55 +0300127 }
128
129 return bs->bl.min_mem_alignment;
130}
131
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000132/* check if the path starts with "<protocol>:" */
Max Reitz5c984152014-12-03 14:57:22 +0100133int path_has_protocol(const char *path)
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000134{
Paolo Bonzini947995c2012-05-08 16:51:48 +0200135 const char *p;
136
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000137#ifdef _WIN32
138 if (is_windows_drive(path) ||
139 is_windows_drive_prefix(path)) {
140 return 0;
141 }
Paolo Bonzini947995c2012-05-08 16:51:48 +0200142 p = path + strcspn(path, ":/\\");
143#else
144 p = path + strcspn(path, ":/");
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000145#endif
146
Paolo Bonzini947995c2012-05-08 16:51:48 +0200147 return *p == ':';
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000148}
149
bellard83f64092006-08-01 16:21:11 +0000150int path_is_absolute(const char *path)
151{
bellard21664422007-01-07 18:22:37 +0000152#ifdef _WIN32
153 /* specific case for names like: "\\.\d:" */
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200154 if (is_windows_drive(path) || is_windows_drive_prefix(path)) {
bellard21664422007-01-07 18:22:37 +0000155 return 1;
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200156 }
157 return (*path == '/' || *path == '\\');
bellard3b9f94e2007-01-07 17:27:07 +0000158#else
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200159 return (*path == '/');
bellard3b9f94e2007-01-07 17:27:07 +0000160#endif
bellard83f64092006-08-01 16:21:11 +0000161}
162
163/* if filename is absolute, just copy it to dest. Otherwise, build a
164 path to it by considering it is relative to base_path. URL are
165 supported. */
166void path_combine(char *dest, int dest_size,
167 const char *base_path,
168 const char *filename)
169{
170 const char *p, *p1;
171 int len;
172
173 if (dest_size <= 0)
174 return;
175 if (path_is_absolute(filename)) {
176 pstrcpy(dest, dest_size, filename);
177 } else {
178 p = strchr(base_path, ':');
179 if (p)
180 p++;
181 else
182 p = base_path;
bellard3b9f94e2007-01-07 17:27:07 +0000183 p1 = strrchr(base_path, '/');
184#ifdef _WIN32
185 {
186 const char *p2;
187 p2 = strrchr(base_path, '\\');
188 if (!p1 || p2 > p1)
189 p1 = p2;
190 }
191#endif
bellard83f64092006-08-01 16:21:11 +0000192 if (p1)
193 p1++;
194 else
195 p1 = base_path;
196 if (p1 > p)
197 p = p1;
198 len = p - base_path;
199 if (len > dest_size - 1)
200 len = dest_size - 1;
201 memcpy(dest, base_path, len);
202 dest[len] = '\0';
203 pstrcat(dest, dest_size, filename);
204 }
205}
206
Max Reitz0a828552014-11-26 17:20:25 +0100207void bdrv_get_full_backing_filename_from_filename(const char *backed,
208 const char *backing,
Max Reitz9f074292014-11-26 17:20:26 +0100209 char *dest, size_t sz,
210 Error **errp)
Max Reitz0a828552014-11-26 17:20:25 +0100211{
Max Reitz9f074292014-11-26 17:20:26 +0100212 if (backing[0] == '\0' || path_has_protocol(backing) ||
213 path_is_absolute(backing))
214 {
Max Reitz0a828552014-11-26 17:20:25 +0100215 pstrcpy(dest, sz, backing);
Max Reitz9f074292014-11-26 17:20:26 +0100216 } else if (backed[0] == '\0' || strstart(backed, "json:", NULL)) {
217 error_setg(errp, "Cannot use relative backing file names for '%s'",
218 backed);
Max Reitz0a828552014-11-26 17:20:25 +0100219 } else {
220 path_combine(dest, sz, backed, backing);
221 }
222}
223
Max Reitz9f074292014-11-26 17:20:26 +0100224void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz,
225 Error **errp)
Paolo Bonzinidc5a1372012-05-08 16:51:50 +0200226{
Max Reitz9f074292014-11-26 17:20:26 +0100227 char *backed = bs->exact_filename[0] ? bs->exact_filename : bs->filename;
228
229 bdrv_get_full_backing_filename_from_filename(backed, bs->backing_file,
230 dest, sz, errp);
Paolo Bonzinidc5a1372012-05-08 16:51:50 +0200231}
232
Stefan Hajnoczi0eb72172015-04-28 14:27:51 +0100233void bdrv_register(BlockDriver *bdrv)
234{
235 bdrv_setup_io_funcs(bdrv);
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +0200236
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100237 QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
bellardea2384d2004-08-01 21:59:26 +0000238}
bellardb3380822004-03-14 21:38:54 +0000239
Markus Armbruster7f06d472014-10-07 13:59:12 +0200240BlockDriverState *bdrv_new_root(void)
bellardfc01f7e2003-06-30 10:03:06 +0000241{
Markus Armbruster7f06d472014-10-07 13:59:12 +0200242 BlockDriverState *bs = bdrv_new();
Markus Armbrustere4e99862014-10-07 13:59:03 +0200243
Markus Armbrustere4e99862014-10-07 13:59:03 +0200244 QTAILQ_INSERT_TAIL(&bdrv_states, bs, device_list);
Markus Armbrustere4e99862014-10-07 13:59:03 +0200245 return bs;
246}
247
248BlockDriverState *bdrv_new(void)
249{
250 BlockDriverState *bs;
251 int i;
252
Markus Armbruster5839e532014-08-19 10:31:08 +0200253 bs = g_new0(BlockDriverState, 1);
Fam Zhenge4654d22013-11-13 18:29:43 +0800254 QLIST_INIT(&bs->dirty_bitmaps);
Fam Zhengfbe40ff2014-05-23 21:29:42 +0800255 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
256 QLIST_INIT(&bs->op_blockers[i]);
257 }
Luiz Capitulino28a72822011-09-26 17:43:50 -0300258 bdrv_iostatus_disable(bs);
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200259 notifier_list_init(&bs->close_notifiers);
Stefan Hajnoczid616b222013-06-24 17:13:10 +0200260 notifier_with_return_list_init(&bs->before_write_notifiers);
Benoît Canetcc0681c2013-09-02 14:14:39 +0200261 qemu_co_queue_init(&bs->throttled_reqs[0]);
262 qemu_co_queue_init(&bs->throttled_reqs[1]);
Fam Zheng9fcb0252013-08-23 09:14:46 +0800263 bs->refcnt = 1;
Stefan Hajnoczidcd04222014-05-08 16:34:37 +0200264 bs->aio_context = qemu_get_aio_context();
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200265
bellardb3380822004-03-14 21:38:54 +0000266 return bs;
267}
268
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200269void bdrv_add_close_notifier(BlockDriverState *bs, Notifier *notify)
270{
271 notifier_list_add(&bs->close_notifiers, notify);
272}
273
bellardea2384d2004-08-01 21:59:26 +0000274BlockDriver *bdrv_find_format(const char *format_name)
275{
276 BlockDriver *drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100277 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
278 if (!strcmp(drv1->format_name, format_name)) {
bellardea2384d2004-08-01 21:59:26 +0000279 return drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100280 }
bellardea2384d2004-08-01 21:59:26 +0000281 }
282 return NULL;
283}
284
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800285static int bdrv_is_whitelisted(BlockDriver *drv, bool read_only)
Markus Armbrustereb852012009-10-27 18:41:44 +0100286{
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800287 static const char *whitelist_rw[] = {
288 CONFIG_BDRV_RW_WHITELIST
289 };
290 static const char *whitelist_ro[] = {
291 CONFIG_BDRV_RO_WHITELIST
Markus Armbrustereb852012009-10-27 18:41:44 +0100292 };
293 const char **p;
294
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800295 if (!whitelist_rw[0] && !whitelist_ro[0]) {
Markus Armbrustereb852012009-10-27 18:41:44 +0100296 return 1; /* no whitelist, anything goes */
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800297 }
Markus Armbrustereb852012009-10-27 18:41:44 +0100298
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800299 for (p = whitelist_rw; *p; p++) {
Markus Armbrustereb852012009-10-27 18:41:44 +0100300 if (!strcmp(drv->format_name, *p)) {
301 return 1;
302 }
303 }
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800304 if (read_only) {
305 for (p = whitelist_ro; *p; p++) {
306 if (!strcmp(drv->format_name, *p)) {
307 return 1;
308 }
309 }
310 }
Markus Armbrustereb852012009-10-27 18:41:44 +0100311 return 0;
312}
313
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800314BlockDriver *bdrv_find_whitelisted_format(const char *format_name,
315 bool read_only)
Markus Armbrustereb852012009-10-27 18:41:44 +0100316{
317 BlockDriver *drv = bdrv_find_format(format_name);
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800318 return drv && bdrv_is_whitelisted(drv, read_only) ? drv : NULL;
Markus Armbrustereb852012009-10-27 18:41:44 +0100319}
320
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800321typedef struct CreateCo {
322 BlockDriver *drv;
323 char *filename;
Chunyan Liu83d05212014-06-05 17:20:51 +0800324 QemuOpts *opts;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800325 int ret;
Max Reitzcc84d902013-09-06 17:14:26 +0200326 Error *err;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800327} CreateCo;
328
329static void coroutine_fn bdrv_create_co_entry(void *opaque)
330{
Max Reitzcc84d902013-09-06 17:14:26 +0200331 Error *local_err = NULL;
332 int ret;
333
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800334 CreateCo *cco = opaque;
335 assert(cco->drv);
336
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800337 ret = cco->drv->bdrv_create(cco->filename, cco->opts, &local_err);
Markus Armbruster84d18f02014-01-30 15:07:28 +0100338 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200339 error_propagate(&cco->err, local_err);
340 }
341 cco->ret = ret;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800342}
343
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200344int bdrv_create(BlockDriver *drv, const char* filename,
Chunyan Liu83d05212014-06-05 17:20:51 +0800345 QemuOpts *opts, Error **errp)
bellardea2384d2004-08-01 21:59:26 +0000346{
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800347 int ret;
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200348
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800349 Coroutine *co;
350 CreateCo cco = {
351 .drv = drv,
352 .filename = g_strdup(filename),
Chunyan Liu83d05212014-06-05 17:20:51 +0800353 .opts = opts,
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800354 .ret = NOT_DONE,
Max Reitzcc84d902013-09-06 17:14:26 +0200355 .err = NULL,
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800356 };
357
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800358 if (!drv->bdrv_create) {
Max Reitzcc84d902013-09-06 17:14:26 +0200359 error_setg(errp, "Driver '%s' does not support image creation", drv->format_name);
Luiz Capitulino80168bf2012-10-17 16:45:25 -0300360 ret = -ENOTSUP;
361 goto out;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800362 }
363
364 if (qemu_in_coroutine()) {
365 /* Fast-path if already in coroutine context */
366 bdrv_create_co_entry(&cco);
367 } else {
368 co = qemu_coroutine_create(bdrv_create_co_entry);
369 qemu_coroutine_enter(co, &cco);
370 while (cco.ret == NOT_DONE) {
Paolo Bonzinib47ec2c2014-07-07 15:18:01 +0200371 aio_poll(qemu_get_aio_context(), true);
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800372 }
373 }
374
375 ret = cco.ret;
Max Reitzcc84d902013-09-06 17:14:26 +0200376 if (ret < 0) {
Markus Armbruster84d18f02014-01-30 15:07:28 +0100377 if (cco.err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200378 error_propagate(errp, cco.err);
379 } else {
380 error_setg_errno(errp, -ret, "Could not create image");
381 }
382 }
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800383
Luiz Capitulino80168bf2012-10-17 16:45:25 -0300384out:
385 g_free(cco.filename);
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800386 return ret;
bellardea2384d2004-08-01 21:59:26 +0000387}
388
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800389int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200390{
391 BlockDriver *drv;
Max Reitzcc84d902013-09-06 17:14:26 +0200392 Error *local_err = NULL;
393 int ret;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200394
Max Reitzb65a5e12015-02-05 13:58:12 -0500395 drv = bdrv_find_protocol(filename, true, errp);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200396 if (drv == NULL) {
Stefan Hajnoczi16905d72010-11-30 15:14:14 +0000397 return -ENOENT;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200398 }
399
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800400 ret = bdrv_create(drv, filename, opts, &local_err);
Markus Armbruster84d18f02014-01-30 15:07:28 +0100401 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200402 error_propagate(errp, local_err);
403 }
404 return ret;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200405}
406
Ekaterina Tumanova892b7de2015-02-16 12:47:54 +0100407/**
408 * Try to get @bs's logical and physical block size.
409 * On success, store them in @bsz struct and return 0.
410 * On failure return -errno.
411 * @bs must not be empty.
412 */
413int bdrv_probe_blocksizes(BlockDriverState *bs, BlockSizes *bsz)
414{
415 BlockDriver *drv = bs->drv;
416
417 if (drv && drv->bdrv_probe_blocksizes) {
418 return drv->bdrv_probe_blocksizes(bs, bsz);
419 }
420
421 return -ENOTSUP;
422}
423
424/**
425 * Try to get @bs's geometry (cyls, heads, sectors).
426 * On success, store them in @geo struct and return 0.
427 * On failure return -errno.
428 * @bs must not be empty.
429 */
430int bdrv_probe_geometry(BlockDriverState *bs, HDGeometry *geo)
431{
432 BlockDriver *drv = bs->drv;
433
434 if (drv && drv->bdrv_probe_geometry) {
435 return drv->bdrv_probe_geometry(bs, geo);
436 }
437
438 return -ENOTSUP;
439}
440
Jim Meyeringeba25052012-05-28 09:27:54 +0200441/*
442 * Create a uniquely-named empty temporary file.
443 * Return 0 upon success, otherwise a negative errno value.
444 */
445int get_tmp_filename(char *filename, int size)
446{
bellardd5249392004-08-03 21:14:23 +0000447#ifdef _WIN32
bellard3b9f94e2007-01-07 17:27:07 +0000448 char temp_dir[MAX_PATH];
Jim Meyeringeba25052012-05-28 09:27:54 +0200449 /* GetTempFileName requires that its output buffer (4th param)
450 have length MAX_PATH or greater. */
451 assert(size >= MAX_PATH);
452 return (GetTempPath(MAX_PATH, temp_dir)
453 && GetTempFileName(temp_dir, "qem", 0, filename)
454 ? 0 : -GetLastError());
bellardd5249392004-08-03 21:14:23 +0000455#else
bellardea2384d2004-08-01 21:59:26 +0000456 int fd;
blueswir17ccfb2e2008-09-14 06:45:34 +0000457 const char *tmpdir;
aurel320badc1e2008-03-10 00:05:34 +0000458 tmpdir = getenv("TMPDIR");
Amit Shah69bef792014-02-26 15:12:37 +0530459 if (!tmpdir) {
460 tmpdir = "/var/tmp";
461 }
Jim Meyeringeba25052012-05-28 09:27:54 +0200462 if (snprintf(filename, size, "%s/vl.XXXXXX", tmpdir) >= size) {
463 return -EOVERFLOW;
464 }
bellardea2384d2004-08-01 21:59:26 +0000465 fd = mkstemp(filename);
Dunrong Huangfe235a02012-09-05 21:26:22 +0800466 if (fd < 0) {
467 return -errno;
468 }
469 if (close(fd) != 0) {
470 unlink(filename);
Jim Meyeringeba25052012-05-28 09:27:54 +0200471 return -errno;
472 }
473 return 0;
bellardd5249392004-08-03 21:14:23 +0000474#endif
Jim Meyeringeba25052012-05-28 09:27:54 +0200475}
bellardea2384d2004-08-01 21:59:26 +0000476
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200477/*
478 * Detect host devices. By convention, /dev/cdrom[N] is always
479 * recognized as a host CDROM.
480 */
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200481static BlockDriver *find_hdev_driver(const char *filename)
482{
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200483 int score_max = 0, score;
484 BlockDriver *drv = NULL, *d;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200485
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100486 QLIST_FOREACH(d, &bdrv_drivers, list) {
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200487 if (d->bdrv_probe_device) {
488 score = d->bdrv_probe_device(filename);
489 if (score > score_max) {
490 score_max = score;
491 drv = d;
492 }
493 }
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200494 }
495
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200496 return drv;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200497}
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200498
Kevin Wolf98289622013-07-10 15:47:39 +0200499BlockDriver *bdrv_find_protocol(const char *filename,
Max Reitzb65a5e12015-02-05 13:58:12 -0500500 bool allow_protocol_prefix,
501 Error **errp)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200502{
503 BlockDriver *drv1;
504 char protocol[128];
505 int len;
506 const char *p;
507
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200508 /* TODO Drivers without bdrv_file_open must be specified explicitly */
509
Christoph Hellwig39508e72010-06-23 12:25:17 +0200510 /*
511 * XXX(hch): we really should not let host device detection
512 * override an explicit protocol specification, but moving this
513 * later breaks access to device names with colons in them.
514 * Thanks to the brain-dead persistent naming schemes on udev-
515 * based Linux systems those actually are quite common.
516 */
517 drv1 = find_hdev_driver(filename);
518 if (drv1) {
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200519 return drv1;
520 }
Christoph Hellwig39508e72010-06-23 12:25:17 +0200521
Kevin Wolf98289622013-07-10 15:47:39 +0200522 if (!path_has_protocol(filename) || !allow_protocol_prefix) {
Max Reitzef810432014-12-02 18:32:42 +0100523 return &bdrv_file;
Christoph Hellwig39508e72010-06-23 12:25:17 +0200524 }
Kevin Wolf98289622013-07-10 15:47:39 +0200525
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000526 p = strchr(filename, ':');
527 assert(p != NULL);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200528 len = p - filename;
529 if (len > sizeof(protocol) - 1)
530 len = sizeof(protocol) - 1;
531 memcpy(protocol, filename, len);
532 protocol[len] = '\0';
533 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
534 if (drv1->protocol_name &&
535 !strcmp(drv1->protocol_name, protocol)) {
536 return drv1;
537 }
538 }
Max Reitzb65a5e12015-02-05 13:58:12 -0500539
540 error_setg(errp, "Unknown protocol '%s'", protocol);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200541 return NULL;
542}
543
Markus Armbrusterc6684242014-11-20 16:27:10 +0100544/*
545 * Guess image format by probing its contents.
546 * This is not a good idea when your image is raw (CVE-2008-2004), but
547 * we do it anyway for backward compatibility.
548 *
549 * @buf contains the image's first @buf_size bytes.
Kevin Wolf7cddd372014-11-20 16:27:11 +0100550 * @buf_size is the buffer size in bytes (generally BLOCK_PROBE_BUF_SIZE,
551 * but can be smaller if the image file is smaller)
Markus Armbrusterc6684242014-11-20 16:27:10 +0100552 * @filename is its filename.
553 *
554 * For all block drivers, call the bdrv_probe() method to get its
555 * probing score.
556 * Return the first block driver with the highest probing score.
557 */
Kevin Wolf38f3ef52014-11-20 16:27:12 +0100558BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size,
559 const char *filename)
Markus Armbrusterc6684242014-11-20 16:27:10 +0100560{
561 int score_max = 0, score;
562 BlockDriver *drv = NULL, *d;
563
564 QLIST_FOREACH(d, &bdrv_drivers, list) {
565 if (d->bdrv_probe) {
566 score = d->bdrv_probe(buf, buf_size, filename);
567 if (score > score_max) {
568 score_max = score;
569 drv = d;
570 }
571 }
572 }
573
574 return drv;
575}
576
Kevin Wolff500a6d2012-11-12 17:35:27 +0100577static int find_image_format(BlockDriverState *bs, const char *filename,
Max Reitz34b5d2c2013-09-05 14:45:29 +0200578 BlockDriver **pdrv, Error **errp)
bellardea2384d2004-08-01 21:59:26 +0000579{
Markus Armbrusterc6684242014-11-20 16:27:10 +0100580 BlockDriver *drv;
Kevin Wolf7cddd372014-11-20 16:27:11 +0100581 uint8_t buf[BLOCK_PROBE_BUF_SIZE];
Kevin Wolff500a6d2012-11-12 17:35:27 +0100582 int ret = 0;
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700583
Kevin Wolf08a00552010-06-01 18:37:31 +0200584 /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
Paolo Bonzini8e895592013-01-10 15:39:27 +0100585 if (bs->sg || !bdrv_is_inserted(bs) || bdrv_getlength(bs) == 0) {
Max Reitzef810432014-12-02 18:32:42 +0100586 *pdrv = &bdrv_raw;
Stefan Weilc98ac352010-07-21 21:51:51 +0200587 return ret;
Nicholas A. Bellinger1a396852010-05-27 08:56:28 -0700588 }
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700589
bellard83f64092006-08-01 16:21:11 +0000590 ret = bdrv_pread(bs, 0, buf, sizeof(buf));
bellard83f64092006-08-01 16:21:11 +0000591 if (ret < 0) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200592 error_setg_errno(errp, -ret, "Could not read image for determining its "
593 "format");
Stefan Weilc98ac352010-07-21 21:51:51 +0200594 *pdrv = NULL;
595 return ret;
bellard83f64092006-08-01 16:21:11 +0000596 }
597
Markus Armbrusterc6684242014-11-20 16:27:10 +0100598 drv = bdrv_probe_all(buf, ret, filename);
Stefan Weilc98ac352010-07-21 21:51:51 +0200599 if (!drv) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200600 error_setg(errp, "Could not determine image format: No compatible "
601 "driver found");
Stefan Weilc98ac352010-07-21 21:51:51 +0200602 ret = -ENOENT;
603 }
604 *pdrv = drv;
605 return ret;
bellardea2384d2004-08-01 21:59:26 +0000606}
607
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100608/**
609 * Set the current 'total_sectors' value
Markus Armbruster65a9bb22014-06-26 13:23:17 +0200610 * Return 0 on success, -errno on error.
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100611 */
612static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
613{
614 BlockDriver *drv = bs->drv;
615
Nicholas Bellinger396759a2010-05-17 09:46:04 -0700616 /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
617 if (bs->sg)
618 return 0;
619
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100620 /* query actual device if possible, otherwise just trust the hint */
621 if (drv->bdrv_getlength) {
622 int64_t length = drv->bdrv_getlength(bs);
623 if (length < 0) {
624 return length;
625 }
Fam Zheng7e382002013-11-06 19:48:06 +0800626 hint = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE);
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100627 }
628
629 bs->total_sectors = hint;
630 return 0;
631}
632
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100633/**
Paolo Bonzini9e8f1832013-02-08 14:06:11 +0100634 * Set open flags for a given discard mode
635 *
636 * Return 0 on success, -1 if the discard mode was invalid.
637 */
638int bdrv_parse_discard_flags(const char *mode, int *flags)
639{
640 *flags &= ~BDRV_O_UNMAP;
641
642 if (!strcmp(mode, "off") || !strcmp(mode, "ignore")) {
643 /* do nothing */
644 } else if (!strcmp(mode, "on") || !strcmp(mode, "unmap")) {
645 *flags |= BDRV_O_UNMAP;
646 } else {
647 return -1;
648 }
649
650 return 0;
651}
652
653/**
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100654 * Set open flags for a given cache mode
655 *
656 * Return 0 on success, -1 if the cache mode was invalid.
657 */
658int bdrv_parse_cache_flags(const char *mode, int *flags)
659{
660 *flags &= ~BDRV_O_CACHE_MASK;
661
662 if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
663 *flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
Stefan Hajnoczi92196b22011-08-04 12:26:52 +0100664 } else if (!strcmp(mode, "directsync")) {
665 *flags |= BDRV_O_NOCACHE;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100666 } else if (!strcmp(mode, "writeback")) {
667 *flags |= BDRV_O_CACHE_WB;
668 } else if (!strcmp(mode, "unsafe")) {
669 *flags |= BDRV_O_CACHE_WB;
670 *flags |= BDRV_O_NO_FLUSH;
671 } else if (!strcmp(mode, "writethrough")) {
672 /* this is the default */
673 } else {
674 return -1;
675 }
676
677 return 0;
678}
679
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200680/*
Kevin Wolfb1e6fc02014-05-06 12:11:42 +0200681 * Returns the flags that a temporary snapshot should get, based on the
682 * originally requested flags (the originally requested image will have flags
683 * like a backing file)
684 */
685static int bdrv_temp_snapshot_flags(int flags)
686{
687 return (flags & ~BDRV_O_SNAPSHOT) | BDRV_O_TEMPORARY;
688}
689
690/*
Kevin Wolff3930ed2015-04-08 13:43:47 +0200691 * Returns the flags that bs->file should get if a protocol driver is expected,
692 * based on the given flags for the parent BDS
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200693 */
694static int bdrv_inherited_flags(int flags)
695{
696 /* Enable protocol handling, disable format probing for bs->file */
697 flags |= BDRV_O_PROTOCOL;
698
699 /* Our block drivers take care to send flushes and respect unmap policy,
700 * so we can enable both unconditionally on lower layers. */
701 flags |= BDRV_O_CACHE_WB | BDRV_O_UNMAP;
702
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200703 /* Clear flags that only apply to the top layer */
Kevin Wolf5669b442014-04-11 21:36:45 +0200704 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ);
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200705
706 return flags;
707}
708
Kevin Wolff3930ed2015-04-08 13:43:47 +0200709const BdrvChildRole child_file = {
710 .inherit_flags = bdrv_inherited_flags,
711};
712
713/*
714 * Returns the flags that bs->file should get if the use of formats (and not
715 * only protocols) is permitted for it, based on the given flags for the parent
716 * BDS
717 */
718static int bdrv_inherited_fmt_flags(int parent_flags)
719{
720 int flags = child_file.inherit_flags(parent_flags);
721 return flags & ~BDRV_O_PROTOCOL;
722}
723
724const BdrvChildRole child_format = {
725 .inherit_flags = bdrv_inherited_fmt_flags,
726};
727
Kevin Wolf317fc442014-04-25 13:27:34 +0200728/*
729 * Returns the flags that bs->backing_hd should get, based on the given flags
730 * for the parent BDS
731 */
732static int bdrv_backing_flags(int flags)
733{
734 /* backing files always opened read-only */
735 flags &= ~(BDRV_O_RDWR | BDRV_O_COPY_ON_READ);
736
737 /* snapshot=on is handled on the top layer */
Kevin Wolf8bfea152014-04-11 19:16:36 +0200738 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_TEMPORARY);
Kevin Wolf317fc442014-04-25 13:27:34 +0200739
740 return flags;
741}
742
Kevin Wolff3930ed2015-04-08 13:43:47 +0200743static const BdrvChildRole child_backing = {
744 .inherit_flags = bdrv_backing_flags,
745};
746
Kevin Wolf7b272452012-11-12 17:05:39 +0100747static int bdrv_open_flags(BlockDriverState *bs, int flags)
748{
749 int open_flags = flags | BDRV_O_CACHE_WB;
750
751 /*
752 * Clear flags that are internal to the block layer before opening the
753 * image.
754 */
Kevin Wolf20cca272014-06-04 14:33:27 +0200755 open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_PROTOCOL);
Kevin Wolf7b272452012-11-12 17:05:39 +0100756
757 /*
758 * Snapshots should be writable.
759 */
Kevin Wolf8bfea152014-04-11 19:16:36 +0200760 if (flags & BDRV_O_TEMPORARY) {
Kevin Wolf7b272452012-11-12 17:05:39 +0100761 open_flags |= BDRV_O_RDWR;
762 }
763
764 return open_flags;
765}
766
Kevin Wolf636ea372014-01-24 14:11:52 +0100767static void bdrv_assign_node_name(BlockDriverState *bs,
768 const char *node_name,
769 Error **errp)
Benoît Canet6913c0c2014-01-23 21:31:33 +0100770{
771 if (!node_name) {
Kevin Wolf636ea372014-01-24 14:11:52 +0100772 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100773 }
774
Kevin Wolf9aebf3b2014-09-25 09:54:02 +0200775 /* Check for empty string or invalid characters */
Markus Armbrusterf5bebbb2014-09-30 13:59:30 +0200776 if (!id_wellformed(node_name)) {
Kevin Wolf9aebf3b2014-09-25 09:54:02 +0200777 error_setg(errp, "Invalid node name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100778 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100779 }
780
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100781 /* takes care of avoiding namespaces collisions */
Markus Armbruster7f06d472014-10-07 13:59:12 +0200782 if (blk_by_name(node_name)) {
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100783 error_setg(errp, "node-name=%s is conflicting with a device id",
784 node_name);
Kevin Wolf636ea372014-01-24 14:11:52 +0100785 return;
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100786 }
787
Benoît Canet6913c0c2014-01-23 21:31:33 +0100788 /* takes care of avoiding duplicates node names */
789 if (bdrv_find_node(node_name)) {
790 error_setg(errp, "Duplicate node name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100791 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100792 }
793
794 /* copy node name into the bs and insert it into the graph list */
795 pstrcpy(bs->node_name, sizeof(bs->node_name), node_name);
796 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs, node_list);
Benoît Canet6913c0c2014-01-23 21:31:33 +0100797}
798
Kevin Wolf18edf282015-04-07 17:12:56 +0200799static QemuOptsList bdrv_runtime_opts = {
800 .name = "bdrv_common",
801 .head = QTAILQ_HEAD_INITIALIZER(bdrv_runtime_opts.head),
802 .desc = {
803 {
804 .name = "node-name",
805 .type = QEMU_OPT_STRING,
806 .help = "Node name of the block device node",
807 },
808 { /* end of list */ }
809 },
810};
811
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200812/*
Kevin Wolf57915332010-04-14 15:24:50 +0200813 * Common part for opening disk images and files
Kevin Wolfb6ad4912013-03-15 10:35:04 +0100814 *
815 * Removes all processed options from *options.
Kevin Wolf57915332010-04-14 15:24:50 +0200816 */
Kevin Wolff500a6d2012-11-12 17:35:27 +0100817static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
Max Reitz34b5d2c2013-09-05 14:45:29 +0200818 QDict *options, int flags, BlockDriver *drv, Error **errp)
Kevin Wolf57915332010-04-14 15:24:50 +0200819{
820 int ret, open_flags;
Kevin Wolf035fccd2013-04-09 14:34:19 +0200821 const char *filename;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100822 const char *node_name = NULL;
Kevin Wolf18edf282015-04-07 17:12:56 +0200823 QemuOpts *opts;
Max Reitz34b5d2c2013-09-05 14:45:29 +0200824 Error *local_err = NULL;
Kevin Wolf57915332010-04-14 15:24:50 +0200825
826 assert(drv != NULL);
Paolo Bonzini64058752012-05-08 16:51:49 +0200827 assert(bs->file == NULL);
Kevin Wolf707ff822013-03-06 12:20:31 +0100828 assert(options != NULL && bs->options != options);
Kevin Wolf57915332010-04-14 15:24:50 +0200829
Kevin Wolf45673672013-04-22 17:48:40 +0200830 if (file != NULL) {
831 filename = file->filename;
832 } else {
833 filename = qdict_get_try_str(options, "filename");
834 }
835
Kevin Wolf765003d2014-02-03 14:49:42 +0100836 if (drv->bdrv_needs_filename && !filename) {
837 error_setg(errp, "The '%s' block driver requires a file name",
838 drv->format_name);
839 return -EINVAL;
840 }
841
Kevin Wolf45673672013-04-22 17:48:40 +0200842 trace_bdrv_open_common(bs, filename ?: "", flags, drv->format_name);
Stefan Hajnoczi28dcee12011-09-22 20:14:12 +0100843
Kevin Wolf18edf282015-04-07 17:12:56 +0200844 opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
845 qemu_opts_absorb_qdict(opts, options, &local_err);
846 if (local_err) {
847 error_propagate(errp, local_err);
848 ret = -EINVAL;
849 goto fail_opts;
850 }
851
852 node_name = qemu_opt_get(opts, "node-name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100853 bdrv_assign_node_name(bs, node_name, &local_err);
Markus Armbruster0fb63952014-04-25 16:50:31 +0200854 if (local_err) {
Kevin Wolf636ea372014-01-24 14:11:52 +0100855 error_propagate(errp, local_err);
Kevin Wolf18edf282015-04-07 17:12:56 +0200856 ret = -EINVAL;
857 goto fail_opts;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100858 }
Benoît Canet6913c0c2014-01-23 21:31:33 +0100859
Paolo Bonzini1b7fd722011-11-29 11:35:47 +0100860 bs->guest_block_size = 512;
Paolo Bonzinic25f53b2011-11-29 12:42:20 +0100861 bs->request_alignment = 512;
Asias He0d51b4d2013-08-22 15:24:14 +0800862 bs->zero_beyond_eof = true;
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800863 open_flags = bdrv_open_flags(bs, flags);
864 bs->read_only = !(open_flags & BDRV_O_RDWR);
865
866 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, bs->read_only)) {
Kevin Wolf8f94a6e2013-10-10 11:45:55 +0200867 error_setg(errp,
868 !bs->read_only && bdrv_is_whitelisted(drv, true)
869 ? "Driver '%s' can only be used for read-only devices"
870 : "Driver '%s' is not whitelisted",
871 drv->format_name);
Kevin Wolf18edf282015-04-07 17:12:56 +0200872 ret = -ENOTSUP;
873 goto fail_opts;
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800874 }
Kevin Wolf57915332010-04-14 15:24:50 +0200875
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000876 assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */
Kevin Wolf0ebd24e2013-09-19 15:12:18 +0200877 if (flags & BDRV_O_COPY_ON_READ) {
878 if (!bs->read_only) {
879 bdrv_enable_copy_on_read(bs);
880 } else {
881 error_setg(errp, "Can't use copy-on-read on read-only device");
Kevin Wolf18edf282015-04-07 17:12:56 +0200882 ret = -EINVAL;
883 goto fail_opts;
Kevin Wolf0ebd24e2013-09-19 15:12:18 +0200884 }
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000885 }
886
Kevin Wolfc2ad1b02013-03-18 16:40:51 +0100887 if (filename != NULL) {
888 pstrcpy(bs->filename, sizeof(bs->filename), filename);
889 } else {
890 bs->filename[0] = '\0';
891 }
Max Reitz91af7012014-07-18 20:24:56 +0200892 pstrcpy(bs->exact_filename, sizeof(bs->exact_filename), bs->filename);
Kevin Wolf57915332010-04-14 15:24:50 +0200893
Kevin Wolf57915332010-04-14 15:24:50 +0200894 bs->drv = drv;
Anthony Liguori7267c092011-08-20 22:09:37 -0500895 bs->opaque = g_malloc0(drv->instance_size);
Kevin Wolf57915332010-04-14 15:24:50 +0200896
Stefan Hajnoczi03f541b2011-10-27 10:54:28 +0100897 bs->enable_write_cache = !!(flags & BDRV_O_CACHE_WB);
Stefan Hajnoczie7c63792011-10-27 10:54:27 +0100898
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200899 /* Open the image, either directly or using a protocol */
900 if (drv->bdrv_file_open) {
Kevin Wolf5d186eb2013-03-27 17:28:18 +0100901 assert(file == NULL);
Benoît Canet030be322013-09-24 17:07:04 +0200902 assert(!drv->bdrv_needs_filename || filename != NULL);
Max Reitz34b5d2c2013-09-05 14:45:29 +0200903 ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
Kevin Wolff500a6d2012-11-12 17:35:27 +0100904 } else {
Kevin Wolf2af5ef72013-04-09 13:19:18 +0200905 if (file == NULL) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200906 error_setg(errp, "Can't use '%s' as a block driver for the "
907 "protocol level", drv->format_name);
Kevin Wolf2af5ef72013-04-09 13:19:18 +0200908 ret = -EINVAL;
909 goto free_and_fail;
910 }
Kevin Wolff500a6d2012-11-12 17:35:27 +0100911 bs->file = file;
Max Reitz34b5d2c2013-09-05 14:45:29 +0200912 ret = drv->bdrv_open(bs, options, open_flags, &local_err);
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200913 }
914
Kevin Wolf57915332010-04-14 15:24:50 +0200915 if (ret < 0) {
Markus Armbruster84d18f02014-01-30 15:07:28 +0100916 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200917 error_propagate(errp, local_err);
Dunrong Huang2fa9aa52013-09-24 18:14:01 +0800918 } else if (bs->filename[0]) {
919 error_setg_errno(errp, -ret, "Could not open '%s'", bs->filename);
Max Reitz34b5d2c2013-09-05 14:45:29 +0200920 } else {
921 error_setg_errno(errp, -ret, "Could not open image");
922 }
Kevin Wolf57915332010-04-14 15:24:50 +0200923 goto free_and_fail;
924 }
925
Markus Armbrustera1f688f2015-03-13 21:09:40 +0100926 if (bs->encrypted) {
927 error_report("Encrypted images are deprecated");
928 error_printf("Support for them will be removed in a future release.\n"
929 "You can use 'qemu-img convert' to convert your image"
930 " to an unencrypted one.\n");
931 }
932
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100933 ret = refresh_total_sectors(bs, bs->total_sectors);
934 if (ret < 0) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200935 error_setg_errno(errp, -ret, "Could not refresh total sector count");
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100936 goto free_and_fail;
Kevin Wolf57915332010-04-14 15:24:50 +0200937 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100938
Kevin Wolf3baca892014-07-16 17:48:16 +0200939 bdrv_refresh_limits(bs, &local_err);
940 if (local_err) {
941 error_propagate(errp, local_err);
942 ret = -EINVAL;
943 goto free_and_fail;
944 }
945
Paolo Bonzinic25f53b2011-11-29 12:42:20 +0100946 assert(bdrv_opt_mem_align(bs) != 0);
Denis V. Lunev4196d2f2015-05-12 17:30:55 +0300947 assert(bdrv_min_mem_align(bs) != 0);
Kevin Wolf47ea2de2014-03-05 15:49:55 +0100948 assert((bs->request_alignment != 0) || bs->sg);
Kevin Wolf18edf282015-04-07 17:12:56 +0200949
950 qemu_opts_del(opts);
Kevin Wolf57915332010-04-14 15:24:50 +0200951 return 0;
952
953free_and_fail:
Kevin Wolff500a6d2012-11-12 17:35:27 +0100954 bs->file = NULL;
Anthony Liguori7267c092011-08-20 22:09:37 -0500955 g_free(bs->opaque);
Kevin Wolf57915332010-04-14 15:24:50 +0200956 bs->opaque = NULL;
957 bs->drv = NULL;
Kevin Wolf18edf282015-04-07 17:12:56 +0200958fail_opts:
959 qemu_opts_del(opts);
Kevin Wolf57915332010-04-14 15:24:50 +0200960 return ret;
961}
962
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200963static QDict *parse_json_filename(const char *filename, Error **errp)
964{
965 QObject *options_obj;
966 QDict *options;
967 int ret;
968
969 ret = strstart(filename, "json:", &filename);
970 assert(ret);
971
972 options_obj = qobject_from_json(filename);
973 if (!options_obj) {
974 error_setg(errp, "Could not parse the JSON options");
975 return NULL;
976 }
977
978 if (qobject_type(options_obj) != QTYPE_QDICT) {
979 qobject_decref(options_obj);
980 error_setg(errp, "Invalid JSON object given");
981 return NULL;
982 }
983
984 options = qobject_to_qdict(options_obj);
985 qdict_flatten(options);
986
987 return options;
988}
989
Kevin Wolf57915332010-04-14 15:24:50 +0200990/*
Kevin Wolff54120f2014-05-26 11:09:59 +0200991 * Fills in default options for opening images and converts the legacy
992 * filename/flags pair to option QDict entries.
Max Reitz53a29512015-03-19 14:53:16 -0400993 * The BDRV_O_PROTOCOL flag in *flags will be set or cleared accordingly if a
994 * block driver has been specified explicitly.
Kevin Wolff54120f2014-05-26 11:09:59 +0200995 */
Max Reitz53a29512015-03-19 14:53:16 -0400996static int bdrv_fill_options(QDict **options, const char **pfilename,
997 int *flags, BlockDriver *drv, Error **errp)
Kevin Wolff54120f2014-05-26 11:09:59 +0200998{
Kevin Wolf5e5c4f62014-05-26 11:45:08 +0200999 const char *filename = *pfilename;
Kevin Wolff54120f2014-05-26 11:09:59 +02001000 const char *drvname;
Max Reitz53a29512015-03-19 14:53:16 -04001001 bool protocol = *flags & BDRV_O_PROTOCOL;
Kevin Wolff54120f2014-05-26 11:09:59 +02001002 bool parse_filename = false;
Max Reitz53a29512015-03-19 14:53:16 -04001003 BlockDriver *tmp_drv;
Kevin Wolff54120f2014-05-26 11:09:59 +02001004 Error *local_err = NULL;
Kevin Wolff54120f2014-05-26 11:09:59 +02001005
Kevin Wolf5e5c4f62014-05-26 11:45:08 +02001006 /* Parse json: pseudo-protocol */
1007 if (filename && g_str_has_prefix(filename, "json:")) {
1008 QDict *json_options = parse_json_filename(filename, &local_err);
1009 if (local_err) {
1010 error_propagate(errp, local_err);
1011 return -EINVAL;
1012 }
1013
1014 /* Options given in the filename have lower priority than options
1015 * specified directly */
1016 qdict_join(*options, json_options, false);
1017 QDECREF(json_options);
1018 *pfilename = filename = NULL;
1019 }
1020
Max Reitz53a29512015-03-19 14:53:16 -04001021 drvname = qdict_get_try_str(*options, "driver");
1022
1023 /* If the user has explicitly specified the driver, this choice should
1024 * override the BDRV_O_PROTOCOL flag */
1025 tmp_drv = drv;
1026 if (!tmp_drv && drvname) {
1027 tmp_drv = bdrv_find_format(drvname);
1028 }
1029 if (tmp_drv) {
1030 protocol = tmp_drv->bdrv_file_open;
1031 }
1032
1033 if (protocol) {
1034 *flags |= BDRV_O_PROTOCOL;
1035 } else {
1036 *flags &= ~BDRV_O_PROTOCOL;
1037 }
1038
Kevin Wolff54120f2014-05-26 11:09:59 +02001039 /* Fetch the file name from the options QDict if necessary */
Kevin Wolf17b005f2014-05-27 10:50:29 +02001040 if (protocol && filename) {
Kevin Wolff54120f2014-05-26 11:09:59 +02001041 if (!qdict_haskey(*options, "filename")) {
1042 qdict_put(*options, "filename", qstring_from_str(filename));
1043 parse_filename = true;
1044 } else {
1045 error_setg(errp, "Can't specify 'file' and 'filename' options at "
1046 "the same time");
1047 return -EINVAL;
1048 }
1049 }
1050
1051 /* Find the right block driver */
1052 filename = qdict_get_try_str(*options, "filename");
Kevin Wolff54120f2014-05-26 11:09:59 +02001053
Kevin Wolf17b005f2014-05-27 10:50:29 +02001054 if (drv) {
1055 if (drvname) {
1056 error_setg(errp, "Driver specified twice");
1057 return -EINVAL;
1058 }
1059 drvname = drv->format_name;
1060 qdict_put(*options, "driver", qstring_from_str(drvname));
1061 } else {
1062 if (!drvname && protocol) {
1063 if (filename) {
Max Reitzb65a5e12015-02-05 13:58:12 -05001064 drv = bdrv_find_protocol(filename, parse_filename, errp);
Kevin Wolf17b005f2014-05-27 10:50:29 +02001065 if (!drv) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001066 return -EINVAL;
1067 }
1068
1069 drvname = drv->format_name;
1070 qdict_put(*options, "driver", qstring_from_str(drvname));
1071 } else {
1072 error_setg(errp, "Must specify either driver or file");
Kevin Wolff54120f2014-05-26 11:09:59 +02001073 return -EINVAL;
1074 }
Kevin Wolf17b005f2014-05-27 10:50:29 +02001075 } else if (drvname) {
1076 drv = bdrv_find_format(drvname);
1077 if (!drv) {
1078 error_setg(errp, "Unknown driver '%s'", drvname);
1079 return -ENOENT;
1080 }
Kevin Wolff54120f2014-05-26 11:09:59 +02001081 }
1082 }
1083
Kevin Wolf17b005f2014-05-27 10:50:29 +02001084 assert(drv || !protocol);
Kevin Wolff54120f2014-05-26 11:09:59 +02001085
1086 /* Driver-specific filename parsing */
Kevin Wolf17b005f2014-05-27 10:50:29 +02001087 if (drv && drv->bdrv_parse_filename && parse_filename) {
Kevin Wolff54120f2014-05-26 11:09:59 +02001088 drv->bdrv_parse_filename(filename, *options, &local_err);
1089 if (local_err) {
1090 error_propagate(errp, local_err);
1091 return -EINVAL;
1092 }
1093
1094 if (!drv->bdrv_needs_filename) {
1095 qdict_del(*options, "filename");
1096 }
1097 }
1098
1099 return 0;
1100}
1101
Fam Zheng8d24cce2014-05-23 21:29:45 +08001102void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd)
1103{
1104
Fam Zheng826b6ca2014-05-23 21:29:47 +08001105 if (bs->backing_hd) {
1106 assert(bs->backing_blocker);
1107 bdrv_op_unblock_all(bs->backing_hd, bs->backing_blocker);
1108 } else if (backing_hd) {
1109 error_setg(&bs->backing_blocker,
Alberto Garcia81e5f782015-04-08 12:29:19 +03001110 "node is used as backing hd of '%s'",
1111 bdrv_get_device_or_node_name(bs));
Fam Zheng826b6ca2014-05-23 21:29:47 +08001112 }
1113
Fam Zheng8d24cce2014-05-23 21:29:45 +08001114 bs->backing_hd = backing_hd;
1115 if (!backing_hd) {
Fam Zheng826b6ca2014-05-23 21:29:47 +08001116 error_free(bs->backing_blocker);
1117 bs->backing_blocker = NULL;
Fam Zheng8d24cce2014-05-23 21:29:45 +08001118 goto out;
1119 }
1120 bs->open_flags &= ~BDRV_O_NO_BACKING;
1121 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filename);
1122 pstrcpy(bs->backing_format, sizeof(bs->backing_format),
1123 backing_hd->drv ? backing_hd->drv->format_name : "");
Fam Zheng826b6ca2014-05-23 21:29:47 +08001124
1125 bdrv_op_block_all(bs->backing_hd, bs->backing_blocker);
1126 /* Otherwise we won't be able to commit due to check in bdrv_commit */
Fam Zhengbb000212014-09-11 13:14:00 +08001127 bdrv_op_unblock(bs->backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET,
Fam Zheng826b6ca2014-05-23 21:29:47 +08001128 bs->backing_blocker);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001129out:
Kevin Wolf3baca892014-07-16 17:48:16 +02001130 bdrv_refresh_limits(bs, NULL);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001131}
1132
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001133/*
1134 * Opens the backing file for a BlockDriverState if not yet open
1135 *
1136 * options is a QDict of options to pass to the block drivers, or NULL for an
1137 * empty set of options. The reference to the QDict is transferred to this
1138 * function (even on failure), so if the caller intends to reuse the dictionary,
1139 * it needs to use QINCREF() before calling bdrv_file_open.
1140 */
Max Reitz34b5d2c2013-09-05 14:45:29 +02001141int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
Paolo Bonzini9156df12012-10-18 16:49:17 +02001142{
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001143 char *backing_filename = g_malloc0(PATH_MAX);
Kevin Wolf317fc442014-04-25 13:27:34 +02001144 int ret = 0;
Fam Zheng8d24cce2014-05-23 21:29:45 +08001145 BlockDriverState *backing_hd;
Max Reitz34b5d2c2013-09-05 14:45:29 +02001146 Error *local_err = NULL;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001147
1148 if (bs->backing_hd != NULL) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001149 QDECREF(options);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001150 goto free_exit;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001151 }
1152
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001153 /* NULL means an empty set of options */
1154 if (options == NULL) {
1155 options = qdict_new();
1156 }
1157
Paolo Bonzini9156df12012-10-18 16:49:17 +02001158 bs->open_flags &= ~BDRV_O_NO_BACKING;
Kevin Wolf1cb6f502013-04-12 20:27:07 +02001159 if (qdict_haskey(options, "file.filename")) {
1160 backing_filename[0] = '\0';
1161 } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001162 QDECREF(options);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001163 goto free_exit;
Fam Zhengdbecebd2013-09-22 20:05:06 +08001164 } else {
Max Reitz9f074292014-11-26 17:20:26 +01001165 bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX,
1166 &local_err);
1167 if (local_err) {
1168 ret = -EINVAL;
1169 error_propagate(errp, local_err);
1170 QDECREF(options);
1171 goto free_exit;
1172 }
Paolo Bonzini9156df12012-10-18 16:49:17 +02001173 }
1174
Kevin Wolf8ee79e72014-06-04 15:09:35 +02001175 if (!bs->drv || !bs->drv->supports_backing) {
1176 ret = -EINVAL;
1177 error_setg(errp, "Driver doesn't support backing files");
1178 QDECREF(options);
1179 goto free_exit;
1180 }
1181
Markus Armbrustere4e99862014-10-07 13:59:03 +02001182 backing_hd = bdrv_new();
Fam Zheng8d24cce2014-05-23 21:29:45 +08001183
Kevin Wolfc5f6e492014-11-25 18:12:42 +01001184 if (bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
1185 qdict_put(options, "driver", qstring_from_str(bs->backing_format));
Paolo Bonzini9156df12012-10-18 16:49:17 +02001186 }
1187
Max Reitzf67503e2014-02-18 18:33:05 +01001188 assert(bs->backing_hd == NULL);
Kevin Wolff3930ed2015-04-08 13:43:47 +02001189 ret = bdrv_open_inherit(&backing_hd,
1190 *backing_filename ? backing_filename : NULL,
1191 NULL, options, 0, bs, &child_backing,
1192 NULL, &local_err);
Paolo Bonzini9156df12012-10-18 16:49:17 +02001193 if (ret < 0) {
Fam Zheng8d24cce2014-05-23 21:29:45 +08001194 bdrv_unref(backing_hd);
1195 backing_hd = NULL;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001196 bs->open_flags |= BDRV_O_NO_BACKING;
Fam Zhengb04b6b62013-11-08 11:26:49 +08001197 error_setg(errp, "Could not open backing file: %s",
1198 error_get_pretty(local_err));
1199 error_free(local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001200 goto free_exit;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001201 }
Fam Zheng8d24cce2014-05-23 21:29:45 +08001202 bdrv_set_backing_hd(bs, backing_hd);
Peter Feinerd80ac652014-01-08 19:43:25 +00001203
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001204free_exit:
1205 g_free(backing_filename);
1206 return ret;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001207}
1208
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001209/*
Max Reitzda557aa2013-12-20 19:28:11 +01001210 * Opens a disk image whose options are given as BlockdevRef in another block
1211 * device's options.
1212 *
Max Reitzda557aa2013-12-20 19:28:11 +01001213 * If allow_none is true, no image will be opened if filename is false and no
1214 * BlockdevRef is given. *pbs will remain unchanged and 0 will be returned.
1215 *
1216 * bdrev_key specifies the key for the image's BlockdevRef in the options QDict.
1217 * That QDict has to be flattened; therefore, if the BlockdevRef is a QDict
1218 * itself, all options starting with "${bdref_key}." are considered part of the
1219 * BlockdevRef.
1220 *
1221 * The BlockdevRef will be removed from the options QDict.
Max Reitzf67503e2014-02-18 18:33:05 +01001222 *
1223 * To conform with the behavior of bdrv_open(), *pbs has to be NULL.
Max Reitzda557aa2013-12-20 19:28:11 +01001224 */
1225int bdrv_open_image(BlockDriverState **pbs, const char *filename,
Kevin Wolff3930ed2015-04-08 13:43:47 +02001226 QDict *options, const char *bdref_key,
1227 BlockDriverState* parent, const BdrvChildRole *child_role,
Max Reitzf7d9fd82014-02-18 18:33:12 +01001228 bool allow_none, Error **errp)
Max Reitzda557aa2013-12-20 19:28:11 +01001229{
1230 QDict *image_options;
1231 int ret;
1232 char *bdref_key_dot;
1233 const char *reference;
1234
Max Reitzf67503e2014-02-18 18:33:05 +01001235 assert(pbs);
1236 assert(*pbs == NULL);
1237
Max Reitzda557aa2013-12-20 19:28:11 +01001238 bdref_key_dot = g_strdup_printf("%s.", bdref_key);
1239 qdict_extract_subqdict(options, &image_options, bdref_key_dot);
1240 g_free(bdref_key_dot);
1241
1242 reference = qdict_get_try_str(options, bdref_key);
1243 if (!filename && !reference && !qdict_size(image_options)) {
1244 if (allow_none) {
1245 ret = 0;
1246 } else {
1247 error_setg(errp, "A block device must be specified for \"%s\"",
1248 bdref_key);
1249 ret = -EINVAL;
1250 }
Markus Armbrusterb20e61e2014-05-28 11:16:57 +02001251 QDECREF(image_options);
Max Reitzda557aa2013-12-20 19:28:11 +01001252 goto done;
1253 }
1254
Kevin Wolff3930ed2015-04-08 13:43:47 +02001255 ret = bdrv_open_inherit(pbs, filename, reference, image_options, 0,
1256 parent, child_role, NULL, errp);
Max Reitzda557aa2013-12-20 19:28:11 +01001257
1258done:
1259 qdict_del(options, bdref_key);
1260 return ret;
1261}
1262
Chen Gang6b8aeca2014-06-23 23:28:23 +08001263int bdrv_append_temp_snapshot(BlockDriverState *bs, int flags, Error **errp)
Kevin Wolfb9988752014-04-03 12:09:34 +02001264{
1265 /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001266 char *tmp_filename = g_malloc0(PATH_MAX + 1);
Kevin Wolfb9988752014-04-03 12:09:34 +02001267 int64_t total_size;
Chunyan Liu83d05212014-06-05 17:20:51 +08001268 QemuOpts *opts = NULL;
Kevin Wolfb9988752014-04-03 12:09:34 +02001269 QDict *snapshot_options;
1270 BlockDriverState *bs_snapshot;
1271 Error *local_err;
1272 int ret;
1273
1274 /* if snapshot, we create a temporary backing file and open it
1275 instead of opening 'filename' directly */
1276
1277 /* Get the required size from the image */
Kevin Wolff1877432014-04-04 17:07:19 +02001278 total_size = bdrv_getlength(bs);
1279 if (total_size < 0) {
Chen Gang6b8aeca2014-06-23 23:28:23 +08001280 ret = total_size;
Kevin Wolff1877432014-04-04 17:07:19 +02001281 error_setg_errno(errp, -total_size, "Could not get image size");
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001282 goto out;
Kevin Wolff1877432014-04-04 17:07:19 +02001283 }
Kevin Wolfb9988752014-04-03 12:09:34 +02001284
1285 /* Create the temporary image */
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001286 ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
Kevin Wolfb9988752014-04-03 12:09:34 +02001287 if (ret < 0) {
1288 error_setg_errno(errp, -ret, "Could not get temporary filename");
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001289 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001290 }
1291
Max Reitzef810432014-12-02 18:32:42 +01001292 opts = qemu_opts_create(bdrv_qcow2.create_opts, NULL, 0,
Chunyan Liuc282e1f2014-06-05 17:21:11 +08001293 &error_abort);
Markus Armbruster39101f22015-02-12 16:46:36 +01001294 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size, &error_abort);
Max Reitzef810432014-12-02 18:32:42 +01001295 ret = bdrv_create(&bdrv_qcow2, tmp_filename, opts, &local_err);
Chunyan Liu83d05212014-06-05 17:20:51 +08001296 qemu_opts_del(opts);
Kevin Wolfb9988752014-04-03 12:09:34 +02001297 if (ret < 0) {
1298 error_setg_errno(errp, -ret, "Could not create temporary overlay "
1299 "'%s': %s", tmp_filename,
1300 error_get_pretty(local_err));
1301 error_free(local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001302 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001303 }
1304
1305 /* Prepare a new options QDict for the temporary file */
1306 snapshot_options = qdict_new();
1307 qdict_put(snapshot_options, "file.driver",
1308 qstring_from_str("file"));
1309 qdict_put(snapshot_options, "file.filename",
1310 qstring_from_str(tmp_filename));
1311
Markus Armbrustere4e99862014-10-07 13:59:03 +02001312 bs_snapshot = bdrv_new();
Kevin Wolfb9988752014-04-03 12:09:34 +02001313
1314 ret = bdrv_open(&bs_snapshot, NULL, NULL, snapshot_options,
Max Reitzef810432014-12-02 18:32:42 +01001315 flags, &bdrv_qcow2, &local_err);
Kevin Wolfb9988752014-04-03 12:09:34 +02001316 if (ret < 0) {
1317 error_propagate(errp, local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001318 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001319 }
1320
1321 bdrv_append(bs_snapshot, bs);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001322
1323out:
1324 g_free(tmp_filename);
Chen Gang6b8aeca2014-06-23 23:28:23 +08001325 return ret;
Kevin Wolfb9988752014-04-03 12:09:34 +02001326}
1327
Max Reitzda557aa2013-12-20 19:28:11 +01001328/*
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001329 * Opens a disk image (raw, qcow2, vmdk, ...)
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001330 *
1331 * options is a QDict of options to pass to the block drivers, or NULL for an
1332 * empty set of options. The reference to the QDict belongs to the block layer
1333 * after the call (even on failure), so if the caller intends to reuse the
1334 * dictionary, it needs to use QINCREF() before calling bdrv_open.
Max Reitzf67503e2014-02-18 18:33:05 +01001335 *
1336 * If *pbs is NULL, a new BDS will be created with a pointer to it stored there.
1337 * If it is not NULL, the referenced BDS will be reused.
Max Reitzddf56362014-02-18 18:33:06 +01001338 *
1339 * The reference parameter may be used to specify an existing block device which
1340 * should be opened. If specified, neither options nor a filename may be given,
1341 * nor can an existing BDS be reused (that is, *pbs has to be NULL).
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001342 */
Kevin Wolff3930ed2015-04-08 13:43:47 +02001343static int bdrv_open_inherit(BlockDriverState **pbs, const char *filename,
1344 const char *reference, QDict *options, int flags,
1345 BlockDriverState *parent,
1346 const BdrvChildRole *child_role,
1347 BlockDriver *drv, Error **errp)
bellardea2384d2004-08-01 21:59:26 +00001348{
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001349 int ret;
Max Reitzf67503e2014-02-18 18:33:05 +01001350 BlockDriverState *file = NULL, *bs;
Kevin Wolf74fe54f2013-07-09 11:09:02 +02001351 const char *drvname;
Max Reitz34b5d2c2013-09-05 14:45:29 +02001352 Error *local_err = NULL;
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001353 int snapshot_flags = 0;
bellard712e7872005-04-28 21:09:32 +00001354
Max Reitzf67503e2014-02-18 18:33:05 +01001355 assert(pbs);
Kevin Wolff3930ed2015-04-08 13:43:47 +02001356 assert(!child_role || !flags);
1357 assert(!child_role == !parent);
Max Reitzf67503e2014-02-18 18:33:05 +01001358
Max Reitzddf56362014-02-18 18:33:06 +01001359 if (reference) {
1360 bool options_non_empty = options ? qdict_size(options) : false;
1361 QDECREF(options);
1362
1363 if (*pbs) {
1364 error_setg(errp, "Cannot reuse an existing BDS when referencing "
1365 "another block device");
1366 return -EINVAL;
1367 }
1368
1369 if (filename || options_non_empty) {
1370 error_setg(errp, "Cannot reference an existing block device with "
1371 "additional options or a new filename");
1372 return -EINVAL;
1373 }
1374
1375 bs = bdrv_lookup_bs(reference, reference, errp);
1376 if (!bs) {
1377 return -ENODEV;
1378 }
1379 bdrv_ref(bs);
1380 *pbs = bs;
1381 return 0;
1382 }
1383
Max Reitzf67503e2014-02-18 18:33:05 +01001384 if (*pbs) {
1385 bs = *pbs;
1386 } else {
Markus Armbrustere4e99862014-10-07 13:59:03 +02001387 bs = bdrv_new();
Max Reitzf67503e2014-02-18 18:33:05 +01001388 }
1389
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001390 /* NULL means an empty set of options */
1391 if (options == NULL) {
1392 options = qdict_new();
1393 }
1394
Kevin Wolff3930ed2015-04-08 13:43:47 +02001395 if (child_role) {
1396 flags = child_role->inherit_flags(parent->open_flags);
1397 }
1398
Max Reitz53a29512015-03-19 14:53:16 -04001399 ret = bdrv_fill_options(&options, &filename, &flags, drv, &local_err);
Kevin Wolf462f5bc2014-05-26 11:39:55 +02001400 if (local_err) {
1401 goto fail;
1402 }
1403
Kevin Wolf76c591b2014-06-04 14:19:44 +02001404 /* Find the right image format driver */
1405 drv = NULL;
1406 drvname = qdict_get_try_str(options, "driver");
1407 if (drvname) {
1408 drv = bdrv_find_format(drvname);
1409 qdict_del(options, "driver");
1410 if (!drv) {
1411 error_setg(errp, "Unknown driver: '%s'", drvname);
1412 ret = -EINVAL;
1413 goto fail;
1414 }
1415 }
1416
1417 assert(drvname || !(flags & BDRV_O_PROTOCOL));
Kevin Wolf76c591b2014-06-04 14:19:44 +02001418
Kevin Wolff3930ed2015-04-08 13:43:47 +02001419 bs->open_flags = flags;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001420 bs->options = options;
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001421 options = qdict_clone_shallow(options);
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001422
Kevin Wolff4788ad2014-06-03 16:44:19 +02001423 /* Open image file without format layer */
1424 if ((flags & BDRV_O_PROTOCOL) == 0) {
1425 if (flags & BDRV_O_RDWR) {
1426 flags |= BDRV_O_ALLOW_RDWR;
1427 }
1428 if (flags & BDRV_O_SNAPSHOT) {
1429 snapshot_flags = bdrv_temp_snapshot_flags(flags);
1430 flags = bdrv_backing_flags(flags);
1431 }
1432
1433 assert(file == NULL);
Kevin Wolff3930ed2015-04-08 13:43:47 +02001434 bs->open_flags = flags;
Kevin Wolff4788ad2014-06-03 16:44:19 +02001435 ret = bdrv_open_image(&file, filename, options, "file",
Kevin Wolff3930ed2015-04-08 13:43:47 +02001436 bs, &child_file, true, &local_err);
Kevin Wolff4788ad2014-06-03 16:44:19 +02001437 if (ret < 0) {
Max Reitz5469a2a2014-02-18 18:33:10 +01001438 goto fail;
1439 }
1440 }
1441
Kevin Wolf76c591b2014-06-04 14:19:44 +02001442 /* Image format probing */
Kevin Wolf38f3ef52014-11-20 16:27:12 +01001443 bs->probed = !drv;
Kevin Wolf76c591b2014-06-04 14:19:44 +02001444 if (!drv && file) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001445 ret = find_image_format(file, filename, &drv, &local_err);
1446 if (ret < 0) {
Kevin Wolf8bfea152014-04-11 19:16:36 +02001447 goto fail;
Max Reitz2a05cbe2013-12-20 19:28:10 +01001448 }
Kevin Wolf76c591b2014-06-04 14:19:44 +02001449 } else if (!drv) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001450 error_setg(errp, "Must specify either driver or file");
1451 ret = -EINVAL;
Kevin Wolf8bfea152014-04-11 19:16:36 +02001452 goto fail;
Kevin Wolff500a6d2012-11-12 17:35:27 +01001453 }
1454
Max Reitz53a29512015-03-19 14:53:16 -04001455 /* BDRV_O_PROTOCOL must be set iff a protocol BDS is about to be created */
1456 assert(!!(flags & BDRV_O_PROTOCOL) == !!drv->bdrv_file_open);
1457 /* file must be NULL if a protocol BDS is about to be created
1458 * (the inverse results in an error message from bdrv_open_common()) */
1459 assert(!(flags & BDRV_O_PROTOCOL) || !file);
1460
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001461 /* Open the image */
Max Reitz34b5d2c2013-09-05 14:45:29 +02001462 ret = bdrv_open_common(bs, file, options, flags, drv, &local_err);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001463 if (ret < 0) {
Kevin Wolf8bfea152014-04-11 19:16:36 +02001464 goto fail;
Christoph Hellwig69873072010-01-20 18:13:25 +01001465 }
1466
Max Reitz2a05cbe2013-12-20 19:28:10 +01001467 if (file && (bs->file != file)) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001468 bdrv_unref(file);
Kevin Wolff500a6d2012-11-12 17:35:27 +01001469 file = NULL;
1470 }
1471
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001472 /* If there is a backing file, use it */
Paolo Bonzini9156df12012-10-18 16:49:17 +02001473 if ((flags & BDRV_O_NO_BACKING) == 0) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001474 QDict *backing_options;
1475
Benoît Canet5726d872013-09-25 13:30:01 +02001476 qdict_extract_subqdict(options, &backing_options, "backing.");
Max Reitz34b5d2c2013-09-05 14:45:29 +02001477 ret = bdrv_open_backing_file(bs, backing_options, &local_err);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001478 if (ret < 0) {
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001479 goto close_and_fail;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001480 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001481 }
1482
Max Reitz91af7012014-07-18 20:24:56 +02001483 bdrv_refresh_filename(bs);
1484
Kevin Wolfb9988752014-04-03 12:09:34 +02001485 /* For snapshot=on, create a temporary qcow2 overlay. bs points to the
1486 * temporary snapshot afterwards. */
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001487 if (snapshot_flags) {
Chen Gang6b8aeca2014-06-23 23:28:23 +08001488 ret = bdrv_append_temp_snapshot(bs, snapshot_flags, &local_err);
Kevin Wolfb9988752014-04-03 12:09:34 +02001489 if (local_err) {
Kevin Wolfb9988752014-04-03 12:09:34 +02001490 goto close_and_fail;
1491 }
1492 }
1493
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001494 /* Check if any unknown options were used */
Max Reitz5acd9d82014-02-18 18:33:11 +01001495 if (options && (qdict_size(options) != 0)) {
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001496 const QDictEntry *entry = qdict_first(options);
Max Reitz5acd9d82014-02-18 18:33:11 +01001497 if (flags & BDRV_O_PROTOCOL) {
1498 error_setg(errp, "Block protocol '%s' doesn't support the option "
1499 "'%s'", drv->format_name, entry->key);
1500 } else {
1501 error_setg(errp, "Block format '%s' used by device '%s' doesn't "
1502 "support the option '%s'", drv->format_name,
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001503 bdrv_get_device_name(bs), entry->key);
Max Reitz5acd9d82014-02-18 18:33:11 +01001504 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001505
1506 ret = -EINVAL;
1507 goto close_and_fail;
1508 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001509
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001510 if (!bdrv_key_required(bs)) {
Markus Armbrustera7f53e22014-10-07 13:59:25 +02001511 if (bs->blk) {
1512 blk_dev_change_media_cb(bs->blk, true);
1513 }
Markus Armbrusterc3adb582014-03-14 09:22:48 +01001514 } else if (!runstate_check(RUN_STATE_PRELAUNCH)
1515 && !runstate_check(RUN_STATE_INMIGRATE)
1516 && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
1517 error_setg(errp,
1518 "Guest must be stopped for opening of encrypted image");
1519 ret = -EBUSY;
1520 goto close_and_fail;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001521 }
1522
Markus Armbrusterc3adb582014-03-14 09:22:48 +01001523 QDECREF(options);
Max Reitzf67503e2014-02-18 18:33:05 +01001524 *pbs = bs;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001525 return 0;
1526
Kevin Wolf8bfea152014-04-11 19:16:36 +02001527fail:
Kevin Wolff500a6d2012-11-12 17:35:27 +01001528 if (file != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001529 bdrv_unref(file);
Kevin Wolff500a6d2012-11-12 17:35:27 +01001530 }
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001531 QDECREF(bs->options);
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001532 QDECREF(options);
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001533 bs->options = NULL;
Max Reitzf67503e2014-02-18 18:33:05 +01001534 if (!*pbs) {
1535 /* If *pbs is NULL, a new BDS has been created in this function and
1536 needs to be freed now. Otherwise, it does not need to be closed,
1537 since it has not really been opened yet. */
1538 bdrv_unref(bs);
1539 }
Markus Armbruster84d18f02014-01-30 15:07:28 +01001540 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001541 error_propagate(errp, local_err);
1542 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001543 return ret;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001544
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001545close_and_fail:
Max Reitzf67503e2014-02-18 18:33:05 +01001546 /* See fail path, but now the BDS has to be always closed */
1547 if (*pbs) {
1548 bdrv_close(bs);
1549 } else {
1550 bdrv_unref(bs);
1551 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001552 QDECREF(options);
Markus Armbruster84d18f02014-01-30 15:07:28 +01001553 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001554 error_propagate(errp, local_err);
1555 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001556 return ret;
1557}
1558
Kevin Wolff3930ed2015-04-08 13:43:47 +02001559int bdrv_open(BlockDriverState **pbs, const char *filename,
1560 const char *reference, QDict *options, int flags,
1561 BlockDriver *drv, Error **errp)
1562{
1563 return bdrv_open_inherit(pbs, filename, reference, options, flags, NULL,
1564 NULL, drv, errp);
1565}
1566
Jeff Codye971aa12012-09-20 15:13:19 -04001567typedef struct BlockReopenQueueEntry {
1568 bool prepared;
1569 BDRVReopenState state;
1570 QSIMPLEQ_ENTRY(BlockReopenQueueEntry) entry;
1571} BlockReopenQueueEntry;
1572
1573/*
1574 * Adds a BlockDriverState to a simple queue for an atomic, transactional
1575 * reopen of multiple devices.
1576 *
1577 * bs_queue can either be an existing BlockReopenQueue that has had QSIMPLE_INIT
1578 * already performed, or alternatively may be NULL a new BlockReopenQueue will
1579 * be created and initialized. This newly created BlockReopenQueue should be
1580 * passed back in for subsequent calls that are intended to be of the same
1581 * atomic 'set'.
1582 *
1583 * bs is the BlockDriverState to add to the reopen queue.
1584 *
1585 * flags contains the open flags for the associated bs
1586 *
1587 * returns a pointer to bs_queue, which is either the newly allocated
1588 * bs_queue, or the existing bs_queue being used.
1589 *
1590 */
1591BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
1592 BlockDriverState *bs, int flags)
1593{
1594 assert(bs != NULL);
1595
1596 BlockReopenQueueEntry *bs_entry;
1597 if (bs_queue == NULL) {
1598 bs_queue = g_new0(BlockReopenQueue, 1);
1599 QSIMPLEQ_INIT(bs_queue);
1600 }
1601
Kevin Wolff1f25a22014-04-25 19:04:55 +02001602 /* bdrv_open() masks this flag out */
1603 flags &= ~BDRV_O_PROTOCOL;
1604
Jeff Codye971aa12012-09-20 15:13:19 -04001605 if (bs->file) {
Kevin Wolff1f25a22014-04-25 19:04:55 +02001606 bdrv_reopen_queue(bs_queue, bs->file, bdrv_inherited_flags(flags));
Jeff Codye971aa12012-09-20 15:13:19 -04001607 }
1608
1609 bs_entry = g_new0(BlockReopenQueueEntry, 1);
1610 QSIMPLEQ_INSERT_TAIL(bs_queue, bs_entry, entry);
1611
1612 bs_entry->state.bs = bs;
1613 bs_entry->state.flags = flags;
1614
1615 return bs_queue;
1616}
1617
1618/*
1619 * Reopen multiple BlockDriverStates atomically & transactionally.
1620 *
1621 * The queue passed in (bs_queue) must have been built up previous
1622 * via bdrv_reopen_queue().
1623 *
1624 * Reopens all BDS specified in the queue, with the appropriate
1625 * flags. All devices are prepared for reopen, and failure of any
1626 * device will cause all device changes to be abandonded, and intermediate
1627 * data cleaned up.
1628 *
1629 * If all devices prepare successfully, then the changes are committed
1630 * to all devices.
1631 *
1632 */
1633int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
1634{
1635 int ret = -1;
1636 BlockReopenQueueEntry *bs_entry, *next;
1637 Error *local_err = NULL;
1638
1639 assert(bs_queue != NULL);
1640
1641 bdrv_drain_all();
1642
1643 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1644 if (bdrv_reopen_prepare(&bs_entry->state, bs_queue, &local_err)) {
1645 error_propagate(errp, local_err);
1646 goto cleanup;
1647 }
1648 bs_entry->prepared = true;
1649 }
1650
1651 /* If we reach this point, we have success and just need to apply the
1652 * changes
1653 */
1654 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1655 bdrv_reopen_commit(&bs_entry->state);
1656 }
1657
1658 ret = 0;
1659
1660cleanup:
1661 QSIMPLEQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
1662 if (ret && bs_entry->prepared) {
1663 bdrv_reopen_abort(&bs_entry->state);
1664 }
1665 g_free(bs_entry);
1666 }
1667 g_free(bs_queue);
1668 return ret;
1669}
1670
1671
1672/* Reopen a single BlockDriverState with the specified flags. */
1673int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp)
1674{
1675 int ret = -1;
1676 Error *local_err = NULL;
1677 BlockReopenQueue *queue = bdrv_reopen_queue(NULL, bs, bdrv_flags);
1678
1679 ret = bdrv_reopen_multiple(queue, &local_err);
1680 if (local_err != NULL) {
1681 error_propagate(errp, local_err);
1682 }
1683 return ret;
1684}
1685
1686
1687/*
1688 * Prepares a BlockDriverState for reopen. All changes are staged in the
1689 * 'opaque' field of the BDRVReopenState, which is used and allocated by
1690 * the block driver layer .bdrv_reopen_prepare()
1691 *
1692 * bs is the BlockDriverState to reopen
1693 * flags are the new open flags
1694 * queue is the reopen queue
1695 *
1696 * Returns 0 on success, non-zero on error. On error errp will be set
1697 * as well.
1698 *
1699 * On failure, bdrv_reopen_abort() will be called to clean up any data.
1700 * It is the responsibility of the caller to then call the abort() or
1701 * commit() for any other BDS that have been left in a prepare() state
1702 *
1703 */
1704int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
1705 Error **errp)
1706{
1707 int ret = -1;
1708 Error *local_err = NULL;
1709 BlockDriver *drv;
1710
1711 assert(reopen_state != NULL);
1712 assert(reopen_state->bs->drv != NULL);
1713 drv = reopen_state->bs->drv;
1714
1715 /* if we are to stay read-only, do not allow permission change
1716 * to r/w */
1717 if (!(reopen_state->bs->open_flags & BDRV_O_ALLOW_RDWR) &&
1718 reopen_state->flags & BDRV_O_RDWR) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03001719 error_setg(errp, "Node '%s' is read only",
1720 bdrv_get_device_or_node_name(reopen_state->bs));
Jeff Codye971aa12012-09-20 15:13:19 -04001721 goto error;
1722 }
1723
1724
1725 ret = bdrv_flush(reopen_state->bs);
1726 if (ret) {
1727 error_set(errp, ERROR_CLASS_GENERIC_ERROR, "Error (%s) flushing drive",
1728 strerror(-ret));
1729 goto error;
1730 }
1731
1732 if (drv->bdrv_reopen_prepare) {
1733 ret = drv->bdrv_reopen_prepare(reopen_state, queue, &local_err);
1734 if (ret) {
1735 if (local_err != NULL) {
1736 error_propagate(errp, local_err);
1737 } else {
Luiz Capitulinod8b68952013-06-10 11:29:27 -04001738 error_setg(errp, "failed while preparing to reopen image '%s'",
1739 reopen_state->bs->filename);
Jeff Codye971aa12012-09-20 15:13:19 -04001740 }
1741 goto error;
1742 }
1743 } else {
1744 /* It is currently mandatory to have a bdrv_reopen_prepare()
1745 * handler for each supported drv. */
Alberto Garcia81e5f782015-04-08 12:29:19 +03001746 error_setg(errp, "Block format '%s' used by node '%s' "
1747 "does not support reopening files", drv->format_name,
1748 bdrv_get_device_or_node_name(reopen_state->bs));
Jeff Codye971aa12012-09-20 15:13:19 -04001749 ret = -1;
1750 goto error;
1751 }
1752
1753 ret = 0;
1754
1755error:
1756 return ret;
1757}
1758
1759/*
1760 * Takes the staged changes for the reopen from bdrv_reopen_prepare(), and
1761 * makes them final by swapping the staging BlockDriverState contents into
1762 * the active BlockDriverState contents.
1763 */
1764void bdrv_reopen_commit(BDRVReopenState *reopen_state)
1765{
1766 BlockDriver *drv;
1767
1768 assert(reopen_state != NULL);
1769 drv = reopen_state->bs->drv;
1770 assert(drv != NULL);
1771
1772 /* If there are any driver level actions to take */
1773 if (drv->bdrv_reopen_commit) {
1774 drv->bdrv_reopen_commit(reopen_state);
1775 }
1776
1777 /* set BDS specific flags now */
1778 reopen_state->bs->open_flags = reopen_state->flags;
1779 reopen_state->bs->enable_write_cache = !!(reopen_state->flags &
1780 BDRV_O_CACHE_WB);
1781 reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
Kevin Wolf355ef4a2013-12-11 20:14:09 +01001782
Kevin Wolf3baca892014-07-16 17:48:16 +02001783 bdrv_refresh_limits(reopen_state->bs, NULL);
Jeff Codye971aa12012-09-20 15:13:19 -04001784}
1785
1786/*
1787 * Abort the reopen, and delete and free the staged changes in
1788 * reopen_state
1789 */
1790void bdrv_reopen_abort(BDRVReopenState *reopen_state)
1791{
1792 BlockDriver *drv;
1793
1794 assert(reopen_state != NULL);
1795 drv = reopen_state->bs->drv;
1796 assert(drv != NULL);
1797
1798 if (drv->bdrv_reopen_abort) {
1799 drv->bdrv_reopen_abort(reopen_state);
1800 }
1801}
1802
1803
bellardfc01f7e2003-06-30 10:03:06 +00001804void bdrv_close(BlockDriverState *bs)
1805{
Max Reitz33384422014-06-20 21:57:33 +02001806 BdrvAioNotifier *ban, *ban_next;
1807
Paolo Bonzini3cbc0022012-10-19 11:36:48 +02001808 if (bs->job) {
1809 block_job_cancel_sync(bs->job);
1810 }
Stefan Hajnoczi58fda172013-07-02 15:36:25 +02001811 bdrv_drain_all(); /* complete I/O */
1812 bdrv_flush(bs);
1813 bdrv_drain_all(); /* in case flush left pending I/O */
Paolo Bonzinid7d512f2012-08-23 11:20:36 +02001814 notifier_list_notify(&bs->close_notifiers, bs);
Kevin Wolf7094f122012-04-11 11:06:37 +02001815
Paolo Bonzini3cbc0022012-10-19 11:36:48 +02001816 if (bs->drv) {
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +01001817 if (bs->backing_hd) {
Fam Zheng826b6ca2014-05-23 21:29:47 +08001818 BlockDriverState *backing_hd = bs->backing_hd;
1819 bdrv_set_backing_hd(bs, NULL);
1820 bdrv_unref(backing_hd);
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +01001821 }
bellardea2384d2004-08-01 21:59:26 +00001822 bs->drv->bdrv_close(bs);
Anthony Liguori7267c092011-08-20 22:09:37 -05001823 g_free(bs->opaque);
bellardea2384d2004-08-01 21:59:26 +00001824 bs->opaque = NULL;
1825 bs->drv = NULL;
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +00001826 bs->copy_on_read = 0;
Paolo Bonzinia275fa42012-05-08 16:51:43 +02001827 bs->backing_file[0] = '\0';
1828 bs->backing_format[0] = '\0';
Paolo Bonzini64058752012-05-08 16:51:49 +02001829 bs->total_sectors = 0;
1830 bs->encrypted = 0;
1831 bs->valid_key = 0;
1832 bs->sg = 0;
Asias He0d51b4d2013-08-22 15:24:14 +08001833 bs->zero_beyond_eof = false;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001834 QDECREF(bs->options);
1835 bs->options = NULL;
Max Reitz91af7012014-07-18 20:24:56 +02001836 QDECREF(bs->full_open_options);
1837 bs->full_open_options = NULL;
bellardb3380822004-03-14 21:38:54 +00001838
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001839 if (bs->file != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001840 bdrv_unref(bs->file);
Paolo Bonzini0ac93772012-05-08 16:51:44 +02001841 bs->file = NULL;
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001842 }
bellardb3380822004-03-14 21:38:54 +00001843 }
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001844
Markus Armbrustera7f53e22014-10-07 13:59:25 +02001845 if (bs->blk) {
1846 blk_dev_change_media_cb(bs->blk, false);
1847 }
Pavel Hrdina9ca11152012-08-09 12:44:48 +02001848
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001849 /*throttling disk I/O limits*/
1850 if (bs->io_limits_enabled) {
1851 bdrv_io_limits_disable(bs);
1852 }
Max Reitz33384422014-06-20 21:57:33 +02001853
1854 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
1855 g_free(ban);
1856 }
1857 QLIST_INIT(&bs->aio_notifiers);
bellardb3380822004-03-14 21:38:54 +00001858}
1859
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001860void bdrv_close_all(void)
1861{
1862 BlockDriverState *bs;
1863
Benoît Canetdc364f42014-01-23 21:31:32 +01001864 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02001865 AioContext *aio_context = bdrv_get_aio_context(bs);
1866
1867 aio_context_acquire(aio_context);
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001868 bdrv_close(bs);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02001869 aio_context_release(aio_context);
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001870 }
1871}
1872
Benoît Canetdc364f42014-01-23 21:31:32 +01001873/* make a BlockDriverState anonymous by removing from bdrv_state and
1874 * graph_bdrv_state list.
Ryan Harperd22b2f42011-03-29 20:51:47 -05001875 Also, NULL terminate the device_name to prevent double remove */
1876void bdrv_make_anon(BlockDriverState *bs)
1877{
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001878 /*
1879 * Take care to remove bs from bdrv_states only when it's actually
1880 * in it. Note that bs->device_list.tqe_prev is initially null,
1881 * and gets set to non-null by QTAILQ_INSERT_TAIL(). Establish
1882 * the useful invariant "bs in bdrv_states iff bs->tqe_prev" by
1883 * resetting it to null on remove.
1884 */
1885 if (bs->device_list.tqe_prev) {
Benoît Canetdc364f42014-01-23 21:31:32 +01001886 QTAILQ_REMOVE(&bdrv_states, bs, device_list);
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001887 bs->device_list.tqe_prev = NULL;
Ryan Harperd22b2f42011-03-29 20:51:47 -05001888 }
Benoît Canetdc364f42014-01-23 21:31:32 +01001889 if (bs->node_name[0] != '\0') {
1890 QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
1891 }
1892 bs->node_name[0] = '\0';
Ryan Harperd22b2f42011-03-29 20:51:47 -05001893}
1894
Paolo Bonzinie023b2e2012-05-08 16:51:41 +02001895static void bdrv_rebind(BlockDriverState *bs)
1896{
1897 if (bs->drv && bs->drv->bdrv_rebind) {
1898 bs->drv->bdrv_rebind(bs);
1899 }
1900}
1901
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001902static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
1903 BlockDriverState *bs_src)
1904{
1905 /* move some fields that need to stay attached to the device */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001906
1907 /* dev info */
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01001908 bs_dest->guest_block_size = bs_src->guest_block_size;
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001909 bs_dest->copy_on_read = bs_src->copy_on_read;
1910
1911 bs_dest->enable_write_cache = bs_src->enable_write_cache;
1912
Benoît Canetcc0681c2013-09-02 14:14:39 +02001913 /* i/o throttled req */
1914 memcpy(&bs_dest->throttle_state,
1915 &bs_src->throttle_state,
1916 sizeof(ThrottleState));
1917 bs_dest->throttled_reqs[0] = bs_src->throttled_reqs[0];
1918 bs_dest->throttled_reqs[1] = bs_src->throttled_reqs[1];
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001919 bs_dest->io_limits_enabled = bs_src->io_limits_enabled;
1920
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001921 /* r/w error */
1922 bs_dest->on_read_error = bs_src->on_read_error;
1923 bs_dest->on_write_error = bs_src->on_write_error;
1924
1925 /* i/o status */
1926 bs_dest->iostatus_enabled = bs_src->iostatus_enabled;
1927 bs_dest->iostatus = bs_src->iostatus;
1928
1929 /* dirty bitmap */
Fam Zhenge4654d22013-11-13 18:29:43 +08001930 bs_dest->dirty_bitmaps = bs_src->dirty_bitmaps;
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001931
Fam Zheng9fcb0252013-08-23 09:14:46 +08001932 /* reference count */
1933 bs_dest->refcnt = bs_src->refcnt;
1934
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001935 /* job */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001936 bs_dest->job = bs_src->job;
1937
1938 /* keep the same entry in bdrv_states */
Benoît Canetdc364f42014-01-23 21:31:32 +01001939 bs_dest->device_list = bs_src->device_list;
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001940 bs_dest->blk = bs_src->blk;
1941
Fam Zhengfbe40ff2014-05-23 21:29:42 +08001942 memcpy(bs_dest->op_blockers, bs_src->op_blockers,
1943 sizeof(bs_dest->op_blockers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001944}
1945
1946/*
1947 * Swap bs contents for two image chains while they are live,
1948 * while keeping required fields on the BlockDriverState that is
1949 * actually attached to a device.
1950 *
1951 * This will modify the BlockDriverState fields, and swap contents
1952 * between bs_new and bs_old. Both bs_new and bs_old are modified.
1953 *
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001954 * bs_new must not be attached to a BlockBackend.
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001955 *
1956 * This function does not create any image files.
1957 */
1958void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
1959{
1960 BlockDriverState tmp;
1961
Benoît Canet90ce8a02014-03-05 23:48:29 +01001962 /* The code needs to swap the node_name but simply swapping node_list won't
1963 * work so first remove the nodes from the graph list, do the swap then
1964 * insert them back if needed.
1965 */
1966 if (bs_new->node_name[0] != '\0') {
1967 QTAILQ_REMOVE(&graph_bdrv_states, bs_new, node_list);
1968 }
1969 if (bs_old->node_name[0] != '\0') {
1970 QTAILQ_REMOVE(&graph_bdrv_states, bs_old, node_list);
1971 }
1972
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001973 /* bs_new must be unattached and shouldn't have anything fancy enabled */
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001974 assert(!bs_new->blk);
Fam Zhenge4654d22013-11-13 18:29:43 +08001975 assert(QLIST_EMPTY(&bs_new->dirty_bitmaps));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001976 assert(bs_new->job == NULL);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001977 assert(bs_new->io_limits_enabled == false);
Benoît Canetcc0681c2013-09-02 14:14:39 +02001978 assert(!throttle_have_timer(&bs_new->throttle_state));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001979
1980 tmp = *bs_new;
1981 *bs_new = *bs_old;
1982 *bs_old = tmp;
1983
1984 /* there are some fields that should not be swapped, move them back */
1985 bdrv_move_feature_fields(&tmp, bs_old);
1986 bdrv_move_feature_fields(bs_old, bs_new);
1987 bdrv_move_feature_fields(bs_new, &tmp);
1988
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02001989 /* bs_new must remain unattached */
Markus Armbruster7e7d56d2014-10-07 13:59:05 +02001990 assert(!bs_new->blk);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001991
1992 /* Check a few fields that should remain attached to the device */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001993 assert(bs_new->job == NULL);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001994 assert(bs_new->io_limits_enabled == false);
Benoît Canetcc0681c2013-09-02 14:14:39 +02001995 assert(!throttle_have_timer(&bs_new->throttle_state));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001996
Benoît Canet90ce8a02014-03-05 23:48:29 +01001997 /* insert the nodes back into the graph node list if needed */
1998 if (bs_new->node_name[0] != '\0') {
1999 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_new, node_list);
2000 }
2001 if (bs_old->node_name[0] != '\0') {
2002 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_old, node_list);
2003 }
2004
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002005 bdrv_rebind(bs_new);
2006 bdrv_rebind(bs_old);
2007}
2008
Jeff Cody8802d1f2012-02-28 15:54:06 -05002009/*
2010 * Add new bs contents at the top of an image chain while the chain is
2011 * live, while keeping required fields on the top layer.
2012 *
2013 * This will modify the BlockDriverState fields, and swap contents
2014 * between bs_new and bs_top. Both bs_new and bs_top are modified.
2015 *
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02002016 * bs_new must not be attached to a BlockBackend.
Jeff Codyf6801b82012-03-27 16:30:19 -04002017 *
Jeff Cody8802d1f2012-02-28 15:54:06 -05002018 * This function does not create any image files.
2019 */
2020void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
2021{
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002022 bdrv_swap(bs_new, bs_top);
Jeff Cody8802d1f2012-02-28 15:54:06 -05002023
2024 /* The contents of 'tmp' will become bs_top, as we are
2025 * swapping bs_new and bs_top contents. */
Fam Zheng8d24cce2014-05-23 21:29:45 +08002026 bdrv_set_backing_hd(bs_top, bs_new);
Jeff Cody8802d1f2012-02-28 15:54:06 -05002027}
2028
Fam Zheng4f6fd342013-08-23 09:14:47 +08002029static void bdrv_delete(BlockDriverState *bs)
bellardb3380822004-03-14 21:38:54 +00002030{
Paolo Bonzini3e914652012-03-30 13:17:11 +02002031 assert(!bs->job);
Fam Zheng3718d8a2014-05-23 21:29:43 +08002032 assert(bdrv_op_blocker_is_empty(bs));
Fam Zheng4f6fd342013-08-23 09:14:47 +08002033 assert(!bs->refcnt);
Fam Zhenge4654d22013-11-13 18:29:43 +08002034 assert(QLIST_EMPTY(&bs->dirty_bitmaps));
Markus Armbruster18846de2010-06-29 16:58:30 +02002035
Stefan Hajnoczie1b5c522013-06-27 15:32:26 +02002036 bdrv_close(bs);
2037
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002038 /* remove from list, if necessary */
Ryan Harperd22b2f42011-03-29 20:51:47 -05002039 bdrv_make_anon(bs);
aurel3234c6f052008-04-08 19:51:21 +00002040
Anthony Liguori7267c092011-08-20 22:09:37 -05002041 g_free(bs);
bellardfc01f7e2003-06-30 10:03:06 +00002042}
2043
aliguorie97fc192009-04-21 23:11:50 +00002044/*
2045 * Run consistency checks on an image
2046 *
Kevin Wolfe076f332010-06-29 11:43:13 +02002047 * Returns 0 if the check could be completed (it doesn't mean that the image is
Stefan Weila1c72732011-04-28 17:20:38 +02002048 * free of errors) or -errno when an internal error occurred. The results of the
Kevin Wolfe076f332010-06-29 11:43:13 +02002049 * check are stored in res.
aliguorie97fc192009-04-21 23:11:50 +00002050 */
Kevin Wolf4534ff52012-05-11 16:07:02 +02002051int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix)
aliguorie97fc192009-04-21 23:11:50 +00002052{
Max Reitz908bcd52014-08-07 22:47:55 +02002053 if (bs->drv == NULL) {
2054 return -ENOMEDIUM;
2055 }
aliguorie97fc192009-04-21 23:11:50 +00002056 if (bs->drv->bdrv_check == NULL) {
2057 return -ENOTSUP;
2058 }
2059
Kevin Wolfe076f332010-06-29 11:43:13 +02002060 memset(res, 0, sizeof(*res));
Kevin Wolf4534ff52012-05-11 16:07:02 +02002061 return bs->drv->bdrv_check(bs, res, fix);
aliguorie97fc192009-04-21 23:11:50 +00002062}
2063
Kevin Wolf8a426612010-07-16 17:17:01 +02002064#define COMMIT_BUF_SECTORS 2048
2065
bellard33e39632003-07-06 17:15:21 +00002066/* commit COW file into the raw image */
2067int bdrv_commit(BlockDriverState *bs)
2068{
bellard19cb3732006-08-19 11:45:59 +00002069 BlockDriver *drv = bs->drv;
Jeff Cody72706ea2014-01-24 09:02:35 -05002070 int64_t sector, total_sectors, length, backing_length;
Kevin Wolf8a426612010-07-16 17:17:01 +02002071 int n, ro, open_flags;
Jeff Cody0bce5972012-09-20 15:13:34 -04002072 int ret = 0;
Jeff Cody72706ea2014-01-24 09:02:35 -05002073 uint8_t *buf = NULL;
bellard33e39632003-07-06 17:15:21 +00002074
bellard19cb3732006-08-19 11:45:59 +00002075 if (!drv)
2076 return -ENOMEDIUM;
Liu Yuan6bb45152014-09-01 13:35:21 +08002077
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002078 if (!bs->backing_hd) {
2079 return -ENOTSUP;
bellard33e39632003-07-06 17:15:21 +00002080 }
2081
Fam Zhengbb000212014-09-11 13:14:00 +08002082 if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, NULL) ||
2083 bdrv_op_is_blocked(bs->backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET, NULL)) {
Stefan Hajnoczi2d3735d2012-01-18 14:40:41 +00002084 return -EBUSY;
2085 }
2086
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002087 ro = bs->backing_hd->read_only;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002088 open_flags = bs->backing_hd->open_flags;
2089
2090 if (ro) {
Jeff Cody0bce5972012-09-20 15:13:34 -04002091 if (bdrv_reopen(bs->backing_hd, open_flags | BDRV_O_RDWR, NULL)) {
2092 return -EACCES;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002093 }
bellard33e39632003-07-06 17:15:21 +00002094 }
bellardea2384d2004-08-01 21:59:26 +00002095
Jeff Cody72706ea2014-01-24 09:02:35 -05002096 length = bdrv_getlength(bs);
2097 if (length < 0) {
2098 ret = length;
2099 goto ro_cleanup;
2100 }
2101
2102 backing_length = bdrv_getlength(bs->backing_hd);
2103 if (backing_length < 0) {
2104 ret = backing_length;
2105 goto ro_cleanup;
2106 }
2107
2108 /* If our top snapshot is larger than the backing file image,
2109 * grow the backing file image if possible. If not possible,
2110 * we must return an error */
2111 if (length > backing_length) {
2112 ret = bdrv_truncate(bs->backing_hd, length);
2113 if (ret < 0) {
2114 goto ro_cleanup;
2115 }
2116 }
2117
2118 total_sectors = length >> BDRV_SECTOR_BITS;
Kevin Wolf857d4f42014-05-20 13:16:51 +02002119
2120 /* qemu_try_blockalign() for bs will choose an alignment that works for
2121 * bs->backing_hd as well, so no need to compare the alignment manually. */
2122 buf = qemu_try_blockalign(bs, COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
2123 if (buf == NULL) {
2124 ret = -ENOMEM;
2125 goto ro_cleanup;
2126 }
bellardea2384d2004-08-01 21:59:26 +00002127
Kevin Wolf8a426612010-07-16 17:17:01 +02002128 for (sector = 0; sector < total_sectors; sector += n) {
Paolo Bonzinid6636402013-09-04 19:00:25 +02002129 ret = bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n);
2130 if (ret < 0) {
2131 goto ro_cleanup;
2132 }
2133 if (ret) {
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002134 ret = bdrv_read(bs, sector, buf, n);
2135 if (ret < 0) {
Kevin Wolf8a426612010-07-16 17:17:01 +02002136 goto ro_cleanup;
2137 }
2138
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002139 ret = bdrv_write(bs->backing_hd, sector, buf, n);
2140 if (ret < 0) {
Kevin Wolf8a426612010-07-16 17:17:01 +02002141 goto ro_cleanup;
2142 }
bellardea2384d2004-08-01 21:59:26 +00002143 }
2144 }
bellard95389c82005-12-18 18:28:15 +00002145
Christoph Hellwig1d449522010-01-17 12:32:30 +01002146 if (drv->bdrv_make_empty) {
2147 ret = drv->bdrv_make_empty(bs);
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002148 if (ret < 0) {
2149 goto ro_cleanup;
2150 }
Christoph Hellwig1d449522010-01-17 12:32:30 +01002151 bdrv_flush(bs);
2152 }
bellard95389c82005-12-18 18:28:15 +00002153
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01002154 /*
2155 * Make sure all data we wrote to the backing device is actually
2156 * stable on disk.
2157 */
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002158 if (bs->backing_hd) {
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01002159 bdrv_flush(bs->backing_hd);
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002160 }
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002161
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002162 ret = 0;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002163ro_cleanup:
Kevin Wolf857d4f42014-05-20 13:16:51 +02002164 qemu_vfree(buf);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002165
2166 if (ro) {
Jeff Cody0bce5972012-09-20 15:13:34 -04002167 /* ignoring error return here */
2168 bdrv_reopen(bs->backing_hd, open_flags & ~BDRV_O_RDWR, NULL);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002169 }
2170
Christoph Hellwig1d449522010-01-17 12:32:30 +01002171 return ret;
bellard33e39632003-07-06 17:15:21 +00002172}
2173
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002174int bdrv_commit_all(void)
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002175{
2176 BlockDriverState *bs;
2177
Benoît Canetdc364f42014-01-23 21:31:32 +01002178 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002179 AioContext *aio_context = bdrv_get_aio_context(bs);
2180
2181 aio_context_acquire(aio_context);
Jeff Cody272d2d82013-02-26 09:55:48 -05002182 if (bs->drv && bs->backing_hd) {
2183 int ret = bdrv_commit(bs);
2184 if (ret < 0) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002185 aio_context_release(aio_context);
Jeff Cody272d2d82013-02-26 09:55:48 -05002186 return ret;
2187 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002188 }
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002189 aio_context_release(aio_context);
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002190 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002191 return 0;
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002192}
2193
Kevin Wolf756e6732010-01-12 12:55:17 +01002194/*
2195 * Return values:
2196 * 0 - success
2197 * -EINVAL - backing format specified, but no file
2198 * -ENOSPC - can't update the backing file because no space is left in the
2199 * image file header
2200 * -ENOTSUP - format driver doesn't support changing the backing file
2201 */
2202int bdrv_change_backing_file(BlockDriverState *bs,
2203 const char *backing_file, const char *backing_fmt)
2204{
2205 BlockDriver *drv = bs->drv;
Paolo Bonzini469ef352012-04-12 14:01:02 +02002206 int ret;
Kevin Wolf756e6732010-01-12 12:55:17 +01002207
Paolo Bonzini5f377792012-04-12 14:01:01 +02002208 /* Backing file format doesn't make sense without a backing file */
2209 if (backing_fmt && !backing_file) {
2210 return -EINVAL;
2211 }
2212
Kevin Wolf756e6732010-01-12 12:55:17 +01002213 if (drv->bdrv_change_backing_file != NULL) {
Paolo Bonzini469ef352012-04-12 14:01:02 +02002214 ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
Kevin Wolf756e6732010-01-12 12:55:17 +01002215 } else {
Paolo Bonzini469ef352012-04-12 14:01:02 +02002216 ret = -ENOTSUP;
Kevin Wolf756e6732010-01-12 12:55:17 +01002217 }
Paolo Bonzini469ef352012-04-12 14:01:02 +02002218
2219 if (ret == 0) {
2220 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_file ?: "");
2221 pstrcpy(bs->backing_format, sizeof(bs->backing_format), backing_fmt ?: "");
2222 }
2223 return ret;
Kevin Wolf756e6732010-01-12 12:55:17 +01002224}
2225
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002226/*
2227 * Finds the image layer in the chain that has 'bs' as its backing file.
2228 *
2229 * active is the current topmost image.
2230 *
2231 * Returns NULL if bs is not found in active's image chain,
2232 * or if active == bs.
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002233 *
2234 * Returns the bottommost base image if bs == NULL.
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002235 */
2236BlockDriverState *bdrv_find_overlay(BlockDriverState *active,
2237 BlockDriverState *bs)
2238{
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002239 while (active && bs != active->backing_hd) {
2240 active = active->backing_hd;
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002241 }
2242
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002243 return active;
2244}
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002245
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002246/* Given a BDS, searches for the base layer. */
2247BlockDriverState *bdrv_find_base(BlockDriverState *bs)
2248{
2249 return bdrv_find_overlay(bs, NULL);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002250}
2251
2252typedef struct BlkIntermediateStates {
2253 BlockDriverState *bs;
2254 QSIMPLEQ_ENTRY(BlkIntermediateStates) entry;
2255} BlkIntermediateStates;
2256
2257
2258/*
2259 * Drops images above 'base' up to and including 'top', and sets the image
2260 * above 'top' to have base as its backing file.
2261 *
2262 * Requires that the overlay to 'top' is opened r/w, so that the backing file
2263 * information in 'bs' can be properly updated.
2264 *
2265 * E.g., this will convert the following chain:
2266 * bottom <- base <- intermediate <- top <- active
2267 *
2268 * to
2269 *
2270 * bottom <- base <- active
2271 *
2272 * It is allowed for bottom==base, in which case it converts:
2273 *
2274 * base <- intermediate <- top <- active
2275 *
2276 * to
2277 *
2278 * base <- active
2279 *
Jeff Cody54e26902014-06-25 15:40:10 -04002280 * If backing_file_str is non-NULL, it will be used when modifying top's
2281 * overlay image metadata.
2282 *
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002283 * Error conditions:
2284 * if active == top, that is considered an error
2285 *
2286 */
2287int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
Jeff Cody54e26902014-06-25 15:40:10 -04002288 BlockDriverState *base, const char *backing_file_str)
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002289{
2290 BlockDriverState *intermediate;
2291 BlockDriverState *base_bs = NULL;
2292 BlockDriverState *new_top_bs = NULL;
2293 BlkIntermediateStates *intermediate_state, *next;
2294 int ret = -EIO;
2295
2296 QSIMPLEQ_HEAD(states_to_delete, BlkIntermediateStates) states_to_delete;
2297 QSIMPLEQ_INIT(&states_to_delete);
2298
2299 if (!top->drv || !base->drv) {
2300 goto exit;
2301 }
2302
2303 new_top_bs = bdrv_find_overlay(active, top);
2304
2305 if (new_top_bs == NULL) {
2306 /* we could not find the image above 'top', this is an error */
2307 goto exit;
2308 }
2309
2310 /* special case of new_top_bs->backing_hd already pointing to base - nothing
2311 * to do, no intermediate images */
2312 if (new_top_bs->backing_hd == base) {
2313 ret = 0;
2314 goto exit;
2315 }
2316
2317 intermediate = top;
2318
2319 /* now we will go down through the list, and add each BDS we find
2320 * into our deletion queue, until we hit the 'base'
2321 */
2322 while (intermediate) {
Markus Armbruster5839e532014-08-19 10:31:08 +02002323 intermediate_state = g_new0(BlkIntermediateStates, 1);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002324 intermediate_state->bs = intermediate;
2325 QSIMPLEQ_INSERT_TAIL(&states_to_delete, intermediate_state, entry);
2326
2327 if (intermediate->backing_hd == base) {
2328 base_bs = intermediate->backing_hd;
2329 break;
2330 }
2331 intermediate = intermediate->backing_hd;
2332 }
2333 if (base_bs == NULL) {
2334 /* something went wrong, we did not end at the base. safely
2335 * unravel everything, and exit with error */
2336 goto exit;
2337 }
2338
2339 /* success - we can delete the intermediate states, and link top->base */
Jeff Cody54e26902014-06-25 15:40:10 -04002340 backing_file_str = backing_file_str ? backing_file_str : base_bs->filename;
2341 ret = bdrv_change_backing_file(new_top_bs, backing_file_str,
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002342 base_bs->drv ? base_bs->drv->format_name : "");
2343 if (ret) {
2344 goto exit;
2345 }
Fam Zheng920beae2014-05-23 21:29:46 +08002346 bdrv_set_backing_hd(new_top_bs, base_bs);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002347
2348 QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
2349 /* so that bdrv_close() does not recursively close the chain */
Fam Zheng920beae2014-05-23 21:29:46 +08002350 bdrv_set_backing_hd(intermediate_state->bs, NULL);
Fam Zheng4f6fd342013-08-23 09:14:47 +08002351 bdrv_unref(intermediate_state->bs);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002352 }
2353 ret = 0;
2354
2355exit:
2356 QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
2357 g_free(intermediate_state);
2358 }
2359 return ret;
2360}
2361
bellard83f64092006-08-01 16:21:11 +00002362/**
bellard83f64092006-08-01 16:21:11 +00002363 * Truncate file to 'offset' bytes (needed only for file protocols)
2364 */
2365int bdrv_truncate(BlockDriverState *bs, int64_t offset)
2366{
2367 BlockDriver *drv = bs->drv;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002368 int ret;
bellard83f64092006-08-01 16:21:11 +00002369 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002370 return -ENOMEDIUM;
bellard83f64092006-08-01 16:21:11 +00002371 if (!drv->bdrv_truncate)
2372 return -ENOTSUP;
Naphtali Sprei59f26892009-10-26 16:25:16 +02002373 if (bs->read_only)
2374 return -EACCES;
Jeff Cody9c75e162014-06-25 16:55:30 -04002375
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002376 ret = drv->bdrv_truncate(bs, offset);
2377 if (ret == 0) {
2378 ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
John Snowce1ffea2015-04-17 19:50:03 -04002379 bdrv_dirty_bitmap_truncate(bs);
Markus Armbrustera7f53e22014-10-07 13:59:25 +02002380 if (bs->blk) {
2381 blk_dev_resize_cb(bs->blk);
2382 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002383 }
2384 return ret;
bellard83f64092006-08-01 16:21:11 +00002385}
2386
2387/**
Fam Zheng4a1d5e12011-07-12 19:56:39 +08002388 * Length of a allocated file in bytes. Sparse files are counted by actual
2389 * allocated space. Return < 0 if error or unknown.
2390 */
2391int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
2392{
2393 BlockDriver *drv = bs->drv;
2394 if (!drv) {
2395 return -ENOMEDIUM;
2396 }
2397 if (drv->bdrv_get_allocated_file_size) {
2398 return drv->bdrv_get_allocated_file_size(bs);
2399 }
2400 if (bs->file) {
2401 return bdrv_get_allocated_file_size(bs->file);
2402 }
2403 return -ENOTSUP;
2404}
2405
2406/**
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002407 * Return number of sectors on success, -errno on error.
bellard83f64092006-08-01 16:21:11 +00002408 */
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002409int64_t bdrv_nb_sectors(BlockDriverState *bs)
bellard83f64092006-08-01 16:21:11 +00002410{
2411 BlockDriver *drv = bs->drv;
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002412
bellard83f64092006-08-01 16:21:11 +00002413 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002414 return -ENOMEDIUM;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01002415
Kevin Wolfb94a2612013-10-29 12:18:58 +01002416 if (drv->has_variable_length) {
2417 int ret = refresh_total_sectors(bs, bs->total_sectors);
2418 if (ret < 0) {
2419 return ret;
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01002420 }
bellard83f64092006-08-01 16:21:11 +00002421 }
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002422 return bs->total_sectors;
2423}
2424
2425/**
2426 * Return length in bytes on success, -errno on error.
2427 * The length is always a multiple of BDRV_SECTOR_SIZE.
2428 */
2429int64_t bdrv_getlength(BlockDriverState *bs)
2430{
2431 int64_t ret = bdrv_nb_sectors(bs);
2432
Fam Zheng4a9c9ea2015-05-15 16:36:05 +08002433 ret = ret > INT64_MAX / BDRV_SECTOR_SIZE ? -EFBIG : ret;
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002434 return ret < 0 ? ret : ret * BDRV_SECTOR_SIZE;
bellardfc01f7e2003-06-30 10:03:06 +00002435}
2436
bellard19cb3732006-08-19 11:45:59 +00002437/* return 0 as number of sectors if no device present or error */
ths96b8f132007-12-17 01:35:20 +00002438void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
bellardfc01f7e2003-06-30 10:03:06 +00002439{
Markus Armbruster65a9bb22014-06-26 13:23:17 +02002440 int64_t nb_sectors = bdrv_nb_sectors(bs);
2441
2442 *nb_sectors_ptr = nb_sectors < 0 ? 0 : nb_sectors;
bellardfc01f7e2003-06-30 10:03:06 +00002443}
bellardcf989512004-02-16 21:56:36 +00002444
Paolo Bonziniff06f5f2012-09-28 17:22:54 +02002445void bdrv_set_on_error(BlockDriverState *bs, BlockdevOnError on_read_error,
2446 BlockdevOnError on_write_error)
Markus Armbrusterabd7f682010-06-02 18:55:17 +02002447{
2448 bs->on_read_error = on_read_error;
2449 bs->on_write_error = on_write_error;
2450}
2451
Paolo Bonzini1ceee0d2012-09-28 17:22:56 +02002452BlockdevOnError bdrv_get_on_error(BlockDriverState *bs, bool is_read)
Markus Armbrusterabd7f682010-06-02 18:55:17 +02002453{
2454 return is_read ? bs->on_read_error : bs->on_write_error;
2455}
2456
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002457BlockErrorAction bdrv_get_error_action(BlockDriverState *bs, bool is_read, int error)
2458{
2459 BlockdevOnError on_err = is_read ? bs->on_read_error : bs->on_write_error;
2460
2461 switch (on_err) {
2462 case BLOCKDEV_ON_ERROR_ENOSPC:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002463 return (error == ENOSPC) ?
2464 BLOCK_ERROR_ACTION_STOP : BLOCK_ERROR_ACTION_REPORT;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002465 case BLOCKDEV_ON_ERROR_STOP:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002466 return BLOCK_ERROR_ACTION_STOP;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002467 case BLOCKDEV_ON_ERROR_REPORT:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002468 return BLOCK_ERROR_ACTION_REPORT;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002469 case BLOCKDEV_ON_ERROR_IGNORE:
Wenchao Xiaa5895692014-06-18 08:43:30 +02002470 return BLOCK_ERROR_ACTION_IGNORE;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002471 default:
2472 abort();
2473 }
2474}
2475
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002476static void send_qmp_error_event(BlockDriverState *bs,
2477 BlockErrorAction action,
2478 bool is_read, int error)
2479{
Peter Maydell573742a2014-10-10 20:33:03 +01002480 IoOperationType optype;
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002481
Peter Maydell573742a2014-10-10 20:33:03 +01002482 optype = is_read ? IO_OPERATION_TYPE_READ : IO_OPERATION_TYPE_WRITE;
2483 qapi_event_send_block_io_error(bdrv_get_device_name(bs), optype, action,
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002484 bdrv_iostatus_is_enabled(bs),
Luiz Capitulino624ff572014-09-11 10:25:48 -04002485 error == ENOSPC, strerror(error),
2486 &error_abort);
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002487}
2488
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002489/* This is done by device models because, while the block layer knows
2490 * about the error, it does not know whether an operation comes from
2491 * the device or the block layer (from a job, for example).
2492 */
2493void bdrv_error_action(BlockDriverState *bs, BlockErrorAction action,
2494 bool is_read, int error)
2495{
2496 assert(error >= 0);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002497
Wenchao Xiaa5895692014-06-18 08:43:30 +02002498 if (action == BLOCK_ERROR_ACTION_STOP) {
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002499 /* First set the iostatus, so that "info block" returns an iostatus
2500 * that matches the events raised so far (an additional error iostatus
2501 * is fine, but not a lost one).
2502 */
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002503 bdrv_iostatus_set_err(bs, error);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002504
2505 /* Then raise the request to stop the VM and the event.
2506 * qemu_system_vmstop_request_prepare has two effects. First,
2507 * it ensures that the STOP event always comes after the
2508 * BLOCK_IO_ERROR event. Second, it ensures that even if management
2509 * can observe the STOP event and do a "cont" before the STOP
2510 * event is issued, the VM will not stop. In this case, vm_start()
2511 * also ensures that the STOP/RESUME pair of events is emitted.
2512 */
2513 qemu_system_vmstop_request_prepare();
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002514 send_qmp_error_event(bs, action, is_read, error);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02002515 qemu_system_vmstop_request(RUN_STATE_IO_ERROR);
2516 } else {
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04002517 send_qmp_error_event(bs, action, is_read, error);
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02002518 }
2519}
2520
bellardb3380822004-03-14 21:38:54 +00002521int bdrv_is_read_only(BlockDriverState *bs)
2522{
2523 return bs->read_only;
2524}
2525
ths985a03b2007-12-24 16:10:43 +00002526int bdrv_is_sg(BlockDriverState *bs)
2527{
2528 return bs->sg;
2529}
2530
Christoph Hellwige900a7b2009-09-04 19:01:15 +02002531int bdrv_enable_write_cache(BlockDriverState *bs)
2532{
2533 return bs->enable_write_cache;
2534}
2535
Paolo Bonzini425b0142012-06-06 00:04:52 +02002536void bdrv_set_enable_write_cache(BlockDriverState *bs, bool wce)
2537{
2538 bs->enable_write_cache = wce;
Jeff Cody55b110f2012-09-20 15:13:18 -04002539
2540 /* so a reopen() will preserve wce */
2541 if (wce) {
2542 bs->open_flags |= BDRV_O_CACHE_WB;
2543 } else {
2544 bs->open_flags &= ~BDRV_O_CACHE_WB;
2545 }
Paolo Bonzini425b0142012-06-06 00:04:52 +02002546}
2547
bellardea2384d2004-08-01 21:59:26 +00002548int bdrv_is_encrypted(BlockDriverState *bs)
2549{
2550 if (bs->backing_hd && bs->backing_hd->encrypted)
2551 return 1;
2552 return bs->encrypted;
2553}
2554
aliguoric0f4ce72009-03-05 23:01:01 +00002555int bdrv_key_required(BlockDriverState *bs)
2556{
2557 BlockDriverState *backing_hd = bs->backing_hd;
2558
2559 if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
2560 return 1;
2561 return (bs->encrypted && !bs->valid_key);
2562}
2563
bellardea2384d2004-08-01 21:59:26 +00002564int bdrv_set_key(BlockDriverState *bs, const char *key)
2565{
2566 int ret;
2567 if (bs->backing_hd && bs->backing_hd->encrypted) {
2568 ret = bdrv_set_key(bs->backing_hd, key);
2569 if (ret < 0)
2570 return ret;
2571 if (!bs->encrypted)
2572 return 0;
2573 }
Shahar Havivifd04a2a2010-03-06 00:26:13 +02002574 if (!bs->encrypted) {
2575 return -EINVAL;
2576 } else if (!bs->drv || !bs->drv->bdrv_set_key) {
2577 return -ENOMEDIUM;
2578 }
aliguoric0f4ce72009-03-05 23:01:01 +00002579 ret = bs->drv->bdrv_set_key(bs, key);
aliguoribb5fc202009-03-05 23:01:15 +00002580 if (ret < 0) {
2581 bs->valid_key = 0;
2582 } else if (!bs->valid_key) {
2583 bs->valid_key = 1;
Markus Armbrustera7f53e22014-10-07 13:59:25 +02002584 if (bs->blk) {
2585 /* call the change callback now, we skipped it on open */
2586 blk_dev_change_media_cb(bs->blk, true);
2587 }
aliguoribb5fc202009-03-05 23:01:15 +00002588 }
aliguoric0f4ce72009-03-05 23:01:01 +00002589 return ret;
bellardea2384d2004-08-01 21:59:26 +00002590}
2591
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002592/*
2593 * Provide an encryption key for @bs.
2594 * If @key is non-null:
2595 * If @bs is not encrypted, fail.
2596 * Else if the key is invalid, fail.
2597 * Else set @bs's key to @key, replacing the existing key, if any.
2598 * If @key is null:
2599 * If @bs is encrypted and still lacks a key, fail.
2600 * Else do nothing.
2601 * On failure, store an error object through @errp if non-null.
2602 */
2603void bdrv_add_key(BlockDriverState *bs, const char *key, Error **errp)
2604{
2605 if (key) {
2606 if (!bdrv_is_encrypted(bs)) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03002607 error_setg(errp, "Node '%s' is not encrypted",
2608 bdrv_get_device_or_node_name(bs));
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002609 } else if (bdrv_set_key(bs, key) < 0) {
2610 error_set(errp, QERR_INVALID_PASSWORD);
2611 }
2612 } else {
2613 if (bdrv_key_required(bs)) {
Markus Armbrusterb1ca6392015-01-29 10:37:01 +01002614 error_set(errp, ERROR_CLASS_DEVICE_ENCRYPTED,
2615 "'%s' (%s) is encrypted",
Alberto Garcia81e5f782015-04-08 12:29:19 +03002616 bdrv_get_device_or_node_name(bs),
Markus Armbruster4d2855a2015-01-29 10:37:00 +01002617 bdrv_get_encrypted_filename(bs));
2618 }
2619 }
2620}
2621
Markus Armbrusterf8d6bba2012-06-13 10:11:48 +02002622const char *bdrv_get_format_name(BlockDriverState *bs)
bellardea2384d2004-08-01 21:59:26 +00002623{
Markus Armbrusterf8d6bba2012-06-13 10:11:48 +02002624 return bs->drv ? bs->drv->format_name : NULL;
bellardea2384d2004-08-01 21:59:26 +00002625}
2626
Stefan Hajnocziada42402014-08-27 12:08:55 +01002627static int qsort_strcmp(const void *a, const void *b)
2628{
2629 return strcmp(a, b);
2630}
2631
ths5fafdf22007-09-16 21:08:06 +00002632void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
bellardea2384d2004-08-01 21:59:26 +00002633 void *opaque)
2634{
2635 BlockDriver *drv;
Jeff Codye855e4f2014-04-28 18:29:54 -04002636 int count = 0;
Stefan Hajnocziada42402014-08-27 12:08:55 +01002637 int i;
Jeff Codye855e4f2014-04-28 18:29:54 -04002638 const char **formats = NULL;
bellardea2384d2004-08-01 21:59:26 +00002639
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +01002640 QLIST_FOREACH(drv, &bdrv_drivers, list) {
Jeff Codye855e4f2014-04-28 18:29:54 -04002641 if (drv->format_name) {
2642 bool found = false;
2643 int i = count;
2644 while (formats && i && !found) {
2645 found = !strcmp(formats[--i], drv->format_name);
2646 }
2647
2648 if (!found) {
Markus Armbruster5839e532014-08-19 10:31:08 +02002649 formats = g_renew(const char *, formats, count + 1);
Jeff Codye855e4f2014-04-28 18:29:54 -04002650 formats[count++] = drv->format_name;
Jeff Codye855e4f2014-04-28 18:29:54 -04002651 }
2652 }
bellardea2384d2004-08-01 21:59:26 +00002653 }
Stefan Hajnocziada42402014-08-27 12:08:55 +01002654
2655 qsort(formats, count, sizeof(formats[0]), qsort_strcmp);
2656
2657 for (i = 0; i < count; i++) {
2658 it(opaque, formats[i]);
2659 }
2660
Jeff Codye855e4f2014-04-28 18:29:54 -04002661 g_free(formats);
bellardea2384d2004-08-01 21:59:26 +00002662}
2663
Benoît Canetdc364f42014-01-23 21:31:32 +01002664/* This function is to find a node in the bs graph */
2665BlockDriverState *bdrv_find_node(const char *node_name)
2666{
2667 BlockDriverState *bs;
2668
2669 assert(node_name);
2670
2671 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
2672 if (!strcmp(node_name, bs->node_name)) {
2673 return bs;
2674 }
2675 }
2676 return NULL;
2677}
2678
Benoît Canetc13163f2014-01-23 21:31:34 +01002679/* Put this QMP function here so it can access the static graph_bdrv_states. */
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002680BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp)
Benoît Canetc13163f2014-01-23 21:31:34 +01002681{
2682 BlockDeviceInfoList *list, *entry;
2683 BlockDriverState *bs;
2684
2685 list = NULL;
2686 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002687 BlockDeviceInfo *info = bdrv_block_device_info(bs, errp);
2688 if (!info) {
2689 qapi_free_BlockDeviceInfoList(list);
2690 return NULL;
2691 }
Benoît Canetc13163f2014-01-23 21:31:34 +01002692 entry = g_malloc0(sizeof(*entry));
Alberto Garciad5a8ee62015-04-17 14:52:43 +03002693 entry->value = info;
Benoît Canetc13163f2014-01-23 21:31:34 +01002694 entry->next = list;
2695 list = entry;
2696 }
2697
2698 return list;
2699}
2700
Benoît Canet12d3ba82014-01-23 21:31:35 +01002701BlockDriverState *bdrv_lookup_bs(const char *device,
2702 const char *node_name,
2703 Error **errp)
2704{
Markus Armbruster7f06d472014-10-07 13:59:12 +02002705 BlockBackend *blk;
2706 BlockDriverState *bs;
Benoît Canet12d3ba82014-01-23 21:31:35 +01002707
Benoît Canet12d3ba82014-01-23 21:31:35 +01002708 if (device) {
Markus Armbruster7f06d472014-10-07 13:59:12 +02002709 blk = blk_by_name(device);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002710
Markus Armbruster7f06d472014-10-07 13:59:12 +02002711 if (blk) {
2712 return blk_bs(blk);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002713 }
Benoît Canet12d3ba82014-01-23 21:31:35 +01002714 }
2715
Benoît Canetdd67fa52014-02-12 17:15:06 +01002716 if (node_name) {
2717 bs = bdrv_find_node(node_name);
Benoît Canet12d3ba82014-01-23 21:31:35 +01002718
Benoît Canetdd67fa52014-02-12 17:15:06 +01002719 if (bs) {
2720 return bs;
2721 }
Benoît Canet12d3ba82014-01-23 21:31:35 +01002722 }
2723
Benoît Canetdd67fa52014-02-12 17:15:06 +01002724 error_setg(errp, "Cannot find device=%s nor node_name=%s",
2725 device ? device : "",
2726 node_name ? node_name : "");
2727 return NULL;
Benoît Canet12d3ba82014-01-23 21:31:35 +01002728}
2729
Jeff Cody5a6684d2014-06-25 15:40:09 -04002730/* If 'base' is in the same chain as 'top', return true. Otherwise,
2731 * return false. If either argument is NULL, return false. */
2732bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
2733{
2734 while (top && top != base) {
2735 top = top->backing_hd;
2736 }
2737
2738 return top != NULL;
2739}
2740
Fam Zheng04df7652014-10-31 11:32:54 +08002741BlockDriverState *bdrv_next_node(BlockDriverState *bs)
2742{
2743 if (!bs) {
2744 return QTAILQ_FIRST(&graph_bdrv_states);
2745 }
2746 return QTAILQ_NEXT(bs, node_list);
2747}
2748
Markus Armbruster2f399b02010-06-02 18:55:20 +02002749BlockDriverState *bdrv_next(BlockDriverState *bs)
2750{
2751 if (!bs) {
2752 return QTAILQ_FIRST(&bdrv_states);
2753 }
Benoît Canetdc364f42014-01-23 21:31:32 +01002754 return QTAILQ_NEXT(bs, device_list);
Markus Armbruster2f399b02010-06-02 18:55:20 +02002755}
2756
Fam Zheng20a9e772014-10-31 11:32:55 +08002757const char *bdrv_get_node_name(const BlockDriverState *bs)
2758{
2759 return bs->node_name;
2760}
2761
Markus Armbruster7f06d472014-10-07 13:59:12 +02002762/* TODO check what callers really want: bs->node_name or blk_name() */
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02002763const char *bdrv_get_device_name(const BlockDriverState *bs)
bellardea2384d2004-08-01 21:59:26 +00002764{
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02002765 return bs->blk ? blk_name(bs->blk) : "";
bellardea2384d2004-08-01 21:59:26 +00002766}
2767
Alberto Garcia9b2aa842015-04-08 12:29:18 +03002768/* This can be used to identify nodes that might not have a device
2769 * name associated. Since node and device names live in the same
2770 * namespace, the result is unambiguous. The exception is if both are
2771 * absent, then this returns an empty (non-null) string. */
2772const char *bdrv_get_device_or_node_name(const BlockDriverState *bs)
2773{
2774 return bs->blk ? blk_name(bs->blk) : bs->node_name;
2775}
2776
Markus Armbrusterc8433282012-06-05 16:49:24 +02002777int bdrv_get_flags(BlockDriverState *bs)
2778{
2779 return bs->open_flags;
2780}
2781
Peter Lieven3ac21622013-06-28 12:47:42 +02002782int bdrv_has_zero_init_1(BlockDriverState *bs)
2783{
2784 return 1;
2785}
2786
Kevin Wolff2feebb2010-04-14 17:30:35 +02002787int bdrv_has_zero_init(BlockDriverState *bs)
2788{
2789 assert(bs->drv);
2790
Paolo Bonzini11212d82013-09-04 19:00:27 +02002791 /* If BS is a copy on write image, it is initialized to
2792 the contents of the base image, which may not be zeroes. */
2793 if (bs->backing_hd) {
2794 return 0;
2795 }
Kevin Wolf336c1c12010-07-28 11:26:29 +02002796 if (bs->drv->bdrv_has_zero_init) {
2797 return bs->drv->bdrv_has_zero_init(bs);
Kevin Wolff2feebb2010-04-14 17:30:35 +02002798 }
2799
Peter Lieven3ac21622013-06-28 12:47:42 +02002800 /* safe default */
2801 return 0;
Kevin Wolff2feebb2010-04-14 17:30:35 +02002802}
2803
Peter Lieven4ce78692013-10-24 12:06:54 +02002804bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs)
2805{
2806 BlockDriverInfo bdi;
2807
2808 if (bs->backing_hd) {
2809 return false;
2810 }
2811
2812 if (bdrv_get_info(bs, &bdi) == 0) {
2813 return bdi.unallocated_blocks_are_zero;
2814 }
2815
2816 return false;
2817}
2818
2819bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs)
2820{
2821 BlockDriverInfo bdi;
2822
2823 if (bs->backing_hd || !(bs->open_flags & BDRV_O_UNMAP)) {
2824 return false;
2825 }
2826
2827 if (bdrv_get_info(bs, &bdi) == 0) {
2828 return bdi.can_write_zeroes_with_unmap;
2829 }
2830
2831 return false;
2832}
2833
aliguori045df332009-03-05 23:00:48 +00002834const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
2835{
2836 if (bs->backing_hd && bs->backing_hd->encrypted)
2837 return bs->backing_file;
2838 else if (bs->encrypted)
2839 return bs->filename;
2840 else
2841 return NULL;
2842}
2843
ths5fafdf22007-09-16 21:08:06 +00002844void bdrv_get_backing_filename(BlockDriverState *bs,
bellard83f64092006-08-01 16:21:11 +00002845 char *filename, int filename_size)
bellardea2384d2004-08-01 21:59:26 +00002846{
Kevin Wolf3574c602011-10-26 11:02:11 +02002847 pstrcpy(filename, filename_size, bs->backing_file);
bellardea2384d2004-08-01 21:59:26 +00002848}
2849
bellardfaea38e2006-08-05 21:31:00 +00002850int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
2851{
2852 BlockDriver *drv = bs->drv;
2853 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002854 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00002855 if (!drv->bdrv_get_info)
2856 return -ENOTSUP;
2857 memset(bdi, 0, sizeof(*bdi));
2858 return drv->bdrv_get_info(bs, bdi);
2859}
2860
Max Reitzeae041f2013-10-09 10:46:16 +02002861ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs)
2862{
2863 BlockDriver *drv = bs->drv;
2864 if (drv && drv->bdrv_get_specific_info) {
2865 return drv->bdrv_get_specific_info(bs);
2866 }
2867 return NULL;
2868}
2869
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002870void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event)
2871{
Kevin Wolfbf736fe2013-06-05 15:17:55 +02002872 if (!bs || !bs->drv || !bs->drv->bdrv_debug_event) {
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002873 return;
2874 }
2875
Kevin Wolfbf736fe2013-06-05 15:17:55 +02002876 bs->drv->bdrv_debug_event(bs, event);
Kevin Wolf41c695c2012-12-06 14:32:58 +01002877}
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002878
Kevin Wolf41c695c2012-12-06 14:32:58 +01002879int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
2880 const char *tag)
2881{
2882 while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) {
2883 bs = bs->file;
2884 }
2885
2886 if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) {
2887 return bs->drv->bdrv_debug_breakpoint(bs, event, tag);
2888 }
2889
2890 return -ENOTSUP;
2891}
2892
Fam Zheng4cc70e92013-11-20 10:01:54 +08002893int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag)
2894{
2895 while (bs && bs->drv && !bs->drv->bdrv_debug_remove_breakpoint) {
2896 bs = bs->file;
2897 }
2898
2899 if (bs && bs->drv && bs->drv->bdrv_debug_remove_breakpoint) {
2900 return bs->drv->bdrv_debug_remove_breakpoint(bs, tag);
2901 }
2902
2903 return -ENOTSUP;
2904}
2905
Kevin Wolf41c695c2012-12-06 14:32:58 +01002906int bdrv_debug_resume(BlockDriverState *bs, const char *tag)
2907{
Max Reitz938789e2014-03-10 23:44:08 +01002908 while (bs && (!bs->drv || !bs->drv->bdrv_debug_resume)) {
Kevin Wolf41c695c2012-12-06 14:32:58 +01002909 bs = bs->file;
2910 }
2911
2912 if (bs && bs->drv && bs->drv->bdrv_debug_resume) {
2913 return bs->drv->bdrv_debug_resume(bs, tag);
2914 }
2915
2916 return -ENOTSUP;
2917}
2918
2919bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag)
2920{
2921 while (bs && bs->drv && !bs->drv->bdrv_debug_is_suspended) {
2922 bs = bs->file;
2923 }
2924
2925 if (bs && bs->drv && bs->drv->bdrv_debug_is_suspended) {
2926 return bs->drv->bdrv_debug_is_suspended(bs, tag);
2927 }
2928
2929 return false;
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002930}
2931
Blue Swirl199630b2010-07-25 20:49:34 +00002932int bdrv_is_snapshot(BlockDriverState *bs)
2933{
2934 return !!(bs->open_flags & BDRV_O_SNAPSHOT);
2935}
2936
Jeff Codyb1b1d782012-10-16 15:49:09 -04002937/* backing_file can either be relative, or absolute, or a protocol. If it is
2938 * relative, it must be relative to the chain. So, passing in bs->filename
2939 * from a BDS as backing_file should not be done, as that may be relative to
2940 * the CWD rather than the chain. */
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002941BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
2942 const char *backing_file)
2943{
Jeff Codyb1b1d782012-10-16 15:49:09 -04002944 char *filename_full = NULL;
2945 char *backing_file_full = NULL;
2946 char *filename_tmp = NULL;
2947 int is_protocol = 0;
2948 BlockDriverState *curr_bs = NULL;
2949 BlockDriverState *retval = NULL;
2950
2951 if (!bs || !bs->drv || !backing_file) {
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002952 return NULL;
2953 }
2954
Jeff Codyb1b1d782012-10-16 15:49:09 -04002955 filename_full = g_malloc(PATH_MAX);
2956 backing_file_full = g_malloc(PATH_MAX);
2957 filename_tmp = g_malloc(PATH_MAX);
2958
2959 is_protocol = path_has_protocol(backing_file);
2960
2961 for (curr_bs = bs; curr_bs->backing_hd; curr_bs = curr_bs->backing_hd) {
2962
2963 /* If either of the filename paths is actually a protocol, then
2964 * compare unmodified paths; otherwise make paths relative */
2965 if (is_protocol || path_has_protocol(curr_bs->backing_file)) {
2966 if (strcmp(backing_file, curr_bs->backing_file) == 0) {
2967 retval = curr_bs->backing_hd;
2968 break;
2969 }
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002970 } else {
Jeff Codyb1b1d782012-10-16 15:49:09 -04002971 /* If not an absolute filename path, make it relative to the current
2972 * image's filename path */
2973 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
2974 backing_file);
2975
2976 /* We are going to compare absolute pathnames */
2977 if (!realpath(filename_tmp, filename_full)) {
2978 continue;
2979 }
2980
2981 /* We need to make sure the backing filename we are comparing against
2982 * is relative to the current image filename (or absolute) */
2983 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
2984 curr_bs->backing_file);
2985
2986 if (!realpath(filename_tmp, backing_file_full)) {
2987 continue;
2988 }
2989
2990 if (strcmp(backing_file_full, filename_full) == 0) {
2991 retval = curr_bs->backing_hd;
2992 break;
2993 }
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002994 }
2995 }
2996
Jeff Codyb1b1d782012-10-16 15:49:09 -04002997 g_free(filename_full);
2998 g_free(backing_file_full);
2999 g_free(filename_tmp);
3000 return retval;
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00003001}
3002
Benoît Canetf198fd12012-08-02 10:22:47 +02003003int bdrv_get_backing_file_depth(BlockDriverState *bs)
3004{
3005 if (!bs->drv) {
3006 return 0;
3007 }
3008
3009 if (!bs->backing_hd) {
3010 return 0;
3011 }
3012
3013 return 1 + bdrv_get_backing_file_depth(bs->backing_hd);
3014}
3015
bellardea2384d2004-08-01 21:59:26 +00003016void bdrv_init(void)
3017{
Anthony Liguori5efa9d52009-05-09 17:03:42 -05003018 module_call_init(MODULE_INIT_BLOCK);
bellardea2384d2004-08-01 21:59:26 +00003019}
pbrookce1a14d2006-08-07 02:38:06 +00003020
Markus Armbrustereb852012009-10-27 18:41:44 +01003021void bdrv_init_with_whitelist(void)
3022{
3023 use_bdrv_whitelist = 1;
3024 bdrv_init();
3025}
3026
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003027void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
Anthony Liguori0f154232011-11-14 15:09:45 -06003028{
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003029 Error *local_err = NULL;
3030 int ret;
3031
Kevin Wolf3456a8d2014-03-11 10:58:39 +01003032 if (!bs->drv) {
3033 return;
Anthony Liguori0f154232011-11-14 15:09:45 -06003034 }
Kevin Wolf3456a8d2014-03-11 10:58:39 +01003035
Alexey Kardashevskiy7ea2d262014-10-09 13:50:46 +11003036 if (!(bs->open_flags & BDRV_O_INCOMING)) {
3037 return;
3038 }
3039 bs->open_flags &= ~BDRV_O_INCOMING;
3040
Kevin Wolf3456a8d2014-03-11 10:58:39 +01003041 if (bs->drv->bdrv_invalidate_cache) {
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003042 bs->drv->bdrv_invalidate_cache(bs, &local_err);
Kevin Wolf3456a8d2014-03-11 10:58:39 +01003043 } else if (bs->file) {
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003044 bdrv_invalidate_cache(bs->file, &local_err);
3045 }
3046 if (local_err) {
3047 error_propagate(errp, local_err);
3048 return;
Kevin Wolf3456a8d2014-03-11 10:58:39 +01003049 }
3050
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003051 ret = refresh_total_sectors(bs, bs->total_sectors);
3052 if (ret < 0) {
3053 error_setg_errno(errp, -ret, "Could not refresh total sector count");
3054 return;
3055 }
Anthony Liguori0f154232011-11-14 15:09:45 -06003056}
3057
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003058void bdrv_invalidate_cache_all(Error **errp)
Anthony Liguori0f154232011-11-14 15:09:45 -06003059{
3060 BlockDriverState *bs;
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003061 Error *local_err = NULL;
Anthony Liguori0f154232011-11-14 15:09:45 -06003062
Benoît Canetdc364f42014-01-23 21:31:32 +01003063 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02003064 AioContext *aio_context = bdrv_get_aio_context(bs);
3065
3066 aio_context_acquire(aio_context);
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003067 bdrv_invalidate_cache(bs, &local_err);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02003068 aio_context_release(aio_context);
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01003069 if (local_err) {
3070 error_propagate(errp, local_err);
3071 return;
3072 }
Anthony Liguori0f154232011-11-14 15:09:45 -06003073 }
3074}
3075
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003076/**************************************************************/
bellard19cb3732006-08-19 11:45:59 +00003077/* removable device support */
3078
3079/**
3080 * Return TRUE if the media is present
3081 */
3082int bdrv_is_inserted(BlockDriverState *bs)
3083{
3084 BlockDriver *drv = bs->drv;
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003085
bellard19cb3732006-08-19 11:45:59 +00003086 if (!drv)
3087 return 0;
3088 if (!drv->bdrv_is_inserted)
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003089 return 1;
3090 return drv->bdrv_is_inserted(bs);
bellard19cb3732006-08-19 11:45:59 +00003091}
3092
3093/**
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003094 * Return whether the media changed since the last call to this
3095 * function, or -ENOTSUP if we don't know. Most drivers don't know.
bellard19cb3732006-08-19 11:45:59 +00003096 */
3097int bdrv_media_changed(BlockDriverState *bs)
3098{
3099 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003100
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003101 if (drv && drv->bdrv_media_changed) {
3102 return drv->bdrv_media_changed(bs);
3103 }
3104 return -ENOTSUP;
bellard19cb3732006-08-19 11:45:59 +00003105}
3106
3107/**
3108 * If eject_flag is TRUE, eject the media. Otherwise, close the tray
3109 */
Luiz Capitulinof36f3942012-02-03 16:24:53 -02003110void bdrv_eject(BlockDriverState *bs, bool eject_flag)
bellard19cb3732006-08-19 11:45:59 +00003111{
3112 BlockDriver *drv = bs->drv;
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003113 const char *device_name;
bellard19cb3732006-08-19 11:45:59 +00003114
Markus Armbruster822e1cd2011-07-20 18:23:42 +02003115 if (drv && drv->bdrv_eject) {
3116 drv->bdrv_eject(bs, eject_flag);
bellard19cb3732006-08-19 11:45:59 +00003117 }
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02003118
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003119 device_name = bdrv_get_device_name(bs);
3120 if (device_name[0] != '\0') {
3121 qapi_event_send_device_tray_moved(device_name,
Wenchao Xiaa5ee7bd2014-06-18 08:43:44 +02003122 eject_flag, &error_abort);
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02003123 }
bellard19cb3732006-08-19 11:45:59 +00003124}
3125
bellard19cb3732006-08-19 11:45:59 +00003126/**
3127 * Lock or unlock the media (if it is locked, the user won't be able
3128 * to eject it manually).
3129 */
Markus Armbruster025e8492011-09-06 18:58:47 +02003130void bdrv_lock_medium(BlockDriverState *bs, bool locked)
bellard19cb3732006-08-19 11:45:59 +00003131{
3132 BlockDriver *drv = bs->drv;
3133
Markus Armbruster025e8492011-09-06 18:58:47 +02003134 trace_bdrv_lock_medium(bs, locked);
Stefan Hajnoczib8c6d092011-03-29 20:04:40 +01003135
Markus Armbruster025e8492011-09-06 18:58:47 +02003136 if (drv && drv->bdrv_lock_medium) {
3137 drv->bdrv_lock_medium(bs, locked);
bellard19cb3732006-08-19 11:45:59 +00003138 }
3139}
ths985a03b2007-12-24 16:10:43 +00003140
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01003141void bdrv_set_guest_block_size(BlockDriverState *bs, int align)
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003142{
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01003143 bs->guest_block_size = align;
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003144}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003145
Fam Zheng0db6e542015-04-17 19:49:50 -04003146BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs, const char *name)
3147{
3148 BdrvDirtyBitmap *bm;
3149
3150 assert(name);
3151 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
3152 if (bm->name && !strcmp(name, bm->name)) {
3153 return bm;
3154 }
3155 }
3156 return NULL;
3157}
3158
John Snow20dca812015-04-17 19:50:02 -04003159void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap)
Fam Zheng0db6e542015-04-17 19:49:50 -04003160{
John Snow9bd2b082015-04-17 19:49:57 -04003161 assert(!bdrv_dirty_bitmap_frozen(bitmap));
Fam Zheng0db6e542015-04-17 19:49:50 -04003162 g_free(bitmap->name);
3163 bitmap->name = NULL;
3164}
3165
3166BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
John Snow5fba6c02015-04-17 19:49:51 -04003167 uint32_t granularity,
Fam Zheng0db6e542015-04-17 19:49:50 -04003168 const char *name,
Fam Zhengb8afb522014-04-16 09:34:30 +08003169 Error **errp)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003170{
3171 int64_t bitmap_size;
Fam Zhenge4654d22013-11-13 18:29:43 +08003172 BdrvDirtyBitmap *bitmap;
John Snow5fba6c02015-04-17 19:49:51 -04003173 uint32_t sector_granularity;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003174
Paolo Bonzini50717e92013-01-21 17:09:45 +01003175 assert((granularity & (granularity - 1)) == 0);
3176
Fam Zheng0db6e542015-04-17 19:49:50 -04003177 if (name && bdrv_find_dirty_bitmap(bs, name)) {
3178 error_setg(errp, "Bitmap already exists: %s", name);
3179 return NULL;
3180 }
John Snow5fba6c02015-04-17 19:49:51 -04003181 sector_granularity = granularity >> BDRV_SECTOR_BITS;
3182 assert(sector_granularity);
Markus Armbruster57322b72014-06-26 13:23:22 +02003183 bitmap_size = bdrv_nb_sectors(bs);
Fam Zhengb8afb522014-04-16 09:34:30 +08003184 if (bitmap_size < 0) {
3185 error_setg_errno(errp, -bitmap_size, "could not get length of device");
3186 errno = -bitmap_size;
3187 return NULL;
3188 }
Markus Armbruster5839e532014-08-19 10:31:08 +02003189 bitmap = g_new0(BdrvDirtyBitmap, 1);
John Snow5fba6c02015-04-17 19:49:51 -04003190 bitmap->bitmap = hbitmap_alloc(bitmap_size, ctz32(sector_granularity));
John Snowe74e6b72015-04-17 19:49:59 -04003191 bitmap->size = bitmap_size;
Fam Zheng0db6e542015-04-17 19:49:50 -04003192 bitmap->name = g_strdup(name);
John Snowb8e6fb72015-04-17 19:49:56 -04003193 bitmap->disabled = false;
Fam Zhenge4654d22013-11-13 18:29:43 +08003194 QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
3195 return bitmap;
3196}
3197
John Snow9bd2b082015-04-17 19:49:57 -04003198bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
3199{
3200 return bitmap->successor;
3201}
3202
John Snowb8e6fb72015-04-17 19:49:56 -04003203bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
3204{
John Snow9bd2b082015-04-17 19:49:57 -04003205 return !(bitmap->disabled || bitmap->successor);
3206}
3207
John Snow9abe3bd2015-05-12 15:53:01 -04003208DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap)
3209{
3210 if (bdrv_dirty_bitmap_frozen(bitmap)) {
3211 return DIRTY_BITMAP_STATUS_FROZEN;
3212 } else if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3213 return DIRTY_BITMAP_STATUS_DISABLED;
3214 } else {
3215 return DIRTY_BITMAP_STATUS_ACTIVE;
3216 }
3217}
3218
John Snow9bd2b082015-04-17 19:49:57 -04003219/**
3220 * Create a successor bitmap destined to replace this bitmap after an operation.
3221 * Requires that the bitmap is not frozen and has no successor.
3222 */
3223int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
3224 BdrvDirtyBitmap *bitmap, Error **errp)
3225{
3226 uint64_t granularity;
3227 BdrvDirtyBitmap *child;
3228
3229 if (bdrv_dirty_bitmap_frozen(bitmap)) {
3230 error_setg(errp, "Cannot create a successor for a bitmap that is "
3231 "currently frozen");
3232 return -1;
3233 }
3234 assert(!bitmap->successor);
3235
3236 /* Create an anonymous successor */
3237 granularity = bdrv_dirty_bitmap_granularity(bitmap);
3238 child = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
3239 if (!child) {
3240 return -1;
3241 }
3242
3243 /* Successor will be on or off based on our current state. */
3244 child->disabled = bitmap->disabled;
3245
3246 /* Install the successor and freeze the parent */
3247 bitmap->successor = child;
3248 return 0;
3249}
3250
3251/**
3252 * For a bitmap with a successor, yield our name to the successor,
3253 * delete the old bitmap, and return a handle to the new bitmap.
3254 */
3255BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
3256 BdrvDirtyBitmap *bitmap,
3257 Error **errp)
3258{
3259 char *name;
3260 BdrvDirtyBitmap *successor = bitmap->successor;
3261
3262 if (successor == NULL) {
3263 error_setg(errp, "Cannot relinquish control if "
3264 "there's no successor present");
3265 return NULL;
3266 }
3267
3268 name = bitmap->name;
3269 bitmap->name = NULL;
3270 successor->name = name;
3271 bitmap->successor = NULL;
3272 bdrv_release_dirty_bitmap(bs, bitmap);
3273
3274 return successor;
3275}
3276
3277/**
3278 * In cases of failure where we can no longer safely delete the parent,
3279 * we may wish to re-join the parent and child/successor.
3280 * The merged parent will be un-frozen, but not explicitly re-enabled.
3281 */
3282BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
3283 BdrvDirtyBitmap *parent,
3284 Error **errp)
3285{
3286 BdrvDirtyBitmap *successor = parent->successor;
3287
3288 if (!successor) {
3289 error_setg(errp, "Cannot reclaim a successor when none is present");
3290 return NULL;
3291 }
3292
3293 if (!hbitmap_merge(parent->bitmap, successor->bitmap)) {
3294 error_setg(errp, "Merging of parent and successor bitmap failed");
3295 return NULL;
3296 }
3297 bdrv_release_dirty_bitmap(bs, successor);
3298 parent->successor = NULL;
3299
3300 return parent;
John Snowb8e6fb72015-04-17 19:49:56 -04003301}
3302
John Snowce1ffea2015-04-17 19:50:03 -04003303/**
3304 * Truncates _all_ bitmaps attached to a BDS.
3305 */
3306static void bdrv_dirty_bitmap_truncate(BlockDriverState *bs)
3307{
3308 BdrvDirtyBitmap *bitmap;
3309 uint64_t size = bdrv_nb_sectors(bs);
3310
3311 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
John Snow06207b02015-06-10 13:24:54 -04003312 assert(!bdrv_dirty_bitmap_frozen(bitmap));
John Snowce1ffea2015-04-17 19:50:03 -04003313 hbitmap_truncate(bitmap->bitmap, size);
John Snow5270b6a2015-06-08 16:49:15 -04003314 bitmap->size = size;
John Snowce1ffea2015-04-17 19:50:03 -04003315 }
3316}
3317
Fam Zhenge4654d22013-11-13 18:29:43 +08003318void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
3319{
3320 BdrvDirtyBitmap *bm, *next;
3321 QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
3322 if (bm == bitmap) {
John Snow9bd2b082015-04-17 19:49:57 -04003323 assert(!bdrv_dirty_bitmap_frozen(bm));
Fam Zhenge4654d22013-11-13 18:29:43 +08003324 QLIST_REMOVE(bitmap, list);
3325 hbitmap_free(bitmap->bitmap);
Fam Zheng0db6e542015-04-17 19:49:50 -04003326 g_free(bitmap->name);
Fam Zhenge4654d22013-11-13 18:29:43 +08003327 g_free(bitmap);
3328 return;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003329 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003330 }
3331}
3332
John Snowb8e6fb72015-04-17 19:49:56 -04003333void bdrv_disable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3334{
John Snow9bd2b082015-04-17 19:49:57 -04003335 assert(!bdrv_dirty_bitmap_frozen(bitmap));
John Snowb8e6fb72015-04-17 19:49:56 -04003336 bitmap->disabled = true;
3337}
3338
3339void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3340{
John Snow9bd2b082015-04-17 19:49:57 -04003341 assert(!bdrv_dirty_bitmap_frozen(bitmap));
John Snowb8e6fb72015-04-17 19:49:56 -04003342 bitmap->disabled = false;
3343}
3344
Fam Zheng21b56832013-11-13 18:29:44 +08003345BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
3346{
3347 BdrvDirtyBitmap *bm;
3348 BlockDirtyInfoList *list = NULL;
3349 BlockDirtyInfoList **plist = &list;
3350
3351 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
Markus Armbruster5839e532014-08-19 10:31:08 +02003352 BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
3353 BlockDirtyInfoList *entry = g_new0(BlockDirtyInfoList, 1);
John Snow20dca812015-04-17 19:50:02 -04003354 info->count = bdrv_get_dirty_count(bm);
John Snow592fdd02015-04-17 19:49:53 -04003355 info->granularity = bdrv_dirty_bitmap_granularity(bm);
Fam Zheng0db6e542015-04-17 19:49:50 -04003356 info->has_name = !!bm->name;
3357 info->name = g_strdup(bm->name);
John Snow9abe3bd2015-05-12 15:53:01 -04003358 info->status = bdrv_dirty_bitmap_status(bm);
Fam Zheng21b56832013-11-13 18:29:44 +08003359 entry->value = info;
3360 *plist = entry;
3361 plist = &entry->next;
3362 }
3363
3364 return list;
3365}
3366
Fam Zhenge4654d22013-11-13 18:29:43 +08003367int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003368{
Fam Zhenge4654d22013-11-13 18:29:43 +08003369 if (bitmap) {
3370 return hbitmap_get(bitmap->bitmap, sector);
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003371 } else {
3372 return 0;
3373 }
3374}
3375
John Snow341ebc22015-04-17 19:49:52 -04003376/**
3377 * Chooses a default granularity based on the existing cluster size,
3378 * but clamped between [4K, 64K]. Defaults to 64K in the case that there
3379 * is no cluster size information available.
3380 */
3381uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs)
3382{
3383 BlockDriverInfo bdi;
3384 uint32_t granularity;
3385
3386 if (bdrv_get_info(bs, &bdi) >= 0 && bdi.cluster_size > 0) {
3387 granularity = MAX(4096, bdi.cluster_size);
3388 granularity = MIN(65536, granularity);
3389 } else {
3390 granularity = 65536;
3391 }
3392
3393 return granularity;
3394}
3395
John Snow592fdd02015-04-17 19:49:53 -04003396uint32_t bdrv_dirty_bitmap_granularity(BdrvDirtyBitmap *bitmap)
3397{
3398 return BDRV_SECTOR_SIZE << hbitmap_granularity(bitmap->bitmap);
3399}
3400
John Snow20dca812015-04-17 19:50:02 -04003401void bdrv_dirty_iter_init(BdrvDirtyBitmap *bitmap, HBitmapIter *hbi)
Paolo Bonzini1755da12012-10-18 16:49:18 +02003402{
Fam Zhenge4654d22013-11-13 18:29:43 +08003403 hbitmap_iter_init(hbi, bitmap->bitmap, 0);
Paolo Bonzini1755da12012-10-18 16:49:18 +02003404}
3405
John Snow20dca812015-04-17 19:50:02 -04003406void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003407 int64_t cur_sector, int nr_sectors)
3408{
John Snowb8e6fb72015-04-17 19:49:56 -04003409 assert(bdrv_dirty_bitmap_enabled(bitmap));
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003410 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
3411}
3412
John Snow20dca812015-04-17 19:50:02 -04003413void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003414 int64_t cur_sector, int nr_sectors)
3415{
John Snowb8e6fb72015-04-17 19:49:56 -04003416 assert(bdrv_dirty_bitmap_enabled(bitmap));
Vladimir Sementsov-Ogievskiyc4237df2014-11-27 12:40:46 +03003417 hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
3418}
3419
John Snowe74e6b72015-04-17 19:49:59 -04003420void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap)
3421{
3422 assert(bdrv_dirty_bitmap_enabled(bitmap));
3423 hbitmap_reset(bitmap->bitmap, 0, bitmap->size);
3424}
3425
Stefan Hajnoczie0c47b62015-04-28 14:27:50 +01003426void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,
3427 int nr_sectors)
Paolo Bonzini1755da12012-10-18 16:49:18 +02003428{
Fam Zhenge4654d22013-11-13 18:29:43 +08003429 BdrvDirtyBitmap *bitmap;
3430 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
John Snowb8e6fb72015-04-17 19:49:56 -04003431 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3432 continue;
3433 }
Fam Zhenge4654d22013-11-13 18:29:43 +08003434 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
Paolo Bonzini8f0720e2013-01-21 17:09:41 +01003435 }
Liran Schouraaa0eb72010-01-26 10:31:48 +02003436}
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003437
Stefan Hajnoczie0c47b62015-04-28 14:27:50 +01003438void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
3439 int nr_sectors)
Fam Zhenge4654d22013-11-13 18:29:43 +08003440{
3441 BdrvDirtyBitmap *bitmap;
3442 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
John Snowb8e6fb72015-04-17 19:49:56 -04003443 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
3444 continue;
3445 }
Fam Zhenge4654d22013-11-13 18:29:43 +08003446 hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
3447 }
3448}
3449
John Snowd58d8452015-04-17 19:49:58 -04003450/**
3451 * Advance an HBitmapIter to an arbitrary offset.
3452 */
3453void bdrv_set_dirty_iter(HBitmapIter *hbi, int64_t offset)
3454{
3455 assert(hbi->hb);
3456 hbitmap_iter_init(hbi, hbi->hb, offset);
3457}
3458
John Snow20dca812015-04-17 19:50:02 -04003459int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
Fam Zhenge4654d22013-11-13 18:29:43 +08003460{
3461 return hbitmap_count(bitmap->bitmap);
3462}
3463
Fam Zheng9fcb0252013-08-23 09:14:46 +08003464/* Get a reference to bs */
3465void bdrv_ref(BlockDriverState *bs)
3466{
3467 bs->refcnt++;
3468}
3469
3470/* Release a previously grabbed reference to bs.
3471 * If after releasing, reference count is zero, the BlockDriverState is
3472 * deleted. */
3473void bdrv_unref(BlockDriverState *bs)
3474{
Jeff Cody9a4d5ca2014-07-23 17:22:57 -04003475 if (!bs) {
3476 return;
3477 }
Fam Zheng9fcb0252013-08-23 09:14:46 +08003478 assert(bs->refcnt > 0);
3479 if (--bs->refcnt == 0) {
3480 bdrv_delete(bs);
3481 }
3482}
3483
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003484struct BdrvOpBlocker {
3485 Error *reason;
3486 QLIST_ENTRY(BdrvOpBlocker) list;
3487};
3488
3489bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
3490{
3491 BdrvOpBlocker *blocker;
3492 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3493 if (!QLIST_EMPTY(&bs->op_blockers[op])) {
3494 blocker = QLIST_FIRST(&bs->op_blockers[op]);
3495 if (errp) {
Alberto Garcia81e5f782015-04-08 12:29:19 +03003496 error_setg(errp, "Node '%s' is busy: %s",
3497 bdrv_get_device_or_node_name(bs),
Markus Armbrusterbfb197e2014-10-07 13:59:11 +02003498 error_get_pretty(blocker->reason));
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003499 }
3500 return true;
3501 }
3502 return false;
3503}
3504
3505void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason)
3506{
3507 BdrvOpBlocker *blocker;
3508 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3509
Markus Armbruster5839e532014-08-19 10:31:08 +02003510 blocker = g_new0(BdrvOpBlocker, 1);
Fam Zhengfbe40ff2014-05-23 21:29:42 +08003511 blocker->reason = reason;
3512 QLIST_INSERT_HEAD(&bs->op_blockers[op], blocker, list);
3513}
3514
3515void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason)
3516{
3517 BdrvOpBlocker *blocker, *next;
3518 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
3519 QLIST_FOREACH_SAFE(blocker, &bs->op_blockers[op], list, next) {
3520 if (blocker->reason == reason) {
3521 QLIST_REMOVE(blocker, list);
3522 g_free(blocker);
3523 }
3524 }
3525}
3526
3527void bdrv_op_block_all(BlockDriverState *bs, Error *reason)
3528{
3529 int i;
3530 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3531 bdrv_op_block(bs, i, reason);
3532 }
3533}
3534
3535void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason)
3536{
3537 int i;
3538 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3539 bdrv_op_unblock(bs, i, reason);
3540 }
3541}
3542
3543bool bdrv_op_blocker_is_empty(BlockDriverState *bs)
3544{
3545 int i;
3546
3547 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
3548 if (!QLIST_EMPTY(&bs->op_blockers[i])) {
3549 return false;
3550 }
3551 }
3552 return true;
3553}
3554
Luiz Capitulino28a72822011-09-26 17:43:50 -03003555void bdrv_iostatus_enable(BlockDriverState *bs)
3556{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003557 bs->iostatus_enabled = true;
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003558 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003559}
3560
3561/* The I/O status is only enabled if the drive explicitly
3562 * enables it _and_ the VM is configured to stop on errors */
3563bool bdrv_iostatus_is_enabled(const BlockDriverState *bs)
3564{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003565 return (bs->iostatus_enabled &&
Paolo Bonzini92aa5c62012-09-28 17:22:55 +02003566 (bs->on_write_error == BLOCKDEV_ON_ERROR_ENOSPC ||
3567 bs->on_write_error == BLOCKDEV_ON_ERROR_STOP ||
3568 bs->on_read_error == BLOCKDEV_ON_ERROR_STOP));
Luiz Capitulino28a72822011-09-26 17:43:50 -03003569}
3570
3571void bdrv_iostatus_disable(BlockDriverState *bs)
3572{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003573 bs->iostatus_enabled = false;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003574}
3575
3576void bdrv_iostatus_reset(BlockDriverState *bs)
3577{
3578 if (bdrv_iostatus_is_enabled(bs)) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003579 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Paolo Bonzini3bd293c2012-10-18 16:49:27 +02003580 if (bs->job) {
3581 block_job_iostatus_reset(bs->job);
3582 }
Luiz Capitulino28a72822011-09-26 17:43:50 -03003583 }
3584}
3585
Luiz Capitulino28a72822011-09-26 17:43:50 -03003586void bdrv_iostatus_set_err(BlockDriverState *bs, int error)
3587{
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003588 assert(bdrv_iostatus_is_enabled(bs));
3589 if (bs->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003590 bs->iostatus = error == ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOSPACE :
3591 BLOCK_DEVICE_IO_STATUS_FAILED;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003592 }
3593}
3594
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003595void bdrv_img_create(const char *filename, const char *fmt,
3596 const char *base_filename, const char *base_fmt,
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003597 char *options, uint64_t img_size, int flags,
3598 Error **errp, bool quiet)
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003599{
Chunyan Liu83d05212014-06-05 17:20:51 +08003600 QemuOptsList *create_opts = NULL;
3601 QemuOpts *opts = NULL;
3602 const char *backing_fmt, *backing_file;
3603 int64_t size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003604 BlockDriver *drv, *proto_drv;
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003605 BlockDriver *backing_drv = NULL;
Max Reitzcc84d902013-09-06 17:14:26 +02003606 Error *local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003607 int ret = 0;
3608
3609 /* Find driver and parse its options */
3610 drv = bdrv_find_format(fmt);
3611 if (!drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003612 error_setg(errp, "Unknown file format '%s'", fmt);
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003613 return;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003614 }
3615
Max Reitzb65a5e12015-02-05 13:58:12 -05003616 proto_drv = bdrv_find_protocol(filename, true, errp);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003617 if (!proto_drv) {
Luiz Capitulinod92ada22012-11-30 10:52:09 -02003618 return;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003619 }
3620
Max Reitzc6149722014-12-02 18:32:45 +01003621 if (!drv->create_opts) {
3622 error_setg(errp, "Format driver '%s' does not support image creation",
3623 drv->format_name);
3624 return;
3625 }
3626
3627 if (!proto_drv->create_opts) {
3628 error_setg(errp, "Protocol driver '%s' does not support image creation",
3629 proto_drv->format_name);
3630 return;
3631 }
3632
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003633 create_opts = qemu_opts_append(create_opts, drv->create_opts);
3634 create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003635
3636 /* Create parameter list with default values */
Chunyan Liu83d05212014-06-05 17:20:51 +08003637 opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
Markus Armbruster39101f22015-02-12 16:46:36 +01003638 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003639
3640 /* Parse -o options */
3641 if (options) {
Markus Armbrusterdc523cd342015-02-12 18:37:11 +01003642 qemu_opts_do_parse(opts, options, NULL, &local_err);
3643 if (local_err) {
3644 error_report_err(local_err);
3645 local_err = NULL;
Chunyan Liu83d05212014-06-05 17:20:51 +08003646 error_setg(errp, "Invalid options for file format '%s'", fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003647 goto out;
3648 }
3649 }
3650
3651 if (base_filename) {
Markus Armbrusterf43e47d2015-02-12 17:52:20 +01003652 qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
Markus Armbruster6be41942015-02-12 17:49:02 +01003653 if (local_err) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003654 error_setg(errp, "Backing file not supported for file format '%s'",
3655 fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003656 goto out;
3657 }
3658 }
3659
3660 if (base_fmt) {
Markus Armbrusterf43e47d2015-02-12 17:52:20 +01003661 qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
Markus Armbruster6be41942015-02-12 17:49:02 +01003662 if (local_err) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003663 error_setg(errp, "Backing file format not supported for file "
3664 "format '%s'", fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003665 goto out;
3666 }
3667 }
3668
Chunyan Liu83d05212014-06-05 17:20:51 +08003669 backing_file = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
3670 if (backing_file) {
3671 if (!strcmp(filename, backing_file)) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003672 error_setg(errp, "Error: Trying to create an image with the "
3673 "same filename as the backing file");
Jes Sorensen792da932010-12-16 13:52:17 +01003674 goto out;
3675 }
3676 }
3677
Chunyan Liu83d05212014-06-05 17:20:51 +08003678 backing_fmt = qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT);
3679 if (backing_fmt) {
3680 backing_drv = bdrv_find_format(backing_fmt);
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003681 if (!backing_drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003682 error_setg(errp, "Unknown backing file format '%s'",
Chunyan Liu83d05212014-06-05 17:20:51 +08003683 backing_fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003684 goto out;
3685 }
3686 }
3687
3688 // The size for the image must always be specified, with one exception:
3689 // If we are using a backing file, we can obtain the size from there
Chunyan Liu83d05212014-06-05 17:20:51 +08003690 size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, 0);
3691 if (size == -1) {
3692 if (backing_file) {
Max Reitz66f6b812013-12-03 14:57:52 +01003693 BlockDriverState *bs;
Max Reitz29168012014-11-26 17:20:27 +01003694 char *full_backing = g_new0(char, PATH_MAX);
Markus Armbruster52bf1e72014-06-26 13:23:25 +02003695 int64_t size;
Paolo Bonzini63090da2012-04-12 14:01:03 +02003696 int back_flags;
3697
Max Reitz29168012014-11-26 17:20:27 +01003698 bdrv_get_full_backing_filename_from_filename(filename, backing_file,
3699 full_backing, PATH_MAX,
3700 &local_err);
3701 if (local_err) {
3702 g_free(full_backing);
3703 goto out;
3704 }
3705
Paolo Bonzini63090da2012-04-12 14:01:03 +02003706 /* backing files always opened read-only */
3707 back_flags =
3708 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003709
Max Reitzf67503e2014-02-18 18:33:05 +01003710 bs = NULL;
Max Reitz29168012014-11-26 17:20:27 +01003711 ret = bdrv_open(&bs, full_backing, NULL, NULL, back_flags,
Max Reitzcc84d902013-09-06 17:14:26 +02003712 backing_drv, &local_err);
Max Reitz29168012014-11-26 17:20:27 +01003713 g_free(full_backing);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003714 if (ret < 0) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003715 goto out;
3716 }
Markus Armbruster52bf1e72014-06-26 13:23:25 +02003717 size = bdrv_getlength(bs);
3718 if (size < 0) {
3719 error_setg_errno(errp, -size, "Could not get size of '%s'",
3720 backing_file);
3721 bdrv_unref(bs);
3722 goto out;
3723 }
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003724
Markus Armbruster39101f22015-02-12 16:46:36 +01003725 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, size, &error_abort);
Max Reitz66f6b812013-12-03 14:57:52 +01003726
3727 bdrv_unref(bs);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003728 } else {
Luiz Capitulino71c79812012-11-30 10:52:04 -02003729 error_setg(errp, "Image creation needs a size parameter");
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003730 goto out;
3731 }
3732 }
3733
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003734 if (!quiet) {
Fam Zheng43c5d8f2014-12-09 15:38:04 +08003735 printf("Formatting '%s', fmt=%s", filename, fmt);
3736 qemu_opts_print(opts, " ");
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01003737 puts("");
3738 }
Chunyan Liu83d05212014-06-05 17:20:51 +08003739
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003740 ret = bdrv_create(drv, filename, opts, &local_err);
Chunyan Liu83d05212014-06-05 17:20:51 +08003741
Max Reitzcc84d902013-09-06 17:14:26 +02003742 if (ret == -EFBIG) {
3743 /* This is generally a better message than whatever the driver would
3744 * deliver (especially because of the cluster_size_hint), since that
3745 * is most probably not much different from "image too large". */
3746 const char *cluster_size_hint = "";
Chunyan Liu83d05212014-06-05 17:20:51 +08003747 if (qemu_opt_get_size(opts, BLOCK_OPT_CLUSTER_SIZE, 0)) {
Max Reitzcc84d902013-09-06 17:14:26 +02003748 cluster_size_hint = " (try using a larger cluster size)";
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003749 }
Max Reitzcc84d902013-09-06 17:14:26 +02003750 error_setg(errp, "The image size is too large for file format '%s'"
3751 "%s", fmt, cluster_size_hint);
3752 error_free(local_err);
3753 local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003754 }
3755
3756out:
Chunyan Liu83d05212014-06-05 17:20:51 +08003757 qemu_opts_del(opts);
3758 qemu_opts_free(create_opts);
Markus Armbruster84d18f02014-01-30 15:07:28 +01003759 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +02003760 error_propagate(errp, local_err);
3761 }
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003762}
Stefan Hajnoczi85d126f2013-03-07 13:41:48 +01003763
3764AioContext *bdrv_get_aio_context(BlockDriverState *bs)
3765{
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003766 return bs->aio_context;
3767}
3768
3769void bdrv_detach_aio_context(BlockDriverState *bs)
3770{
Max Reitz33384422014-06-20 21:57:33 +02003771 BdrvAioNotifier *baf;
3772
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003773 if (!bs->drv) {
3774 return;
3775 }
3776
Max Reitz33384422014-06-20 21:57:33 +02003777 QLIST_FOREACH(baf, &bs->aio_notifiers, list) {
3778 baf->detach_aio_context(baf->opaque);
3779 }
3780
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003781 if (bs->io_limits_enabled) {
3782 throttle_detach_aio_context(&bs->throttle_state);
3783 }
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003784 if (bs->drv->bdrv_detach_aio_context) {
3785 bs->drv->bdrv_detach_aio_context(bs);
3786 }
3787 if (bs->file) {
3788 bdrv_detach_aio_context(bs->file);
3789 }
3790 if (bs->backing_hd) {
3791 bdrv_detach_aio_context(bs->backing_hd);
3792 }
3793
3794 bs->aio_context = NULL;
3795}
3796
3797void bdrv_attach_aio_context(BlockDriverState *bs,
3798 AioContext *new_context)
3799{
Max Reitz33384422014-06-20 21:57:33 +02003800 BdrvAioNotifier *ban;
3801
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003802 if (!bs->drv) {
3803 return;
3804 }
3805
3806 bs->aio_context = new_context;
3807
3808 if (bs->backing_hd) {
3809 bdrv_attach_aio_context(bs->backing_hd, new_context);
3810 }
3811 if (bs->file) {
3812 bdrv_attach_aio_context(bs->file, new_context);
3813 }
3814 if (bs->drv->bdrv_attach_aio_context) {
3815 bs->drv->bdrv_attach_aio_context(bs, new_context);
3816 }
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02003817 if (bs->io_limits_enabled) {
3818 throttle_attach_aio_context(&bs->throttle_state, new_context);
3819 }
Max Reitz33384422014-06-20 21:57:33 +02003820
3821 QLIST_FOREACH(ban, &bs->aio_notifiers, list) {
3822 ban->attached_aio_context(new_context, ban->opaque);
3823 }
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02003824}
3825
3826void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
3827{
3828 bdrv_drain_all(); /* ensure there are no in-flight requests */
3829
3830 bdrv_detach_aio_context(bs);
3831
3832 /* This function executes in the old AioContext so acquire the new one in
3833 * case it runs in a different thread.
3834 */
3835 aio_context_acquire(new_context);
3836 bdrv_attach_aio_context(bs, new_context);
3837 aio_context_release(new_context);
Stefan Hajnoczi85d126f2013-03-07 13:41:48 +01003838}
Stefan Hajnoczid616b222013-06-24 17:13:10 +02003839
Max Reitz33384422014-06-20 21:57:33 +02003840void bdrv_add_aio_context_notifier(BlockDriverState *bs,
3841 void (*attached_aio_context)(AioContext *new_context, void *opaque),
3842 void (*detach_aio_context)(void *opaque), void *opaque)
3843{
3844 BdrvAioNotifier *ban = g_new(BdrvAioNotifier, 1);
3845 *ban = (BdrvAioNotifier){
3846 .attached_aio_context = attached_aio_context,
3847 .detach_aio_context = detach_aio_context,
3848 .opaque = opaque
3849 };
3850
3851 QLIST_INSERT_HEAD(&bs->aio_notifiers, ban, list);
3852}
3853
3854void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
3855 void (*attached_aio_context)(AioContext *,
3856 void *),
3857 void (*detach_aio_context)(void *),
3858 void *opaque)
3859{
3860 BdrvAioNotifier *ban, *ban_next;
3861
3862 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
3863 if (ban->attached_aio_context == attached_aio_context &&
3864 ban->detach_aio_context == detach_aio_context &&
3865 ban->opaque == opaque)
3866 {
3867 QLIST_REMOVE(ban, list);
3868 g_free(ban);
3869
3870 return;
3871 }
3872 }
3873
3874 abort();
3875}
3876
Max Reitz77485432014-10-27 11:12:50 +01003877int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
3878 BlockDriverAmendStatusCB *status_cb)
Max Reitz6f176b42013-09-03 10:09:50 +02003879{
Chunyan Liuc282e1f2014-06-05 17:21:11 +08003880 if (!bs->drv->bdrv_amend_options) {
Max Reitz6f176b42013-09-03 10:09:50 +02003881 return -ENOTSUP;
3882 }
Max Reitz77485432014-10-27 11:12:50 +01003883 return bs->drv->bdrv_amend_options(bs, opts, status_cb);
Max Reitz6f176b42013-09-03 10:09:50 +02003884}
Benoît Canetf6186f42013-10-02 14:33:48 +02003885
Benoît Canetb5042a32014-03-03 19:11:34 +01003886/* This function will be called by the bdrv_recurse_is_first_non_filter method
3887 * of block filter and by bdrv_is_first_non_filter.
3888 * It is used to test if the given bs is the candidate or recurse more in the
3889 * node graph.
Benoît Canet212a5a82014-01-23 21:31:36 +01003890 */
Benoît Canet212a5a82014-01-23 21:31:36 +01003891bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
3892 BlockDriverState *candidate)
Benoît Canetf6186f42013-10-02 14:33:48 +02003893{
Benoît Canetb5042a32014-03-03 19:11:34 +01003894 /* return false if basic checks fails */
3895 if (!bs || !bs->drv) {
3896 return false;
3897 }
3898
3899 /* the code reached a non block filter driver -> check if the bs is
3900 * the same as the candidate. It's the recursion termination condition.
3901 */
3902 if (!bs->drv->is_filter) {
3903 return bs == candidate;
3904 }
3905 /* Down this path the driver is a block filter driver */
3906
3907 /* If the block filter recursion method is defined use it to recurse down
3908 * the node graph.
3909 */
3910 if (bs->drv->bdrv_recurse_is_first_non_filter) {
Benoît Canet212a5a82014-01-23 21:31:36 +01003911 return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate);
3912 }
3913
Benoît Canetb5042a32014-03-03 19:11:34 +01003914 /* the driver is a block filter but don't allow to recurse -> return false
3915 */
3916 return false;
Benoît Canet212a5a82014-01-23 21:31:36 +01003917}
3918
3919/* This function checks if the candidate is the first non filter bs down it's
3920 * bs chain. Since we don't have pointers to parents it explore all bs chains
3921 * from the top. Some filters can choose not to pass down the recursion.
3922 */
3923bool bdrv_is_first_non_filter(BlockDriverState *candidate)
3924{
3925 BlockDriverState *bs;
3926
3927 /* walk down the bs forest recursively */
3928 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
3929 bool perm;
3930
Benoît Canetb5042a32014-03-03 19:11:34 +01003931 /* try to recurse in this top level bs */
Kevin Wolfe6dc8a12014-02-04 11:45:31 +01003932 perm = bdrv_recurse_is_first_non_filter(bs, candidate);
Benoît Canet212a5a82014-01-23 21:31:36 +01003933
3934 /* candidate is the first non filter */
3935 if (perm) {
3936 return true;
3937 }
3938 }
3939
3940 return false;
Benoît Canetf6186f42013-10-02 14:33:48 +02003941}
Benoît Canet09158f02014-06-27 18:25:25 +02003942
3943BlockDriverState *check_to_replace_node(const char *node_name, Error **errp)
3944{
3945 BlockDriverState *to_replace_bs = bdrv_find_node(node_name);
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003946 AioContext *aio_context;
3947
Benoît Canet09158f02014-06-27 18:25:25 +02003948 if (!to_replace_bs) {
3949 error_setg(errp, "Node name '%s' not found", node_name);
3950 return NULL;
3951 }
3952
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003953 aio_context = bdrv_get_aio_context(to_replace_bs);
3954 aio_context_acquire(aio_context);
3955
Benoît Canet09158f02014-06-27 18:25:25 +02003956 if (bdrv_op_is_blocked(to_replace_bs, BLOCK_OP_TYPE_REPLACE, errp)) {
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003957 to_replace_bs = NULL;
3958 goto out;
Benoît Canet09158f02014-06-27 18:25:25 +02003959 }
3960
3961 /* We don't want arbitrary node of the BDS chain to be replaced only the top
3962 * most non filter in order to prevent data corruption.
3963 * Another benefit is that this tests exclude backing files which are
3964 * blocked by the backing blockers.
3965 */
3966 if (!bdrv_is_first_non_filter(to_replace_bs)) {
3967 error_setg(errp, "Only top most non filter can be replaced");
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003968 to_replace_bs = NULL;
3969 goto out;
Benoît Canet09158f02014-06-27 18:25:25 +02003970 }
3971
Stefan Hajnoczi5a7e7a02014-10-21 12:03:58 +01003972out:
3973 aio_context_release(aio_context);
Benoît Canet09158f02014-06-27 18:25:25 +02003974 return to_replace_bs;
3975}
Ming Lei448ad912014-07-04 18:04:33 +08003976
Max Reitz91af7012014-07-18 20:24:56 +02003977static bool append_open_options(QDict *d, BlockDriverState *bs)
3978{
3979 const QDictEntry *entry;
3980 bool found_any = false;
3981
3982 for (entry = qdict_first(bs->options); entry;
3983 entry = qdict_next(bs->options, entry))
3984 {
3985 /* Only take options for this level and exclude all non-driver-specific
3986 * options */
3987 if (!strchr(qdict_entry_key(entry), '.') &&
3988 strcmp(qdict_entry_key(entry), "node-name"))
3989 {
3990 qobject_incref(qdict_entry_value(entry));
3991 qdict_put_obj(d, qdict_entry_key(entry), qdict_entry_value(entry));
3992 found_any = true;
3993 }
3994 }
3995
3996 return found_any;
3997}
3998
3999/* Updates the following BDS fields:
4000 * - exact_filename: A filename which may be used for opening a block device
4001 * which (mostly) equals the given BDS (even without any
4002 * other options; so reading and writing must return the same
4003 * results, but caching etc. may be different)
4004 * - full_open_options: Options which, when given when opening a block device
4005 * (without a filename), result in a BDS (mostly)
4006 * equalling the given one
4007 * - filename: If exact_filename is set, it is copied here. Otherwise,
4008 * full_open_options is converted to a JSON object, prefixed with
4009 * "json:" (for use through the JSON pseudo protocol) and put here.
4010 */
4011void bdrv_refresh_filename(BlockDriverState *bs)
4012{
4013 BlockDriver *drv = bs->drv;
4014 QDict *opts;
4015
4016 if (!drv) {
4017 return;
4018 }
4019
4020 /* This BDS's file name will most probably depend on its file's name, so
4021 * refresh that first */
4022 if (bs->file) {
4023 bdrv_refresh_filename(bs->file);
4024 }
4025
4026 if (drv->bdrv_refresh_filename) {
4027 /* Obsolete information is of no use here, so drop the old file name
4028 * information before refreshing it */
4029 bs->exact_filename[0] = '\0';
4030 if (bs->full_open_options) {
4031 QDECREF(bs->full_open_options);
4032 bs->full_open_options = NULL;
4033 }
4034
4035 drv->bdrv_refresh_filename(bs);
4036 } else if (bs->file) {
4037 /* Try to reconstruct valid information from the underlying file */
4038 bool has_open_options;
4039
4040 bs->exact_filename[0] = '\0';
4041 if (bs->full_open_options) {
4042 QDECREF(bs->full_open_options);
4043 bs->full_open_options = NULL;
4044 }
4045
4046 opts = qdict_new();
4047 has_open_options = append_open_options(opts, bs);
4048
4049 /* If no specific options have been given for this BDS, the filename of
4050 * the underlying file should suffice for this one as well */
4051 if (bs->file->exact_filename[0] && !has_open_options) {
4052 strcpy(bs->exact_filename, bs->file->exact_filename);
4053 }
4054 /* Reconstructing the full options QDict is simple for most format block
4055 * drivers, as long as the full options are known for the underlying
4056 * file BDS. The full options QDict of that file BDS should somehow
4057 * contain a representation of the filename, therefore the following
4058 * suffices without querying the (exact_)filename of this BDS. */
4059 if (bs->file->full_open_options) {
4060 qdict_put_obj(opts, "driver",
4061 QOBJECT(qstring_from_str(drv->format_name)));
4062 QINCREF(bs->file->full_open_options);
4063 qdict_put_obj(opts, "file", QOBJECT(bs->file->full_open_options));
4064
4065 bs->full_open_options = opts;
4066 } else {
4067 QDECREF(opts);
4068 }
4069 } else if (!bs->full_open_options && qdict_size(bs->options)) {
4070 /* There is no underlying file BDS (at least referenced by BDS.file),
4071 * so the full options QDict should be equal to the options given
4072 * specifically for this block device when it was opened (plus the
4073 * driver specification).
4074 * Because those options don't change, there is no need to update
4075 * full_open_options when it's already set. */
4076
4077 opts = qdict_new();
4078 append_open_options(opts, bs);
4079 qdict_put_obj(opts, "driver",
4080 QOBJECT(qstring_from_str(drv->format_name)));
4081
4082 if (bs->exact_filename[0]) {
4083 /* This may not work for all block protocol drivers (some may
4084 * require this filename to be parsed), but we have to find some
4085 * default solution here, so just include it. If some block driver
4086 * does not support pure options without any filename at all or
4087 * needs some special format of the options QDict, it needs to
4088 * implement the driver-specific bdrv_refresh_filename() function.
4089 */
4090 qdict_put_obj(opts, "filename",
4091 QOBJECT(qstring_from_str(bs->exact_filename)));
4092 }
4093
4094 bs->full_open_options = opts;
4095 }
4096
4097 if (bs->exact_filename[0]) {
4098 pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename);
4099 } else if (bs->full_open_options) {
4100 QString *json = qobject_to_json(QOBJECT(bs->full_open_options));
4101 snprintf(bs->filename, sizeof(bs->filename), "json:%s",
4102 qstring_get_str(json));
4103 QDECREF(json);
4104 }
4105}
Benoît Canet5366d0c2014-09-05 15:46:18 +02004106
4107/* This accessor function purpose is to allow the device models to access the
4108 * BlockAcctStats structure embedded inside a BlockDriverState without being
4109 * aware of the BlockDriverState structure layout.
4110 * It will go away when the BlockAcctStats structure will be moved inside
4111 * the device models.
4112 */
4113BlockAcctStats *bdrv_get_stats(BlockDriverState *bs)
4114{
4115 return &bs->stats;
4116}