blob: c5a251c57ec70d5595886b17d7e970cabd3dc949 [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"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010031#include "sysemu/sysemu.h"
Markus Armbruster3ae59582014-09-12 21:26:22 +020032#include "sysemu/blockdev.h" /* FIXME layering violation */
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
Fam Zhenge4654d22013-11-13 18:29:43 +080054struct BdrvDirtyBitmap {
55 HBitmap *bitmap;
56 QLIST_ENTRY(BdrvDirtyBitmap) list;
57};
58
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +010059#define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */
60
Stefan Hajnoczi2a871512014-07-07 15:15:53 +020061#define COROUTINE_POOL_RESERVATION 64 /* number of coroutines to reserve */
62
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +020063static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load);
aliguorif141eaf2009-04-07 18:43:24 +000064static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
65 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
aliguoric87c0672009-04-07 18:43:20 +000066 BlockDriverCompletionFunc *cb, void *opaque);
aliguorif141eaf2009-04-07 18:43:24 +000067static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
68 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
pbrookce1a14d2006-08-07 02:38:06 +000069 BlockDriverCompletionFunc *cb, void *opaque);
Kevin Wolff9f05dc2011-07-15 13:50:26 +020070static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
71 int64_t sector_num, int nb_sectors,
72 QEMUIOVector *iov);
73static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
74 int64_t sector_num, int nb_sectors,
75 QEMUIOVector *iov);
Kevin Wolf775aa8b2013-12-05 12:09:38 +010076static int coroutine_fn bdrv_co_do_preadv(BlockDriverState *bs,
77 int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
Stefan Hajnoczi470c0502012-01-18 14:40:42 +000078 BdrvRequestFlags flags);
Kevin Wolf775aa8b2013-12-05 12:09:38 +010079static int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs,
80 int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +000081 BdrvRequestFlags flags);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +010082static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
83 int64_t sector_num,
84 QEMUIOVector *qiov,
85 int nb_sectors,
Paolo Bonzinid20d9b72013-11-22 13:39:44 +010086 BdrvRequestFlags flags,
Stefan Hajnoczib2a61372011-10-13 13:08:23 +010087 BlockDriverCompletionFunc *cb,
88 void *opaque,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +010089 bool is_write);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +010090static void coroutine_fn bdrv_co_do_rw(void *opaque);
Kevin Wolf621f0582012-03-20 15:12:58 +010091static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
Peter Lievenaa7bfbf2013-10-24 12:06:51 +020092 int64_t sector_num, int nb_sectors, BdrvRequestFlags flags);
bellardec530c82006-04-25 22:36:06 +000093
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +010094static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
95 QTAILQ_HEAD_INITIALIZER(bdrv_states);
blueswir17ee930d2008-09-17 19:04:14 +000096
Benoît Canetdc364f42014-01-23 21:31:32 +010097static QTAILQ_HEAD(, BlockDriverState) graph_bdrv_states =
98 QTAILQ_HEAD_INITIALIZER(graph_bdrv_states);
99
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100100static QLIST_HEAD(, BlockDriver) bdrv_drivers =
101 QLIST_HEAD_INITIALIZER(bdrv_drivers);
bellardea2384d2004-08-01 21:59:26 +0000102
Markus Armbrustereb852012009-10-27 18:41:44 +0100103/* If non-zero, use only whitelisted block drivers */
104static int use_bdrv_whitelist;
105
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000106#ifdef _WIN32
107static int is_windows_drive_prefix(const char *filename)
108{
109 return (((filename[0] >= 'a' && filename[0] <= 'z') ||
110 (filename[0] >= 'A' && filename[0] <= 'Z')) &&
111 filename[1] == ':');
112}
113
114int is_windows_drive(const char *filename)
115{
116 if (is_windows_drive_prefix(filename) &&
117 filename[2] == '\0')
118 return 1;
119 if (strstart(filename, "\\\\.\\", NULL) ||
120 strstart(filename, "//./", NULL))
121 return 1;
122 return 0;
123}
124#endif
125
Zhi Yong Wu0563e192011-11-03 16:57:25 +0800126/* throttling disk I/O limits */
Benoît Canetcc0681c2013-09-02 14:14:39 +0200127void bdrv_set_io_limits(BlockDriverState *bs,
128 ThrottleConfig *cfg)
129{
130 int i;
131
132 throttle_config(&bs->throttle_state, cfg);
133
134 for (i = 0; i < 2; i++) {
135 qemu_co_enter_next(&bs->throttled_reqs[i]);
136 }
137}
138
139/* this function drain all the throttled IOs */
140static bool bdrv_start_throttled_reqs(BlockDriverState *bs)
141{
142 bool drained = false;
143 bool enabled = bs->io_limits_enabled;
144 int i;
145
146 bs->io_limits_enabled = false;
147
148 for (i = 0; i < 2; i++) {
149 while (qemu_co_enter_next(&bs->throttled_reqs[i])) {
150 drained = true;
151 }
152 }
153
154 bs->io_limits_enabled = enabled;
155
156 return drained;
157}
158
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800159void bdrv_io_limits_disable(BlockDriverState *bs)
160{
161 bs->io_limits_enabled = false;
162
Benoît Canetcc0681c2013-09-02 14:14:39 +0200163 bdrv_start_throttled_reqs(bs);
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800164
Benoît Canetcc0681c2013-09-02 14:14:39 +0200165 throttle_destroy(&bs->throttle_state);
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800166}
167
Benoît Canetcc0681c2013-09-02 14:14:39 +0200168static void bdrv_throttle_read_timer_cb(void *opaque)
Zhi Yong Wu0563e192011-11-03 16:57:25 +0800169{
170 BlockDriverState *bs = opaque;
Benoît Canetcc0681c2013-09-02 14:14:39 +0200171 qemu_co_enter_next(&bs->throttled_reqs[0]);
Zhi Yong Wu0563e192011-11-03 16:57:25 +0800172}
173
Benoît Canetcc0681c2013-09-02 14:14:39 +0200174static void bdrv_throttle_write_timer_cb(void *opaque)
175{
176 BlockDriverState *bs = opaque;
177 qemu_co_enter_next(&bs->throttled_reqs[1]);
178}
179
180/* should be called before bdrv_set_io_limits if a limit is set */
Zhi Yong Wu0563e192011-11-03 16:57:25 +0800181void bdrv_io_limits_enable(BlockDriverState *bs)
182{
Benoît Canetcc0681c2013-09-02 14:14:39 +0200183 assert(!bs->io_limits_enabled);
184 throttle_init(&bs->throttle_state,
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +0200185 bdrv_get_aio_context(bs),
Benoît Canetcc0681c2013-09-02 14:14:39 +0200186 QEMU_CLOCK_VIRTUAL,
187 bdrv_throttle_read_timer_cb,
188 bdrv_throttle_write_timer_cb,
189 bs);
Zhi Yong Wu0563e192011-11-03 16:57:25 +0800190 bs->io_limits_enabled = true;
191}
192
Benoît Canetcc0681c2013-09-02 14:14:39 +0200193/* This function makes an IO wait if needed
194 *
195 * @nb_sectors: the number of sectors of the IO
196 * @is_write: is the IO a write
197 */
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800198static void bdrv_io_limits_intercept(BlockDriverState *bs,
Kevin Wolfd5103582014-01-16 13:29:10 +0100199 unsigned int bytes,
Benoît Canetcc0681c2013-09-02 14:14:39 +0200200 bool is_write)
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800201{
Benoît Canetcc0681c2013-09-02 14:14:39 +0200202 /* does this io must wait */
203 bool must_wait = throttle_schedule_timer(&bs->throttle_state, is_write);
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800204
Benoît Canetcc0681c2013-09-02 14:14:39 +0200205 /* if must wait or any request of this type throttled queue the IO */
206 if (must_wait ||
207 !qemu_co_queue_empty(&bs->throttled_reqs[is_write])) {
208 qemu_co_queue_wait(&bs->throttled_reqs[is_write]);
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800209 }
210
Benoît Canetcc0681c2013-09-02 14:14:39 +0200211 /* the IO will be executed, do the accounting */
Kevin Wolfd5103582014-01-16 13:29:10 +0100212 throttle_account(&bs->throttle_state, is_write, bytes);
213
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800214
Benoît Canetcc0681c2013-09-02 14:14:39 +0200215 /* if the next request must wait -> do nothing */
216 if (throttle_schedule_timer(&bs->throttle_state, is_write)) {
217 return;
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800218 }
219
Benoît Canetcc0681c2013-09-02 14:14:39 +0200220 /* else queue next request for execution */
221 qemu_co_queue_next(&bs->throttled_reqs[is_write]);
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800222}
223
Kevin Wolf339064d2013-11-28 10:23:32 +0100224size_t bdrv_opt_mem_align(BlockDriverState *bs)
225{
226 if (!bs || !bs->drv) {
227 /* 4k should be on the safe side */
228 return 4096;
229 }
230
231 return bs->bl.opt_mem_alignment;
232}
233
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000234/* check if the path starts with "<protocol>:" */
235static int path_has_protocol(const char *path)
236{
Paolo Bonzini947995c2012-05-08 16:51:48 +0200237 const char *p;
238
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000239#ifdef _WIN32
240 if (is_windows_drive(path) ||
241 is_windows_drive_prefix(path)) {
242 return 0;
243 }
Paolo Bonzini947995c2012-05-08 16:51:48 +0200244 p = path + strcspn(path, ":/\\");
245#else
246 p = path + strcspn(path, ":/");
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000247#endif
248
Paolo Bonzini947995c2012-05-08 16:51:48 +0200249 return *p == ':';
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000250}
251
bellard83f64092006-08-01 16:21:11 +0000252int path_is_absolute(const char *path)
253{
bellard21664422007-01-07 18:22:37 +0000254#ifdef _WIN32
255 /* specific case for names like: "\\.\d:" */
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200256 if (is_windows_drive(path) || is_windows_drive_prefix(path)) {
bellard21664422007-01-07 18:22:37 +0000257 return 1;
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200258 }
259 return (*path == '/' || *path == '\\');
bellard3b9f94e2007-01-07 17:27:07 +0000260#else
Paolo Bonzinif53f4da2012-05-08 16:51:47 +0200261 return (*path == '/');
bellard3b9f94e2007-01-07 17:27:07 +0000262#endif
bellard83f64092006-08-01 16:21:11 +0000263}
264
265/* if filename is absolute, just copy it to dest. Otherwise, build a
266 path to it by considering it is relative to base_path. URL are
267 supported. */
268void path_combine(char *dest, int dest_size,
269 const char *base_path,
270 const char *filename)
271{
272 const char *p, *p1;
273 int len;
274
275 if (dest_size <= 0)
276 return;
277 if (path_is_absolute(filename)) {
278 pstrcpy(dest, dest_size, filename);
279 } else {
280 p = strchr(base_path, ':');
281 if (p)
282 p++;
283 else
284 p = base_path;
bellard3b9f94e2007-01-07 17:27:07 +0000285 p1 = strrchr(base_path, '/');
286#ifdef _WIN32
287 {
288 const char *p2;
289 p2 = strrchr(base_path, '\\');
290 if (!p1 || p2 > p1)
291 p1 = p2;
292 }
293#endif
bellard83f64092006-08-01 16:21:11 +0000294 if (p1)
295 p1++;
296 else
297 p1 = base_path;
298 if (p1 > p)
299 p = p1;
300 len = p - base_path;
301 if (len > dest_size - 1)
302 len = dest_size - 1;
303 memcpy(dest, base_path, len);
304 dest[len] = '\0';
305 pstrcat(dest, dest_size, filename);
306 }
307}
308
Paolo Bonzinidc5a1372012-05-08 16:51:50 +0200309void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz)
310{
311 if (bs->backing_file[0] == '\0' || path_has_protocol(bs->backing_file)) {
312 pstrcpy(dest, sz, bs->backing_file);
313 } else {
314 path_combine(dest, sz, bs->filename, bs->backing_file);
315 }
316}
317
Anthony Liguori5efa9d52009-05-09 17:03:42 -0500318void bdrv_register(BlockDriver *bdrv)
bellardea2384d2004-08-01 21:59:26 +0000319{
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +0100320 /* Block drivers without coroutine functions need emulation */
321 if (!bdrv->bdrv_co_readv) {
Kevin Wolff9f05dc2011-07-15 13:50:26 +0200322 bdrv->bdrv_co_readv = bdrv_co_readv_em;
323 bdrv->bdrv_co_writev = bdrv_co_writev_em;
324
Stefan Hajnoczif8c35c12011-10-13 21:09:31 +0100325 /* bdrv_co_readv_em()/brdv_co_writev_em() work in terms of aio, so if
326 * the block driver lacks aio we need to emulate that too.
327 */
Kevin Wolff9f05dc2011-07-15 13:50:26 +0200328 if (!bdrv->bdrv_aio_readv) {
329 /* add AIO emulation layer */
330 bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
331 bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
Kevin Wolff9f05dc2011-07-15 13:50:26 +0200332 }
bellard83f64092006-08-01 16:21:11 +0000333 }
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +0200334
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100335 QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
bellardea2384d2004-08-01 21:59:26 +0000336}
bellardb3380822004-03-14 21:38:54 +0000337
Kevin Wolf9aebf3b2014-09-25 09:54:02 +0200338static bool bdrv_is_valid_name(const char *name)
339{
340 return qemu_opts_id_wellformed(name);
341}
342
bellardb3380822004-03-14 21:38:54 +0000343/* create a new block device (by default it is empty) */
Kevin Wolf98522f62014-04-17 13:16:01 +0200344BlockDriverState *bdrv_new(const char *device_name, Error **errp)
bellardfc01f7e2003-06-30 10:03:06 +0000345{
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +0100346 BlockDriverState *bs;
Fam Zhengfbe40ff2014-05-23 21:29:42 +0800347 int i;
bellardb3380822004-03-14 21:38:54 +0000348
Kevin Wolf9aebf3b2014-09-25 09:54:02 +0200349 if (*device_name && !bdrv_is_valid_name(device_name)) {
350 error_setg(errp, "Invalid device name");
351 return NULL;
352 }
353
Kevin Wolff2d953e2014-04-17 13:27:05 +0200354 if (bdrv_find(device_name)) {
355 error_setg(errp, "Device with id '%s' already exists",
356 device_name);
357 return NULL;
358 }
359 if (bdrv_find_node(device_name)) {
Markus Armbrusterd2244692014-09-12 21:26:24 +0200360 error_setg(errp,
361 "Device name '%s' conflicts with an existing node name",
Kevin Wolff2d953e2014-04-17 13:27:05 +0200362 device_name);
363 return NULL;
364 }
365
Markus Armbruster5839e532014-08-19 10:31:08 +0200366 bs = g_new0(BlockDriverState, 1);
Fam Zhenge4654d22013-11-13 18:29:43 +0800367 QLIST_INIT(&bs->dirty_bitmaps);
bellardb3380822004-03-14 21:38:54 +0000368 pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
bellardea2384d2004-08-01 21:59:26 +0000369 if (device_name[0] != '\0') {
Benoît Canetdc364f42014-01-23 21:31:32 +0100370 QTAILQ_INSERT_TAIL(&bdrv_states, bs, device_list);
bellardea2384d2004-08-01 21:59:26 +0000371 }
Fam Zhengfbe40ff2014-05-23 21:29:42 +0800372 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
373 QLIST_INIT(&bs->op_blockers[i]);
374 }
Luiz Capitulino28a72822011-09-26 17:43:50 -0300375 bdrv_iostatus_disable(bs);
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200376 notifier_list_init(&bs->close_notifiers);
Stefan Hajnoczid616b222013-06-24 17:13:10 +0200377 notifier_with_return_list_init(&bs->before_write_notifiers);
Benoît Canetcc0681c2013-09-02 14:14:39 +0200378 qemu_co_queue_init(&bs->throttled_reqs[0]);
379 qemu_co_queue_init(&bs->throttled_reqs[1]);
Fam Zheng9fcb0252013-08-23 09:14:46 +0800380 bs->refcnt = 1;
Stefan Hajnoczidcd04222014-05-08 16:34:37 +0200381 bs->aio_context = qemu_get_aio_context();
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200382
bellardb3380822004-03-14 21:38:54 +0000383 return bs;
384}
385
Paolo Bonzinid7d512f2012-08-23 11:20:36 +0200386void bdrv_add_close_notifier(BlockDriverState *bs, Notifier *notify)
387{
388 notifier_list_add(&bs->close_notifiers, notify);
389}
390
bellardea2384d2004-08-01 21:59:26 +0000391BlockDriver *bdrv_find_format(const char *format_name)
392{
393 BlockDriver *drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100394 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
395 if (!strcmp(drv1->format_name, format_name)) {
bellardea2384d2004-08-01 21:59:26 +0000396 return drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100397 }
bellardea2384d2004-08-01 21:59:26 +0000398 }
399 return NULL;
400}
401
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800402static int bdrv_is_whitelisted(BlockDriver *drv, bool read_only)
Markus Armbrustereb852012009-10-27 18:41:44 +0100403{
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800404 static const char *whitelist_rw[] = {
405 CONFIG_BDRV_RW_WHITELIST
406 };
407 static const char *whitelist_ro[] = {
408 CONFIG_BDRV_RO_WHITELIST
Markus Armbrustereb852012009-10-27 18:41:44 +0100409 };
410 const char **p;
411
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800412 if (!whitelist_rw[0] && !whitelist_ro[0]) {
Markus Armbrustereb852012009-10-27 18:41:44 +0100413 return 1; /* no whitelist, anything goes */
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800414 }
Markus Armbrustereb852012009-10-27 18:41:44 +0100415
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800416 for (p = whitelist_rw; *p; p++) {
Markus Armbrustereb852012009-10-27 18:41:44 +0100417 if (!strcmp(drv->format_name, *p)) {
418 return 1;
419 }
420 }
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800421 if (read_only) {
422 for (p = whitelist_ro; *p; p++) {
423 if (!strcmp(drv->format_name, *p)) {
424 return 1;
425 }
426 }
427 }
Markus Armbrustereb852012009-10-27 18:41:44 +0100428 return 0;
429}
430
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800431BlockDriver *bdrv_find_whitelisted_format(const char *format_name,
432 bool read_only)
Markus Armbrustereb852012009-10-27 18:41:44 +0100433{
434 BlockDriver *drv = bdrv_find_format(format_name);
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800435 return drv && bdrv_is_whitelisted(drv, read_only) ? drv : NULL;
Markus Armbrustereb852012009-10-27 18:41:44 +0100436}
437
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800438typedef struct CreateCo {
439 BlockDriver *drv;
440 char *filename;
Chunyan Liu83d05212014-06-05 17:20:51 +0800441 QemuOpts *opts;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800442 int ret;
Max Reitzcc84d902013-09-06 17:14:26 +0200443 Error *err;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800444} CreateCo;
445
446static void coroutine_fn bdrv_create_co_entry(void *opaque)
447{
Max Reitzcc84d902013-09-06 17:14:26 +0200448 Error *local_err = NULL;
449 int ret;
450
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800451 CreateCo *cco = opaque;
452 assert(cco->drv);
453
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800454 ret = cco->drv->bdrv_create(cco->filename, cco->opts, &local_err);
Markus Armbruster84d18f02014-01-30 15:07:28 +0100455 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200456 error_propagate(&cco->err, local_err);
457 }
458 cco->ret = ret;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800459}
460
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200461int bdrv_create(BlockDriver *drv, const char* filename,
Chunyan Liu83d05212014-06-05 17:20:51 +0800462 QemuOpts *opts, Error **errp)
bellardea2384d2004-08-01 21:59:26 +0000463{
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800464 int ret;
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200465
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800466 Coroutine *co;
467 CreateCo cco = {
468 .drv = drv,
469 .filename = g_strdup(filename),
Chunyan Liu83d05212014-06-05 17:20:51 +0800470 .opts = opts,
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800471 .ret = NOT_DONE,
Max Reitzcc84d902013-09-06 17:14:26 +0200472 .err = NULL,
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800473 };
474
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800475 if (!drv->bdrv_create) {
Max Reitzcc84d902013-09-06 17:14:26 +0200476 error_setg(errp, "Driver '%s' does not support image creation", drv->format_name);
Luiz Capitulino80168bf2012-10-17 16:45:25 -0300477 ret = -ENOTSUP;
478 goto out;
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800479 }
480
481 if (qemu_in_coroutine()) {
482 /* Fast-path if already in coroutine context */
483 bdrv_create_co_entry(&cco);
484 } else {
485 co = qemu_coroutine_create(bdrv_create_co_entry);
486 qemu_coroutine_enter(co, &cco);
487 while (cco.ret == NOT_DONE) {
Paolo Bonzinib47ec2c2014-07-07 15:18:01 +0200488 aio_poll(qemu_get_aio_context(), true);
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800489 }
490 }
491
492 ret = cco.ret;
Max Reitzcc84d902013-09-06 17:14:26 +0200493 if (ret < 0) {
Markus Armbruster84d18f02014-01-30 15:07:28 +0100494 if (cco.err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200495 error_propagate(errp, cco.err);
496 } else {
497 error_setg_errno(errp, -ret, "Could not create image");
498 }
499 }
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800500
Luiz Capitulino80168bf2012-10-17 16:45:25 -0300501out:
502 g_free(cco.filename);
Zhi Yong Wu5b7e1542012-05-07 16:50:42 +0800503 return ret;
bellardea2384d2004-08-01 21:59:26 +0000504}
505
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800506int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200507{
508 BlockDriver *drv;
Max Reitzcc84d902013-09-06 17:14:26 +0200509 Error *local_err = NULL;
510 int ret;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200511
Kevin Wolf98289622013-07-10 15:47:39 +0200512 drv = bdrv_find_protocol(filename, true);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200513 if (drv == NULL) {
Max Reitzcc84d902013-09-06 17:14:26 +0200514 error_setg(errp, "Could not find protocol for file '%s'", filename);
Stefan Hajnoczi16905d72010-11-30 15:14:14 +0000515 return -ENOENT;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200516 }
517
Chunyan Liuc282e1f2014-06-05 17:21:11 +0800518 ret = bdrv_create(drv, filename, opts, &local_err);
Markus Armbruster84d18f02014-01-30 15:07:28 +0100519 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +0200520 error_propagate(errp, local_err);
521 }
522 return ret;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200523}
524
Kevin Wolf3baca892014-07-16 17:48:16 +0200525void bdrv_refresh_limits(BlockDriverState *bs, Error **errp)
Kevin Wolfd34682c2013-12-11 19:26:16 +0100526{
527 BlockDriver *drv = bs->drv;
Kevin Wolf3baca892014-07-16 17:48:16 +0200528 Error *local_err = NULL;
Kevin Wolfd34682c2013-12-11 19:26:16 +0100529
530 memset(&bs->bl, 0, sizeof(bs->bl));
531
Kevin Wolf466ad822013-12-11 19:50:32 +0100532 if (!drv) {
Kevin Wolf3baca892014-07-16 17:48:16 +0200533 return;
Kevin Wolf466ad822013-12-11 19:50:32 +0100534 }
535
536 /* Take some limits from the children as a default */
537 if (bs->file) {
Kevin Wolf3baca892014-07-16 17:48:16 +0200538 bdrv_refresh_limits(bs->file, &local_err);
539 if (local_err) {
540 error_propagate(errp, local_err);
541 return;
542 }
Kevin Wolf466ad822013-12-11 19:50:32 +0100543 bs->bl.opt_transfer_length = bs->file->bl.opt_transfer_length;
Kevin Wolf339064d2013-11-28 10:23:32 +0100544 bs->bl.opt_mem_alignment = bs->file->bl.opt_mem_alignment;
545 } else {
546 bs->bl.opt_mem_alignment = 512;
Kevin Wolf466ad822013-12-11 19:50:32 +0100547 }
548
549 if (bs->backing_hd) {
Kevin Wolf3baca892014-07-16 17:48:16 +0200550 bdrv_refresh_limits(bs->backing_hd, &local_err);
551 if (local_err) {
552 error_propagate(errp, local_err);
553 return;
554 }
Kevin Wolf466ad822013-12-11 19:50:32 +0100555 bs->bl.opt_transfer_length =
556 MAX(bs->bl.opt_transfer_length,
557 bs->backing_hd->bl.opt_transfer_length);
Kevin Wolf339064d2013-11-28 10:23:32 +0100558 bs->bl.opt_mem_alignment =
559 MAX(bs->bl.opt_mem_alignment,
560 bs->backing_hd->bl.opt_mem_alignment);
Kevin Wolf466ad822013-12-11 19:50:32 +0100561 }
562
563 /* Then let the driver override it */
564 if (drv->bdrv_refresh_limits) {
Kevin Wolf3baca892014-07-16 17:48:16 +0200565 drv->bdrv_refresh_limits(bs, errp);
Kevin Wolfd34682c2013-12-11 19:26:16 +0100566 }
Kevin Wolfd34682c2013-12-11 19:26:16 +0100567}
568
Jim Meyeringeba25052012-05-28 09:27:54 +0200569/*
570 * Create a uniquely-named empty temporary file.
571 * Return 0 upon success, otherwise a negative errno value.
572 */
573int get_tmp_filename(char *filename, int size)
574{
bellardd5249392004-08-03 21:14:23 +0000575#ifdef _WIN32
bellard3b9f94e2007-01-07 17:27:07 +0000576 char temp_dir[MAX_PATH];
Jim Meyeringeba25052012-05-28 09:27:54 +0200577 /* GetTempFileName requires that its output buffer (4th param)
578 have length MAX_PATH or greater. */
579 assert(size >= MAX_PATH);
580 return (GetTempPath(MAX_PATH, temp_dir)
581 && GetTempFileName(temp_dir, "qem", 0, filename)
582 ? 0 : -GetLastError());
bellardd5249392004-08-03 21:14:23 +0000583#else
bellardea2384d2004-08-01 21:59:26 +0000584 int fd;
blueswir17ccfb2e2008-09-14 06:45:34 +0000585 const char *tmpdir;
aurel320badc1e2008-03-10 00:05:34 +0000586 tmpdir = getenv("TMPDIR");
Amit Shah69bef792014-02-26 15:12:37 +0530587 if (!tmpdir) {
588 tmpdir = "/var/tmp";
589 }
Jim Meyeringeba25052012-05-28 09:27:54 +0200590 if (snprintf(filename, size, "%s/vl.XXXXXX", tmpdir) >= size) {
591 return -EOVERFLOW;
592 }
bellardea2384d2004-08-01 21:59:26 +0000593 fd = mkstemp(filename);
Dunrong Huangfe235a02012-09-05 21:26:22 +0800594 if (fd < 0) {
595 return -errno;
596 }
597 if (close(fd) != 0) {
598 unlink(filename);
Jim Meyeringeba25052012-05-28 09:27:54 +0200599 return -errno;
600 }
601 return 0;
bellardd5249392004-08-03 21:14:23 +0000602#endif
Jim Meyeringeba25052012-05-28 09:27:54 +0200603}
bellardea2384d2004-08-01 21:59:26 +0000604
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200605/*
606 * Detect host devices. By convention, /dev/cdrom[N] is always
607 * recognized as a host CDROM.
608 */
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200609static BlockDriver *find_hdev_driver(const char *filename)
610{
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200611 int score_max = 0, score;
612 BlockDriver *drv = NULL, *d;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200613
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100614 QLIST_FOREACH(d, &bdrv_drivers, list) {
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200615 if (d->bdrv_probe_device) {
616 score = d->bdrv_probe_device(filename);
617 if (score > score_max) {
618 score_max = score;
619 drv = d;
620 }
621 }
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200622 }
623
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200624 return drv;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200625}
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200626
Kevin Wolf98289622013-07-10 15:47:39 +0200627BlockDriver *bdrv_find_protocol(const char *filename,
628 bool allow_protocol_prefix)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200629{
630 BlockDriver *drv1;
631 char protocol[128];
632 int len;
633 const char *p;
634
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200635 /* TODO Drivers without bdrv_file_open must be specified explicitly */
636
Christoph Hellwig39508e72010-06-23 12:25:17 +0200637 /*
638 * XXX(hch): we really should not let host device detection
639 * override an explicit protocol specification, but moving this
640 * later breaks access to device names with colons in them.
641 * Thanks to the brain-dead persistent naming schemes on udev-
642 * based Linux systems those actually are quite common.
643 */
644 drv1 = find_hdev_driver(filename);
645 if (drv1) {
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200646 return drv1;
647 }
Christoph Hellwig39508e72010-06-23 12:25:17 +0200648
Kevin Wolf98289622013-07-10 15:47:39 +0200649 if (!path_has_protocol(filename) || !allow_protocol_prefix) {
Christoph Hellwig39508e72010-06-23 12:25:17 +0200650 return bdrv_find_format("file");
651 }
Kevin Wolf98289622013-07-10 15:47:39 +0200652
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000653 p = strchr(filename, ':');
654 assert(p != NULL);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200655 len = p - filename;
656 if (len > sizeof(protocol) - 1)
657 len = sizeof(protocol) - 1;
658 memcpy(protocol, filename, len);
659 protocol[len] = '\0';
660 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
661 if (drv1->protocol_name &&
662 !strcmp(drv1->protocol_name, protocol)) {
663 return drv1;
664 }
665 }
666 return NULL;
667}
668
Kevin Wolff500a6d2012-11-12 17:35:27 +0100669static int find_image_format(BlockDriverState *bs, const char *filename,
Max Reitz34b5d2c2013-09-05 14:45:29 +0200670 BlockDriver **pdrv, Error **errp)
bellardea2384d2004-08-01 21:59:26 +0000671{
Kevin Wolff500a6d2012-11-12 17:35:27 +0100672 int score, score_max;
bellardea2384d2004-08-01 21:59:26 +0000673 BlockDriver *drv1, *drv;
bellard83f64092006-08-01 16:21:11 +0000674 uint8_t buf[2048];
Kevin Wolff500a6d2012-11-12 17:35:27 +0100675 int ret = 0;
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700676
Kevin Wolf08a00552010-06-01 18:37:31 +0200677 /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
Paolo Bonzini8e895592013-01-10 15:39:27 +0100678 if (bs->sg || !bdrv_is_inserted(bs) || bdrv_getlength(bs) == 0) {
Stefan Weilc98ac352010-07-21 21:51:51 +0200679 drv = bdrv_find_format("raw");
680 if (!drv) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200681 error_setg(errp, "Could not find raw image format");
Stefan Weilc98ac352010-07-21 21:51:51 +0200682 ret = -ENOENT;
683 }
684 *pdrv = drv;
685 return ret;
Nicholas A. Bellinger1a396852010-05-27 08:56:28 -0700686 }
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700687
bellard83f64092006-08-01 16:21:11 +0000688 ret = bdrv_pread(bs, 0, buf, sizeof(buf));
bellard83f64092006-08-01 16:21:11 +0000689 if (ret < 0) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200690 error_setg_errno(errp, -ret, "Could not read image for determining its "
691 "format");
Stefan Weilc98ac352010-07-21 21:51:51 +0200692 *pdrv = NULL;
693 return ret;
bellard83f64092006-08-01 16:21:11 +0000694 }
695
bellardea2384d2004-08-01 21:59:26 +0000696 score_max = 0;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200697 drv = NULL;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100698 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
bellard83f64092006-08-01 16:21:11 +0000699 if (drv1->bdrv_probe) {
700 score = drv1->bdrv_probe(buf, ret, filename);
701 if (score > score_max) {
702 score_max = score;
703 drv = drv1;
704 }
bellardea2384d2004-08-01 21:59:26 +0000705 }
706 }
Stefan Weilc98ac352010-07-21 21:51:51 +0200707 if (!drv) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200708 error_setg(errp, "Could not determine image format: No compatible "
709 "driver found");
Stefan Weilc98ac352010-07-21 21:51:51 +0200710 ret = -ENOENT;
711 }
712 *pdrv = drv;
713 return ret;
bellardea2384d2004-08-01 21:59:26 +0000714}
715
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100716/**
717 * Set the current 'total_sectors' value
Markus Armbruster65a9bb22014-06-26 13:23:17 +0200718 * Return 0 on success, -errno on error.
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100719 */
720static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
721{
722 BlockDriver *drv = bs->drv;
723
Nicholas Bellinger396759a2010-05-17 09:46:04 -0700724 /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
725 if (bs->sg)
726 return 0;
727
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100728 /* query actual device if possible, otherwise just trust the hint */
729 if (drv->bdrv_getlength) {
730 int64_t length = drv->bdrv_getlength(bs);
731 if (length < 0) {
732 return length;
733 }
Fam Zheng7e382002013-11-06 19:48:06 +0800734 hint = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE);
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100735 }
736
737 bs->total_sectors = hint;
738 return 0;
739}
740
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100741/**
Paolo Bonzini9e8f1832013-02-08 14:06:11 +0100742 * Set open flags for a given discard mode
743 *
744 * Return 0 on success, -1 if the discard mode was invalid.
745 */
746int bdrv_parse_discard_flags(const char *mode, int *flags)
747{
748 *flags &= ~BDRV_O_UNMAP;
749
750 if (!strcmp(mode, "off") || !strcmp(mode, "ignore")) {
751 /* do nothing */
752 } else if (!strcmp(mode, "on") || !strcmp(mode, "unmap")) {
753 *flags |= BDRV_O_UNMAP;
754 } else {
755 return -1;
756 }
757
758 return 0;
759}
760
761/**
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100762 * Set open flags for a given cache mode
763 *
764 * Return 0 on success, -1 if the cache mode was invalid.
765 */
766int bdrv_parse_cache_flags(const char *mode, int *flags)
767{
768 *flags &= ~BDRV_O_CACHE_MASK;
769
770 if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
771 *flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
Stefan Hajnoczi92196b22011-08-04 12:26:52 +0100772 } else if (!strcmp(mode, "directsync")) {
773 *flags |= BDRV_O_NOCACHE;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100774 } else if (!strcmp(mode, "writeback")) {
775 *flags |= BDRV_O_CACHE_WB;
776 } else if (!strcmp(mode, "unsafe")) {
777 *flags |= BDRV_O_CACHE_WB;
778 *flags |= BDRV_O_NO_FLUSH;
779 } else if (!strcmp(mode, "writethrough")) {
780 /* this is the default */
781 } else {
782 return -1;
783 }
784
785 return 0;
786}
787
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000788/**
789 * The copy-on-read flag is actually a reference count so multiple users may
790 * use the feature without worrying about clobbering its previous state.
791 * Copy-on-read stays enabled until all users have called to disable it.
792 */
793void bdrv_enable_copy_on_read(BlockDriverState *bs)
794{
795 bs->copy_on_read++;
796}
797
798void bdrv_disable_copy_on_read(BlockDriverState *bs)
799{
800 assert(bs->copy_on_read > 0);
801 bs->copy_on_read--;
802}
803
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200804/*
Kevin Wolfb1e6fc02014-05-06 12:11:42 +0200805 * Returns the flags that a temporary snapshot should get, based on the
806 * originally requested flags (the originally requested image will have flags
807 * like a backing file)
808 */
809static int bdrv_temp_snapshot_flags(int flags)
810{
811 return (flags & ~BDRV_O_SNAPSHOT) | BDRV_O_TEMPORARY;
812}
813
814/*
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200815 * Returns the flags that bs->file should get, based on the given flags for
816 * the parent BDS
817 */
818static int bdrv_inherited_flags(int flags)
819{
820 /* Enable protocol handling, disable format probing for bs->file */
821 flags |= BDRV_O_PROTOCOL;
822
823 /* Our block drivers take care to send flushes and respect unmap policy,
824 * so we can enable both unconditionally on lower layers. */
825 flags |= BDRV_O_CACHE_WB | BDRV_O_UNMAP;
826
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200827 /* Clear flags that only apply to the top layer */
Kevin Wolf5669b442014-04-11 21:36:45 +0200828 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ);
Kevin Wolf0b50cc82014-04-11 21:29:52 +0200829
830 return flags;
831}
832
Kevin Wolf317fc442014-04-25 13:27:34 +0200833/*
834 * Returns the flags that bs->backing_hd should get, based on the given flags
835 * for the parent BDS
836 */
837static int bdrv_backing_flags(int flags)
838{
839 /* backing files always opened read-only */
840 flags &= ~(BDRV_O_RDWR | BDRV_O_COPY_ON_READ);
841
842 /* snapshot=on is handled on the top layer */
Kevin Wolf8bfea152014-04-11 19:16:36 +0200843 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_TEMPORARY);
Kevin Wolf317fc442014-04-25 13:27:34 +0200844
845 return flags;
846}
847
Kevin Wolf7b272452012-11-12 17:05:39 +0100848static int bdrv_open_flags(BlockDriverState *bs, int flags)
849{
850 int open_flags = flags | BDRV_O_CACHE_WB;
851
852 /*
853 * Clear flags that are internal to the block layer before opening the
854 * image.
855 */
Kevin Wolf20cca272014-06-04 14:33:27 +0200856 open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_PROTOCOL);
Kevin Wolf7b272452012-11-12 17:05:39 +0100857
858 /*
859 * Snapshots should be writable.
860 */
Kevin Wolf8bfea152014-04-11 19:16:36 +0200861 if (flags & BDRV_O_TEMPORARY) {
Kevin Wolf7b272452012-11-12 17:05:39 +0100862 open_flags |= BDRV_O_RDWR;
863 }
864
865 return open_flags;
866}
867
Kevin Wolf636ea372014-01-24 14:11:52 +0100868static void bdrv_assign_node_name(BlockDriverState *bs,
869 const char *node_name,
870 Error **errp)
Benoît Canet6913c0c2014-01-23 21:31:33 +0100871{
872 if (!node_name) {
Kevin Wolf636ea372014-01-24 14:11:52 +0100873 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100874 }
875
Kevin Wolf9aebf3b2014-09-25 09:54:02 +0200876 /* Check for empty string or invalid characters */
877 if (!bdrv_is_valid_name(node_name)) {
878 error_setg(errp, "Invalid node name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100879 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100880 }
881
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100882 /* takes care of avoiding namespaces collisions */
883 if (bdrv_find(node_name)) {
884 error_setg(errp, "node-name=%s is conflicting with a device id",
885 node_name);
Kevin Wolf636ea372014-01-24 14:11:52 +0100886 return;
Benoît Canet0c5e94e2014-02-12 17:15:07 +0100887 }
888
Benoît Canet6913c0c2014-01-23 21:31:33 +0100889 /* takes care of avoiding duplicates node names */
890 if (bdrv_find_node(node_name)) {
891 error_setg(errp, "Duplicate node name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100892 return;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100893 }
894
895 /* copy node name into the bs and insert it into the graph list */
896 pstrcpy(bs->node_name, sizeof(bs->node_name), node_name);
897 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs, node_list);
Benoît Canet6913c0c2014-01-23 21:31:33 +0100898}
899
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200900/*
Kevin Wolf57915332010-04-14 15:24:50 +0200901 * Common part for opening disk images and files
Kevin Wolfb6ad4912013-03-15 10:35:04 +0100902 *
903 * Removes all processed options from *options.
Kevin Wolf57915332010-04-14 15:24:50 +0200904 */
Kevin Wolff500a6d2012-11-12 17:35:27 +0100905static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
Max Reitz34b5d2c2013-09-05 14:45:29 +0200906 QDict *options, int flags, BlockDriver *drv, Error **errp)
Kevin Wolf57915332010-04-14 15:24:50 +0200907{
908 int ret, open_flags;
Kevin Wolf035fccd2013-04-09 14:34:19 +0200909 const char *filename;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100910 const char *node_name = NULL;
Max Reitz34b5d2c2013-09-05 14:45:29 +0200911 Error *local_err = NULL;
Kevin Wolf57915332010-04-14 15:24:50 +0200912
913 assert(drv != NULL);
Paolo Bonzini64058752012-05-08 16:51:49 +0200914 assert(bs->file == NULL);
Kevin Wolf707ff822013-03-06 12:20:31 +0100915 assert(options != NULL && bs->options != options);
Kevin Wolf57915332010-04-14 15:24:50 +0200916
Kevin Wolf45673672013-04-22 17:48:40 +0200917 if (file != NULL) {
918 filename = file->filename;
919 } else {
920 filename = qdict_get_try_str(options, "filename");
921 }
922
Kevin Wolf765003d2014-02-03 14:49:42 +0100923 if (drv->bdrv_needs_filename && !filename) {
924 error_setg(errp, "The '%s' block driver requires a file name",
925 drv->format_name);
926 return -EINVAL;
927 }
928
Kevin Wolf45673672013-04-22 17:48:40 +0200929 trace_bdrv_open_common(bs, filename ?: "", flags, drv->format_name);
Stefan Hajnoczi28dcee12011-09-22 20:14:12 +0100930
Benoît Canet6913c0c2014-01-23 21:31:33 +0100931 node_name = qdict_get_try_str(options, "node-name");
Kevin Wolf636ea372014-01-24 14:11:52 +0100932 bdrv_assign_node_name(bs, node_name, &local_err);
Markus Armbruster0fb63952014-04-25 16:50:31 +0200933 if (local_err) {
Kevin Wolf636ea372014-01-24 14:11:52 +0100934 error_propagate(errp, local_err);
935 return -EINVAL;
Benoît Canet6913c0c2014-01-23 21:31:33 +0100936 }
937 qdict_del(options, "node-name");
938
Kevin Wolf5d186eb2013-03-27 17:28:18 +0100939 /* bdrv_open() with directly using a protocol as drv. This layer is already
940 * opened, so assign it to bs (while file becomes a closed BlockDriverState)
941 * and return immediately. */
942 if (file != NULL && drv->bdrv_file_open) {
943 bdrv_swap(file, bs);
944 return 0;
945 }
946
Kevin Wolf57915332010-04-14 15:24:50 +0200947 bs->open_flags = flags;
Paolo Bonzini1b7fd722011-11-29 11:35:47 +0100948 bs->guest_block_size = 512;
Paolo Bonzinic25f53b2011-11-29 12:42:20 +0100949 bs->request_alignment = 512;
Asias He0d51b4d2013-08-22 15:24:14 +0800950 bs->zero_beyond_eof = true;
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800951 open_flags = bdrv_open_flags(bs, flags);
952 bs->read_only = !(open_flags & BDRV_O_RDWR);
Kevin Wolf20cca272014-06-04 14:33:27 +0200953 bs->growable = !!(flags & BDRV_O_PROTOCOL);
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800954
955 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, bs->read_only)) {
Kevin Wolf8f94a6e2013-10-10 11:45:55 +0200956 error_setg(errp,
957 !bs->read_only && bdrv_is_whitelisted(drv, true)
958 ? "Driver '%s' can only be used for read-only devices"
959 : "Driver '%s' is not whitelisted",
960 drv->format_name);
Fam Zhengb64ec4e2013-05-29 19:35:40 +0800961 return -ENOTSUP;
962 }
Kevin Wolf57915332010-04-14 15:24:50 +0200963
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000964 assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */
Kevin Wolf0ebd24e2013-09-19 15:12:18 +0200965 if (flags & BDRV_O_COPY_ON_READ) {
966 if (!bs->read_only) {
967 bdrv_enable_copy_on_read(bs);
968 } else {
969 error_setg(errp, "Can't use copy-on-read on read-only device");
970 return -EINVAL;
971 }
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000972 }
973
Kevin Wolfc2ad1b02013-03-18 16:40:51 +0100974 if (filename != NULL) {
975 pstrcpy(bs->filename, sizeof(bs->filename), filename);
976 } else {
977 bs->filename[0] = '\0';
978 }
Max Reitz91af7012014-07-18 20:24:56 +0200979 pstrcpy(bs->exact_filename, sizeof(bs->exact_filename), bs->filename);
Kevin Wolf57915332010-04-14 15:24:50 +0200980
Kevin Wolf57915332010-04-14 15:24:50 +0200981 bs->drv = drv;
Anthony Liguori7267c092011-08-20 22:09:37 -0500982 bs->opaque = g_malloc0(drv->instance_size);
Kevin Wolf57915332010-04-14 15:24:50 +0200983
Stefan Hajnoczi03f541b2011-10-27 10:54:28 +0100984 bs->enable_write_cache = !!(flags & BDRV_O_CACHE_WB);
Stefan Hajnoczie7c63792011-10-27 10:54:27 +0100985
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200986 /* Open the image, either directly or using a protocol */
987 if (drv->bdrv_file_open) {
Kevin Wolf5d186eb2013-03-27 17:28:18 +0100988 assert(file == NULL);
Benoît Canet030be322013-09-24 17:07:04 +0200989 assert(!drv->bdrv_needs_filename || filename != NULL);
Max Reitz34b5d2c2013-09-05 14:45:29 +0200990 ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
Kevin Wolff500a6d2012-11-12 17:35:27 +0100991 } else {
Kevin Wolf2af5ef72013-04-09 13:19:18 +0200992 if (file == NULL) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200993 error_setg(errp, "Can't use '%s' as a block driver for the "
994 "protocol level", drv->format_name);
Kevin Wolf2af5ef72013-04-09 13:19:18 +0200995 ret = -EINVAL;
996 goto free_and_fail;
997 }
Kevin Wolff500a6d2012-11-12 17:35:27 +0100998 bs->file = file;
Max Reitz34b5d2c2013-09-05 14:45:29 +0200999 ret = drv->bdrv_open(bs, options, open_flags, &local_err);
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001000 }
1001
Kevin Wolf57915332010-04-14 15:24:50 +02001002 if (ret < 0) {
Markus Armbruster84d18f02014-01-30 15:07:28 +01001003 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001004 error_propagate(errp, local_err);
Dunrong Huang2fa9aa52013-09-24 18:14:01 +08001005 } else if (bs->filename[0]) {
1006 error_setg_errno(errp, -ret, "Could not open '%s'", bs->filename);
Max Reitz34b5d2c2013-09-05 14:45:29 +02001007 } else {
1008 error_setg_errno(errp, -ret, "Could not open image");
1009 }
Kevin Wolf57915332010-04-14 15:24:50 +02001010 goto free_and_fail;
1011 }
1012
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001013 ret = refresh_total_sectors(bs, bs->total_sectors);
1014 if (ret < 0) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001015 error_setg_errno(errp, -ret, "Could not refresh total sector count");
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001016 goto free_and_fail;
Kevin Wolf57915332010-04-14 15:24:50 +02001017 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001018
Kevin Wolf3baca892014-07-16 17:48:16 +02001019 bdrv_refresh_limits(bs, &local_err);
1020 if (local_err) {
1021 error_propagate(errp, local_err);
1022 ret = -EINVAL;
1023 goto free_and_fail;
1024 }
1025
Paolo Bonzinic25f53b2011-11-29 12:42:20 +01001026 assert(bdrv_opt_mem_align(bs) != 0);
Kevin Wolf47ea2de2014-03-05 15:49:55 +01001027 assert((bs->request_alignment != 0) || bs->sg);
Kevin Wolf57915332010-04-14 15:24:50 +02001028 return 0;
1029
1030free_and_fail:
Kevin Wolff500a6d2012-11-12 17:35:27 +01001031 bs->file = NULL;
Anthony Liguori7267c092011-08-20 22:09:37 -05001032 g_free(bs->opaque);
Kevin Wolf57915332010-04-14 15:24:50 +02001033 bs->opaque = NULL;
1034 bs->drv = NULL;
1035 return ret;
1036}
1037
Kevin Wolf5e5c4f62014-05-26 11:45:08 +02001038static QDict *parse_json_filename(const char *filename, Error **errp)
1039{
1040 QObject *options_obj;
1041 QDict *options;
1042 int ret;
1043
1044 ret = strstart(filename, "json:", &filename);
1045 assert(ret);
1046
1047 options_obj = qobject_from_json(filename);
1048 if (!options_obj) {
1049 error_setg(errp, "Could not parse the JSON options");
1050 return NULL;
1051 }
1052
1053 if (qobject_type(options_obj) != QTYPE_QDICT) {
1054 qobject_decref(options_obj);
1055 error_setg(errp, "Invalid JSON object given");
1056 return NULL;
1057 }
1058
1059 options = qobject_to_qdict(options_obj);
1060 qdict_flatten(options);
1061
1062 return options;
1063}
1064
Kevin Wolf57915332010-04-14 15:24:50 +02001065/*
Kevin Wolff54120f2014-05-26 11:09:59 +02001066 * Fills in default options for opening images and converts the legacy
1067 * filename/flags pair to option QDict entries.
1068 */
Kevin Wolf5e5c4f62014-05-26 11:45:08 +02001069static int bdrv_fill_options(QDict **options, const char **pfilename, int flags,
Kevin Wolf17b005f2014-05-27 10:50:29 +02001070 BlockDriver *drv, Error **errp)
Kevin Wolff54120f2014-05-26 11:09:59 +02001071{
Kevin Wolf5e5c4f62014-05-26 11:45:08 +02001072 const char *filename = *pfilename;
Kevin Wolff54120f2014-05-26 11:09:59 +02001073 const char *drvname;
Kevin Wolf462f5bc2014-05-26 11:39:55 +02001074 bool protocol = flags & BDRV_O_PROTOCOL;
Kevin Wolff54120f2014-05-26 11:09:59 +02001075 bool parse_filename = false;
1076 Error *local_err = NULL;
Kevin Wolff54120f2014-05-26 11:09:59 +02001077
Kevin Wolf5e5c4f62014-05-26 11:45:08 +02001078 /* Parse json: pseudo-protocol */
1079 if (filename && g_str_has_prefix(filename, "json:")) {
1080 QDict *json_options = parse_json_filename(filename, &local_err);
1081 if (local_err) {
1082 error_propagate(errp, local_err);
1083 return -EINVAL;
1084 }
1085
1086 /* Options given in the filename have lower priority than options
1087 * specified directly */
1088 qdict_join(*options, json_options, false);
1089 QDECREF(json_options);
1090 *pfilename = filename = NULL;
1091 }
1092
Kevin Wolff54120f2014-05-26 11:09:59 +02001093 /* Fetch the file name from the options QDict if necessary */
Kevin Wolf17b005f2014-05-27 10:50:29 +02001094 if (protocol && filename) {
Kevin Wolff54120f2014-05-26 11:09:59 +02001095 if (!qdict_haskey(*options, "filename")) {
1096 qdict_put(*options, "filename", qstring_from_str(filename));
1097 parse_filename = true;
1098 } else {
1099 error_setg(errp, "Can't specify 'file' and 'filename' options at "
1100 "the same time");
1101 return -EINVAL;
1102 }
1103 }
1104
1105 /* Find the right block driver */
1106 filename = qdict_get_try_str(*options, "filename");
1107 drvname = qdict_get_try_str(*options, "driver");
1108
Kevin Wolf17b005f2014-05-27 10:50:29 +02001109 if (drv) {
1110 if (drvname) {
1111 error_setg(errp, "Driver specified twice");
1112 return -EINVAL;
1113 }
1114 drvname = drv->format_name;
1115 qdict_put(*options, "driver", qstring_from_str(drvname));
1116 } else {
1117 if (!drvname && protocol) {
1118 if (filename) {
1119 drv = bdrv_find_protocol(filename, parse_filename);
1120 if (!drv) {
1121 error_setg(errp, "Unknown protocol");
1122 return -EINVAL;
1123 }
1124
1125 drvname = drv->format_name;
1126 qdict_put(*options, "driver", qstring_from_str(drvname));
1127 } else {
1128 error_setg(errp, "Must specify either driver or file");
Kevin Wolff54120f2014-05-26 11:09:59 +02001129 return -EINVAL;
1130 }
Kevin Wolf17b005f2014-05-27 10:50:29 +02001131 } else if (drvname) {
1132 drv = bdrv_find_format(drvname);
1133 if (!drv) {
1134 error_setg(errp, "Unknown driver '%s'", drvname);
1135 return -ENOENT;
1136 }
Kevin Wolff54120f2014-05-26 11:09:59 +02001137 }
1138 }
1139
Kevin Wolf17b005f2014-05-27 10:50:29 +02001140 assert(drv || !protocol);
Kevin Wolff54120f2014-05-26 11:09:59 +02001141
1142 /* Driver-specific filename parsing */
Kevin Wolf17b005f2014-05-27 10:50:29 +02001143 if (drv && drv->bdrv_parse_filename && parse_filename) {
Kevin Wolff54120f2014-05-26 11:09:59 +02001144 drv->bdrv_parse_filename(filename, *options, &local_err);
1145 if (local_err) {
1146 error_propagate(errp, local_err);
1147 return -EINVAL;
1148 }
1149
1150 if (!drv->bdrv_needs_filename) {
1151 qdict_del(*options, "filename");
1152 }
1153 }
1154
1155 return 0;
1156}
1157
Fam Zheng8d24cce2014-05-23 21:29:45 +08001158void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd)
1159{
1160
Fam Zheng826b6ca2014-05-23 21:29:47 +08001161 if (bs->backing_hd) {
1162 assert(bs->backing_blocker);
1163 bdrv_op_unblock_all(bs->backing_hd, bs->backing_blocker);
1164 } else if (backing_hd) {
1165 error_setg(&bs->backing_blocker,
1166 "device is used as backing hd of '%s'",
1167 bs->device_name);
1168 }
1169
Fam Zheng8d24cce2014-05-23 21:29:45 +08001170 bs->backing_hd = backing_hd;
1171 if (!backing_hd) {
Fam Zheng826b6ca2014-05-23 21:29:47 +08001172 error_free(bs->backing_blocker);
1173 bs->backing_blocker = NULL;
Fam Zheng8d24cce2014-05-23 21:29:45 +08001174 goto out;
1175 }
1176 bs->open_flags &= ~BDRV_O_NO_BACKING;
1177 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filename);
1178 pstrcpy(bs->backing_format, sizeof(bs->backing_format),
1179 backing_hd->drv ? backing_hd->drv->format_name : "");
Fam Zheng826b6ca2014-05-23 21:29:47 +08001180
1181 bdrv_op_block_all(bs->backing_hd, bs->backing_blocker);
1182 /* Otherwise we won't be able to commit due to check in bdrv_commit */
1183 bdrv_op_unblock(bs->backing_hd, BLOCK_OP_TYPE_COMMIT,
1184 bs->backing_blocker);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001185out:
Kevin Wolf3baca892014-07-16 17:48:16 +02001186 bdrv_refresh_limits(bs, NULL);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001187}
1188
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001189/*
1190 * Opens the backing file for a BlockDriverState if not yet open
1191 *
1192 * options is a QDict of options to pass to the block drivers, or NULL for an
1193 * empty set of options. The reference to the QDict is transferred to this
1194 * function (even on failure), so if the caller intends to reuse the dictionary,
1195 * it needs to use QINCREF() before calling bdrv_file_open.
1196 */
Max Reitz34b5d2c2013-09-05 14:45:29 +02001197int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
Paolo Bonzini9156df12012-10-18 16:49:17 +02001198{
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001199 char *backing_filename = g_malloc0(PATH_MAX);
Kevin Wolf317fc442014-04-25 13:27:34 +02001200 int ret = 0;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001201 BlockDriver *back_drv = NULL;
Fam Zheng8d24cce2014-05-23 21:29:45 +08001202 BlockDriverState *backing_hd;
Max Reitz34b5d2c2013-09-05 14:45:29 +02001203 Error *local_err = NULL;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001204
1205 if (bs->backing_hd != NULL) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001206 QDECREF(options);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001207 goto free_exit;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001208 }
1209
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001210 /* NULL means an empty set of options */
1211 if (options == NULL) {
1212 options = qdict_new();
1213 }
1214
Paolo Bonzini9156df12012-10-18 16:49:17 +02001215 bs->open_flags &= ~BDRV_O_NO_BACKING;
Kevin Wolf1cb6f502013-04-12 20:27:07 +02001216 if (qdict_haskey(options, "file.filename")) {
1217 backing_filename[0] = '\0';
1218 } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001219 QDECREF(options);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001220 goto free_exit;
Fam Zhengdbecebd2013-09-22 20:05:06 +08001221 } else {
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001222 bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX);
Paolo Bonzini9156df12012-10-18 16:49:17 +02001223 }
1224
Kevin Wolf8ee79e72014-06-04 15:09:35 +02001225 if (!bs->drv || !bs->drv->supports_backing) {
1226 ret = -EINVAL;
1227 error_setg(errp, "Driver doesn't support backing files");
1228 QDECREF(options);
1229 goto free_exit;
1230 }
1231
Fam Zheng8d24cce2014-05-23 21:29:45 +08001232 backing_hd = bdrv_new("", errp);
1233
Paolo Bonzini9156df12012-10-18 16:49:17 +02001234 if (bs->backing_format[0] != '\0') {
1235 back_drv = bdrv_find_format(bs->backing_format);
1236 }
1237
Max Reitzf67503e2014-02-18 18:33:05 +01001238 assert(bs->backing_hd == NULL);
Fam Zheng8d24cce2014-05-23 21:29:45 +08001239 ret = bdrv_open(&backing_hd,
Max Reitzddf56362014-02-18 18:33:06 +01001240 *backing_filename ? backing_filename : NULL, NULL, options,
Kevin Wolf317fc442014-04-25 13:27:34 +02001241 bdrv_backing_flags(bs->open_flags), back_drv, &local_err);
Paolo Bonzini9156df12012-10-18 16:49:17 +02001242 if (ret < 0) {
Fam Zheng8d24cce2014-05-23 21:29:45 +08001243 bdrv_unref(backing_hd);
1244 backing_hd = NULL;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001245 bs->open_flags |= BDRV_O_NO_BACKING;
Fam Zhengb04b6b62013-11-08 11:26:49 +08001246 error_setg(errp, "Could not open backing file: %s",
1247 error_get_pretty(local_err));
1248 error_free(local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001249 goto free_exit;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001250 }
Fam Zheng8d24cce2014-05-23 21:29:45 +08001251 bdrv_set_backing_hd(bs, backing_hd);
Peter Feinerd80ac652014-01-08 19:43:25 +00001252
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001253free_exit:
1254 g_free(backing_filename);
1255 return ret;
Paolo Bonzini9156df12012-10-18 16:49:17 +02001256}
1257
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001258/*
Max Reitzda557aa2013-12-20 19:28:11 +01001259 * Opens a disk image whose options are given as BlockdevRef in another block
1260 * device's options.
1261 *
Max Reitzda557aa2013-12-20 19:28:11 +01001262 * If allow_none is true, no image will be opened if filename is false and no
1263 * BlockdevRef is given. *pbs will remain unchanged and 0 will be returned.
1264 *
1265 * bdrev_key specifies the key for the image's BlockdevRef in the options QDict.
1266 * That QDict has to be flattened; therefore, if the BlockdevRef is a QDict
1267 * itself, all options starting with "${bdref_key}." are considered part of the
1268 * BlockdevRef.
1269 *
1270 * The BlockdevRef will be removed from the options QDict.
Max Reitzf67503e2014-02-18 18:33:05 +01001271 *
1272 * To conform with the behavior of bdrv_open(), *pbs has to be NULL.
Max Reitzda557aa2013-12-20 19:28:11 +01001273 */
1274int bdrv_open_image(BlockDriverState **pbs, const char *filename,
1275 QDict *options, const char *bdref_key, int flags,
Max Reitzf7d9fd82014-02-18 18:33:12 +01001276 bool allow_none, Error **errp)
Max Reitzda557aa2013-12-20 19:28:11 +01001277{
1278 QDict *image_options;
1279 int ret;
1280 char *bdref_key_dot;
1281 const char *reference;
1282
Max Reitzf67503e2014-02-18 18:33:05 +01001283 assert(pbs);
1284 assert(*pbs == NULL);
1285
Max Reitzda557aa2013-12-20 19:28:11 +01001286 bdref_key_dot = g_strdup_printf("%s.", bdref_key);
1287 qdict_extract_subqdict(options, &image_options, bdref_key_dot);
1288 g_free(bdref_key_dot);
1289
1290 reference = qdict_get_try_str(options, bdref_key);
1291 if (!filename && !reference && !qdict_size(image_options)) {
1292 if (allow_none) {
1293 ret = 0;
1294 } else {
1295 error_setg(errp, "A block device must be specified for \"%s\"",
1296 bdref_key);
1297 ret = -EINVAL;
1298 }
Markus Armbrusterb20e61e2014-05-28 11:16:57 +02001299 QDECREF(image_options);
Max Reitzda557aa2013-12-20 19:28:11 +01001300 goto done;
1301 }
1302
Max Reitzf7d9fd82014-02-18 18:33:12 +01001303 ret = bdrv_open(pbs, filename, reference, image_options, flags, NULL, errp);
Max Reitzda557aa2013-12-20 19:28:11 +01001304
1305done:
1306 qdict_del(options, bdref_key);
1307 return ret;
1308}
1309
Chen Gang6b8aeca2014-06-23 23:28:23 +08001310int bdrv_append_temp_snapshot(BlockDriverState *bs, int flags, Error **errp)
Kevin Wolfb9988752014-04-03 12:09:34 +02001311{
1312 /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001313 char *tmp_filename = g_malloc0(PATH_MAX + 1);
Kevin Wolfb9988752014-04-03 12:09:34 +02001314 int64_t total_size;
1315 BlockDriver *bdrv_qcow2;
Chunyan Liu83d05212014-06-05 17:20:51 +08001316 QemuOpts *opts = NULL;
Kevin Wolfb9988752014-04-03 12:09:34 +02001317 QDict *snapshot_options;
1318 BlockDriverState *bs_snapshot;
1319 Error *local_err;
1320 int ret;
1321
1322 /* if snapshot, we create a temporary backing file and open it
1323 instead of opening 'filename' directly */
1324
1325 /* Get the required size from the image */
Kevin Wolff1877432014-04-04 17:07:19 +02001326 total_size = bdrv_getlength(bs);
1327 if (total_size < 0) {
Chen Gang6b8aeca2014-06-23 23:28:23 +08001328 ret = total_size;
Kevin Wolff1877432014-04-04 17:07:19 +02001329 error_setg_errno(errp, -total_size, "Could not get image size");
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001330 goto out;
Kevin Wolff1877432014-04-04 17:07:19 +02001331 }
Kevin Wolfb9988752014-04-03 12:09:34 +02001332
1333 /* Create the temporary image */
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001334 ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
Kevin Wolfb9988752014-04-03 12:09:34 +02001335 if (ret < 0) {
1336 error_setg_errno(errp, -ret, "Could not get temporary filename");
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001337 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001338 }
1339
1340 bdrv_qcow2 = bdrv_find_format("qcow2");
Chunyan Liuc282e1f2014-06-05 17:21:11 +08001341 opts = qemu_opts_create(bdrv_qcow2->create_opts, NULL, 0,
1342 &error_abort);
Chunyan Liu83d05212014-06-05 17:20:51 +08001343 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size);
Chunyan Liuc282e1f2014-06-05 17:21:11 +08001344 ret = bdrv_create(bdrv_qcow2, tmp_filename, opts, &local_err);
Chunyan Liu83d05212014-06-05 17:20:51 +08001345 qemu_opts_del(opts);
Kevin Wolfb9988752014-04-03 12:09:34 +02001346 if (ret < 0) {
1347 error_setg_errno(errp, -ret, "Could not create temporary overlay "
1348 "'%s': %s", tmp_filename,
1349 error_get_pretty(local_err));
1350 error_free(local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001351 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001352 }
1353
1354 /* Prepare a new options QDict for the temporary file */
1355 snapshot_options = qdict_new();
1356 qdict_put(snapshot_options, "file.driver",
1357 qstring_from_str("file"));
1358 qdict_put(snapshot_options, "file.filename",
1359 qstring_from_str(tmp_filename));
1360
Kevin Wolf98522f62014-04-17 13:16:01 +02001361 bs_snapshot = bdrv_new("", &error_abort);
Kevin Wolfb9988752014-04-03 12:09:34 +02001362
1363 ret = bdrv_open(&bs_snapshot, NULL, NULL, snapshot_options,
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001364 flags, bdrv_qcow2, &local_err);
Kevin Wolfb9988752014-04-03 12:09:34 +02001365 if (ret < 0) {
1366 error_propagate(errp, local_err);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001367 goto out;
Kevin Wolfb9988752014-04-03 12:09:34 +02001368 }
1369
1370 bdrv_append(bs_snapshot, bs);
Benoît Canet1ba4b6a2014-04-22 17:05:27 +02001371
1372out:
1373 g_free(tmp_filename);
Chen Gang6b8aeca2014-06-23 23:28:23 +08001374 return ret;
Kevin Wolfb9988752014-04-03 12:09:34 +02001375}
1376
Max Reitzda557aa2013-12-20 19:28:11 +01001377/*
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001378 * Opens a disk image (raw, qcow2, vmdk, ...)
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001379 *
1380 * options is a QDict of options to pass to the block drivers, or NULL for an
1381 * empty set of options. The reference to the QDict belongs to the block layer
1382 * after the call (even on failure), so if the caller intends to reuse the
1383 * dictionary, it needs to use QINCREF() before calling bdrv_open.
Max Reitzf67503e2014-02-18 18:33:05 +01001384 *
1385 * If *pbs is NULL, a new BDS will be created with a pointer to it stored there.
1386 * If it is not NULL, the referenced BDS will be reused.
Max Reitzddf56362014-02-18 18:33:06 +01001387 *
1388 * The reference parameter may be used to specify an existing block device which
1389 * should be opened. If specified, neither options nor a filename may be given,
1390 * nor can an existing BDS be reused (that is, *pbs has to be NULL).
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001391 */
Max Reitzddf56362014-02-18 18:33:06 +01001392int bdrv_open(BlockDriverState **pbs, const char *filename,
1393 const char *reference, QDict *options, int flags,
1394 BlockDriver *drv, Error **errp)
bellardea2384d2004-08-01 21:59:26 +00001395{
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001396 int ret;
Max Reitzf67503e2014-02-18 18:33:05 +01001397 BlockDriverState *file = NULL, *bs;
Kevin Wolf74fe54f2013-07-09 11:09:02 +02001398 const char *drvname;
Max Reitz34b5d2c2013-09-05 14:45:29 +02001399 Error *local_err = NULL;
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001400 int snapshot_flags = 0;
bellard712e7872005-04-28 21:09:32 +00001401
Max Reitzf67503e2014-02-18 18:33:05 +01001402 assert(pbs);
1403
Max Reitzddf56362014-02-18 18:33:06 +01001404 if (reference) {
1405 bool options_non_empty = options ? qdict_size(options) : false;
1406 QDECREF(options);
1407
1408 if (*pbs) {
1409 error_setg(errp, "Cannot reuse an existing BDS when referencing "
1410 "another block device");
1411 return -EINVAL;
1412 }
1413
1414 if (filename || options_non_empty) {
1415 error_setg(errp, "Cannot reference an existing block device with "
1416 "additional options or a new filename");
1417 return -EINVAL;
1418 }
1419
1420 bs = bdrv_lookup_bs(reference, reference, errp);
1421 if (!bs) {
1422 return -ENODEV;
1423 }
1424 bdrv_ref(bs);
1425 *pbs = bs;
1426 return 0;
1427 }
1428
Max Reitzf67503e2014-02-18 18:33:05 +01001429 if (*pbs) {
1430 bs = *pbs;
1431 } else {
Kevin Wolf98522f62014-04-17 13:16:01 +02001432 bs = bdrv_new("", &error_abort);
Max Reitzf67503e2014-02-18 18:33:05 +01001433 }
1434
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001435 /* NULL means an empty set of options */
1436 if (options == NULL) {
1437 options = qdict_new();
1438 }
1439
Kevin Wolf17b005f2014-05-27 10:50:29 +02001440 ret = bdrv_fill_options(&options, &filename, flags, drv, &local_err);
Kevin Wolf462f5bc2014-05-26 11:39:55 +02001441 if (local_err) {
1442 goto fail;
1443 }
1444
Kevin Wolf76c591b2014-06-04 14:19:44 +02001445 /* Find the right image format driver */
1446 drv = NULL;
1447 drvname = qdict_get_try_str(options, "driver");
1448 if (drvname) {
1449 drv = bdrv_find_format(drvname);
1450 qdict_del(options, "driver");
1451 if (!drv) {
1452 error_setg(errp, "Unknown driver: '%s'", drvname);
1453 ret = -EINVAL;
1454 goto fail;
1455 }
1456 }
1457
1458 assert(drvname || !(flags & BDRV_O_PROTOCOL));
1459 if (drv && !drv->bdrv_file_open) {
1460 /* If the user explicitly wants a format driver here, we'll need to add
1461 * another layer for the protocol in bs->file */
1462 flags &= ~BDRV_O_PROTOCOL;
1463 }
1464
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001465 bs->options = options;
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001466 options = qdict_clone_shallow(options);
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001467
Kevin Wolff4788ad2014-06-03 16:44:19 +02001468 /* Open image file without format layer */
1469 if ((flags & BDRV_O_PROTOCOL) == 0) {
1470 if (flags & BDRV_O_RDWR) {
1471 flags |= BDRV_O_ALLOW_RDWR;
1472 }
1473 if (flags & BDRV_O_SNAPSHOT) {
1474 snapshot_flags = bdrv_temp_snapshot_flags(flags);
1475 flags = bdrv_backing_flags(flags);
1476 }
1477
1478 assert(file == NULL);
1479 ret = bdrv_open_image(&file, filename, options, "file",
1480 bdrv_inherited_flags(flags),
1481 true, &local_err);
1482 if (ret < 0) {
Max Reitz5469a2a2014-02-18 18:33:10 +01001483 goto fail;
1484 }
1485 }
1486
Kevin Wolf76c591b2014-06-04 14:19:44 +02001487 /* Image format probing */
1488 if (!drv && file) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001489 ret = find_image_format(file, filename, &drv, &local_err);
1490 if (ret < 0) {
Kevin Wolf8bfea152014-04-11 19:16:36 +02001491 goto fail;
Max Reitz2a05cbe2013-12-20 19:28:10 +01001492 }
Kevin Wolf76c591b2014-06-04 14:19:44 +02001493 } else if (!drv) {
Kevin Wolf17b005f2014-05-27 10:50:29 +02001494 error_setg(errp, "Must specify either driver or file");
1495 ret = -EINVAL;
Kevin Wolf8bfea152014-04-11 19:16:36 +02001496 goto fail;
Kevin Wolff500a6d2012-11-12 17:35:27 +01001497 }
1498
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001499 /* Open the image */
Max Reitz34b5d2c2013-09-05 14:45:29 +02001500 ret = bdrv_open_common(bs, file, options, flags, drv, &local_err);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001501 if (ret < 0) {
Kevin Wolf8bfea152014-04-11 19:16:36 +02001502 goto fail;
Christoph Hellwig69873072010-01-20 18:13:25 +01001503 }
1504
Max Reitz2a05cbe2013-12-20 19:28:10 +01001505 if (file && (bs->file != file)) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001506 bdrv_unref(file);
Kevin Wolff500a6d2012-11-12 17:35:27 +01001507 file = NULL;
1508 }
1509
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001510 /* If there is a backing file, use it */
Paolo Bonzini9156df12012-10-18 16:49:17 +02001511 if ((flags & BDRV_O_NO_BACKING) == 0) {
Kevin Wolf31ca6d02013-03-28 15:29:24 +01001512 QDict *backing_options;
1513
Benoît Canet5726d872013-09-25 13:30:01 +02001514 qdict_extract_subqdict(options, &backing_options, "backing.");
Max Reitz34b5d2c2013-09-05 14:45:29 +02001515 ret = bdrv_open_backing_file(bs, backing_options, &local_err);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001516 if (ret < 0) {
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001517 goto close_and_fail;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001518 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001519 }
1520
Max Reitz91af7012014-07-18 20:24:56 +02001521 bdrv_refresh_filename(bs);
1522
Kevin Wolfb9988752014-04-03 12:09:34 +02001523 /* For snapshot=on, create a temporary qcow2 overlay. bs points to the
1524 * temporary snapshot afterwards. */
Kevin Wolfb1e6fc02014-05-06 12:11:42 +02001525 if (snapshot_flags) {
Chen Gang6b8aeca2014-06-23 23:28:23 +08001526 ret = bdrv_append_temp_snapshot(bs, snapshot_flags, &local_err);
Kevin Wolfb9988752014-04-03 12:09:34 +02001527 if (local_err) {
Kevin Wolfb9988752014-04-03 12:09:34 +02001528 goto close_and_fail;
1529 }
1530 }
1531
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001532 /* Check if any unknown options were used */
Max Reitz5acd9d82014-02-18 18:33:11 +01001533 if (options && (qdict_size(options) != 0)) {
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001534 const QDictEntry *entry = qdict_first(options);
Max Reitz5acd9d82014-02-18 18:33:11 +01001535 if (flags & BDRV_O_PROTOCOL) {
1536 error_setg(errp, "Block protocol '%s' doesn't support the option "
1537 "'%s'", drv->format_name, entry->key);
1538 } else {
1539 error_setg(errp, "Block format '%s' used by device '%s' doesn't "
1540 "support the option '%s'", drv->format_name,
1541 bs->device_name, entry->key);
1542 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001543
1544 ret = -EINVAL;
1545 goto close_and_fail;
1546 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001547
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001548 if (!bdrv_key_required(bs)) {
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +02001549 bdrv_dev_change_media_cb(bs, true);
Markus Armbrusterc3adb582014-03-14 09:22:48 +01001550 } else if (!runstate_check(RUN_STATE_PRELAUNCH)
1551 && !runstate_check(RUN_STATE_INMIGRATE)
1552 && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
1553 error_setg(errp,
1554 "Guest must be stopped for opening of encrypted image");
1555 ret = -EBUSY;
1556 goto close_and_fail;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001557 }
1558
Markus Armbrusterc3adb582014-03-14 09:22:48 +01001559 QDECREF(options);
Max Reitzf67503e2014-02-18 18:33:05 +01001560 *pbs = bs;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001561 return 0;
1562
Kevin Wolf8bfea152014-04-11 19:16:36 +02001563fail:
Kevin Wolff500a6d2012-11-12 17:35:27 +01001564 if (file != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001565 bdrv_unref(file);
Kevin Wolff500a6d2012-11-12 17:35:27 +01001566 }
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001567 QDECREF(bs->options);
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001568 QDECREF(options);
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001569 bs->options = NULL;
Max Reitzf67503e2014-02-18 18:33:05 +01001570 if (!*pbs) {
1571 /* If *pbs is NULL, a new BDS has been created in this function and
1572 needs to be freed now. Otherwise, it does not need to be closed,
1573 since it has not really been opened yet. */
1574 bdrv_unref(bs);
1575 }
Markus Armbruster84d18f02014-01-30 15:07:28 +01001576 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001577 error_propagate(errp, local_err);
1578 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001579 return ret;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001580
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001581close_and_fail:
Max Reitzf67503e2014-02-18 18:33:05 +01001582 /* See fail path, but now the BDS has to be always closed */
1583 if (*pbs) {
1584 bdrv_close(bs);
1585 } else {
1586 bdrv_unref(bs);
1587 }
Kevin Wolfb6ad4912013-03-15 10:35:04 +01001588 QDECREF(options);
Markus Armbruster84d18f02014-01-30 15:07:28 +01001589 if (local_err) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02001590 error_propagate(errp, local_err);
1591 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +02001592 return ret;
1593}
1594
Jeff Codye971aa12012-09-20 15:13:19 -04001595typedef struct BlockReopenQueueEntry {
1596 bool prepared;
1597 BDRVReopenState state;
1598 QSIMPLEQ_ENTRY(BlockReopenQueueEntry) entry;
1599} BlockReopenQueueEntry;
1600
1601/*
1602 * Adds a BlockDriverState to a simple queue for an atomic, transactional
1603 * reopen of multiple devices.
1604 *
1605 * bs_queue can either be an existing BlockReopenQueue that has had QSIMPLE_INIT
1606 * already performed, or alternatively may be NULL a new BlockReopenQueue will
1607 * be created and initialized. This newly created BlockReopenQueue should be
1608 * passed back in for subsequent calls that are intended to be of the same
1609 * atomic 'set'.
1610 *
1611 * bs is the BlockDriverState to add to the reopen queue.
1612 *
1613 * flags contains the open flags for the associated bs
1614 *
1615 * returns a pointer to bs_queue, which is either the newly allocated
1616 * bs_queue, or the existing bs_queue being used.
1617 *
1618 */
1619BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
1620 BlockDriverState *bs, int flags)
1621{
1622 assert(bs != NULL);
1623
1624 BlockReopenQueueEntry *bs_entry;
1625 if (bs_queue == NULL) {
1626 bs_queue = g_new0(BlockReopenQueue, 1);
1627 QSIMPLEQ_INIT(bs_queue);
1628 }
1629
Kevin Wolff1f25a22014-04-25 19:04:55 +02001630 /* bdrv_open() masks this flag out */
1631 flags &= ~BDRV_O_PROTOCOL;
1632
Jeff Codye971aa12012-09-20 15:13:19 -04001633 if (bs->file) {
Kevin Wolff1f25a22014-04-25 19:04:55 +02001634 bdrv_reopen_queue(bs_queue, bs->file, bdrv_inherited_flags(flags));
Jeff Codye971aa12012-09-20 15:13:19 -04001635 }
1636
1637 bs_entry = g_new0(BlockReopenQueueEntry, 1);
1638 QSIMPLEQ_INSERT_TAIL(bs_queue, bs_entry, entry);
1639
1640 bs_entry->state.bs = bs;
1641 bs_entry->state.flags = flags;
1642
1643 return bs_queue;
1644}
1645
1646/*
1647 * Reopen multiple BlockDriverStates atomically & transactionally.
1648 *
1649 * The queue passed in (bs_queue) must have been built up previous
1650 * via bdrv_reopen_queue().
1651 *
1652 * Reopens all BDS specified in the queue, with the appropriate
1653 * flags. All devices are prepared for reopen, and failure of any
1654 * device will cause all device changes to be abandonded, and intermediate
1655 * data cleaned up.
1656 *
1657 * If all devices prepare successfully, then the changes are committed
1658 * to all devices.
1659 *
1660 */
1661int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
1662{
1663 int ret = -1;
1664 BlockReopenQueueEntry *bs_entry, *next;
1665 Error *local_err = NULL;
1666
1667 assert(bs_queue != NULL);
1668
1669 bdrv_drain_all();
1670
1671 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1672 if (bdrv_reopen_prepare(&bs_entry->state, bs_queue, &local_err)) {
1673 error_propagate(errp, local_err);
1674 goto cleanup;
1675 }
1676 bs_entry->prepared = true;
1677 }
1678
1679 /* If we reach this point, we have success and just need to apply the
1680 * changes
1681 */
1682 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
1683 bdrv_reopen_commit(&bs_entry->state);
1684 }
1685
1686 ret = 0;
1687
1688cleanup:
1689 QSIMPLEQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
1690 if (ret && bs_entry->prepared) {
1691 bdrv_reopen_abort(&bs_entry->state);
1692 }
1693 g_free(bs_entry);
1694 }
1695 g_free(bs_queue);
1696 return ret;
1697}
1698
1699
1700/* Reopen a single BlockDriverState with the specified flags. */
1701int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp)
1702{
1703 int ret = -1;
1704 Error *local_err = NULL;
1705 BlockReopenQueue *queue = bdrv_reopen_queue(NULL, bs, bdrv_flags);
1706
1707 ret = bdrv_reopen_multiple(queue, &local_err);
1708 if (local_err != NULL) {
1709 error_propagate(errp, local_err);
1710 }
1711 return ret;
1712}
1713
1714
1715/*
1716 * Prepares a BlockDriverState for reopen. All changes are staged in the
1717 * 'opaque' field of the BDRVReopenState, which is used and allocated by
1718 * the block driver layer .bdrv_reopen_prepare()
1719 *
1720 * bs is the BlockDriverState to reopen
1721 * flags are the new open flags
1722 * queue is the reopen queue
1723 *
1724 * Returns 0 on success, non-zero on error. On error errp will be set
1725 * as well.
1726 *
1727 * On failure, bdrv_reopen_abort() will be called to clean up any data.
1728 * It is the responsibility of the caller to then call the abort() or
1729 * commit() for any other BDS that have been left in a prepare() state
1730 *
1731 */
1732int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
1733 Error **errp)
1734{
1735 int ret = -1;
1736 Error *local_err = NULL;
1737 BlockDriver *drv;
1738
1739 assert(reopen_state != NULL);
1740 assert(reopen_state->bs->drv != NULL);
1741 drv = reopen_state->bs->drv;
1742
1743 /* if we are to stay read-only, do not allow permission change
1744 * to r/w */
1745 if (!(reopen_state->bs->open_flags & BDRV_O_ALLOW_RDWR) &&
1746 reopen_state->flags & BDRV_O_RDWR) {
1747 error_set(errp, QERR_DEVICE_IS_READ_ONLY,
1748 reopen_state->bs->device_name);
1749 goto error;
1750 }
1751
1752
1753 ret = bdrv_flush(reopen_state->bs);
1754 if (ret) {
1755 error_set(errp, ERROR_CLASS_GENERIC_ERROR, "Error (%s) flushing drive",
1756 strerror(-ret));
1757 goto error;
1758 }
1759
1760 if (drv->bdrv_reopen_prepare) {
1761 ret = drv->bdrv_reopen_prepare(reopen_state, queue, &local_err);
1762 if (ret) {
1763 if (local_err != NULL) {
1764 error_propagate(errp, local_err);
1765 } else {
Luiz Capitulinod8b68952013-06-10 11:29:27 -04001766 error_setg(errp, "failed while preparing to reopen image '%s'",
1767 reopen_state->bs->filename);
Jeff Codye971aa12012-09-20 15:13:19 -04001768 }
1769 goto error;
1770 }
1771 } else {
1772 /* It is currently mandatory to have a bdrv_reopen_prepare()
1773 * handler for each supported drv. */
1774 error_set(errp, QERR_BLOCK_FORMAT_FEATURE_NOT_SUPPORTED,
1775 drv->format_name, reopen_state->bs->device_name,
1776 "reopening of file");
1777 ret = -1;
1778 goto error;
1779 }
1780
1781 ret = 0;
1782
1783error:
1784 return ret;
1785}
1786
1787/*
1788 * Takes the staged changes for the reopen from bdrv_reopen_prepare(), and
1789 * makes them final by swapping the staging BlockDriverState contents into
1790 * the active BlockDriverState contents.
1791 */
1792void bdrv_reopen_commit(BDRVReopenState *reopen_state)
1793{
1794 BlockDriver *drv;
1795
1796 assert(reopen_state != NULL);
1797 drv = reopen_state->bs->drv;
1798 assert(drv != NULL);
1799
1800 /* If there are any driver level actions to take */
1801 if (drv->bdrv_reopen_commit) {
1802 drv->bdrv_reopen_commit(reopen_state);
1803 }
1804
1805 /* set BDS specific flags now */
1806 reopen_state->bs->open_flags = reopen_state->flags;
1807 reopen_state->bs->enable_write_cache = !!(reopen_state->flags &
1808 BDRV_O_CACHE_WB);
1809 reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
Kevin Wolf355ef4a2013-12-11 20:14:09 +01001810
Kevin Wolf3baca892014-07-16 17:48:16 +02001811 bdrv_refresh_limits(reopen_state->bs, NULL);
Jeff Codye971aa12012-09-20 15:13:19 -04001812}
1813
1814/*
1815 * Abort the reopen, and delete and free the staged changes in
1816 * reopen_state
1817 */
1818void bdrv_reopen_abort(BDRVReopenState *reopen_state)
1819{
1820 BlockDriver *drv;
1821
1822 assert(reopen_state != NULL);
1823 drv = reopen_state->bs->drv;
1824 assert(drv != NULL);
1825
1826 if (drv->bdrv_reopen_abort) {
1827 drv->bdrv_reopen_abort(reopen_state);
1828 }
1829}
1830
1831
bellardfc01f7e2003-06-30 10:03:06 +00001832void bdrv_close(BlockDriverState *bs)
1833{
Max Reitz33384422014-06-20 21:57:33 +02001834 BdrvAioNotifier *ban, *ban_next;
1835
Paolo Bonzini3cbc0022012-10-19 11:36:48 +02001836 if (bs->job) {
1837 block_job_cancel_sync(bs->job);
1838 }
Stefan Hajnoczi58fda172013-07-02 15:36:25 +02001839 bdrv_drain_all(); /* complete I/O */
1840 bdrv_flush(bs);
1841 bdrv_drain_all(); /* in case flush left pending I/O */
Paolo Bonzinid7d512f2012-08-23 11:20:36 +02001842 notifier_list_notify(&bs->close_notifiers, bs);
Kevin Wolf7094f122012-04-11 11:06:37 +02001843
Paolo Bonzini3cbc0022012-10-19 11:36:48 +02001844 if (bs->drv) {
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +01001845 if (bs->backing_hd) {
Fam Zheng826b6ca2014-05-23 21:29:47 +08001846 BlockDriverState *backing_hd = bs->backing_hd;
1847 bdrv_set_backing_hd(bs, NULL);
1848 bdrv_unref(backing_hd);
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +01001849 }
bellardea2384d2004-08-01 21:59:26 +00001850 bs->drv->bdrv_close(bs);
Anthony Liguori7267c092011-08-20 22:09:37 -05001851 g_free(bs->opaque);
bellardea2384d2004-08-01 21:59:26 +00001852 bs->opaque = NULL;
1853 bs->drv = NULL;
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +00001854 bs->copy_on_read = 0;
Paolo Bonzinia275fa42012-05-08 16:51:43 +02001855 bs->backing_file[0] = '\0';
1856 bs->backing_format[0] = '\0';
Paolo Bonzini64058752012-05-08 16:51:49 +02001857 bs->total_sectors = 0;
1858 bs->encrypted = 0;
1859 bs->valid_key = 0;
1860 bs->sg = 0;
1861 bs->growable = 0;
Asias He0d51b4d2013-08-22 15:24:14 +08001862 bs->zero_beyond_eof = false;
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01001863 QDECREF(bs->options);
1864 bs->options = NULL;
Max Reitz91af7012014-07-18 20:24:56 +02001865 QDECREF(bs->full_open_options);
1866 bs->full_open_options = NULL;
bellardb3380822004-03-14 21:38:54 +00001867
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001868 if (bs->file != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001869 bdrv_unref(bs->file);
Paolo Bonzini0ac93772012-05-08 16:51:44 +02001870 bs->file = NULL;
Kevin Wolf66f82ce2010-04-14 14:17:38 +02001871 }
bellardb3380822004-03-14 21:38:54 +00001872 }
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001873
Pavel Hrdina9ca11152012-08-09 12:44:48 +02001874 bdrv_dev_change_media_cb(bs, false);
1875
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001876 /*throttling disk I/O limits*/
1877 if (bs->io_limits_enabled) {
1878 bdrv_io_limits_disable(bs);
1879 }
Max Reitz33384422014-06-20 21:57:33 +02001880
1881 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
1882 g_free(ban);
1883 }
1884 QLIST_INIT(&bs->aio_notifiers);
bellardb3380822004-03-14 21:38:54 +00001885}
1886
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001887void bdrv_close_all(void)
1888{
1889 BlockDriverState *bs;
1890
Benoît Canetdc364f42014-01-23 21:31:32 +01001891 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02001892 AioContext *aio_context = bdrv_get_aio_context(bs);
1893
1894 aio_context_acquire(aio_context);
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001895 bdrv_close(bs);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02001896 aio_context_release(aio_context);
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +09001897 }
1898}
1899
Stefan Hajnoczi88266f52013-04-11 15:41:13 +02001900/* Check if any requests are in-flight (including throttled requests) */
1901static bool bdrv_requests_pending(BlockDriverState *bs)
1902{
1903 if (!QLIST_EMPTY(&bs->tracked_requests)) {
1904 return true;
1905 }
Benoît Canetcc0681c2013-09-02 14:14:39 +02001906 if (!qemu_co_queue_empty(&bs->throttled_reqs[0])) {
1907 return true;
1908 }
1909 if (!qemu_co_queue_empty(&bs->throttled_reqs[1])) {
Stefan Hajnoczi88266f52013-04-11 15:41:13 +02001910 return true;
1911 }
1912 if (bs->file && bdrv_requests_pending(bs->file)) {
1913 return true;
1914 }
1915 if (bs->backing_hd && bdrv_requests_pending(bs->backing_hd)) {
1916 return true;
1917 }
1918 return false;
1919}
1920
Stefan Hajnoczi922453b2011-11-30 12:23:43 +00001921/*
1922 * Wait for pending requests to complete across all BlockDriverStates
1923 *
1924 * This function does not flush data to disk, use bdrv_flush_all() for that
1925 * after calling this function.
Zhi Yong Wu4c355d52012-04-12 14:00:57 +02001926 *
1927 * Note that completion of an asynchronous I/O operation can trigger any
1928 * number of other I/O operations on other devices---for example a coroutine
1929 * can be arbitrarily complex and a constant flow of I/O can come until the
1930 * coroutine is complete. Because of this, it is not possible to have a
1931 * function to drain a single device's I/O queue.
Stefan Hajnoczi922453b2011-11-30 12:23:43 +00001932 */
1933void bdrv_drain_all(void)
1934{
Stefan Hajnoczi88266f52013-04-11 15:41:13 +02001935 /* Always run first iteration so any pending completion BHs run */
1936 bool busy = true;
Stefan Hajnoczi922453b2011-11-30 12:23:43 +00001937 BlockDriverState *bs;
1938
Stefan Hajnoczi88266f52013-04-11 15:41:13 +02001939 while (busy) {
Stefan Hajnoczi9b536ad2014-05-08 16:34:36 +02001940 busy = false;
Stefan Hajnoczi922453b2011-11-30 12:23:43 +00001941
Stefan Hajnoczi9b536ad2014-05-08 16:34:36 +02001942 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
1943 AioContext *aio_context = bdrv_get_aio_context(bs);
1944 bool bs_busy;
1945
1946 aio_context_acquire(aio_context);
Ming Lei448ad912014-07-04 18:04:33 +08001947 bdrv_flush_io_queue(bs);
Stefan Hajnoczi9b536ad2014-05-08 16:34:36 +02001948 bdrv_start_throttled_reqs(bs);
1949 bs_busy = bdrv_requests_pending(bs);
1950 bs_busy |= aio_poll(aio_context, bs_busy);
1951 aio_context_release(aio_context);
1952
1953 busy |= bs_busy;
1954 }
Stefan Hajnoczi922453b2011-11-30 12:23:43 +00001955 }
1956}
1957
Benoît Canetdc364f42014-01-23 21:31:32 +01001958/* make a BlockDriverState anonymous by removing from bdrv_state and
1959 * graph_bdrv_state list.
Ryan Harperd22b2f42011-03-29 20:51:47 -05001960 Also, NULL terminate the device_name to prevent double remove */
1961void bdrv_make_anon(BlockDriverState *bs)
1962{
1963 if (bs->device_name[0] != '\0') {
Benoît Canetdc364f42014-01-23 21:31:32 +01001964 QTAILQ_REMOVE(&bdrv_states, bs, device_list);
Ryan Harperd22b2f42011-03-29 20:51:47 -05001965 }
1966 bs->device_name[0] = '\0';
Benoît Canetdc364f42014-01-23 21:31:32 +01001967 if (bs->node_name[0] != '\0') {
1968 QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
1969 }
1970 bs->node_name[0] = '\0';
Ryan Harperd22b2f42011-03-29 20:51:47 -05001971}
1972
Paolo Bonzinie023b2e2012-05-08 16:51:41 +02001973static void bdrv_rebind(BlockDriverState *bs)
1974{
1975 if (bs->drv && bs->drv->bdrv_rebind) {
1976 bs->drv->bdrv_rebind(bs);
1977 }
1978}
1979
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001980static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
1981 BlockDriverState *bs_src)
1982{
1983 /* move some fields that need to stay attached to the device */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001984
1985 /* dev info */
1986 bs_dest->dev_ops = bs_src->dev_ops;
1987 bs_dest->dev_opaque = bs_src->dev_opaque;
1988 bs_dest->dev = bs_src->dev;
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01001989 bs_dest->guest_block_size = bs_src->guest_block_size;
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02001990 bs_dest->copy_on_read = bs_src->copy_on_read;
1991
1992 bs_dest->enable_write_cache = bs_src->enable_write_cache;
1993
Benoît Canetcc0681c2013-09-02 14:14:39 +02001994 /* i/o throttled req */
1995 memcpy(&bs_dest->throttle_state,
1996 &bs_src->throttle_state,
1997 sizeof(ThrottleState));
1998 bs_dest->throttled_reqs[0] = bs_src->throttled_reqs[0];
1999 bs_dest->throttled_reqs[1] = bs_src->throttled_reqs[1];
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002000 bs_dest->io_limits_enabled = bs_src->io_limits_enabled;
2001
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002002 /* r/w error */
2003 bs_dest->on_read_error = bs_src->on_read_error;
2004 bs_dest->on_write_error = bs_src->on_write_error;
2005
2006 /* i/o status */
2007 bs_dest->iostatus_enabled = bs_src->iostatus_enabled;
2008 bs_dest->iostatus = bs_src->iostatus;
2009
2010 /* dirty bitmap */
Fam Zhenge4654d22013-11-13 18:29:43 +08002011 bs_dest->dirty_bitmaps = bs_src->dirty_bitmaps;
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002012
Fam Zheng9fcb0252013-08-23 09:14:46 +08002013 /* reference count */
2014 bs_dest->refcnt = bs_src->refcnt;
2015
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002016 /* job */
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002017 bs_dest->job = bs_src->job;
2018
2019 /* keep the same entry in bdrv_states */
2020 pstrcpy(bs_dest->device_name, sizeof(bs_dest->device_name),
2021 bs_src->device_name);
Benoît Canetdc364f42014-01-23 21:31:32 +01002022 bs_dest->device_list = bs_src->device_list;
Fam Zhengfbe40ff2014-05-23 21:29:42 +08002023 memcpy(bs_dest->op_blockers, bs_src->op_blockers,
2024 sizeof(bs_dest->op_blockers));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002025}
2026
2027/*
2028 * Swap bs contents for two image chains while they are live,
2029 * while keeping required fields on the BlockDriverState that is
2030 * actually attached to a device.
2031 *
2032 * This will modify the BlockDriverState fields, and swap contents
2033 * between bs_new and bs_old. Both bs_new and bs_old are modified.
2034 *
2035 * bs_new is required to be anonymous.
2036 *
2037 * This function does not create any image files.
2038 */
2039void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
2040{
2041 BlockDriverState tmp;
2042
Benoît Canet90ce8a02014-03-05 23:48:29 +01002043 /* The code needs to swap the node_name but simply swapping node_list won't
2044 * work so first remove the nodes from the graph list, do the swap then
2045 * insert them back if needed.
2046 */
2047 if (bs_new->node_name[0] != '\0') {
2048 QTAILQ_REMOVE(&graph_bdrv_states, bs_new, node_list);
2049 }
2050 if (bs_old->node_name[0] != '\0') {
2051 QTAILQ_REMOVE(&graph_bdrv_states, bs_old, node_list);
2052 }
2053
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002054 /* bs_new must be anonymous and shouldn't have anything fancy enabled */
2055 assert(bs_new->device_name[0] == '\0');
Fam Zhenge4654d22013-11-13 18:29:43 +08002056 assert(QLIST_EMPTY(&bs_new->dirty_bitmaps));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002057 assert(bs_new->job == NULL);
2058 assert(bs_new->dev == NULL);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002059 assert(bs_new->io_limits_enabled == false);
Benoît Canetcc0681c2013-09-02 14:14:39 +02002060 assert(!throttle_have_timer(&bs_new->throttle_state));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002061
2062 tmp = *bs_new;
2063 *bs_new = *bs_old;
2064 *bs_old = tmp;
2065
2066 /* there are some fields that should not be swapped, move them back */
2067 bdrv_move_feature_fields(&tmp, bs_old);
2068 bdrv_move_feature_fields(bs_old, bs_new);
2069 bdrv_move_feature_fields(bs_new, &tmp);
2070
2071 /* bs_new shouldn't be in bdrv_states even after the swap! */
2072 assert(bs_new->device_name[0] == '\0');
2073
2074 /* Check a few fields that should remain attached to the device */
2075 assert(bs_new->dev == NULL);
2076 assert(bs_new->job == NULL);
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002077 assert(bs_new->io_limits_enabled == false);
Benoît Canetcc0681c2013-09-02 14:14:39 +02002078 assert(!throttle_have_timer(&bs_new->throttle_state));
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002079
Benoît Canet90ce8a02014-03-05 23:48:29 +01002080 /* insert the nodes back into the graph node list if needed */
2081 if (bs_new->node_name[0] != '\0') {
2082 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_new, node_list);
2083 }
2084 if (bs_old->node_name[0] != '\0') {
2085 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_old, node_list);
2086 }
2087
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002088 bdrv_rebind(bs_new);
2089 bdrv_rebind(bs_old);
2090}
2091
Jeff Cody8802d1f2012-02-28 15:54:06 -05002092/*
2093 * Add new bs contents at the top of an image chain while the chain is
2094 * live, while keeping required fields on the top layer.
2095 *
2096 * This will modify the BlockDriverState fields, and swap contents
2097 * between bs_new and bs_top. Both bs_new and bs_top are modified.
2098 *
Jeff Codyf6801b82012-03-27 16:30:19 -04002099 * bs_new is required to be anonymous.
2100 *
Jeff Cody8802d1f2012-02-28 15:54:06 -05002101 * This function does not create any image files.
2102 */
2103void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
2104{
Paolo Bonzini4ddc07c2012-06-14 16:55:02 +02002105 bdrv_swap(bs_new, bs_top);
Jeff Cody8802d1f2012-02-28 15:54:06 -05002106
2107 /* The contents of 'tmp' will become bs_top, as we are
2108 * swapping bs_new and bs_top contents. */
Fam Zheng8d24cce2014-05-23 21:29:45 +08002109 bdrv_set_backing_hd(bs_top, bs_new);
Jeff Cody8802d1f2012-02-28 15:54:06 -05002110}
2111
Fam Zheng4f6fd342013-08-23 09:14:47 +08002112static void bdrv_delete(BlockDriverState *bs)
bellardb3380822004-03-14 21:38:54 +00002113{
Markus Armbrusterfa879d62011-08-03 15:07:40 +02002114 assert(!bs->dev);
Paolo Bonzini3e914652012-03-30 13:17:11 +02002115 assert(!bs->job);
Fam Zheng3718d8a2014-05-23 21:29:43 +08002116 assert(bdrv_op_blocker_is_empty(bs));
Fam Zheng4f6fd342013-08-23 09:14:47 +08002117 assert(!bs->refcnt);
Fam Zhenge4654d22013-11-13 18:29:43 +08002118 assert(QLIST_EMPTY(&bs->dirty_bitmaps));
Markus Armbruster18846de2010-06-29 16:58:30 +02002119
Stefan Hajnoczie1b5c522013-06-27 15:32:26 +02002120 bdrv_close(bs);
2121
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002122 /* remove from list, if necessary */
Ryan Harperd22b2f42011-03-29 20:51:47 -05002123 bdrv_make_anon(bs);
aurel3234c6f052008-04-08 19:51:21 +00002124
Markus Armbruster3ae59582014-09-12 21:26:22 +02002125 drive_info_del(drive_get_by_blockdev(bs));
Anthony Liguori7267c092011-08-20 22:09:37 -05002126 g_free(bs);
bellardfc01f7e2003-06-30 10:03:06 +00002127}
2128
Markus Armbrusterfa879d62011-08-03 15:07:40 +02002129int bdrv_attach_dev(BlockDriverState *bs, void *dev)
2130/* TODO change to DeviceState *dev when all users are qdevified */
Markus Armbruster18846de2010-06-29 16:58:30 +02002131{
Markus Armbrusterfa879d62011-08-03 15:07:40 +02002132 if (bs->dev) {
Markus Armbruster18846de2010-06-29 16:58:30 +02002133 return -EBUSY;
2134 }
Markus Armbrusterfa879d62011-08-03 15:07:40 +02002135 bs->dev = dev;
Luiz Capitulino28a72822011-09-26 17:43:50 -03002136 bdrv_iostatus_reset(bs);
Stefan Hajnoczi2a871512014-07-07 15:15:53 +02002137
2138 /* We're expecting I/O from the device so bump up coroutine pool size */
2139 qemu_coroutine_adjust_pool_size(COROUTINE_POOL_RESERVATION);
Markus Armbruster18846de2010-06-29 16:58:30 +02002140 return 0;
2141}
2142
Markus Armbrusterfa879d62011-08-03 15:07:40 +02002143/* TODO qdevified devices don't use this, remove when devices are qdevified */
2144void bdrv_attach_dev_nofail(BlockDriverState *bs, void *dev)
Markus Armbruster18846de2010-06-29 16:58:30 +02002145{
Markus Armbrusterfa879d62011-08-03 15:07:40 +02002146 if (bdrv_attach_dev(bs, dev) < 0) {
2147 abort();
2148 }
2149}
2150
2151void bdrv_detach_dev(BlockDriverState *bs, void *dev)
2152/* TODO change to DeviceState *dev when all users are qdevified */
2153{
2154 assert(bs->dev == dev);
2155 bs->dev = NULL;
Markus Armbruster0e49de52011-08-03 15:07:41 +02002156 bs->dev_ops = NULL;
2157 bs->dev_opaque = NULL;
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01002158 bs->guest_block_size = 512;
Stefan Hajnoczi2a871512014-07-07 15:15:53 +02002159 qemu_coroutine_adjust_pool_size(-COROUTINE_POOL_RESERVATION);
Markus Armbruster18846de2010-06-29 16:58:30 +02002160}
2161
Markus Armbrusterfa879d62011-08-03 15:07:40 +02002162/* TODO change to return DeviceState * when all users are qdevified */
2163void *bdrv_get_attached_dev(BlockDriverState *bs)
Markus Armbruster18846de2010-06-29 16:58:30 +02002164{
Markus Armbrusterfa879d62011-08-03 15:07:40 +02002165 return bs->dev;
Markus Armbruster18846de2010-06-29 16:58:30 +02002166}
2167
Markus Armbruster0e49de52011-08-03 15:07:41 +02002168void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
2169 void *opaque)
2170{
2171 bs->dev_ops = ops;
2172 bs->dev_opaque = opaque;
2173}
2174
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +02002175static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load)
Markus Armbruster0e49de52011-08-03 15:07:41 +02002176{
Markus Armbruster145feb12011-08-03 15:07:42 +02002177 if (bs->dev_ops && bs->dev_ops->change_media_cb) {
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02002178 bool tray_was_closed = !bdrv_dev_is_tray_open(bs);
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +02002179 bs->dev_ops->change_media_cb(bs->dev_opaque, load);
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02002180 if (tray_was_closed) {
2181 /* tray open */
Wenchao Xiaa5ee7bd2014-06-18 08:43:44 +02002182 qapi_event_send_device_tray_moved(bdrv_get_device_name(bs),
2183 true, &error_abort);
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02002184 }
2185 if (load) {
2186 /* tray close */
Wenchao Xiaa5ee7bd2014-06-18 08:43:44 +02002187 qapi_event_send_device_tray_moved(bdrv_get_device_name(bs),
2188 false, &error_abort);
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02002189 }
Markus Armbruster145feb12011-08-03 15:07:42 +02002190 }
2191}
2192
Markus Armbruster2c6942f2011-09-06 18:58:51 +02002193bool bdrv_dev_has_removable_media(BlockDriverState *bs)
2194{
2195 return !bs->dev || (bs->dev_ops && bs->dev_ops->change_media_cb);
2196}
2197
Paolo Bonzini025ccaa2011-11-07 17:50:13 +01002198void bdrv_dev_eject_request(BlockDriverState *bs, bool force)
2199{
2200 if (bs->dev_ops && bs->dev_ops->eject_request_cb) {
2201 bs->dev_ops->eject_request_cb(bs->dev_opaque, force);
2202 }
2203}
2204
Markus Armbrustere4def802011-09-06 18:58:53 +02002205bool bdrv_dev_is_tray_open(BlockDriverState *bs)
2206{
2207 if (bs->dev_ops && bs->dev_ops->is_tray_open) {
2208 return bs->dev_ops->is_tray_open(bs->dev_opaque);
2209 }
2210 return false;
2211}
2212
Markus Armbruster145feb12011-08-03 15:07:42 +02002213static void bdrv_dev_resize_cb(BlockDriverState *bs)
2214{
2215 if (bs->dev_ops && bs->dev_ops->resize_cb) {
2216 bs->dev_ops->resize_cb(bs->dev_opaque);
Markus Armbruster0e49de52011-08-03 15:07:41 +02002217 }
2218}
2219
Markus Armbrusterf1076392011-09-06 18:58:46 +02002220bool bdrv_dev_is_medium_locked(BlockDriverState *bs)
2221{
2222 if (bs->dev_ops && bs->dev_ops->is_medium_locked) {
2223 return bs->dev_ops->is_medium_locked(bs->dev_opaque);
2224 }
2225 return false;
2226}
2227
aliguorie97fc192009-04-21 23:11:50 +00002228/*
2229 * Run consistency checks on an image
2230 *
Kevin Wolfe076f332010-06-29 11:43:13 +02002231 * Returns 0 if the check could be completed (it doesn't mean that the image is
Stefan Weila1c72732011-04-28 17:20:38 +02002232 * free of errors) or -errno when an internal error occurred. The results of the
Kevin Wolfe076f332010-06-29 11:43:13 +02002233 * check are stored in res.
aliguorie97fc192009-04-21 23:11:50 +00002234 */
Kevin Wolf4534ff52012-05-11 16:07:02 +02002235int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix)
aliguorie97fc192009-04-21 23:11:50 +00002236{
Max Reitz908bcd52014-08-07 22:47:55 +02002237 if (bs->drv == NULL) {
2238 return -ENOMEDIUM;
2239 }
aliguorie97fc192009-04-21 23:11:50 +00002240 if (bs->drv->bdrv_check == NULL) {
2241 return -ENOTSUP;
2242 }
2243
Kevin Wolfe076f332010-06-29 11:43:13 +02002244 memset(res, 0, sizeof(*res));
Kevin Wolf4534ff52012-05-11 16:07:02 +02002245 return bs->drv->bdrv_check(bs, res, fix);
aliguorie97fc192009-04-21 23:11:50 +00002246}
2247
Kevin Wolf8a426612010-07-16 17:17:01 +02002248#define COMMIT_BUF_SECTORS 2048
2249
bellard33e39632003-07-06 17:15:21 +00002250/* commit COW file into the raw image */
2251int bdrv_commit(BlockDriverState *bs)
2252{
bellard19cb3732006-08-19 11:45:59 +00002253 BlockDriver *drv = bs->drv;
Jeff Cody72706ea2014-01-24 09:02:35 -05002254 int64_t sector, total_sectors, length, backing_length;
Kevin Wolf8a426612010-07-16 17:17:01 +02002255 int n, ro, open_flags;
Jeff Cody0bce5972012-09-20 15:13:34 -04002256 int ret = 0;
Jeff Cody72706ea2014-01-24 09:02:35 -05002257 uint8_t *buf = NULL;
Jim Meyeringc2cba3d2012-10-04 13:09:46 +02002258 char filename[PATH_MAX];
bellard33e39632003-07-06 17:15:21 +00002259
bellard19cb3732006-08-19 11:45:59 +00002260 if (!drv)
2261 return -ENOMEDIUM;
Liu Yuan6bb45152014-09-01 13:35:21 +08002262
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002263 if (!bs->backing_hd) {
2264 return -ENOTSUP;
bellard33e39632003-07-06 17:15:21 +00002265 }
2266
Fam Zheng3718d8a2014-05-23 21:29:43 +08002267 if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT, NULL) ||
2268 bdrv_op_is_blocked(bs->backing_hd, BLOCK_OP_TYPE_COMMIT, NULL)) {
Stefan Hajnoczi2d3735d2012-01-18 14:40:41 +00002269 return -EBUSY;
2270 }
2271
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002272 ro = bs->backing_hd->read_only;
Jim Meyeringc2cba3d2012-10-04 13:09:46 +02002273 /* Use pstrcpy (not strncpy): filename must be NUL-terminated. */
2274 pstrcpy(filename, sizeof(filename), bs->backing_hd->filename);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002275 open_flags = bs->backing_hd->open_flags;
2276
2277 if (ro) {
Jeff Cody0bce5972012-09-20 15:13:34 -04002278 if (bdrv_reopen(bs->backing_hd, open_flags | BDRV_O_RDWR, NULL)) {
2279 return -EACCES;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002280 }
bellard33e39632003-07-06 17:15:21 +00002281 }
bellardea2384d2004-08-01 21:59:26 +00002282
Jeff Cody72706ea2014-01-24 09:02:35 -05002283 length = bdrv_getlength(bs);
2284 if (length < 0) {
2285 ret = length;
2286 goto ro_cleanup;
2287 }
2288
2289 backing_length = bdrv_getlength(bs->backing_hd);
2290 if (backing_length < 0) {
2291 ret = backing_length;
2292 goto ro_cleanup;
2293 }
2294
2295 /* If our top snapshot is larger than the backing file image,
2296 * grow the backing file image if possible. If not possible,
2297 * we must return an error */
2298 if (length > backing_length) {
2299 ret = bdrv_truncate(bs->backing_hd, length);
2300 if (ret < 0) {
2301 goto ro_cleanup;
2302 }
2303 }
2304
2305 total_sectors = length >> BDRV_SECTOR_BITS;
Kevin Wolf857d4f42014-05-20 13:16:51 +02002306
2307 /* qemu_try_blockalign() for bs will choose an alignment that works for
2308 * bs->backing_hd as well, so no need to compare the alignment manually. */
2309 buf = qemu_try_blockalign(bs, COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
2310 if (buf == NULL) {
2311 ret = -ENOMEM;
2312 goto ro_cleanup;
2313 }
bellardea2384d2004-08-01 21:59:26 +00002314
Kevin Wolf8a426612010-07-16 17:17:01 +02002315 for (sector = 0; sector < total_sectors; sector += n) {
Paolo Bonzinid6636402013-09-04 19:00:25 +02002316 ret = bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n);
2317 if (ret < 0) {
2318 goto ro_cleanup;
2319 }
2320 if (ret) {
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002321 ret = bdrv_read(bs, sector, buf, n);
2322 if (ret < 0) {
Kevin Wolf8a426612010-07-16 17:17:01 +02002323 goto ro_cleanup;
2324 }
2325
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002326 ret = bdrv_write(bs->backing_hd, sector, buf, n);
2327 if (ret < 0) {
Kevin Wolf8a426612010-07-16 17:17:01 +02002328 goto ro_cleanup;
2329 }
bellardea2384d2004-08-01 21:59:26 +00002330 }
2331 }
bellard95389c82005-12-18 18:28:15 +00002332
Christoph Hellwig1d449522010-01-17 12:32:30 +01002333 if (drv->bdrv_make_empty) {
2334 ret = drv->bdrv_make_empty(bs);
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002335 if (ret < 0) {
2336 goto ro_cleanup;
2337 }
Christoph Hellwig1d449522010-01-17 12:32:30 +01002338 bdrv_flush(bs);
2339 }
bellard95389c82005-12-18 18:28:15 +00002340
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01002341 /*
2342 * Make sure all data we wrote to the backing device is actually
2343 * stable on disk.
2344 */
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002345 if (bs->backing_hd) {
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01002346 bdrv_flush(bs->backing_hd);
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002347 }
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002348
Kevin Wolfdabfa6c2014-01-24 14:00:43 +01002349 ret = 0;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002350ro_cleanup:
Kevin Wolf857d4f42014-05-20 13:16:51 +02002351 qemu_vfree(buf);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002352
2353 if (ro) {
Jeff Cody0bce5972012-09-20 15:13:34 -04002354 /* ignoring error return here */
2355 bdrv_reopen(bs->backing_hd, open_flags & ~BDRV_O_RDWR, NULL);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02002356 }
2357
Christoph Hellwig1d449522010-01-17 12:32:30 +01002358 return ret;
bellard33e39632003-07-06 17:15:21 +00002359}
2360
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002361int bdrv_commit_all(void)
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002362{
2363 BlockDriverState *bs;
2364
Benoît Canetdc364f42014-01-23 21:31:32 +01002365 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002366 AioContext *aio_context = bdrv_get_aio_context(bs);
2367
2368 aio_context_acquire(aio_context);
Jeff Cody272d2d82013-02-26 09:55:48 -05002369 if (bs->drv && bs->backing_hd) {
2370 int ret = bdrv_commit(bs);
2371 if (ret < 0) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002372 aio_context_release(aio_context);
Jeff Cody272d2d82013-02-26 09:55:48 -05002373 return ret;
2374 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002375 }
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02002376 aio_context_release(aio_context);
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002377 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00002378 return 0;
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02002379}
2380
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00002381/**
2382 * Remove an active request from the tracked requests list
2383 *
2384 * This function should be called when a tracked request is completing.
2385 */
2386static void tracked_request_end(BdrvTrackedRequest *req)
2387{
Kevin Wolf2dbafdc2013-12-04 16:43:44 +01002388 if (req->serialising) {
2389 req->bs->serialising_in_flight--;
2390 }
2391
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00002392 QLIST_REMOVE(req, list);
Stefan Hajnoczif4658282011-11-17 13:40:29 +00002393 qemu_co_queue_restart_all(&req->wait_queue);
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00002394}
2395
2396/**
2397 * Add an active request to the tracked requests list
2398 */
2399static void tracked_request_begin(BdrvTrackedRequest *req,
2400 BlockDriverState *bs,
Kevin Wolf793ed472013-12-03 15:31:25 +01002401 int64_t offset,
2402 unsigned int bytes, bool is_write)
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00002403{
2404 *req = (BdrvTrackedRequest){
2405 .bs = bs,
Kevin Wolf2dbafdc2013-12-04 16:43:44 +01002406 .offset = offset,
2407 .bytes = bytes,
2408 .is_write = is_write,
2409 .co = qemu_coroutine_self(),
2410 .serialising = false,
Kevin Wolf73271452013-12-04 17:08:50 +01002411 .overlap_offset = offset,
2412 .overlap_bytes = bytes,
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00002413 };
2414
Stefan Hajnoczif4658282011-11-17 13:40:29 +00002415 qemu_co_queue_init(&req->wait_queue);
2416
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00002417 QLIST_INSERT_HEAD(&bs->tracked_requests, req, list);
2418}
2419
Kevin Wolfe96126f2014-02-08 10:42:18 +01002420static void mark_request_serialising(BdrvTrackedRequest *req, uint64_t align)
Kevin Wolf2dbafdc2013-12-04 16:43:44 +01002421{
Kevin Wolf73271452013-12-04 17:08:50 +01002422 int64_t overlap_offset = req->offset & ~(align - 1);
Kevin Wolfe96126f2014-02-08 10:42:18 +01002423 unsigned int overlap_bytes = ROUND_UP(req->offset + req->bytes, align)
2424 - overlap_offset;
Kevin Wolf73271452013-12-04 17:08:50 +01002425
Kevin Wolf2dbafdc2013-12-04 16:43:44 +01002426 if (!req->serialising) {
2427 req->bs->serialising_in_flight++;
2428 req->serialising = true;
2429 }
Kevin Wolf73271452013-12-04 17:08:50 +01002430
2431 req->overlap_offset = MIN(req->overlap_offset, overlap_offset);
2432 req->overlap_bytes = MAX(req->overlap_bytes, overlap_bytes);
Kevin Wolf2dbafdc2013-12-04 16:43:44 +01002433}
2434
Stefan Hajnoczid83947a2011-11-23 11:47:56 +00002435/**
2436 * Round a region to cluster boundaries
2437 */
Paolo Bonzini343bded2013-01-21 17:09:42 +01002438void bdrv_round_to_clusters(BlockDriverState *bs,
2439 int64_t sector_num, int nb_sectors,
2440 int64_t *cluster_sector_num,
2441 int *cluster_nb_sectors)
Stefan Hajnoczid83947a2011-11-23 11:47:56 +00002442{
2443 BlockDriverInfo bdi;
2444
2445 if (bdrv_get_info(bs, &bdi) < 0 || bdi.cluster_size == 0) {
2446 *cluster_sector_num = sector_num;
2447 *cluster_nb_sectors = nb_sectors;
2448 } else {
2449 int64_t c = bdi.cluster_size / BDRV_SECTOR_SIZE;
2450 *cluster_sector_num = QEMU_ALIGN_DOWN(sector_num, c);
2451 *cluster_nb_sectors = QEMU_ALIGN_UP(sector_num - *cluster_sector_num +
2452 nb_sectors, c);
2453 }
2454}
2455
Kevin Wolf73271452013-12-04 17:08:50 +01002456static int bdrv_get_cluster_size(BlockDriverState *bs)
Kevin Wolf793ed472013-12-03 15:31:25 +01002457{
2458 BlockDriverInfo bdi;
Kevin Wolf73271452013-12-04 17:08:50 +01002459 int ret;
Kevin Wolf793ed472013-12-03 15:31:25 +01002460
Kevin Wolf73271452013-12-04 17:08:50 +01002461 ret = bdrv_get_info(bs, &bdi);
2462 if (ret < 0 || bdi.cluster_size == 0) {
2463 return bs->request_alignment;
Kevin Wolf793ed472013-12-03 15:31:25 +01002464 } else {
Kevin Wolf73271452013-12-04 17:08:50 +01002465 return bdi.cluster_size;
Kevin Wolf793ed472013-12-03 15:31:25 +01002466 }
2467}
2468
Stefan Hajnoczif4658282011-11-17 13:40:29 +00002469static bool tracked_request_overlaps(BdrvTrackedRequest *req,
Kevin Wolf793ed472013-12-03 15:31:25 +01002470 int64_t offset, unsigned int bytes)
2471{
Stefan Hajnoczid83947a2011-11-23 11:47:56 +00002472 /* aaaa bbbb */
Kevin Wolf73271452013-12-04 17:08:50 +01002473 if (offset >= req->overlap_offset + req->overlap_bytes) {
Stefan Hajnoczid83947a2011-11-23 11:47:56 +00002474 return false;
2475 }
2476 /* bbbb aaaa */
Kevin Wolf73271452013-12-04 17:08:50 +01002477 if (req->overlap_offset >= offset + bytes) {
Stefan Hajnoczid83947a2011-11-23 11:47:56 +00002478 return false;
2479 }
2480 return true;
Stefan Hajnoczif4658282011-11-17 13:40:29 +00002481}
2482
Kevin Wolf28de2dc2014-01-14 11:41:35 +01002483static bool coroutine_fn wait_serialising_requests(BdrvTrackedRequest *self)
Stefan Hajnoczif4658282011-11-17 13:40:29 +00002484{
Kevin Wolf2dbafdc2013-12-04 16:43:44 +01002485 BlockDriverState *bs = self->bs;
Stefan Hajnoczif4658282011-11-17 13:40:29 +00002486 BdrvTrackedRequest *req;
2487 bool retry;
Kevin Wolf28de2dc2014-01-14 11:41:35 +01002488 bool waited = false;
Stefan Hajnoczif4658282011-11-17 13:40:29 +00002489
Kevin Wolf2dbafdc2013-12-04 16:43:44 +01002490 if (!bs->serialising_in_flight) {
Kevin Wolf28de2dc2014-01-14 11:41:35 +01002491 return false;
Kevin Wolf2dbafdc2013-12-04 16:43:44 +01002492 }
2493
Stefan Hajnoczif4658282011-11-17 13:40:29 +00002494 do {
2495 retry = false;
2496 QLIST_FOREACH(req, &bs->tracked_requests, list) {
Kevin Wolf2dbafdc2013-12-04 16:43:44 +01002497 if (req == self || (!req->serialising && !self->serialising)) {
Kevin Wolf65afd212013-12-03 14:55:55 +01002498 continue;
2499 }
Kevin Wolf73271452013-12-04 17:08:50 +01002500 if (tracked_request_overlaps(req, self->overlap_offset,
2501 self->overlap_bytes))
2502 {
Stefan Hajnoczi5f8b6492011-11-30 12:23:42 +00002503 /* Hitting this means there was a reentrant request, for
2504 * example, a block driver issuing nested requests. This must
2505 * never happen since it means deadlock.
2506 */
2507 assert(qemu_coroutine_self() != req->co);
2508
Kevin Wolf64604402013-12-13 13:04:35 +01002509 /* If the request is already (indirectly) waiting for us, or
2510 * will wait for us as soon as it wakes up, then just go on
2511 * (instead of producing a deadlock in the former case). */
2512 if (!req->waiting_for) {
2513 self->waiting_for = req;
2514 qemu_co_queue_wait(&req->wait_queue);
2515 self->waiting_for = NULL;
2516 retry = true;
Kevin Wolf28de2dc2014-01-14 11:41:35 +01002517 waited = true;
Kevin Wolf64604402013-12-13 13:04:35 +01002518 break;
2519 }
Stefan Hajnoczif4658282011-11-17 13:40:29 +00002520 }
2521 }
2522 } while (retry);
Kevin Wolf28de2dc2014-01-14 11:41:35 +01002523
2524 return waited;
Stefan Hajnoczif4658282011-11-17 13:40:29 +00002525}
2526
Kevin Wolf756e6732010-01-12 12:55:17 +01002527/*
2528 * Return values:
2529 * 0 - success
2530 * -EINVAL - backing format specified, but no file
2531 * -ENOSPC - can't update the backing file because no space is left in the
2532 * image file header
2533 * -ENOTSUP - format driver doesn't support changing the backing file
2534 */
2535int bdrv_change_backing_file(BlockDriverState *bs,
2536 const char *backing_file, const char *backing_fmt)
2537{
2538 BlockDriver *drv = bs->drv;
Paolo Bonzini469ef352012-04-12 14:01:02 +02002539 int ret;
Kevin Wolf756e6732010-01-12 12:55:17 +01002540
Paolo Bonzini5f377792012-04-12 14:01:01 +02002541 /* Backing file format doesn't make sense without a backing file */
2542 if (backing_fmt && !backing_file) {
2543 return -EINVAL;
2544 }
2545
Kevin Wolf756e6732010-01-12 12:55:17 +01002546 if (drv->bdrv_change_backing_file != NULL) {
Paolo Bonzini469ef352012-04-12 14:01:02 +02002547 ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
Kevin Wolf756e6732010-01-12 12:55:17 +01002548 } else {
Paolo Bonzini469ef352012-04-12 14:01:02 +02002549 ret = -ENOTSUP;
Kevin Wolf756e6732010-01-12 12:55:17 +01002550 }
Paolo Bonzini469ef352012-04-12 14:01:02 +02002551
2552 if (ret == 0) {
2553 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_file ?: "");
2554 pstrcpy(bs->backing_format, sizeof(bs->backing_format), backing_fmt ?: "");
2555 }
2556 return ret;
Kevin Wolf756e6732010-01-12 12:55:17 +01002557}
2558
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002559/*
2560 * Finds the image layer in the chain that has 'bs' as its backing file.
2561 *
2562 * active is the current topmost image.
2563 *
2564 * Returns NULL if bs is not found in active's image chain,
2565 * or if active == bs.
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002566 *
2567 * Returns the bottommost base image if bs == NULL.
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002568 */
2569BlockDriverState *bdrv_find_overlay(BlockDriverState *active,
2570 BlockDriverState *bs)
2571{
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002572 while (active && bs != active->backing_hd) {
2573 active = active->backing_hd;
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002574 }
2575
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002576 return active;
2577}
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002578
Jeff Cody4caf0fc2014-06-25 15:35:26 -04002579/* Given a BDS, searches for the base layer. */
2580BlockDriverState *bdrv_find_base(BlockDriverState *bs)
2581{
2582 return bdrv_find_overlay(bs, NULL);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002583}
2584
2585typedef struct BlkIntermediateStates {
2586 BlockDriverState *bs;
2587 QSIMPLEQ_ENTRY(BlkIntermediateStates) entry;
2588} BlkIntermediateStates;
2589
2590
2591/*
2592 * Drops images above 'base' up to and including 'top', and sets the image
2593 * above 'top' to have base as its backing file.
2594 *
2595 * Requires that the overlay to 'top' is opened r/w, so that the backing file
2596 * information in 'bs' can be properly updated.
2597 *
2598 * E.g., this will convert the following chain:
2599 * bottom <- base <- intermediate <- top <- active
2600 *
2601 * to
2602 *
2603 * bottom <- base <- active
2604 *
2605 * It is allowed for bottom==base, in which case it converts:
2606 *
2607 * base <- intermediate <- top <- active
2608 *
2609 * to
2610 *
2611 * base <- active
2612 *
Jeff Cody54e26902014-06-25 15:40:10 -04002613 * If backing_file_str is non-NULL, it will be used when modifying top's
2614 * overlay image metadata.
2615 *
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002616 * Error conditions:
2617 * if active == top, that is considered an error
2618 *
2619 */
2620int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
Jeff Cody54e26902014-06-25 15:40:10 -04002621 BlockDriverState *base, const char *backing_file_str)
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002622{
2623 BlockDriverState *intermediate;
2624 BlockDriverState *base_bs = NULL;
2625 BlockDriverState *new_top_bs = NULL;
2626 BlkIntermediateStates *intermediate_state, *next;
2627 int ret = -EIO;
2628
2629 QSIMPLEQ_HEAD(states_to_delete, BlkIntermediateStates) states_to_delete;
2630 QSIMPLEQ_INIT(&states_to_delete);
2631
2632 if (!top->drv || !base->drv) {
2633 goto exit;
2634 }
2635
2636 new_top_bs = bdrv_find_overlay(active, top);
2637
2638 if (new_top_bs == NULL) {
2639 /* we could not find the image above 'top', this is an error */
2640 goto exit;
2641 }
2642
2643 /* special case of new_top_bs->backing_hd already pointing to base - nothing
2644 * to do, no intermediate images */
2645 if (new_top_bs->backing_hd == base) {
2646 ret = 0;
2647 goto exit;
2648 }
2649
2650 intermediate = top;
2651
2652 /* now we will go down through the list, and add each BDS we find
2653 * into our deletion queue, until we hit the 'base'
2654 */
2655 while (intermediate) {
Markus Armbruster5839e532014-08-19 10:31:08 +02002656 intermediate_state = g_new0(BlkIntermediateStates, 1);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002657 intermediate_state->bs = intermediate;
2658 QSIMPLEQ_INSERT_TAIL(&states_to_delete, intermediate_state, entry);
2659
2660 if (intermediate->backing_hd == base) {
2661 base_bs = intermediate->backing_hd;
2662 break;
2663 }
2664 intermediate = intermediate->backing_hd;
2665 }
2666 if (base_bs == NULL) {
2667 /* something went wrong, we did not end at the base. safely
2668 * unravel everything, and exit with error */
2669 goto exit;
2670 }
2671
2672 /* success - we can delete the intermediate states, and link top->base */
Jeff Cody54e26902014-06-25 15:40:10 -04002673 backing_file_str = backing_file_str ? backing_file_str : base_bs->filename;
2674 ret = bdrv_change_backing_file(new_top_bs, backing_file_str,
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002675 base_bs->drv ? base_bs->drv->format_name : "");
2676 if (ret) {
2677 goto exit;
2678 }
Fam Zheng920beae2014-05-23 21:29:46 +08002679 bdrv_set_backing_hd(new_top_bs, base_bs);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002680
2681 QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
2682 /* so that bdrv_close() does not recursively close the chain */
Fam Zheng920beae2014-05-23 21:29:46 +08002683 bdrv_set_backing_hd(intermediate_state->bs, NULL);
Fam Zheng4f6fd342013-08-23 09:14:47 +08002684 bdrv_unref(intermediate_state->bs);
Jeff Cody6ebdcee2012-09-27 13:29:12 -04002685 }
2686 ret = 0;
2687
2688exit:
2689 QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
2690 g_free(intermediate_state);
2691 }
2692 return ret;
2693}
2694
2695
aliguori71d07702009-03-03 17:37:16 +00002696static int bdrv_check_byte_request(BlockDriverState *bs, int64_t offset,
2697 size_t size)
2698{
2699 int64_t len;
2700
Kevin Wolf1dd3a442014-04-14 14:48:16 +02002701 if (size > INT_MAX) {
2702 return -EIO;
2703 }
2704
aliguori71d07702009-03-03 17:37:16 +00002705 if (!bdrv_is_inserted(bs))
2706 return -ENOMEDIUM;
2707
2708 if (bs->growable)
2709 return 0;
2710
2711 len = bdrv_getlength(bs);
2712
Kevin Wolffbb7b4e2009-05-08 14:47:24 +02002713 if (offset < 0)
2714 return -EIO;
2715
2716 if ((offset > len) || (len - offset < size))
aliguori71d07702009-03-03 17:37:16 +00002717 return -EIO;
2718
2719 return 0;
2720}
2721
2722static int bdrv_check_request(BlockDriverState *bs, int64_t sector_num,
2723 int nb_sectors)
2724{
Kevin Wolf54db38a2014-04-14 14:47:14 +02002725 if (nb_sectors < 0 || nb_sectors > INT_MAX / BDRV_SECTOR_SIZE) {
Kevin Wolf8f4754e2014-03-26 13:06:02 +01002726 return -EIO;
2727 }
2728
Jes Sorenseneb5a3162010-05-27 16:20:31 +02002729 return bdrv_check_byte_request(bs, sector_num * BDRV_SECTOR_SIZE,
2730 nb_sectors * BDRV_SECTOR_SIZE);
aliguori71d07702009-03-03 17:37:16 +00002731}
2732
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002733typedef struct RwCo {
2734 BlockDriverState *bs;
Kevin Wolf775aa8b2013-12-05 12:09:38 +01002735 int64_t offset;
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002736 QEMUIOVector *qiov;
2737 bool is_write;
2738 int ret;
Peter Lieven4105eaa2013-07-11 14:16:22 +02002739 BdrvRequestFlags flags;
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002740} RwCo;
2741
2742static void coroutine_fn bdrv_rw_co_entry(void *opaque)
2743{
2744 RwCo *rwco = opaque;
2745
2746 if (!rwco->is_write) {
Kevin Wolf775aa8b2013-12-05 12:09:38 +01002747 rwco->ret = bdrv_co_do_preadv(rwco->bs, rwco->offset,
2748 rwco->qiov->size, rwco->qiov,
Peter Lieven4105eaa2013-07-11 14:16:22 +02002749 rwco->flags);
Kevin Wolf775aa8b2013-12-05 12:09:38 +01002750 } else {
2751 rwco->ret = bdrv_co_do_pwritev(rwco->bs, rwco->offset,
2752 rwco->qiov->size, rwco->qiov,
2753 rwco->flags);
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002754 }
2755}
2756
2757/*
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002758 * Process a vectored synchronous request using coroutines
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002759 */
Kevin Wolf775aa8b2013-12-05 12:09:38 +01002760static int bdrv_prwv_co(BlockDriverState *bs, int64_t offset,
2761 QEMUIOVector *qiov, bool is_write,
2762 BdrvRequestFlags flags)
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002763{
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002764 Coroutine *co;
2765 RwCo rwco = {
2766 .bs = bs,
Kevin Wolf775aa8b2013-12-05 12:09:38 +01002767 .offset = offset,
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002768 .qiov = qiov,
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002769 .is_write = is_write,
2770 .ret = NOT_DONE,
Peter Lieven4105eaa2013-07-11 14:16:22 +02002771 .flags = flags,
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002772 };
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002773
Zhi Yong Wu498e3862012-04-02 18:59:34 +08002774 /**
2775 * In sync call context, when the vcpu is blocked, this throttling timer
2776 * will not fire; so the I/O throttling function has to be disabled here
2777 * if it has been enabled.
2778 */
2779 if (bs->io_limits_enabled) {
2780 fprintf(stderr, "Disabling I/O throttling on '%s' due "
2781 "to synchronous I/O.\n", bdrv_get_device_name(bs));
2782 bdrv_io_limits_disable(bs);
2783 }
2784
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002785 if (qemu_in_coroutine()) {
2786 /* Fast-path if already in coroutine context */
2787 bdrv_rw_co_entry(&rwco);
2788 } else {
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02002789 AioContext *aio_context = bdrv_get_aio_context(bs);
2790
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002791 co = qemu_coroutine_create(bdrv_rw_co_entry);
2792 qemu_coroutine_enter(co, &rwco);
2793 while (rwco.ret == NOT_DONE) {
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02002794 aio_poll(aio_context, true);
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01002795 }
2796 }
2797 return rwco.ret;
2798}
2799
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002800/*
2801 * Process a synchronous request using coroutines
2802 */
2803static int bdrv_rw_co(BlockDriverState *bs, int64_t sector_num, uint8_t *buf,
Peter Lieven4105eaa2013-07-11 14:16:22 +02002804 int nb_sectors, bool is_write, BdrvRequestFlags flags)
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002805{
2806 QEMUIOVector qiov;
2807 struct iovec iov = {
2808 .iov_base = (void *)buf,
2809 .iov_len = nb_sectors * BDRV_SECTOR_SIZE,
2810 };
2811
Kevin Wolfda15ee52014-04-14 15:39:36 +02002812 if (nb_sectors < 0 || nb_sectors > INT_MAX / BDRV_SECTOR_SIZE) {
2813 return -EINVAL;
2814 }
2815
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002816 qemu_iovec_init_external(&qiov, &iov, 1);
Kevin Wolf775aa8b2013-12-05 12:09:38 +01002817 return bdrv_prwv_co(bs, sector_num << BDRV_SECTOR_BITS,
2818 &qiov, is_write, flags);
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002819}
2820
bellard19cb3732006-08-19 11:45:59 +00002821/* return < 0 if error. See bdrv_write() for the return codes */
ths5fafdf22007-09-16 21:08:06 +00002822int bdrv_read(BlockDriverState *bs, int64_t sector_num,
bellardfc01f7e2003-06-30 10:03:06 +00002823 uint8_t *buf, int nb_sectors)
2824{
Peter Lieven4105eaa2013-07-11 14:16:22 +02002825 return bdrv_rw_co(bs, sector_num, buf, nb_sectors, false, 0);
bellardfc01f7e2003-06-30 10:03:06 +00002826}
2827
Markus Armbruster07d27a42012-06-29 17:34:29 +02002828/* Just like bdrv_read(), but with I/O throttling temporarily disabled */
2829int bdrv_read_unthrottled(BlockDriverState *bs, int64_t sector_num,
2830 uint8_t *buf, int nb_sectors)
2831{
2832 bool enabled;
2833 int ret;
2834
2835 enabled = bs->io_limits_enabled;
2836 bs->io_limits_enabled = false;
Peter Lieven4e7395e2013-07-18 10:37:32 +02002837 ret = bdrv_read(bs, sector_num, buf, nb_sectors);
Markus Armbruster07d27a42012-06-29 17:34:29 +02002838 bs->io_limits_enabled = enabled;
2839 return ret;
2840}
2841
ths5fafdf22007-09-16 21:08:06 +00002842/* Return < 0 if error. Important errors are:
bellard19cb3732006-08-19 11:45:59 +00002843 -EIO generic I/O error (may happen for all errors)
2844 -ENOMEDIUM No media inserted.
2845 -EINVAL Invalid sector number or nb_sectors
2846 -EACCES Trying to write a read-only device
2847*/
ths5fafdf22007-09-16 21:08:06 +00002848int bdrv_write(BlockDriverState *bs, int64_t sector_num,
bellardfc01f7e2003-06-30 10:03:06 +00002849 const uint8_t *buf, int nb_sectors)
2850{
Peter Lieven4105eaa2013-07-11 14:16:22 +02002851 return bdrv_rw_co(bs, sector_num, (uint8_t *)buf, nb_sectors, true, 0);
bellard83f64092006-08-01 16:21:11 +00002852}
2853
Peter Lievenaa7bfbf2013-10-24 12:06:51 +02002854int bdrv_write_zeroes(BlockDriverState *bs, int64_t sector_num,
2855 int nb_sectors, BdrvRequestFlags flags)
Peter Lieven4105eaa2013-07-11 14:16:22 +02002856{
2857 return bdrv_rw_co(bs, sector_num, NULL, nb_sectors, true,
Peter Lievenaa7bfbf2013-10-24 12:06:51 +02002858 BDRV_REQ_ZERO_WRITE | flags);
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002859}
2860
Peter Lievend75cbb52013-10-24 12:07:03 +02002861/*
2862 * Completely zero out a block device with the help of bdrv_write_zeroes.
2863 * The operation is sped up by checking the block status and only writing
2864 * zeroes to the device if they currently do not return zeroes. Optional
2865 * flags are passed through to bdrv_write_zeroes (e.g. BDRV_REQ_MAY_UNMAP).
2866 *
2867 * Returns < 0 on error, 0 on success. For error codes see bdrv_write().
2868 */
2869int bdrv_make_zero(BlockDriverState *bs, BdrvRequestFlags flags)
2870{
Markus Armbrusterd32f7c12014-06-26 13:23:18 +02002871 int64_t target_sectors, ret, nb_sectors, sector_num = 0;
Peter Lievend75cbb52013-10-24 12:07:03 +02002872 int n;
2873
Markus Armbrusterd32f7c12014-06-26 13:23:18 +02002874 target_sectors = bdrv_nb_sectors(bs);
2875 if (target_sectors < 0) {
2876 return target_sectors;
Kevin Wolf9ce10c02014-04-14 17:03:34 +02002877 }
Kevin Wolf9ce10c02014-04-14 17:03:34 +02002878
Peter Lievend75cbb52013-10-24 12:07:03 +02002879 for (;;) {
Markus Armbrusterd32f7c12014-06-26 13:23:18 +02002880 nb_sectors = target_sectors - sector_num;
Peter Lievend75cbb52013-10-24 12:07:03 +02002881 if (nb_sectors <= 0) {
2882 return 0;
2883 }
2884 if (nb_sectors > INT_MAX) {
2885 nb_sectors = INT_MAX;
2886 }
2887 ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &n);
Peter Lieven3d94ce62013-12-12 13:57:05 +01002888 if (ret < 0) {
2889 error_report("error getting block status at sector %" PRId64 ": %s",
2890 sector_num, strerror(-ret));
2891 return ret;
2892 }
Peter Lievend75cbb52013-10-24 12:07:03 +02002893 if (ret & BDRV_BLOCK_ZERO) {
2894 sector_num += n;
2895 continue;
2896 }
2897 ret = bdrv_write_zeroes(bs, sector_num, n, flags);
2898 if (ret < 0) {
2899 error_report("error writing zeroes at sector %" PRId64 ": %s",
2900 sector_num, strerror(-ret));
2901 return ret;
2902 }
2903 sector_num += n;
2904 }
2905}
2906
Kevin Wolfa3ef6572013-12-05 12:29:59 +01002907int bdrv_pread(BlockDriverState *bs, int64_t offset, void *buf, int bytes)
bellard83f64092006-08-01 16:21:11 +00002908{
Kevin Wolfa3ef6572013-12-05 12:29:59 +01002909 QEMUIOVector qiov;
2910 struct iovec iov = {
2911 .iov_base = (void *)buf,
2912 .iov_len = bytes,
2913 };
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01002914 int ret;
bellard83f64092006-08-01 16:21:11 +00002915
Kevin Wolfa3ef6572013-12-05 12:29:59 +01002916 if (bytes < 0) {
2917 return -EINVAL;
bellard83f64092006-08-01 16:21:11 +00002918 }
2919
Kevin Wolfa3ef6572013-12-05 12:29:59 +01002920 qemu_iovec_init_external(&qiov, &iov, 1);
2921 ret = bdrv_prwv_co(bs, offset, &qiov, false, 0);
2922 if (ret < 0) {
2923 return ret;
bellard83f64092006-08-01 16:21:11 +00002924 }
2925
Kevin Wolfa3ef6572013-12-05 12:29:59 +01002926 return bytes;
bellard83f64092006-08-01 16:21:11 +00002927}
2928
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002929int bdrv_pwritev(BlockDriverState *bs, int64_t offset, QEMUIOVector *qiov)
bellard83f64092006-08-01 16:21:11 +00002930{
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01002931 int ret;
bellard83f64092006-08-01 16:21:11 +00002932
Kevin Wolf8407d5d2013-12-05 12:34:02 +01002933 ret = bdrv_prwv_co(bs, offset, qiov, true, 0);
2934 if (ret < 0) {
2935 return ret;
bellard83f64092006-08-01 16:21:11 +00002936 }
2937
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002938 return qiov->size;
2939}
2940
2941int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
Kevin Wolf8407d5d2013-12-05 12:34:02 +01002942 const void *buf, int bytes)
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002943{
2944 QEMUIOVector qiov;
2945 struct iovec iov = {
2946 .iov_base = (void *) buf,
Kevin Wolf8407d5d2013-12-05 12:34:02 +01002947 .iov_len = bytes,
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002948 };
2949
Kevin Wolf8407d5d2013-12-05 12:34:02 +01002950 if (bytes < 0) {
2951 return -EINVAL;
2952 }
2953
Kevin Wolf8d3b1a22013-04-05 21:27:55 +02002954 qemu_iovec_init_external(&qiov, &iov, 1);
2955 return bdrv_pwritev(bs, offset, &qiov);
bellard83f64092006-08-01 16:21:11 +00002956}
bellard83f64092006-08-01 16:21:11 +00002957
Kevin Wolff08145f2010-06-16 16:38:15 +02002958/*
2959 * Writes to the file and ensures that no writes are reordered across this
2960 * request (acts as a barrier)
2961 *
2962 * Returns 0 on success, -errno in error cases.
2963 */
2964int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
2965 const void *buf, int count)
2966{
2967 int ret;
2968
2969 ret = bdrv_pwrite(bs, offset, buf, count);
2970 if (ret < 0) {
2971 return ret;
2972 }
2973
Paolo Bonzinif05fa4a2012-06-06 00:04:49 +02002974 /* No flush needed for cache modes that already do it */
2975 if (bs->enable_write_cache) {
Kevin Wolff08145f2010-06-16 16:38:15 +02002976 bdrv_flush(bs);
2977 }
2978
2979 return 0;
2980}
2981
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00002982static int coroutine_fn bdrv_co_do_copy_on_readv(BlockDriverState *bs,
Stefan Hajnocziab185922011-11-17 13:40:31 +00002983 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
2984{
2985 /* Perform I/O through a temporary buffer so that users who scribble over
2986 * their read buffer while the operation is in progress do not end up
2987 * modifying the image file. This is critical for zero-copy guest I/O
2988 * where anything might happen inside guest memory.
2989 */
2990 void *bounce_buffer;
2991
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00002992 BlockDriver *drv = bs->drv;
Stefan Hajnocziab185922011-11-17 13:40:31 +00002993 struct iovec iov;
2994 QEMUIOVector bounce_qiov;
2995 int64_t cluster_sector_num;
2996 int cluster_nb_sectors;
2997 size_t skip_bytes;
2998 int ret;
2999
3000 /* Cover entire cluster so no additional backing file I/O is required when
3001 * allocating cluster in the image file.
3002 */
Paolo Bonzini343bded2013-01-21 17:09:42 +01003003 bdrv_round_to_clusters(bs, sector_num, nb_sectors,
3004 &cluster_sector_num, &cluster_nb_sectors);
Stefan Hajnocziab185922011-11-17 13:40:31 +00003005
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00003006 trace_bdrv_co_do_copy_on_readv(bs, sector_num, nb_sectors,
3007 cluster_sector_num, cluster_nb_sectors);
Stefan Hajnocziab185922011-11-17 13:40:31 +00003008
3009 iov.iov_len = cluster_nb_sectors * BDRV_SECTOR_SIZE;
Kevin Wolf857d4f42014-05-20 13:16:51 +02003010 iov.iov_base = bounce_buffer = qemu_try_blockalign(bs, iov.iov_len);
3011 if (bounce_buffer == NULL) {
3012 ret = -ENOMEM;
3013 goto err;
3014 }
3015
Stefan Hajnocziab185922011-11-17 13:40:31 +00003016 qemu_iovec_init_external(&bounce_qiov, &iov, 1);
3017
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00003018 ret = drv->bdrv_co_readv(bs, cluster_sector_num, cluster_nb_sectors,
3019 &bounce_qiov);
Stefan Hajnocziab185922011-11-17 13:40:31 +00003020 if (ret < 0) {
3021 goto err;
3022 }
3023
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00003024 if (drv->bdrv_co_write_zeroes &&
3025 buffer_is_zero(bounce_buffer, iov.iov_len)) {
Kevin Wolf621f0582012-03-20 15:12:58 +01003026 ret = bdrv_co_do_write_zeroes(bs, cluster_sector_num,
Peter Lievenaa7bfbf2013-10-24 12:06:51 +02003027 cluster_nb_sectors, 0);
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00003028 } else {
Paolo Bonzinif05fa4a2012-06-06 00:04:49 +02003029 /* This does not change the data on the disk, it is not necessary
3030 * to flush even in cache=writethrough mode.
3031 */
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00003032 ret = drv->bdrv_co_writev(bs, cluster_sector_num, cluster_nb_sectors,
Stefan Hajnocziab185922011-11-17 13:40:31 +00003033 &bounce_qiov);
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00003034 }
3035
Stefan Hajnocziab185922011-11-17 13:40:31 +00003036 if (ret < 0) {
3037 /* It might be okay to ignore write errors for guest requests. If this
3038 * is a deliberate copy-on-read then we don't want to ignore the error.
3039 * Simply report it in all cases.
3040 */
3041 goto err;
3042 }
3043
3044 skip_bytes = (sector_num - cluster_sector_num) * BDRV_SECTOR_SIZE;
Michael Tokarev03396142012-06-07 20:17:55 +04003045 qemu_iovec_from_buf(qiov, 0, bounce_buffer + skip_bytes,
3046 nb_sectors * BDRV_SECTOR_SIZE);
Stefan Hajnocziab185922011-11-17 13:40:31 +00003047
3048err:
3049 qemu_vfree(bounce_buffer);
3050 return ret;
3051}
3052
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01003053/*
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003054 * Forwards an already correctly aligned request to the BlockDriver. This
3055 * handles copy on read and zeroing after EOF; any other features must be
3056 * implemented by the caller.
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01003057 */
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003058static int coroutine_fn bdrv_aligned_preadv(BlockDriverState *bs,
Kevin Wolf65afd212013-12-03 14:55:55 +01003059 BdrvTrackedRequest *req, int64_t offset, unsigned int bytes,
Kevin Wolfec746e12013-12-04 12:13:10 +01003060 int64_t align, QEMUIOVector *qiov, int flags)
Kevin Wolfda1fa912011-07-14 17:27:13 +02003061{
3062 BlockDriver *drv = bs->drv;
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00003063 int ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02003064
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003065 int64_t sector_num = offset >> BDRV_SECTOR_BITS;
3066 unsigned int nb_sectors = bytes >> BDRV_SECTOR_BITS;
Kevin Wolfda1fa912011-07-14 17:27:13 +02003067
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003068 assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0);
3069 assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0);
Kevin Wolf8eb029c2014-07-01 16:09:54 +02003070 assert(!qiov || bytes == qiov->size);
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003071
3072 /* Handle Copy on Read and associated serialisation */
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00003073 if (flags & BDRV_REQ_COPY_ON_READ) {
Kevin Wolf73271452013-12-04 17:08:50 +01003074 /* If we touch the same cluster it counts as an overlap. This
3075 * guarantees that allocating writes will be serialized and not race
3076 * with each other for the same cluster. For example, in copy-on-read
3077 * it ensures that the CoR read and write operations are atomic and
3078 * guest writes cannot interleave between them. */
3079 mark_request_serialising(req, bdrv_get_cluster_size(bs));
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00003080 }
3081
Kevin Wolf2dbafdc2013-12-04 16:43:44 +01003082 wait_serialising_requests(req);
Stefan Hajnoczif4658282011-11-17 13:40:29 +00003083
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00003084 if (flags & BDRV_REQ_COPY_ON_READ) {
Stefan Hajnocziab185922011-11-17 13:40:31 +00003085 int pnum;
3086
Paolo Bonzinibdad13b2013-09-04 19:00:22 +02003087 ret = bdrv_is_allocated(bs, sector_num, nb_sectors, &pnum);
Stefan Hajnocziab185922011-11-17 13:40:31 +00003088 if (ret < 0) {
3089 goto out;
3090 }
3091
3092 if (!ret || pnum != nb_sectors) {
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00003093 ret = bdrv_co_do_copy_on_readv(bs, sector_num, nb_sectors, qiov);
Stefan Hajnocziab185922011-11-17 13:40:31 +00003094 goto out;
3095 }
3096 }
3097
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003098 /* Forward the request to the BlockDriver */
MORITA Kazutaka893a8f62013-08-06 09:53:40 +08003099 if (!(bs->zero_beyond_eof && bs->growable)) {
3100 ret = drv->bdrv_co_readv(bs, sector_num, nb_sectors, qiov);
3101 } else {
3102 /* Read zeros after EOF of growable BDSes */
Markus Armbruster40490822014-06-26 13:23:19 +02003103 int64_t total_sectors, max_nb_sectors;
MORITA Kazutaka893a8f62013-08-06 09:53:40 +08003104
Markus Armbruster40490822014-06-26 13:23:19 +02003105 total_sectors = bdrv_nb_sectors(bs);
3106 if (total_sectors < 0) {
3107 ret = total_sectors;
MORITA Kazutaka893a8f62013-08-06 09:53:40 +08003108 goto out;
3109 }
3110
Kevin Wolf5f5bcd82014-02-07 16:00:09 +01003111 max_nb_sectors = ROUND_UP(MAX(0, total_sectors - sector_num),
3112 align >> BDRV_SECTOR_BITS);
MORITA Kazutaka893a8f62013-08-06 09:53:40 +08003113 if (max_nb_sectors > 0) {
Kevin Wolf33f461e2014-07-03 13:21:24 +02003114 QEMUIOVector local_qiov;
3115 size_t local_sectors;
3116
3117 max_nb_sectors = MIN(max_nb_sectors, SIZE_MAX / BDRV_SECTOR_BITS);
3118 local_sectors = MIN(max_nb_sectors, nb_sectors);
3119
3120 qemu_iovec_init(&local_qiov, qiov->niov);
3121 qemu_iovec_concat(&local_qiov, qiov, 0,
3122 local_sectors * BDRV_SECTOR_SIZE);
3123
3124 ret = drv->bdrv_co_readv(bs, sector_num, local_sectors,
3125 &local_qiov);
3126
3127 qemu_iovec_destroy(&local_qiov);
MORITA Kazutaka893a8f62013-08-06 09:53:40 +08003128 } else {
3129 ret = 0;
3130 }
3131
3132 /* Reading beyond end of file is supposed to produce zeroes */
3133 if (ret == 0 && total_sectors < sector_num + nb_sectors) {
3134 uint64_t offset = MAX(0, total_sectors - sector_num);
3135 uint64_t bytes = (sector_num + nb_sectors - offset) *
3136 BDRV_SECTOR_SIZE;
3137 qemu_iovec_memset(qiov, offset * BDRV_SECTOR_SIZE, 0, bytes);
3138 }
3139 }
Stefan Hajnocziab185922011-11-17 13:40:31 +00003140
3141out:
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00003142 return ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02003143}
3144
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003145/*
3146 * Handle a read request in coroutine context
3147 */
Kevin Wolf1b0288a2013-12-02 16:09:46 +01003148static int coroutine_fn bdrv_co_do_preadv(BlockDriverState *bs,
3149 int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003150 BdrvRequestFlags flags)
3151{
3152 BlockDriver *drv = bs->drv;
Kevin Wolf65afd212013-12-03 14:55:55 +01003153 BdrvTrackedRequest req;
3154
Kevin Wolf1b0288a2013-12-02 16:09:46 +01003155 /* TODO Lift BDRV_SECTOR_SIZE restriction in BlockDriver interface */
3156 uint64_t align = MAX(BDRV_SECTOR_SIZE, bs->request_alignment);
3157 uint8_t *head_buf = NULL;
3158 uint8_t *tail_buf = NULL;
3159 QEMUIOVector local_qiov;
3160 bool use_local_qiov = false;
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003161 int ret;
3162
3163 if (!drv) {
3164 return -ENOMEDIUM;
3165 }
Kevin Wolf1b0288a2013-12-02 16:09:46 +01003166 if (bdrv_check_byte_request(bs, offset, bytes)) {
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003167 return -EIO;
3168 }
3169
3170 if (bs->copy_on_read) {
3171 flags |= BDRV_REQ_COPY_ON_READ;
3172 }
3173
3174 /* throttling disk I/O */
3175 if (bs->io_limits_enabled) {
Kevin Wolfd5103582014-01-16 13:29:10 +01003176 bdrv_io_limits_intercept(bs, bytes, false);
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003177 }
3178
Kevin Wolf1b0288a2013-12-02 16:09:46 +01003179 /* Align read if necessary by padding qiov */
3180 if (offset & (align - 1)) {
3181 head_buf = qemu_blockalign(bs, align);
3182 qemu_iovec_init(&local_qiov, qiov->niov + 2);
3183 qemu_iovec_add(&local_qiov, head_buf, offset & (align - 1));
3184 qemu_iovec_concat(&local_qiov, qiov, 0, qiov->size);
3185 use_local_qiov = true;
3186
3187 bytes += offset & (align - 1);
3188 offset = offset & ~(align - 1);
3189 }
3190
3191 if ((offset + bytes) & (align - 1)) {
3192 if (!use_local_qiov) {
3193 qemu_iovec_init(&local_qiov, qiov->niov + 1);
3194 qemu_iovec_concat(&local_qiov, qiov, 0, qiov->size);
3195 use_local_qiov = true;
3196 }
3197 tail_buf = qemu_blockalign(bs, align);
3198 qemu_iovec_add(&local_qiov, tail_buf,
3199 align - ((offset + bytes) & (align - 1)));
3200
3201 bytes = ROUND_UP(bytes, align);
3202 }
3203
Kevin Wolf65afd212013-12-03 14:55:55 +01003204 tracked_request_begin(&req, bs, offset, bytes, false);
Kevin Wolfec746e12013-12-04 12:13:10 +01003205 ret = bdrv_aligned_preadv(bs, &req, offset, bytes, align,
Kevin Wolf1b0288a2013-12-02 16:09:46 +01003206 use_local_qiov ? &local_qiov : qiov,
3207 flags);
Kevin Wolf65afd212013-12-03 14:55:55 +01003208 tracked_request_end(&req);
Kevin Wolf1b0288a2013-12-02 16:09:46 +01003209
3210 if (use_local_qiov) {
3211 qemu_iovec_destroy(&local_qiov);
3212 qemu_vfree(head_buf);
3213 qemu_vfree(tail_buf);
3214 }
3215
Kevin Wolfd0c7f642013-12-02 15:07:48 +01003216 return ret;
3217}
3218
Kevin Wolf1b0288a2013-12-02 16:09:46 +01003219static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
3220 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
3221 BdrvRequestFlags flags)
3222{
3223 if (nb_sectors < 0 || nb_sectors > (UINT_MAX >> BDRV_SECTOR_BITS)) {
3224 return -EINVAL;
3225 }
3226
3227 return bdrv_co_do_preadv(bs, sector_num << BDRV_SECTOR_BITS,
3228 nb_sectors << BDRV_SECTOR_BITS, qiov, flags);
3229}
3230
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01003231int coroutine_fn bdrv_co_readv(BlockDriverState *bs, int64_t sector_num,
Kevin Wolfda1fa912011-07-14 17:27:13 +02003232 int nb_sectors, QEMUIOVector *qiov)
3233{
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01003234 trace_bdrv_co_readv(bs, sector_num, nb_sectors);
Kevin Wolfda1fa912011-07-14 17:27:13 +02003235
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00003236 return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov, 0);
3237}
3238
3239int coroutine_fn bdrv_co_copy_on_readv(BlockDriverState *bs,
3240 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
3241{
3242 trace_bdrv_co_copy_on_readv(bs, sector_num, nb_sectors);
3243
3244 return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov,
3245 BDRV_REQ_COPY_ON_READ);
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01003246}
3247
Peter Lievenc31cb702013-10-24 12:06:58 +02003248/* if no limit is specified in the BlockLimits use a default
3249 * of 32768 512-byte sectors (16 MiB) per request.
3250 */
3251#define MAX_WRITE_ZEROES_DEFAULT 32768
3252
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003253static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
Peter Lievenaa7bfbf2013-10-24 12:06:51 +02003254 int64_t sector_num, int nb_sectors, BdrvRequestFlags flags)
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003255{
3256 BlockDriver *drv = bs->drv;
3257 QEMUIOVector qiov;
Peter Lievenc31cb702013-10-24 12:06:58 +02003258 struct iovec iov = {0};
3259 int ret = 0;
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003260
Peter Lievenc31cb702013-10-24 12:06:58 +02003261 int max_write_zeroes = bs->bl.max_write_zeroes ?
3262 bs->bl.max_write_zeroes : MAX_WRITE_ZEROES_DEFAULT;
Kevin Wolf621f0582012-03-20 15:12:58 +01003263
Peter Lievenc31cb702013-10-24 12:06:58 +02003264 while (nb_sectors > 0 && !ret) {
3265 int num = nb_sectors;
3266
Paolo Bonzinib8d71c02013-11-22 13:39:48 +01003267 /* Align request. Block drivers can expect the "bulk" of the request
3268 * to be aligned.
3269 */
3270 if (bs->bl.write_zeroes_alignment
3271 && num > bs->bl.write_zeroes_alignment) {
3272 if (sector_num % bs->bl.write_zeroes_alignment != 0) {
3273 /* Make a small request up to the first aligned sector. */
Peter Lievenc31cb702013-10-24 12:06:58 +02003274 num = bs->bl.write_zeroes_alignment;
Paolo Bonzinib8d71c02013-11-22 13:39:48 +01003275 num -= sector_num % bs->bl.write_zeroes_alignment;
3276 } else if ((sector_num + num) % bs->bl.write_zeroes_alignment != 0) {
3277 /* Shorten the request to the last aligned sector. num cannot
3278 * underflow because num > bs->bl.write_zeroes_alignment.
3279 */
3280 num -= (sector_num + num) % bs->bl.write_zeroes_alignment;
Peter Lievenc31cb702013-10-24 12:06:58 +02003281 }
Kevin Wolf621f0582012-03-20 15:12:58 +01003282 }
Peter Lievenc31cb702013-10-24 12:06:58 +02003283
3284 /* limit request size */
3285 if (num > max_write_zeroes) {
3286 num = max_write_zeroes;
3287 }
3288
3289 ret = -ENOTSUP;
3290 /* First try the efficient write zeroes operation */
3291 if (drv->bdrv_co_write_zeroes) {
3292 ret = drv->bdrv_co_write_zeroes(bs, sector_num, num, flags);
3293 }
3294
3295 if (ret == -ENOTSUP) {
3296 /* Fall back to bounce buffer if write zeroes is unsupported */
3297 iov.iov_len = num * BDRV_SECTOR_SIZE;
3298 if (iov.iov_base == NULL) {
Kevin Wolf857d4f42014-05-20 13:16:51 +02003299 iov.iov_base = qemu_try_blockalign(bs, num * BDRV_SECTOR_SIZE);
3300 if (iov.iov_base == NULL) {
3301 ret = -ENOMEM;
3302 goto fail;
3303 }
Paolo Bonzinib8d71c02013-11-22 13:39:48 +01003304 memset(iov.iov_base, 0, num * BDRV_SECTOR_SIZE);
Peter Lievenc31cb702013-10-24 12:06:58 +02003305 }
3306 qemu_iovec_init_external(&qiov, &iov, 1);
3307
3308 ret = drv->bdrv_co_writev(bs, sector_num, num, &qiov);
Paolo Bonzinib8d71c02013-11-22 13:39:48 +01003309
3310 /* Keep bounce buffer around if it is big enough for all
3311 * all future requests.
3312 */
3313 if (num < max_write_zeroes) {
3314 qemu_vfree(iov.iov_base);
3315 iov.iov_base = NULL;
3316 }
Peter Lievenc31cb702013-10-24 12:06:58 +02003317 }
3318
3319 sector_num += num;
3320 nb_sectors -= num;
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003321 }
3322
Kevin Wolf857d4f42014-05-20 13:16:51 +02003323fail:
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003324 qemu_vfree(iov.iov_base);
3325 return ret;
3326}
3327
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01003328/*
Kevin Wolfb404f722013-12-03 14:02:23 +01003329 * Forwards an already correctly aligned write request to the BlockDriver.
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01003330 */
Kevin Wolfb404f722013-12-03 14:02:23 +01003331static int coroutine_fn bdrv_aligned_pwritev(BlockDriverState *bs,
Kevin Wolf65afd212013-12-03 14:55:55 +01003332 BdrvTrackedRequest *req, int64_t offset, unsigned int bytes,
3333 QEMUIOVector *qiov, int flags)
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01003334{
3335 BlockDriver *drv = bs->drv;
Kevin Wolf28de2dc2014-01-14 11:41:35 +01003336 bool waited;
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01003337 int ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02003338
Kevin Wolfb404f722013-12-03 14:02:23 +01003339 int64_t sector_num = offset >> BDRV_SECTOR_BITS;
3340 unsigned int nb_sectors = bytes >> BDRV_SECTOR_BITS;
Kevin Wolfda1fa912011-07-14 17:27:13 +02003341
Kevin Wolfb404f722013-12-03 14:02:23 +01003342 assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0);
3343 assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0);
Kevin Wolf8eb029c2014-07-01 16:09:54 +02003344 assert(!qiov || bytes == qiov->size);
Benoît Canetcc0681c2013-09-02 14:14:39 +02003345
Kevin Wolf28de2dc2014-01-14 11:41:35 +01003346 waited = wait_serialising_requests(req);
3347 assert(!waited || !req->serialising);
Kevin Wolfaf91f9a2014-02-07 15:35:56 +01003348 assert(req->overlap_offset <= offset);
3349 assert(offset + bytes <= req->overlap_offset + req->overlap_bytes);
Kevin Wolf244eade2013-12-03 14:30:44 +01003350
Kevin Wolf65afd212013-12-03 14:55:55 +01003351 ret = notifier_with_return_list_notify(&bs->before_write_notifiers, req);
Stefan Hajnoczid616b222013-06-24 17:13:10 +02003352
Peter Lieven465bee12014-05-18 00:58:19 +02003353 if (!ret && bs->detect_zeroes != BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF &&
3354 !(flags & BDRV_REQ_ZERO_WRITE) && drv->bdrv_co_write_zeroes &&
3355 qemu_iovec_is_zero(qiov)) {
3356 flags |= BDRV_REQ_ZERO_WRITE;
3357 if (bs->detect_zeroes == BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP) {
3358 flags |= BDRV_REQ_MAY_UNMAP;
3359 }
3360 }
3361
Stefan Hajnoczid616b222013-06-24 17:13:10 +02003362 if (ret < 0) {
3363 /* Do nothing, write notifier decided to fail this request */
3364 } else if (flags & BDRV_REQ_ZERO_WRITE) {
Kevin Wolf9e1cb962014-01-14 15:37:03 +01003365 BLKDBG_EVENT(bs, BLKDBG_PWRITEV_ZERO);
Peter Lievenaa7bfbf2013-10-24 12:06:51 +02003366 ret = bdrv_co_do_write_zeroes(bs, sector_num, nb_sectors, flags);
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003367 } else {
Kevin Wolf9e1cb962014-01-14 15:37:03 +01003368 BLKDBG_EVENT(bs, BLKDBG_PWRITEV);
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003369 ret = drv->bdrv_co_writev(bs, sector_num, nb_sectors, qiov);
3370 }
Kevin Wolf9e1cb962014-01-14 15:37:03 +01003371 BLKDBG_EVENT(bs, BLKDBG_PWRITEV_DONE);
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01003372
Paolo Bonzinif05fa4a2012-06-06 00:04:49 +02003373 if (ret == 0 && !bs->enable_write_cache) {
3374 ret = bdrv_co_flush(bs);
3375 }
3376
Fam Zhenge4654d22013-11-13 18:29:43 +08003377 bdrv_set_dirty(bs, sector_num, nb_sectors);
Kevin Wolfda1fa912011-07-14 17:27:13 +02003378
Benoît Canet5366d0c2014-09-05 15:46:18 +02003379 block_acct_highest_sector(&bs->stats, sector_num, nb_sectors);
Benoît Canet5e5a94b2014-09-05 15:46:16 +02003380
Paolo Bonzinidf2a6f22013-09-04 19:00:21 +02003381 if (bs->growable && ret >= 0) {
3382 bs->total_sectors = MAX(bs->total_sectors, sector_num + nb_sectors);
3383 }
Kevin Wolfda1fa912011-07-14 17:27:13 +02003384
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01003385 return ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02003386}
3387
Kevin Wolfb404f722013-12-03 14:02:23 +01003388/*
3389 * Handle a write request in coroutine context
3390 */
Kevin Wolf66015532013-12-03 14:40:18 +01003391static int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs,
3392 int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
Kevin Wolfb404f722013-12-03 14:02:23 +01003393 BdrvRequestFlags flags)
3394{
Kevin Wolf65afd212013-12-03 14:55:55 +01003395 BdrvTrackedRequest req;
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003396 /* TODO Lift BDRV_SECTOR_SIZE restriction in BlockDriver interface */
3397 uint64_t align = MAX(BDRV_SECTOR_SIZE, bs->request_alignment);
3398 uint8_t *head_buf = NULL;
3399 uint8_t *tail_buf = NULL;
3400 QEMUIOVector local_qiov;
3401 bool use_local_qiov = false;
Kevin Wolfb404f722013-12-03 14:02:23 +01003402 int ret;
3403
3404 if (!bs->drv) {
3405 return -ENOMEDIUM;
3406 }
3407 if (bs->read_only) {
3408 return -EACCES;
3409 }
Kevin Wolf66015532013-12-03 14:40:18 +01003410 if (bdrv_check_byte_request(bs, offset, bytes)) {
Kevin Wolfb404f722013-12-03 14:02:23 +01003411 return -EIO;
3412 }
3413
Kevin Wolfb404f722013-12-03 14:02:23 +01003414 /* throttling disk I/O */
3415 if (bs->io_limits_enabled) {
Kevin Wolfd5103582014-01-16 13:29:10 +01003416 bdrv_io_limits_intercept(bs, bytes, true);
Kevin Wolfb404f722013-12-03 14:02:23 +01003417 }
3418
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003419 /*
3420 * Align write if necessary by performing a read-modify-write cycle.
3421 * Pad qiov with the read parts and be sure to have a tracked request not
3422 * only for bdrv_aligned_pwritev, but also for the reads of the RMW cycle.
3423 */
Kevin Wolf65afd212013-12-03 14:55:55 +01003424 tracked_request_begin(&req, bs, offset, bytes, true);
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003425
3426 if (offset & (align - 1)) {
3427 QEMUIOVector head_qiov;
3428 struct iovec head_iov;
3429
3430 mark_request_serialising(&req, align);
3431 wait_serialising_requests(&req);
3432
3433 head_buf = qemu_blockalign(bs, align);
3434 head_iov = (struct iovec) {
3435 .iov_base = head_buf,
3436 .iov_len = align,
3437 };
3438 qemu_iovec_init_external(&head_qiov, &head_iov, 1);
3439
Kevin Wolf9e1cb962014-01-14 15:37:03 +01003440 BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_HEAD);
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003441 ret = bdrv_aligned_preadv(bs, &req, offset & ~(align - 1), align,
3442 align, &head_qiov, 0);
3443 if (ret < 0) {
3444 goto fail;
3445 }
Kevin Wolf9e1cb962014-01-14 15:37:03 +01003446 BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_AFTER_HEAD);
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003447
3448 qemu_iovec_init(&local_qiov, qiov->niov + 2);
3449 qemu_iovec_add(&local_qiov, head_buf, offset & (align - 1));
3450 qemu_iovec_concat(&local_qiov, qiov, 0, qiov->size);
3451 use_local_qiov = true;
3452
3453 bytes += offset & (align - 1);
3454 offset = offset & ~(align - 1);
3455 }
3456
3457 if ((offset + bytes) & (align - 1)) {
3458 QEMUIOVector tail_qiov;
3459 struct iovec tail_iov;
3460 size_t tail_bytes;
Kevin Wolf28de2dc2014-01-14 11:41:35 +01003461 bool waited;
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003462
3463 mark_request_serialising(&req, align);
Kevin Wolf28de2dc2014-01-14 11:41:35 +01003464 waited = wait_serialising_requests(&req);
3465 assert(!waited || !use_local_qiov);
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003466
3467 tail_buf = qemu_blockalign(bs, align);
3468 tail_iov = (struct iovec) {
3469 .iov_base = tail_buf,
3470 .iov_len = align,
3471 };
3472 qemu_iovec_init_external(&tail_qiov, &tail_iov, 1);
3473
Kevin Wolf9e1cb962014-01-14 15:37:03 +01003474 BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_TAIL);
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003475 ret = bdrv_aligned_preadv(bs, &req, (offset + bytes) & ~(align - 1), align,
3476 align, &tail_qiov, 0);
3477 if (ret < 0) {
3478 goto fail;
3479 }
Kevin Wolf9e1cb962014-01-14 15:37:03 +01003480 BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_AFTER_TAIL);
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003481
3482 if (!use_local_qiov) {
3483 qemu_iovec_init(&local_qiov, qiov->niov + 1);
3484 qemu_iovec_concat(&local_qiov, qiov, 0, qiov->size);
3485 use_local_qiov = true;
3486 }
3487
3488 tail_bytes = (offset + bytes) & (align - 1);
3489 qemu_iovec_add(&local_qiov, tail_buf + tail_bytes, align - tail_bytes);
3490
3491 bytes = ROUND_UP(bytes, align);
3492 }
3493
3494 ret = bdrv_aligned_pwritev(bs, &req, offset, bytes,
3495 use_local_qiov ? &local_qiov : qiov,
3496 flags);
3497
3498fail:
Kevin Wolf65afd212013-12-03 14:55:55 +01003499 tracked_request_end(&req);
Kevin Wolfb404f722013-12-03 14:02:23 +01003500
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003501 if (use_local_qiov) {
3502 qemu_iovec_destroy(&local_qiov);
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003503 }
Kevin Wolf99c4a852014-02-07 15:29:00 +01003504 qemu_vfree(head_buf);
3505 qemu_vfree(tail_buf);
Kevin Wolf3b8242e2013-12-03 16:34:41 +01003506
Kevin Wolfb404f722013-12-03 14:02:23 +01003507 return ret;
3508}
3509
Kevin Wolf66015532013-12-03 14:40:18 +01003510static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
3511 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
3512 BdrvRequestFlags flags)
3513{
3514 if (nb_sectors < 0 || nb_sectors > (INT_MAX >> BDRV_SECTOR_BITS)) {
3515 return -EINVAL;
3516 }
3517
3518 return bdrv_co_do_pwritev(bs, sector_num << BDRV_SECTOR_BITS,
3519 nb_sectors << BDRV_SECTOR_BITS, qiov, flags);
3520}
3521
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01003522int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
3523 int nb_sectors, QEMUIOVector *qiov)
3524{
3525 trace_bdrv_co_writev(bs, sector_num, nb_sectors);
3526
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003527 return bdrv_co_do_writev(bs, sector_num, nb_sectors, qiov, 0);
3528}
3529
3530int coroutine_fn bdrv_co_write_zeroes(BlockDriverState *bs,
Peter Lievenaa7bfbf2013-10-24 12:06:51 +02003531 int64_t sector_num, int nb_sectors,
3532 BdrvRequestFlags flags)
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003533{
Paolo Bonzini94d6ff22013-11-22 13:39:45 +01003534 trace_bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003535
Peter Lievend32f35c2013-10-24 12:06:52 +02003536 if (!(bs->open_flags & BDRV_O_UNMAP)) {
3537 flags &= ~BDRV_REQ_MAY_UNMAP;
3538 }
3539
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003540 return bdrv_co_do_writev(bs, sector_num, nb_sectors, NULL,
Peter Lievenaa7bfbf2013-10-24 12:06:51 +02003541 BDRV_REQ_ZERO_WRITE | flags);
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01003542}
3543
bellard83f64092006-08-01 16:21:11 +00003544/**
bellard83f64092006-08-01 16:21:11 +00003545 * Truncate file to 'offset' bytes (needed only for file protocols)
3546 */
3547int bdrv_truncate(BlockDriverState *bs, int64_t offset)
3548{
3549 BlockDriver *drv = bs->drv;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01003550 int ret;
bellard83f64092006-08-01 16:21:11 +00003551 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00003552 return -ENOMEDIUM;
bellard83f64092006-08-01 16:21:11 +00003553 if (!drv->bdrv_truncate)
3554 return -ENOTSUP;
Naphtali Sprei59f26892009-10-26 16:25:16 +02003555 if (bs->read_only)
3556 return -EACCES;
Jeff Cody9c75e162014-06-25 16:55:30 -04003557
Stefan Hajnoczi51762282010-04-19 16:56:41 +01003558 ret = drv->bdrv_truncate(bs, offset);
3559 if (ret == 0) {
3560 ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
Markus Armbruster145feb12011-08-03 15:07:42 +02003561 bdrv_dev_resize_cb(bs);
Stefan Hajnoczi51762282010-04-19 16:56:41 +01003562 }
3563 return ret;
bellard83f64092006-08-01 16:21:11 +00003564}
3565
3566/**
Fam Zheng4a1d5e12011-07-12 19:56:39 +08003567 * Length of a allocated file in bytes. Sparse files are counted by actual
3568 * allocated space. Return < 0 if error or unknown.
3569 */
3570int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
3571{
3572 BlockDriver *drv = bs->drv;
3573 if (!drv) {
3574 return -ENOMEDIUM;
3575 }
3576 if (drv->bdrv_get_allocated_file_size) {
3577 return drv->bdrv_get_allocated_file_size(bs);
3578 }
3579 if (bs->file) {
3580 return bdrv_get_allocated_file_size(bs->file);
3581 }
3582 return -ENOTSUP;
3583}
3584
3585/**
Markus Armbruster65a9bb22014-06-26 13:23:17 +02003586 * Return number of sectors on success, -errno on error.
bellard83f64092006-08-01 16:21:11 +00003587 */
Markus Armbruster65a9bb22014-06-26 13:23:17 +02003588int64_t bdrv_nb_sectors(BlockDriverState *bs)
bellard83f64092006-08-01 16:21:11 +00003589{
3590 BlockDriver *drv = bs->drv;
Markus Armbruster65a9bb22014-06-26 13:23:17 +02003591
bellard83f64092006-08-01 16:21:11 +00003592 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00003593 return -ENOMEDIUM;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01003594
Kevin Wolfb94a2612013-10-29 12:18:58 +01003595 if (drv->has_variable_length) {
3596 int ret = refresh_total_sectors(bs, bs->total_sectors);
3597 if (ret < 0) {
3598 return ret;
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01003599 }
bellard83f64092006-08-01 16:21:11 +00003600 }
Markus Armbruster65a9bb22014-06-26 13:23:17 +02003601 return bs->total_sectors;
3602}
3603
3604/**
3605 * Return length in bytes on success, -errno on error.
3606 * The length is always a multiple of BDRV_SECTOR_SIZE.
3607 */
3608int64_t bdrv_getlength(BlockDriverState *bs)
3609{
3610 int64_t ret = bdrv_nb_sectors(bs);
3611
3612 return ret < 0 ? ret : ret * BDRV_SECTOR_SIZE;
bellardfc01f7e2003-06-30 10:03:06 +00003613}
3614
bellard19cb3732006-08-19 11:45:59 +00003615/* return 0 as number of sectors if no device present or error */
ths96b8f132007-12-17 01:35:20 +00003616void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
bellardfc01f7e2003-06-30 10:03:06 +00003617{
Markus Armbruster65a9bb22014-06-26 13:23:17 +02003618 int64_t nb_sectors = bdrv_nb_sectors(bs);
3619
3620 *nb_sectors_ptr = nb_sectors < 0 ? 0 : nb_sectors;
bellardfc01f7e2003-06-30 10:03:06 +00003621}
bellardcf989512004-02-16 21:56:36 +00003622
Paolo Bonziniff06f5f2012-09-28 17:22:54 +02003623void bdrv_set_on_error(BlockDriverState *bs, BlockdevOnError on_read_error,
3624 BlockdevOnError on_write_error)
Markus Armbrusterabd7f682010-06-02 18:55:17 +02003625{
3626 bs->on_read_error = on_read_error;
3627 bs->on_write_error = on_write_error;
3628}
3629
Paolo Bonzini1ceee0d2012-09-28 17:22:56 +02003630BlockdevOnError bdrv_get_on_error(BlockDriverState *bs, bool is_read)
Markus Armbrusterabd7f682010-06-02 18:55:17 +02003631{
3632 return is_read ? bs->on_read_error : bs->on_write_error;
3633}
3634
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003635BlockErrorAction bdrv_get_error_action(BlockDriverState *bs, bool is_read, int error)
3636{
3637 BlockdevOnError on_err = is_read ? bs->on_read_error : bs->on_write_error;
3638
3639 switch (on_err) {
3640 case BLOCKDEV_ON_ERROR_ENOSPC:
Wenchao Xiaa5895692014-06-18 08:43:30 +02003641 return (error == ENOSPC) ?
3642 BLOCK_ERROR_ACTION_STOP : BLOCK_ERROR_ACTION_REPORT;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003643 case BLOCKDEV_ON_ERROR_STOP:
Wenchao Xiaa5895692014-06-18 08:43:30 +02003644 return BLOCK_ERROR_ACTION_STOP;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003645 case BLOCKDEV_ON_ERROR_REPORT:
Wenchao Xiaa5895692014-06-18 08:43:30 +02003646 return BLOCK_ERROR_ACTION_REPORT;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003647 case BLOCKDEV_ON_ERROR_IGNORE:
Wenchao Xiaa5895692014-06-18 08:43:30 +02003648 return BLOCK_ERROR_ACTION_IGNORE;
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003649 default:
3650 abort();
3651 }
3652}
3653
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04003654static void send_qmp_error_event(BlockDriverState *bs,
3655 BlockErrorAction action,
3656 bool is_read, int error)
3657{
3658 BlockErrorAction ac;
3659
3660 ac = is_read ? IO_OPERATION_TYPE_READ : IO_OPERATION_TYPE_WRITE;
3661 qapi_event_send_block_io_error(bdrv_get_device_name(bs), ac, action,
3662 bdrv_iostatus_is_enabled(bs),
Luiz Capitulino624ff572014-09-11 10:25:48 -04003663 error == ENOSPC, strerror(error),
3664 &error_abort);
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04003665}
3666
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003667/* This is done by device models because, while the block layer knows
3668 * about the error, it does not know whether an operation comes from
3669 * the device or the block layer (from a job, for example).
3670 */
3671void bdrv_error_action(BlockDriverState *bs, BlockErrorAction action,
3672 bool is_read, int error)
3673{
3674 assert(error >= 0);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02003675
Wenchao Xiaa5895692014-06-18 08:43:30 +02003676 if (action == BLOCK_ERROR_ACTION_STOP) {
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02003677 /* First set the iostatus, so that "info block" returns an iostatus
3678 * that matches the events raised so far (an additional error iostatus
3679 * is fine, but not a lost one).
3680 */
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003681 bdrv_iostatus_set_err(bs, error);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02003682
3683 /* Then raise the request to stop the VM and the event.
3684 * qemu_system_vmstop_request_prepare has two effects. First,
3685 * it ensures that the STOP event always comes after the
3686 * BLOCK_IO_ERROR event. Second, it ensures that even if management
3687 * can observe the STOP event and do a "cont" before the STOP
3688 * event is issued, the VM will not stop. In this case, vm_start()
3689 * also ensures that the STOP/RESUME pair of events is emitted.
3690 */
3691 qemu_system_vmstop_request_prepare();
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04003692 send_qmp_error_event(bs, action, is_read, error);
Paolo Bonzini2bd3bce2014-06-05 14:53:59 +02003693 qemu_system_vmstop_request(RUN_STATE_IO_ERROR);
3694 } else {
Luiz Capitulinoc7c2ff02014-08-29 16:07:27 -04003695 send_qmp_error_event(bs, action, is_read, error);
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02003696 }
3697}
3698
bellardb3380822004-03-14 21:38:54 +00003699int bdrv_is_read_only(BlockDriverState *bs)
3700{
3701 return bs->read_only;
3702}
3703
ths985a03b2007-12-24 16:10:43 +00003704int bdrv_is_sg(BlockDriverState *bs)
3705{
3706 return bs->sg;
3707}
3708
Christoph Hellwige900a7b2009-09-04 19:01:15 +02003709int bdrv_enable_write_cache(BlockDriverState *bs)
3710{
3711 return bs->enable_write_cache;
3712}
3713
Paolo Bonzini425b0142012-06-06 00:04:52 +02003714void bdrv_set_enable_write_cache(BlockDriverState *bs, bool wce)
3715{
3716 bs->enable_write_cache = wce;
Jeff Cody55b110f2012-09-20 15:13:18 -04003717
3718 /* so a reopen() will preserve wce */
3719 if (wce) {
3720 bs->open_flags |= BDRV_O_CACHE_WB;
3721 } else {
3722 bs->open_flags &= ~BDRV_O_CACHE_WB;
3723 }
Paolo Bonzini425b0142012-06-06 00:04:52 +02003724}
3725
bellardea2384d2004-08-01 21:59:26 +00003726int bdrv_is_encrypted(BlockDriverState *bs)
3727{
3728 if (bs->backing_hd && bs->backing_hd->encrypted)
3729 return 1;
3730 return bs->encrypted;
3731}
3732
aliguoric0f4ce72009-03-05 23:01:01 +00003733int bdrv_key_required(BlockDriverState *bs)
3734{
3735 BlockDriverState *backing_hd = bs->backing_hd;
3736
3737 if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
3738 return 1;
3739 return (bs->encrypted && !bs->valid_key);
3740}
3741
bellardea2384d2004-08-01 21:59:26 +00003742int bdrv_set_key(BlockDriverState *bs, const char *key)
3743{
3744 int ret;
3745 if (bs->backing_hd && bs->backing_hd->encrypted) {
3746 ret = bdrv_set_key(bs->backing_hd, key);
3747 if (ret < 0)
3748 return ret;
3749 if (!bs->encrypted)
3750 return 0;
3751 }
Shahar Havivifd04a2a2010-03-06 00:26:13 +02003752 if (!bs->encrypted) {
3753 return -EINVAL;
3754 } else if (!bs->drv || !bs->drv->bdrv_set_key) {
3755 return -ENOMEDIUM;
3756 }
aliguoric0f4ce72009-03-05 23:01:01 +00003757 ret = bs->drv->bdrv_set_key(bs, key);
aliguoribb5fc202009-03-05 23:01:15 +00003758 if (ret < 0) {
3759 bs->valid_key = 0;
3760 } else if (!bs->valid_key) {
3761 bs->valid_key = 1;
3762 /* call the change callback now, we skipped it on open */
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +02003763 bdrv_dev_change_media_cb(bs, true);
aliguoribb5fc202009-03-05 23:01:15 +00003764 }
aliguoric0f4ce72009-03-05 23:01:01 +00003765 return ret;
bellardea2384d2004-08-01 21:59:26 +00003766}
3767
Markus Armbrusterf8d6bba2012-06-13 10:11:48 +02003768const char *bdrv_get_format_name(BlockDriverState *bs)
bellardea2384d2004-08-01 21:59:26 +00003769{
Markus Armbrusterf8d6bba2012-06-13 10:11:48 +02003770 return bs->drv ? bs->drv->format_name : NULL;
bellardea2384d2004-08-01 21:59:26 +00003771}
3772
Stefan Hajnocziada42402014-08-27 12:08:55 +01003773static int qsort_strcmp(const void *a, const void *b)
3774{
3775 return strcmp(a, b);
3776}
3777
ths5fafdf22007-09-16 21:08:06 +00003778void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
bellardea2384d2004-08-01 21:59:26 +00003779 void *opaque)
3780{
3781 BlockDriver *drv;
Jeff Codye855e4f2014-04-28 18:29:54 -04003782 int count = 0;
Stefan Hajnocziada42402014-08-27 12:08:55 +01003783 int i;
Jeff Codye855e4f2014-04-28 18:29:54 -04003784 const char **formats = NULL;
bellardea2384d2004-08-01 21:59:26 +00003785
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +01003786 QLIST_FOREACH(drv, &bdrv_drivers, list) {
Jeff Codye855e4f2014-04-28 18:29:54 -04003787 if (drv->format_name) {
3788 bool found = false;
3789 int i = count;
3790 while (formats && i && !found) {
3791 found = !strcmp(formats[--i], drv->format_name);
3792 }
3793
3794 if (!found) {
Markus Armbruster5839e532014-08-19 10:31:08 +02003795 formats = g_renew(const char *, formats, count + 1);
Jeff Codye855e4f2014-04-28 18:29:54 -04003796 formats[count++] = drv->format_name;
Jeff Codye855e4f2014-04-28 18:29:54 -04003797 }
3798 }
bellardea2384d2004-08-01 21:59:26 +00003799 }
Stefan Hajnocziada42402014-08-27 12:08:55 +01003800
3801 qsort(formats, count, sizeof(formats[0]), qsort_strcmp);
3802
3803 for (i = 0; i < count; i++) {
3804 it(opaque, formats[i]);
3805 }
3806
Jeff Codye855e4f2014-04-28 18:29:54 -04003807 g_free(formats);
bellardea2384d2004-08-01 21:59:26 +00003808}
3809
Benoît Canetdc364f42014-01-23 21:31:32 +01003810/* This function is to find block backend bs */
bellardb3380822004-03-14 21:38:54 +00003811BlockDriverState *bdrv_find(const char *name)
3812{
3813 BlockDriverState *bs;
3814
Benoît Canetdc364f42014-01-23 21:31:32 +01003815 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01003816 if (!strcmp(name, bs->device_name)) {
bellardb3380822004-03-14 21:38:54 +00003817 return bs;
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01003818 }
bellardb3380822004-03-14 21:38:54 +00003819 }
3820 return NULL;
3821}
3822
Benoît Canetdc364f42014-01-23 21:31:32 +01003823/* This function is to find a node in the bs graph */
3824BlockDriverState *bdrv_find_node(const char *node_name)
3825{
3826 BlockDriverState *bs;
3827
3828 assert(node_name);
3829
3830 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
3831 if (!strcmp(node_name, bs->node_name)) {
3832 return bs;
3833 }
3834 }
3835 return NULL;
3836}
3837
Benoît Canetc13163f2014-01-23 21:31:34 +01003838/* Put this QMP function here so it can access the static graph_bdrv_states. */
3839BlockDeviceInfoList *bdrv_named_nodes_list(void)
3840{
3841 BlockDeviceInfoList *list, *entry;
3842 BlockDriverState *bs;
3843
3844 list = NULL;
3845 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
3846 entry = g_malloc0(sizeof(*entry));
3847 entry->value = bdrv_block_device_info(bs);
3848 entry->next = list;
3849 list = entry;
3850 }
3851
3852 return list;
3853}
3854
Benoît Canet12d3ba82014-01-23 21:31:35 +01003855BlockDriverState *bdrv_lookup_bs(const char *device,
3856 const char *node_name,
3857 Error **errp)
3858{
3859 BlockDriverState *bs = NULL;
3860
Benoît Canet12d3ba82014-01-23 21:31:35 +01003861 if (device) {
3862 bs = bdrv_find(device);
3863
Benoît Canetdd67fa52014-02-12 17:15:06 +01003864 if (bs) {
3865 return bs;
Benoît Canet12d3ba82014-01-23 21:31:35 +01003866 }
Benoît Canet12d3ba82014-01-23 21:31:35 +01003867 }
3868
Benoît Canetdd67fa52014-02-12 17:15:06 +01003869 if (node_name) {
3870 bs = bdrv_find_node(node_name);
Benoît Canet12d3ba82014-01-23 21:31:35 +01003871
Benoît Canetdd67fa52014-02-12 17:15:06 +01003872 if (bs) {
3873 return bs;
3874 }
Benoît Canet12d3ba82014-01-23 21:31:35 +01003875 }
3876
Benoît Canetdd67fa52014-02-12 17:15:06 +01003877 error_setg(errp, "Cannot find device=%s nor node_name=%s",
3878 device ? device : "",
3879 node_name ? node_name : "");
3880 return NULL;
Benoît Canet12d3ba82014-01-23 21:31:35 +01003881}
3882
Jeff Cody5a6684d2014-06-25 15:40:09 -04003883/* If 'base' is in the same chain as 'top', return true. Otherwise,
3884 * return false. If either argument is NULL, return false. */
3885bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
3886{
3887 while (top && top != base) {
3888 top = top->backing_hd;
3889 }
3890
3891 return top != NULL;
3892}
3893
Markus Armbruster2f399b02010-06-02 18:55:20 +02003894BlockDriverState *bdrv_next(BlockDriverState *bs)
3895{
3896 if (!bs) {
3897 return QTAILQ_FIRST(&bdrv_states);
3898 }
Benoît Canetdc364f42014-01-23 21:31:32 +01003899 return QTAILQ_NEXT(bs, device_list);
Markus Armbruster2f399b02010-06-02 18:55:20 +02003900}
3901
aliguori51de9762009-03-05 23:00:43 +00003902void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
bellard81d09122004-07-14 17:21:37 +00003903{
3904 BlockDriverState *bs;
3905
Benoît Canetdc364f42014-01-23 21:31:32 +01003906 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
aliguori51de9762009-03-05 23:00:43 +00003907 it(opaque, bs);
bellard81d09122004-07-14 17:21:37 +00003908 }
3909}
3910
bellardea2384d2004-08-01 21:59:26 +00003911const char *bdrv_get_device_name(BlockDriverState *bs)
3912{
3913 return bs->device_name;
3914}
3915
Markus Armbrusterc8433282012-06-05 16:49:24 +02003916int bdrv_get_flags(BlockDriverState *bs)
3917{
3918 return bs->open_flags;
3919}
3920
Kevin Wolff0f0fdf2013-07-05 13:48:01 +02003921int bdrv_flush_all(void)
aliguoric6ca28d2008-10-06 13:55:43 +00003922{
3923 BlockDriverState *bs;
Kevin Wolff0f0fdf2013-07-05 13:48:01 +02003924 int result = 0;
aliguoric6ca28d2008-10-06 13:55:43 +00003925
Benoît Canetdc364f42014-01-23 21:31:32 +01003926 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02003927 AioContext *aio_context = bdrv_get_aio_context(bs);
3928 int ret;
3929
3930 aio_context_acquire(aio_context);
3931 ret = bdrv_flush(bs);
Kevin Wolff0f0fdf2013-07-05 13:48:01 +02003932 if (ret < 0 && !result) {
3933 result = ret;
3934 }
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02003935 aio_context_release(aio_context);
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01003936 }
Kevin Wolff0f0fdf2013-07-05 13:48:01 +02003937
3938 return result;
aliguoric6ca28d2008-10-06 13:55:43 +00003939}
3940
Peter Lieven3ac21622013-06-28 12:47:42 +02003941int bdrv_has_zero_init_1(BlockDriverState *bs)
3942{
3943 return 1;
3944}
3945
Kevin Wolff2feebb2010-04-14 17:30:35 +02003946int bdrv_has_zero_init(BlockDriverState *bs)
3947{
3948 assert(bs->drv);
3949
Paolo Bonzini11212d82013-09-04 19:00:27 +02003950 /* If BS is a copy on write image, it is initialized to
3951 the contents of the base image, which may not be zeroes. */
3952 if (bs->backing_hd) {
3953 return 0;
3954 }
Kevin Wolf336c1c12010-07-28 11:26:29 +02003955 if (bs->drv->bdrv_has_zero_init) {
3956 return bs->drv->bdrv_has_zero_init(bs);
Kevin Wolff2feebb2010-04-14 17:30:35 +02003957 }
3958
Peter Lieven3ac21622013-06-28 12:47:42 +02003959 /* safe default */
3960 return 0;
Kevin Wolff2feebb2010-04-14 17:30:35 +02003961}
3962
Peter Lieven4ce78692013-10-24 12:06:54 +02003963bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs)
3964{
3965 BlockDriverInfo bdi;
3966
3967 if (bs->backing_hd) {
3968 return false;
3969 }
3970
3971 if (bdrv_get_info(bs, &bdi) == 0) {
3972 return bdi.unallocated_blocks_are_zero;
3973 }
3974
3975 return false;
3976}
3977
3978bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs)
3979{
3980 BlockDriverInfo bdi;
3981
3982 if (bs->backing_hd || !(bs->open_flags & BDRV_O_UNMAP)) {
3983 return false;
3984 }
3985
3986 if (bdrv_get_info(bs, &bdi) == 0) {
3987 return bdi.can_write_zeroes_with_unmap;
3988 }
3989
3990 return false;
3991}
3992
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02003993typedef struct BdrvCoGetBlockStatusData {
Stefan Hajnoczi376ae3f2011-11-14 12:44:19 +00003994 BlockDriverState *bs;
Miroslav Rezaninab35b2bb2013-02-13 09:09:39 +01003995 BlockDriverState *base;
Stefan Hajnoczi376ae3f2011-11-14 12:44:19 +00003996 int64_t sector_num;
3997 int nb_sectors;
3998 int *pnum;
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02003999 int64_t ret;
Stefan Hajnoczi376ae3f2011-11-14 12:44:19 +00004000 bool done;
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004001} BdrvCoGetBlockStatusData;
Stefan Hajnoczi376ae3f2011-11-14 12:44:19 +00004002
thsf58c7b32008-06-05 21:53:49 +00004003/*
4004 * Returns true iff the specified sector is present in the disk image. Drivers
4005 * not implementing the functionality are assumed to not support backing files,
4006 * hence all their sectors are reported as allocated.
4007 *
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00004008 * If 'sector_num' is beyond the end of the disk image the return value is 0
4009 * and 'pnum' is set to 0.
4010 *
thsf58c7b32008-06-05 21:53:49 +00004011 * 'pnum' is set to the number of sectors (including and immediately following
4012 * the specified sector) that are known to be in the same
4013 * allocated/unallocated state.
4014 *
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00004015 * 'nb_sectors' is the max value 'pnum' should be set to. If nb_sectors goes
4016 * beyond the end of the disk image it will be clamped.
thsf58c7b32008-06-05 21:53:49 +00004017 */
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004018static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
4019 int64_t sector_num,
4020 int nb_sectors, int *pnum)
thsf58c7b32008-06-05 21:53:49 +00004021{
Markus Armbruster30a7f2f2014-06-26 13:23:20 +02004022 int64_t total_sectors;
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00004023 int64_t n;
Paolo Bonzini5daa74a2013-09-04 19:00:38 +02004024 int64_t ret, ret2;
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00004025
Markus Armbruster30a7f2f2014-06-26 13:23:20 +02004026 total_sectors = bdrv_nb_sectors(bs);
4027 if (total_sectors < 0) {
4028 return total_sectors;
Paolo Bonzini617ccb42013-09-04 19:00:23 +02004029 }
4030
Markus Armbruster30a7f2f2014-06-26 13:23:20 +02004031 if (sector_num >= total_sectors) {
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00004032 *pnum = 0;
4033 return 0;
4034 }
4035
Markus Armbruster30a7f2f2014-06-26 13:23:20 +02004036 n = total_sectors - sector_num;
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00004037 if (n < nb_sectors) {
4038 nb_sectors = n;
4039 }
4040
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004041 if (!bs->drv->bdrv_co_get_block_status) {
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00004042 *pnum = nb_sectors;
Kevin Wolfe88ae222014-05-06 15:25:36 +02004043 ret = BDRV_BLOCK_DATA | BDRV_BLOCK_ALLOCATED;
Paolo Bonzini918e92d2013-09-04 19:00:37 +02004044 if (bs->drv->protocol_name) {
4045 ret |= BDRV_BLOCK_OFFSET_VALID | (sector_num * BDRV_SECTOR_SIZE);
4046 }
4047 return ret;
thsf58c7b32008-06-05 21:53:49 +00004048 }
Stefan Hajnoczi6aebab12011-11-14 12:44:25 +00004049
Paolo Bonzini415b5b02013-09-04 19:00:31 +02004050 ret = bs->drv->bdrv_co_get_block_status(bs, sector_num, nb_sectors, pnum);
4051 if (ret < 0) {
Peter Lieven3e0a2332013-09-24 15:35:08 +02004052 *pnum = 0;
Paolo Bonzini415b5b02013-09-04 19:00:31 +02004053 return ret;
4054 }
4055
Peter Lieven92bc50a2013-10-08 14:43:14 +02004056 if (ret & BDRV_BLOCK_RAW) {
4057 assert(ret & BDRV_BLOCK_OFFSET_VALID);
4058 return bdrv_get_block_status(bs->file, ret >> BDRV_SECTOR_BITS,
4059 *pnum, pnum);
4060 }
4061
Kevin Wolfe88ae222014-05-06 15:25:36 +02004062 if (ret & (BDRV_BLOCK_DATA | BDRV_BLOCK_ZERO)) {
4063 ret |= BDRV_BLOCK_ALLOCATED;
4064 }
4065
Peter Lievenc3d86882013-10-24 12:07:04 +02004066 if (!(ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO)) {
4067 if (bdrv_unallocated_blocks_are_zero(bs)) {
Paolo Bonzinif0ad5712013-09-04 19:00:32 +02004068 ret |= BDRV_BLOCK_ZERO;
Peter Lieven1f9db222013-09-24 15:35:09 +02004069 } else if (bs->backing_hd) {
Paolo Bonzinif0ad5712013-09-04 19:00:32 +02004070 BlockDriverState *bs2 = bs->backing_hd;
Markus Armbruster30a7f2f2014-06-26 13:23:20 +02004071 int64_t nb_sectors2 = bdrv_nb_sectors(bs2);
4072 if (nb_sectors2 >= 0 && sector_num >= nb_sectors2) {
Paolo Bonzinif0ad5712013-09-04 19:00:32 +02004073 ret |= BDRV_BLOCK_ZERO;
4074 }
4075 }
Paolo Bonzini415b5b02013-09-04 19:00:31 +02004076 }
Paolo Bonzini5daa74a2013-09-04 19:00:38 +02004077
4078 if (bs->file &&
4079 (ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO) &&
4080 (ret & BDRV_BLOCK_OFFSET_VALID)) {
4081 ret2 = bdrv_co_get_block_status(bs->file, ret >> BDRV_SECTOR_BITS,
4082 *pnum, pnum);
4083 if (ret2 >= 0) {
4084 /* Ignore errors. This is just providing extra information, it
4085 * is useful but not necessary.
4086 */
4087 ret |= (ret2 & BDRV_BLOCK_ZERO);
4088 }
4089 }
4090
Paolo Bonzini415b5b02013-09-04 19:00:31 +02004091 return ret;
Stefan Hajnoczi060f51c2011-11-14 12:44:26 +00004092}
4093
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004094/* Coroutine wrapper for bdrv_get_block_status() */
4095static void coroutine_fn bdrv_get_block_status_co_entry(void *opaque)
Stefan Hajnoczi060f51c2011-11-14 12:44:26 +00004096{
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004097 BdrvCoGetBlockStatusData *data = opaque;
Stefan Hajnoczi060f51c2011-11-14 12:44:26 +00004098 BlockDriverState *bs = data->bs;
4099
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004100 data->ret = bdrv_co_get_block_status(bs, data->sector_num, data->nb_sectors,
4101 data->pnum);
Stefan Hajnoczi060f51c2011-11-14 12:44:26 +00004102 data->done = true;
4103}
4104
4105/*
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004106 * Synchronous wrapper around bdrv_co_get_block_status().
Stefan Hajnoczi060f51c2011-11-14 12:44:26 +00004107 *
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004108 * See bdrv_co_get_block_status() for details.
Stefan Hajnoczi060f51c2011-11-14 12:44:26 +00004109 */
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004110int64_t bdrv_get_block_status(BlockDriverState *bs, int64_t sector_num,
4111 int nb_sectors, int *pnum)
Stefan Hajnoczi060f51c2011-11-14 12:44:26 +00004112{
Stefan Hajnoczi6aebab12011-11-14 12:44:25 +00004113 Coroutine *co;
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004114 BdrvCoGetBlockStatusData data = {
Stefan Hajnoczi6aebab12011-11-14 12:44:25 +00004115 .bs = bs,
4116 .sector_num = sector_num,
4117 .nb_sectors = nb_sectors,
4118 .pnum = pnum,
4119 .done = false,
4120 };
4121
Paolo Bonzinibdad13b2013-09-04 19:00:22 +02004122 if (qemu_in_coroutine()) {
4123 /* Fast-path if already in coroutine context */
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004124 bdrv_get_block_status_co_entry(&data);
Paolo Bonzinibdad13b2013-09-04 19:00:22 +02004125 } else {
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02004126 AioContext *aio_context = bdrv_get_aio_context(bs);
4127
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004128 co = qemu_coroutine_create(bdrv_get_block_status_co_entry);
Paolo Bonzinibdad13b2013-09-04 19:00:22 +02004129 qemu_coroutine_enter(co, &data);
4130 while (!data.done) {
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02004131 aio_poll(aio_context, true);
Paolo Bonzinibdad13b2013-09-04 19:00:22 +02004132 }
Stefan Hajnoczi6aebab12011-11-14 12:44:25 +00004133 }
4134 return data.ret;
thsf58c7b32008-06-05 21:53:49 +00004135}
4136
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004137int coroutine_fn bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num,
4138 int nb_sectors, int *pnum)
4139{
Paolo Bonzini4333bb72013-09-04 19:00:29 +02004140 int64_t ret = bdrv_get_block_status(bs, sector_num, nb_sectors, pnum);
4141 if (ret < 0) {
4142 return ret;
4143 }
Kevin Wolf01fb2702014-07-07 17:00:37 +02004144 return !!(ret & BDRV_BLOCK_ALLOCATED);
Paolo Bonzinib6b8a332013-09-04 19:00:28 +02004145}
4146
Paolo Bonzini188a7bb2012-05-08 16:52:01 +02004147/*
4148 * Given an image chain: ... -> [BASE] -> [INTER1] -> [INTER2] -> [TOP]
4149 *
4150 * Return true if the given sector is allocated in any image between
4151 * BASE and TOP (inclusive). BASE can be NULL to check if the given
4152 * sector is allocated in any image of the chain. Return false otherwise.
4153 *
4154 * 'pnum' is set to the number of sectors (including and immediately following
4155 * the specified sector) that are known to be in the same
4156 * allocated/unallocated state.
4157 *
4158 */
Paolo Bonzini4f578632013-09-04 19:00:24 +02004159int bdrv_is_allocated_above(BlockDriverState *top,
4160 BlockDriverState *base,
4161 int64_t sector_num,
4162 int nb_sectors, int *pnum)
Paolo Bonzini188a7bb2012-05-08 16:52:01 +02004163{
4164 BlockDriverState *intermediate;
4165 int ret, n = nb_sectors;
4166
4167 intermediate = top;
4168 while (intermediate && intermediate != base) {
4169 int pnum_inter;
Paolo Bonzinibdad13b2013-09-04 19:00:22 +02004170 ret = bdrv_is_allocated(intermediate, sector_num, nb_sectors,
4171 &pnum_inter);
Paolo Bonzini188a7bb2012-05-08 16:52:01 +02004172 if (ret < 0) {
4173 return ret;
4174 } else if (ret) {
4175 *pnum = pnum_inter;
4176 return 1;
4177 }
4178
4179 /*
4180 * [sector_num, nb_sectors] is unallocated on top but intermediate
4181 * might have
4182 *
4183 * [sector_num+x, nr_sectors] allocated.
4184 */
Vishvananda Ishaya63ba17d2013-01-24 10:02:08 -08004185 if (n > pnum_inter &&
4186 (intermediate == top ||
4187 sector_num + pnum_inter < intermediate->total_sectors)) {
Paolo Bonzini188a7bb2012-05-08 16:52:01 +02004188 n = pnum_inter;
4189 }
4190
4191 intermediate = intermediate->backing_hd;
4192 }
4193
4194 *pnum = n;
4195 return 0;
4196}
4197
aliguori045df332009-03-05 23:00:48 +00004198const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
4199{
4200 if (bs->backing_hd && bs->backing_hd->encrypted)
4201 return bs->backing_file;
4202 else if (bs->encrypted)
4203 return bs->filename;
4204 else
4205 return NULL;
4206}
4207
ths5fafdf22007-09-16 21:08:06 +00004208void bdrv_get_backing_filename(BlockDriverState *bs,
bellard83f64092006-08-01 16:21:11 +00004209 char *filename, int filename_size)
bellardea2384d2004-08-01 21:59:26 +00004210{
Kevin Wolf3574c602011-10-26 11:02:11 +02004211 pstrcpy(filename, filename_size, bs->backing_file);
bellardea2384d2004-08-01 21:59:26 +00004212}
4213
ths5fafdf22007-09-16 21:08:06 +00004214int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
bellardfaea38e2006-08-05 21:31:00 +00004215 const uint8_t *buf, int nb_sectors)
4216{
4217 BlockDriver *drv = bs->drv;
4218 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00004219 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00004220 if (!drv->bdrv_write_compressed)
4221 return -ENOTSUP;
Kevin Wolffbb7b4e2009-05-08 14:47:24 +02004222 if (bdrv_check_request(bs, sector_num, nb_sectors))
4223 return -EIO;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01004224
Fam Zhenge4654d22013-11-13 18:29:43 +08004225 assert(QLIST_EMPTY(&bs->dirty_bitmaps));
Jan Kiszkaa55eb922009-11-30 18:21:19 +01004226
bellardfaea38e2006-08-05 21:31:00 +00004227 return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
4228}
ths3b46e622007-09-17 08:09:54 +00004229
bellardfaea38e2006-08-05 21:31:00 +00004230int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
4231{
4232 BlockDriver *drv = bs->drv;
4233 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00004234 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00004235 if (!drv->bdrv_get_info)
4236 return -ENOTSUP;
4237 memset(bdi, 0, sizeof(*bdi));
4238 return drv->bdrv_get_info(bs, bdi);
4239}
4240
Max Reitzeae041f2013-10-09 10:46:16 +02004241ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs)
4242{
4243 BlockDriver *drv = bs->drv;
4244 if (drv && drv->bdrv_get_specific_info) {
4245 return drv->bdrv_get_specific_info(bs);
4246 }
4247 return NULL;
4248}
4249
Christoph Hellwig45566e92009-07-10 23:11:57 +02004250int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
4251 int64_t pos, int size)
aliguori178e08a2009-04-05 19:10:55 +00004252{
Kevin Wolfcf8074b2013-04-05 21:27:53 +02004253 QEMUIOVector qiov;
4254 struct iovec iov = {
4255 .iov_base = (void *) buf,
4256 .iov_len = size,
4257 };
4258
4259 qemu_iovec_init_external(&qiov, &iov, 1);
4260 return bdrv_writev_vmstate(bs, &qiov, pos);
4261}
4262
4263int bdrv_writev_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos)
4264{
aliguori178e08a2009-04-05 19:10:55 +00004265 BlockDriver *drv = bs->drv;
Kevin Wolfcf8074b2013-04-05 21:27:53 +02004266
4267 if (!drv) {
aliguori178e08a2009-04-05 19:10:55 +00004268 return -ENOMEDIUM;
Kevin Wolfcf8074b2013-04-05 21:27:53 +02004269 } else if (drv->bdrv_save_vmstate) {
4270 return drv->bdrv_save_vmstate(bs, qiov, pos);
4271 } else if (bs->file) {
4272 return bdrv_writev_vmstate(bs->file, qiov, pos);
4273 }
4274
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09004275 return -ENOTSUP;
aliguori178e08a2009-04-05 19:10:55 +00004276}
4277
Christoph Hellwig45566e92009-07-10 23:11:57 +02004278int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
4279 int64_t pos, int size)
aliguori178e08a2009-04-05 19:10:55 +00004280{
4281 BlockDriver *drv = bs->drv;
4282 if (!drv)
4283 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09004284 if (drv->bdrv_load_vmstate)
4285 return drv->bdrv_load_vmstate(bs, buf, pos, size);
4286 if (bs->file)
4287 return bdrv_load_vmstate(bs->file, buf, pos, size);
4288 return -ENOTSUP;
aliguori178e08a2009-04-05 19:10:55 +00004289}
4290
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01004291void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event)
4292{
Kevin Wolfbf736fe2013-06-05 15:17:55 +02004293 if (!bs || !bs->drv || !bs->drv->bdrv_debug_event) {
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01004294 return;
4295 }
4296
Kevin Wolfbf736fe2013-06-05 15:17:55 +02004297 bs->drv->bdrv_debug_event(bs, event);
Kevin Wolf41c695c2012-12-06 14:32:58 +01004298}
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01004299
Kevin Wolf41c695c2012-12-06 14:32:58 +01004300int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
4301 const char *tag)
4302{
4303 while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) {
4304 bs = bs->file;
4305 }
4306
4307 if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) {
4308 return bs->drv->bdrv_debug_breakpoint(bs, event, tag);
4309 }
4310
4311 return -ENOTSUP;
4312}
4313
Fam Zheng4cc70e92013-11-20 10:01:54 +08004314int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag)
4315{
4316 while (bs && bs->drv && !bs->drv->bdrv_debug_remove_breakpoint) {
4317 bs = bs->file;
4318 }
4319
4320 if (bs && bs->drv && bs->drv->bdrv_debug_remove_breakpoint) {
4321 return bs->drv->bdrv_debug_remove_breakpoint(bs, tag);
4322 }
4323
4324 return -ENOTSUP;
4325}
4326
Kevin Wolf41c695c2012-12-06 14:32:58 +01004327int bdrv_debug_resume(BlockDriverState *bs, const char *tag)
4328{
Max Reitz938789e2014-03-10 23:44:08 +01004329 while (bs && (!bs->drv || !bs->drv->bdrv_debug_resume)) {
Kevin Wolf41c695c2012-12-06 14:32:58 +01004330 bs = bs->file;
4331 }
4332
4333 if (bs && bs->drv && bs->drv->bdrv_debug_resume) {
4334 return bs->drv->bdrv_debug_resume(bs, tag);
4335 }
4336
4337 return -ENOTSUP;
4338}
4339
4340bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag)
4341{
4342 while (bs && bs->drv && !bs->drv->bdrv_debug_is_suspended) {
4343 bs = bs->file;
4344 }
4345
4346 if (bs && bs->drv && bs->drv->bdrv_debug_is_suspended) {
4347 return bs->drv->bdrv_debug_is_suspended(bs, tag);
4348 }
4349
4350 return false;
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01004351}
4352
Blue Swirl199630b2010-07-25 20:49:34 +00004353int bdrv_is_snapshot(BlockDriverState *bs)
4354{
4355 return !!(bs->open_flags & BDRV_O_SNAPSHOT);
4356}
4357
Jeff Codyb1b1d782012-10-16 15:49:09 -04004358/* backing_file can either be relative, or absolute, or a protocol. If it is
4359 * relative, it must be relative to the chain. So, passing in bs->filename
4360 * from a BDS as backing_file should not be done, as that may be relative to
4361 * the CWD rather than the chain. */
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00004362BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
4363 const char *backing_file)
4364{
Jeff Codyb1b1d782012-10-16 15:49:09 -04004365 char *filename_full = NULL;
4366 char *backing_file_full = NULL;
4367 char *filename_tmp = NULL;
4368 int is_protocol = 0;
4369 BlockDriverState *curr_bs = NULL;
4370 BlockDriverState *retval = NULL;
4371
4372 if (!bs || !bs->drv || !backing_file) {
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00004373 return NULL;
4374 }
4375
Jeff Codyb1b1d782012-10-16 15:49:09 -04004376 filename_full = g_malloc(PATH_MAX);
4377 backing_file_full = g_malloc(PATH_MAX);
4378 filename_tmp = g_malloc(PATH_MAX);
4379
4380 is_protocol = path_has_protocol(backing_file);
4381
4382 for (curr_bs = bs; curr_bs->backing_hd; curr_bs = curr_bs->backing_hd) {
4383
4384 /* If either of the filename paths is actually a protocol, then
4385 * compare unmodified paths; otherwise make paths relative */
4386 if (is_protocol || path_has_protocol(curr_bs->backing_file)) {
4387 if (strcmp(backing_file, curr_bs->backing_file) == 0) {
4388 retval = curr_bs->backing_hd;
4389 break;
4390 }
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00004391 } else {
Jeff Codyb1b1d782012-10-16 15:49:09 -04004392 /* If not an absolute filename path, make it relative to the current
4393 * image's filename path */
4394 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
4395 backing_file);
4396
4397 /* We are going to compare absolute pathnames */
4398 if (!realpath(filename_tmp, filename_full)) {
4399 continue;
4400 }
4401
4402 /* We need to make sure the backing filename we are comparing against
4403 * is relative to the current image filename (or absolute) */
4404 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
4405 curr_bs->backing_file);
4406
4407 if (!realpath(filename_tmp, backing_file_full)) {
4408 continue;
4409 }
4410
4411 if (strcmp(backing_file_full, filename_full) == 0) {
4412 retval = curr_bs->backing_hd;
4413 break;
4414 }
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00004415 }
4416 }
4417
Jeff Codyb1b1d782012-10-16 15:49:09 -04004418 g_free(filename_full);
4419 g_free(backing_file_full);
4420 g_free(filename_tmp);
4421 return retval;
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00004422}
4423
Benoît Canetf198fd12012-08-02 10:22:47 +02004424int bdrv_get_backing_file_depth(BlockDriverState *bs)
4425{
4426 if (!bs->drv) {
4427 return 0;
4428 }
4429
4430 if (!bs->backing_hd) {
4431 return 0;
4432 }
4433
4434 return 1 + bdrv_get_backing_file_depth(bs->backing_hd);
4435}
4436
bellard83f64092006-08-01 16:21:11 +00004437/**************************************************************/
4438/* async I/Os */
4439
aliguori3b69e4b2009-01-22 16:59:24 +00004440BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
aliguorif141eaf2009-04-07 18:43:24 +00004441 QEMUIOVector *qiov, int nb_sectors,
aliguori3b69e4b2009-01-22 16:59:24 +00004442 BlockDriverCompletionFunc *cb, void *opaque)
4443{
Stefan Hajnoczibbf0a442010-10-05 14:28:53 +01004444 trace_bdrv_aio_readv(bs, sector_num, nb_sectors, opaque);
4445
Paolo Bonzinid20d9b72013-11-22 13:39:44 +01004446 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors, 0,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01004447 cb, opaque, false);
bellard83f64092006-08-01 16:21:11 +00004448}
4449
aliguorif141eaf2009-04-07 18:43:24 +00004450BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
4451 QEMUIOVector *qiov, int nb_sectors,
4452 BlockDriverCompletionFunc *cb, void *opaque)
bellard83f64092006-08-01 16:21:11 +00004453{
Stefan Hajnoczibbf0a442010-10-05 14:28:53 +01004454 trace_bdrv_aio_writev(bs, sector_num, nb_sectors, opaque);
4455
Paolo Bonzinid20d9b72013-11-22 13:39:44 +01004456 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors, 0,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01004457 cb, opaque, true);
bellard83f64092006-08-01 16:21:11 +00004458}
4459
Paolo Bonzinid5ef94d2013-11-22 13:39:46 +01004460BlockDriverAIOCB *bdrv_aio_write_zeroes(BlockDriverState *bs,
4461 int64_t sector_num, int nb_sectors, BdrvRequestFlags flags,
4462 BlockDriverCompletionFunc *cb, void *opaque)
4463{
4464 trace_bdrv_aio_write_zeroes(bs, sector_num, nb_sectors, flags, opaque);
4465
4466 return bdrv_co_aio_rw_vector(bs, sector_num, NULL, nb_sectors,
4467 BDRV_REQ_ZERO_WRITE | flags,
4468 cb, opaque, true);
4469}
4470
Kevin Wolf40b4f532009-09-09 17:53:37 +02004471
4472typedef struct MultiwriteCB {
4473 int error;
4474 int num_requests;
4475 int num_callbacks;
4476 struct {
4477 BlockDriverCompletionFunc *cb;
4478 void *opaque;
4479 QEMUIOVector *free_qiov;
Kevin Wolf40b4f532009-09-09 17:53:37 +02004480 } callbacks[];
4481} MultiwriteCB;
4482
4483static void multiwrite_user_cb(MultiwriteCB *mcb)
4484{
4485 int i;
4486
4487 for (i = 0; i < mcb->num_callbacks; i++) {
4488 mcb->callbacks[i].cb(mcb->callbacks[i].opaque, mcb->error);
Stefan Hajnoczi1e1ea482010-04-21 20:35:45 +01004489 if (mcb->callbacks[i].free_qiov) {
4490 qemu_iovec_destroy(mcb->callbacks[i].free_qiov);
4491 }
Anthony Liguori7267c092011-08-20 22:09:37 -05004492 g_free(mcb->callbacks[i].free_qiov);
Kevin Wolf40b4f532009-09-09 17:53:37 +02004493 }
4494}
4495
4496static void multiwrite_cb(void *opaque, int ret)
4497{
4498 MultiwriteCB *mcb = opaque;
4499
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01004500 trace_multiwrite_cb(mcb, ret);
4501
Kevin Wolfcb6d3ca2010-04-01 22:48:44 +02004502 if (ret < 0 && !mcb->error) {
Kevin Wolf40b4f532009-09-09 17:53:37 +02004503 mcb->error = ret;
Kevin Wolf40b4f532009-09-09 17:53:37 +02004504 }
4505
4506 mcb->num_requests--;
4507 if (mcb->num_requests == 0) {
Kevin Wolfde189a12010-07-01 16:08:51 +02004508 multiwrite_user_cb(mcb);
Anthony Liguori7267c092011-08-20 22:09:37 -05004509 g_free(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02004510 }
4511}
4512
4513static int multiwrite_req_compare(const void *a, const void *b)
4514{
Christoph Hellwig77be4362010-05-19 20:53:10 +02004515 const BlockRequest *req1 = a, *req2 = b;
4516
4517 /*
4518 * Note that we can't simply subtract req2->sector from req1->sector
4519 * here as that could overflow the return value.
4520 */
4521 if (req1->sector > req2->sector) {
4522 return 1;
4523 } else if (req1->sector < req2->sector) {
4524 return -1;
4525 } else {
4526 return 0;
4527 }
Kevin Wolf40b4f532009-09-09 17:53:37 +02004528}
4529
4530/*
4531 * Takes a bunch of requests and tries to merge them. Returns the number of
4532 * requests that remain after merging.
4533 */
4534static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs,
4535 int num_reqs, MultiwriteCB *mcb)
4536{
4537 int i, outidx;
4538
4539 // Sort requests by start sector
4540 qsort(reqs, num_reqs, sizeof(*reqs), &multiwrite_req_compare);
4541
4542 // Check if adjacent requests touch the same clusters. If so, combine them,
4543 // filling up gaps with zero sectors.
4544 outidx = 0;
4545 for (i = 1; i < num_reqs; i++) {
4546 int merge = 0;
4547 int64_t oldreq_last = reqs[outidx].sector + reqs[outidx].nb_sectors;
4548
Paolo Bonzinib6a127a2012-02-21 16:43:52 +01004549 // Handle exactly sequential writes and overlapping writes.
Kevin Wolf40b4f532009-09-09 17:53:37 +02004550 if (reqs[i].sector <= oldreq_last) {
4551 merge = 1;
4552 }
4553
Christoph Hellwige2a305f2010-01-26 14:49:08 +01004554 if (reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1 > IOV_MAX) {
4555 merge = 0;
4556 }
4557
Kevin Wolf40b4f532009-09-09 17:53:37 +02004558 if (merge) {
4559 size_t size;
Anthony Liguori7267c092011-08-20 22:09:37 -05004560 QEMUIOVector *qiov = g_malloc0(sizeof(*qiov));
Kevin Wolf40b4f532009-09-09 17:53:37 +02004561 qemu_iovec_init(qiov,
4562 reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1);
4563
4564 // Add the first request to the merged one. If the requests are
4565 // overlapping, drop the last sectors of the first request.
4566 size = (reqs[i].sector - reqs[outidx].sector) << 9;
Michael Tokarev1b093c42012-03-12 21:28:06 +04004567 qemu_iovec_concat(qiov, reqs[outidx].qiov, 0, size);
Kevin Wolf40b4f532009-09-09 17:53:37 +02004568
Paolo Bonzinib6a127a2012-02-21 16:43:52 +01004569 // We should need to add any zeros between the two requests
4570 assert (reqs[i].sector <= oldreq_last);
Kevin Wolf40b4f532009-09-09 17:53:37 +02004571
4572 // Add the second request
Michael Tokarev1b093c42012-03-12 21:28:06 +04004573 qemu_iovec_concat(qiov, reqs[i].qiov, 0, reqs[i].qiov->size);
Kevin Wolf40b4f532009-09-09 17:53:37 +02004574
Stefan Hajnoczi391827e2014-07-30 09:53:30 +01004575 // Add tail of first request, if necessary
4576 if (qiov->size < reqs[outidx].qiov->size) {
4577 qemu_iovec_concat(qiov, reqs[outidx].qiov, qiov->size,
4578 reqs[outidx].qiov->size - qiov->size);
4579 }
4580
Kevin Wolfcbf1dff2010-05-21 11:09:42 +02004581 reqs[outidx].nb_sectors = qiov->size >> 9;
Kevin Wolf40b4f532009-09-09 17:53:37 +02004582 reqs[outidx].qiov = qiov;
4583
4584 mcb->callbacks[i].free_qiov = reqs[outidx].qiov;
4585 } else {
4586 outidx++;
4587 reqs[outidx].sector = reqs[i].sector;
4588 reqs[outidx].nb_sectors = reqs[i].nb_sectors;
4589 reqs[outidx].qiov = reqs[i].qiov;
4590 }
4591 }
4592
4593 return outidx + 1;
4594}
4595
4596/*
4597 * Submit multiple AIO write requests at once.
4598 *
4599 * On success, the function returns 0 and all requests in the reqs array have
4600 * been submitted. In error case this function returns -1, and any of the
4601 * requests may or may not be submitted yet. In particular, this means that the
4602 * callback will be called for some of the requests, for others it won't. The
4603 * caller must check the error field of the BlockRequest to wait for the right
4604 * callbacks (if error != 0, no callback will be called).
4605 *
4606 * The implementation may modify the contents of the reqs array, e.g. to merge
4607 * requests. However, the fields opaque and error are left unmodified as they
4608 * are used to signal failure for a single request to the caller.
4609 */
4610int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs)
4611{
Kevin Wolf40b4f532009-09-09 17:53:37 +02004612 MultiwriteCB *mcb;
4613 int i;
4614
Ryan Harper301db7c2011-03-07 10:01:04 -06004615 /* don't submit writes if we don't have a medium */
4616 if (bs->drv == NULL) {
4617 for (i = 0; i < num_reqs; i++) {
4618 reqs[i].error = -ENOMEDIUM;
4619 }
4620 return -1;
4621 }
4622
Kevin Wolf40b4f532009-09-09 17:53:37 +02004623 if (num_reqs == 0) {
4624 return 0;
4625 }
4626
4627 // Create MultiwriteCB structure
Anthony Liguori7267c092011-08-20 22:09:37 -05004628 mcb = g_malloc0(sizeof(*mcb) + num_reqs * sizeof(*mcb->callbacks));
Kevin Wolf40b4f532009-09-09 17:53:37 +02004629 mcb->num_requests = 0;
4630 mcb->num_callbacks = num_reqs;
4631
4632 for (i = 0; i < num_reqs; i++) {
4633 mcb->callbacks[i].cb = reqs[i].cb;
4634 mcb->callbacks[i].opaque = reqs[i].opaque;
4635 }
4636
4637 // Check for mergable requests
4638 num_reqs = multiwrite_merge(bs, reqs, num_reqs, mcb);
4639
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01004640 trace_bdrv_aio_multiwrite(mcb, mcb->num_callbacks, num_reqs);
4641
Paolo Bonzinidf9309f2011-11-14 17:50:50 +01004642 /* Run the aio requests. */
4643 mcb->num_requests = num_reqs;
Kevin Wolf40b4f532009-09-09 17:53:37 +02004644 for (i = 0; i < num_reqs; i++) {
Paolo Bonzinid20d9b72013-11-22 13:39:44 +01004645 bdrv_co_aio_rw_vector(bs, reqs[i].sector, reqs[i].qiov,
4646 reqs[i].nb_sectors, reqs[i].flags,
4647 multiwrite_cb, mcb,
4648 true);
Kevin Wolf40b4f532009-09-09 17:53:37 +02004649 }
4650
4651 return 0;
Kevin Wolf40b4f532009-09-09 17:53:37 +02004652}
4653
bellard83f64092006-08-01 16:21:11 +00004654void bdrv_aio_cancel(BlockDriverAIOCB *acb)
pbrookce1a14d2006-08-07 02:38:06 +00004655{
Fam Zhengca5fd112014-09-11 13:41:27 +08004656 qemu_aio_ref(acb);
4657 bdrv_aio_cancel_async(acb);
4658 while (acb->refcnt > 1) {
4659 if (acb->aiocb_info->get_aio_context) {
4660 aio_poll(acb->aiocb_info->get_aio_context(acb), true);
4661 } else if (acb->bs) {
4662 aio_poll(bdrv_get_aio_context(acb->bs), true);
4663 } else {
4664 abort();
Fam Zheng02c50ef2014-09-11 13:41:09 +08004665 }
Fam Zheng02c50ef2014-09-11 13:41:09 +08004666 }
Fam Zheng80074292014-09-11 13:41:28 +08004667 qemu_aio_unref(acb);
Fam Zheng02c50ef2014-09-11 13:41:09 +08004668}
4669
4670/* Async version of aio cancel. The caller is not blocked if the acb implements
4671 * cancel_async, otherwise we do nothing and let the request normally complete.
4672 * In either case the completion callback must be called. */
4673void bdrv_aio_cancel_async(BlockDriverAIOCB *acb)
4674{
4675 if (acb->aiocb_info->cancel_async) {
4676 acb->aiocb_info->cancel_async(acb);
4677 }
bellard83f64092006-08-01 16:21:11 +00004678}
4679
4680/**************************************************************/
4681/* async block device emulation */
4682
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02004683typedef struct BlockDriverAIOCBSync {
4684 BlockDriverAIOCB common;
4685 QEMUBH *bh;
4686 int ret;
4687 /* vector translation state */
4688 QEMUIOVector *qiov;
4689 uint8_t *bounce;
4690 int is_write;
4691} BlockDriverAIOCBSync;
4692
Stefan Hajnoczid7331be2012-10-31 16:34:37 +01004693static const AIOCBInfo bdrv_em_aiocb_info = {
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02004694 .aiocb_size = sizeof(BlockDriverAIOCBSync),
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02004695};
4696
bellard83f64092006-08-01 16:21:11 +00004697static void bdrv_aio_bh_cb(void *opaque)
bellardbeac80c2006-06-26 20:08:57 +00004698{
pbrookce1a14d2006-08-07 02:38:06 +00004699 BlockDriverAIOCBSync *acb = opaque;
aliguorif141eaf2009-04-07 18:43:24 +00004700
Kevin Wolf857d4f42014-05-20 13:16:51 +02004701 if (!acb->is_write && acb->ret >= 0) {
Michael Tokarev03396142012-06-07 20:17:55 +04004702 qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
Kevin Wolf857d4f42014-05-20 13:16:51 +02004703 }
aliguoriceb42de2009-04-07 18:43:28 +00004704 qemu_vfree(acb->bounce);
pbrookce1a14d2006-08-07 02:38:06 +00004705 acb->common.cb(acb->common.opaque, acb->ret);
Dor Laor6a7ad292009-06-01 12:07:23 +03004706 qemu_bh_delete(acb->bh);
Avi Kivity36afc452009-06-23 16:20:36 +03004707 acb->bh = NULL;
Fam Zheng80074292014-09-11 13:41:28 +08004708 qemu_aio_unref(acb);
bellardbeac80c2006-06-26 20:08:57 +00004709}
bellardbeac80c2006-06-26 20:08:57 +00004710
aliguorif141eaf2009-04-07 18:43:24 +00004711static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
4712 int64_t sector_num,
4713 QEMUIOVector *qiov,
4714 int nb_sectors,
4715 BlockDriverCompletionFunc *cb,
4716 void *opaque,
4717 int is_write)
4718
bellardea2384d2004-08-01 21:59:26 +00004719{
pbrookce1a14d2006-08-07 02:38:06 +00004720 BlockDriverAIOCBSync *acb;
pbrookce1a14d2006-08-07 02:38:06 +00004721
Stefan Hajnoczid7331be2012-10-31 16:34:37 +01004722 acb = qemu_aio_get(&bdrv_em_aiocb_info, bs, cb, opaque);
aliguorif141eaf2009-04-07 18:43:24 +00004723 acb->is_write = is_write;
4724 acb->qiov = qiov;
Kevin Wolf857d4f42014-05-20 13:16:51 +02004725 acb->bounce = qemu_try_blockalign(bs, qiov->size);
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02004726 acb->bh = aio_bh_new(bdrv_get_aio_context(bs), bdrv_aio_bh_cb, acb);
aliguorif141eaf2009-04-07 18:43:24 +00004727
Kevin Wolf857d4f42014-05-20 13:16:51 +02004728 if (acb->bounce == NULL) {
4729 acb->ret = -ENOMEM;
4730 } else if (is_write) {
Michael Tokarevd5e6b162012-06-07 20:21:06 +04004731 qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01004732 acb->ret = bs->drv->bdrv_write(bs, sector_num, acb->bounce, nb_sectors);
aliguorif141eaf2009-04-07 18:43:24 +00004733 } else {
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01004734 acb->ret = bs->drv->bdrv_read(bs, sector_num, acb->bounce, nb_sectors);
aliguorif141eaf2009-04-07 18:43:24 +00004735 }
4736
pbrookce1a14d2006-08-07 02:38:06 +00004737 qemu_bh_schedule(acb->bh);
aliguorif141eaf2009-04-07 18:43:24 +00004738
pbrookce1a14d2006-08-07 02:38:06 +00004739 return &acb->common;
pbrook7a6cba62006-06-04 11:39:07 +00004740}
4741
aliguorif141eaf2009-04-07 18:43:24 +00004742static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
4743 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
pbrookce1a14d2006-08-07 02:38:06 +00004744 BlockDriverCompletionFunc *cb, void *opaque)
bellard83f64092006-08-01 16:21:11 +00004745{
aliguorif141eaf2009-04-07 18:43:24 +00004746 return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
bellard83f64092006-08-01 16:21:11 +00004747}
4748
aliguorif141eaf2009-04-07 18:43:24 +00004749static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
4750 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
4751 BlockDriverCompletionFunc *cb, void *opaque)
4752{
4753 return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
4754}
4755
Kevin Wolf68485422011-06-30 10:05:46 +02004756
4757typedef struct BlockDriverAIOCBCoroutine {
4758 BlockDriverAIOCB common;
4759 BlockRequest req;
4760 bool is_write;
Kevin Wolfd318aea2012-11-13 16:35:08 +01004761 bool *done;
Kevin Wolf68485422011-06-30 10:05:46 +02004762 QEMUBH* bh;
4763} BlockDriverAIOCBCoroutine;
4764
Stefan Hajnoczid7331be2012-10-31 16:34:37 +01004765static const AIOCBInfo bdrv_em_co_aiocb_info = {
Kevin Wolf68485422011-06-30 10:05:46 +02004766 .aiocb_size = sizeof(BlockDriverAIOCBCoroutine),
Kevin Wolf68485422011-06-30 10:05:46 +02004767};
4768
Paolo Bonzini35246a62011-10-14 10:41:29 +02004769static void bdrv_co_em_bh(void *opaque)
Kevin Wolf68485422011-06-30 10:05:46 +02004770{
4771 BlockDriverAIOCBCoroutine *acb = opaque;
4772
4773 acb->common.cb(acb->common.opaque, acb->req.error);
Kevin Wolfd318aea2012-11-13 16:35:08 +01004774
Kevin Wolf68485422011-06-30 10:05:46 +02004775 qemu_bh_delete(acb->bh);
Fam Zheng80074292014-09-11 13:41:28 +08004776 qemu_aio_unref(acb);
Kevin Wolf68485422011-06-30 10:05:46 +02004777}
4778
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01004779/* Invoke bdrv_co_do_readv/bdrv_co_do_writev */
4780static void coroutine_fn bdrv_co_do_rw(void *opaque)
4781{
4782 BlockDriverAIOCBCoroutine *acb = opaque;
4783 BlockDriverState *bs = acb->common.bs;
4784
4785 if (!acb->is_write) {
4786 acb->req.error = bdrv_co_do_readv(bs, acb->req.sector,
Paolo Bonzinid20d9b72013-11-22 13:39:44 +01004787 acb->req.nb_sectors, acb->req.qiov, acb->req.flags);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01004788 } else {
4789 acb->req.error = bdrv_co_do_writev(bs, acb->req.sector,
Paolo Bonzinid20d9b72013-11-22 13:39:44 +01004790 acb->req.nb_sectors, acb->req.qiov, acb->req.flags);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01004791 }
4792
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02004793 acb->bh = aio_bh_new(bdrv_get_aio_context(bs), bdrv_co_em_bh, acb);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01004794 qemu_bh_schedule(acb->bh);
4795}
4796
Kevin Wolf68485422011-06-30 10:05:46 +02004797static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
4798 int64_t sector_num,
4799 QEMUIOVector *qiov,
4800 int nb_sectors,
Paolo Bonzinid20d9b72013-11-22 13:39:44 +01004801 BdrvRequestFlags flags,
Kevin Wolf68485422011-06-30 10:05:46 +02004802 BlockDriverCompletionFunc *cb,
4803 void *opaque,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01004804 bool is_write)
Kevin Wolf68485422011-06-30 10:05:46 +02004805{
4806 Coroutine *co;
4807 BlockDriverAIOCBCoroutine *acb;
4808
Stefan Hajnoczid7331be2012-10-31 16:34:37 +01004809 acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque);
Kevin Wolf68485422011-06-30 10:05:46 +02004810 acb->req.sector = sector_num;
4811 acb->req.nb_sectors = nb_sectors;
4812 acb->req.qiov = qiov;
Paolo Bonzinid20d9b72013-11-22 13:39:44 +01004813 acb->req.flags = flags;
Kevin Wolf68485422011-06-30 10:05:46 +02004814 acb->is_write = is_write;
4815
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01004816 co = qemu_coroutine_create(bdrv_co_do_rw);
Kevin Wolf68485422011-06-30 10:05:46 +02004817 qemu_coroutine_enter(co, acb);
4818
4819 return &acb->common;
4820}
4821
Paolo Bonzini07f07612011-10-17 12:32:12 +02004822static void coroutine_fn bdrv_aio_flush_co_entry(void *opaque)
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02004823{
Paolo Bonzini07f07612011-10-17 12:32:12 +02004824 BlockDriverAIOCBCoroutine *acb = opaque;
4825 BlockDriverState *bs = acb->common.bs;
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02004826
Paolo Bonzini07f07612011-10-17 12:32:12 +02004827 acb->req.error = bdrv_co_flush(bs);
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02004828 acb->bh = aio_bh_new(bdrv_get_aio_context(bs), bdrv_co_em_bh, acb);
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02004829 qemu_bh_schedule(acb->bh);
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02004830}
4831
Paolo Bonzini07f07612011-10-17 12:32:12 +02004832BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
Alexander Graf016f5cf2010-05-26 17:51:49 +02004833 BlockDriverCompletionFunc *cb, void *opaque)
4834{
Paolo Bonzini07f07612011-10-17 12:32:12 +02004835 trace_bdrv_aio_flush(bs, opaque);
Alexander Graf016f5cf2010-05-26 17:51:49 +02004836
Paolo Bonzini07f07612011-10-17 12:32:12 +02004837 Coroutine *co;
4838 BlockDriverAIOCBCoroutine *acb;
Alexander Graf016f5cf2010-05-26 17:51:49 +02004839
Stefan Hajnoczid7331be2012-10-31 16:34:37 +01004840 acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque);
Kevin Wolfd318aea2012-11-13 16:35:08 +01004841
Paolo Bonzini07f07612011-10-17 12:32:12 +02004842 co = qemu_coroutine_create(bdrv_aio_flush_co_entry);
4843 qemu_coroutine_enter(co, acb);
Alexander Graf016f5cf2010-05-26 17:51:49 +02004844
Alexander Graf016f5cf2010-05-26 17:51:49 +02004845 return &acb->common;
4846}
4847
Paolo Bonzini4265d622011-10-17 12:32:14 +02004848static void coroutine_fn bdrv_aio_discard_co_entry(void *opaque)
4849{
4850 BlockDriverAIOCBCoroutine *acb = opaque;
4851 BlockDriverState *bs = acb->common.bs;
4852
4853 acb->req.error = bdrv_co_discard(bs, acb->req.sector, acb->req.nb_sectors);
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02004854 acb->bh = aio_bh_new(bdrv_get_aio_context(bs), bdrv_co_em_bh, acb);
Paolo Bonzini4265d622011-10-17 12:32:14 +02004855 qemu_bh_schedule(acb->bh);
4856}
4857
4858BlockDriverAIOCB *bdrv_aio_discard(BlockDriverState *bs,
4859 int64_t sector_num, int nb_sectors,
4860 BlockDriverCompletionFunc *cb, void *opaque)
4861{
4862 Coroutine *co;
4863 BlockDriverAIOCBCoroutine *acb;
4864
4865 trace_bdrv_aio_discard(bs, sector_num, nb_sectors, opaque);
4866
Stefan Hajnoczid7331be2012-10-31 16:34:37 +01004867 acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque);
Paolo Bonzini4265d622011-10-17 12:32:14 +02004868 acb->req.sector = sector_num;
4869 acb->req.nb_sectors = nb_sectors;
4870 co = qemu_coroutine_create(bdrv_aio_discard_co_entry);
4871 qemu_coroutine_enter(co, acb);
4872
4873 return &acb->common;
4874}
4875
bellardea2384d2004-08-01 21:59:26 +00004876void bdrv_init(void)
4877{
Anthony Liguori5efa9d52009-05-09 17:03:42 -05004878 module_call_init(MODULE_INIT_BLOCK);
bellardea2384d2004-08-01 21:59:26 +00004879}
pbrookce1a14d2006-08-07 02:38:06 +00004880
Markus Armbrustereb852012009-10-27 18:41:44 +01004881void bdrv_init_with_whitelist(void)
4882{
4883 use_bdrv_whitelist = 1;
4884 bdrv_init();
4885}
4886
Stefan Hajnoczid7331be2012-10-31 16:34:37 +01004887void *qemu_aio_get(const AIOCBInfo *aiocb_info, BlockDriverState *bs,
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02004888 BlockDriverCompletionFunc *cb, void *opaque)
aliguori6bbff9a2009-03-20 18:25:59 +00004889{
pbrookce1a14d2006-08-07 02:38:06 +00004890 BlockDriverAIOCB *acb;
4891
Stefan Hajnoczid7331be2012-10-31 16:34:37 +01004892 acb = g_slice_alloc(aiocb_info->aiocb_size);
4893 acb->aiocb_info = aiocb_info;
pbrookce1a14d2006-08-07 02:38:06 +00004894 acb->bs = bs;
4895 acb->cb = cb;
4896 acb->opaque = opaque;
Fam Zhengf197fe22014-09-11 13:41:08 +08004897 acb->refcnt = 1;
pbrookce1a14d2006-08-07 02:38:06 +00004898 return acb;
4899}
4900
Fam Zhengf197fe22014-09-11 13:41:08 +08004901void qemu_aio_ref(void *p)
4902{
4903 BlockDriverAIOCB *acb = p;
4904 acb->refcnt++;
4905}
4906
Fam Zheng80074292014-09-11 13:41:28 +08004907void qemu_aio_unref(void *p)
pbrookce1a14d2006-08-07 02:38:06 +00004908{
Stefan Hajnoczid37c9752012-10-31 16:34:36 +01004909 BlockDriverAIOCB *acb = p;
Fam Zhengf197fe22014-09-11 13:41:08 +08004910 assert(acb->refcnt > 0);
4911 if (--acb->refcnt == 0) {
4912 g_slice_free1(acb->aiocb_info->aiocb_size, acb);
4913 }
pbrookce1a14d2006-08-07 02:38:06 +00004914}
bellard19cb3732006-08-19 11:45:59 +00004915
4916/**************************************************************/
Kevin Wolff9f05dc2011-07-15 13:50:26 +02004917/* Coroutine block device emulation */
4918
4919typedef struct CoroutineIOCompletion {
4920 Coroutine *coroutine;
4921 int ret;
4922} CoroutineIOCompletion;
4923
4924static void bdrv_co_io_em_complete(void *opaque, int ret)
4925{
4926 CoroutineIOCompletion *co = opaque;
4927
4928 co->ret = ret;
4929 qemu_coroutine_enter(co->coroutine, NULL);
4930}
4931
4932static int coroutine_fn bdrv_co_io_em(BlockDriverState *bs, int64_t sector_num,
4933 int nb_sectors, QEMUIOVector *iov,
4934 bool is_write)
4935{
4936 CoroutineIOCompletion co = {
4937 .coroutine = qemu_coroutine_self(),
4938 };
4939 BlockDriverAIOCB *acb;
4940
4941 if (is_write) {
Stefan Hajnoczia652d162011-10-05 17:17:02 +01004942 acb = bs->drv->bdrv_aio_writev(bs, sector_num, iov, nb_sectors,
4943 bdrv_co_io_em_complete, &co);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02004944 } else {
Stefan Hajnoczia652d162011-10-05 17:17:02 +01004945 acb = bs->drv->bdrv_aio_readv(bs, sector_num, iov, nb_sectors,
4946 bdrv_co_io_em_complete, &co);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02004947 }
4948
Stefan Hajnoczi59370aa2011-09-30 17:34:58 +01004949 trace_bdrv_co_io_em(bs, sector_num, nb_sectors, is_write, acb);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02004950 if (!acb) {
4951 return -EIO;
4952 }
4953 qemu_coroutine_yield();
4954
4955 return co.ret;
4956}
4957
4958static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
4959 int64_t sector_num, int nb_sectors,
4960 QEMUIOVector *iov)
4961{
4962 return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, false);
4963}
4964
4965static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
4966 int64_t sector_num, int nb_sectors,
4967 QEMUIOVector *iov)
4968{
4969 return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, true);
4970}
4971
Paolo Bonzini07f07612011-10-17 12:32:12 +02004972static void coroutine_fn bdrv_flush_co_entry(void *opaque)
Kevin Wolfe7a8a782011-07-15 16:05:00 +02004973{
Paolo Bonzini07f07612011-10-17 12:32:12 +02004974 RwCo *rwco = opaque;
Kevin Wolfe7a8a782011-07-15 16:05:00 +02004975
Paolo Bonzini07f07612011-10-17 12:32:12 +02004976 rwco->ret = bdrv_co_flush(rwco->bs);
4977}
4978
4979int coroutine_fn bdrv_co_flush(BlockDriverState *bs)
4980{
Kevin Wolfeb489bb2011-11-10 18:10:11 +01004981 int ret;
4982
Paolo Bonzini29cdb252012-03-12 18:26:01 +01004983 if (!bs || !bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
Paolo Bonzini07f07612011-10-17 12:32:12 +02004984 return 0;
Kevin Wolfeb489bb2011-11-10 18:10:11 +01004985 }
4986
Kevin Wolfca716362011-11-10 18:13:59 +01004987 /* Write back cached data to the OS even with cache=unsafe */
Kevin Wolfbf736fe2013-06-05 15:17:55 +02004988 BLKDBG_EVENT(bs->file, BLKDBG_FLUSH_TO_OS);
Kevin Wolfeb489bb2011-11-10 18:10:11 +01004989 if (bs->drv->bdrv_co_flush_to_os) {
4990 ret = bs->drv->bdrv_co_flush_to_os(bs);
4991 if (ret < 0) {
4992 return ret;
4993 }
4994 }
4995
Kevin Wolfca716362011-11-10 18:13:59 +01004996 /* But don't actually force it to the disk with cache=unsafe */
4997 if (bs->open_flags & BDRV_O_NO_FLUSH) {
Kevin Wolfd4c82322012-08-15 12:52:45 +02004998 goto flush_parent;
Kevin Wolfca716362011-11-10 18:13:59 +01004999 }
5000
Kevin Wolfbf736fe2013-06-05 15:17:55 +02005001 BLKDBG_EVENT(bs->file, BLKDBG_FLUSH_TO_DISK);
Kevin Wolfeb489bb2011-11-10 18:10:11 +01005002 if (bs->drv->bdrv_co_flush_to_disk) {
Paolo Bonzini29cdb252012-03-12 18:26:01 +01005003 ret = bs->drv->bdrv_co_flush_to_disk(bs);
Paolo Bonzini07f07612011-10-17 12:32:12 +02005004 } else if (bs->drv->bdrv_aio_flush) {
5005 BlockDriverAIOCB *acb;
5006 CoroutineIOCompletion co = {
5007 .coroutine = qemu_coroutine_self(),
5008 };
5009
5010 acb = bs->drv->bdrv_aio_flush(bs, bdrv_co_io_em_complete, &co);
5011 if (acb == NULL) {
Paolo Bonzini29cdb252012-03-12 18:26:01 +01005012 ret = -EIO;
Paolo Bonzini07f07612011-10-17 12:32:12 +02005013 } else {
5014 qemu_coroutine_yield();
Paolo Bonzini29cdb252012-03-12 18:26:01 +01005015 ret = co.ret;
Paolo Bonzini07f07612011-10-17 12:32:12 +02005016 }
Paolo Bonzini07f07612011-10-17 12:32:12 +02005017 } else {
5018 /*
5019 * Some block drivers always operate in either writethrough or unsafe
5020 * mode and don't support bdrv_flush therefore. Usually qemu doesn't
5021 * know how the server works (because the behaviour is hardcoded or
5022 * depends on server-side configuration), so we can't ensure that
5023 * everything is safe on disk. Returning an error doesn't work because
5024 * that would break guests even if the server operates in writethrough
5025 * mode.
5026 *
5027 * Let's hope the user knows what he's doing.
5028 */
Paolo Bonzini29cdb252012-03-12 18:26:01 +01005029 ret = 0;
Kevin Wolfe7a8a782011-07-15 16:05:00 +02005030 }
Paolo Bonzini29cdb252012-03-12 18:26:01 +01005031 if (ret < 0) {
5032 return ret;
5033 }
5034
5035 /* Now flush the underlying protocol. It will also have BDRV_O_NO_FLUSH
5036 * in the case of cache=unsafe, so there are no useless flushes.
5037 */
Kevin Wolfd4c82322012-08-15 12:52:45 +02005038flush_parent:
Paolo Bonzini29cdb252012-03-12 18:26:01 +01005039 return bdrv_co_flush(bs->file);
Paolo Bonzini07f07612011-10-17 12:32:12 +02005040}
5041
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01005042void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
Anthony Liguori0f154232011-11-14 15:09:45 -06005043{
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01005044 Error *local_err = NULL;
5045 int ret;
5046
Kevin Wolf3456a8d2014-03-11 10:58:39 +01005047 if (!bs->drv) {
5048 return;
Anthony Liguori0f154232011-11-14 15:09:45 -06005049 }
Kevin Wolf3456a8d2014-03-11 10:58:39 +01005050
5051 if (bs->drv->bdrv_invalidate_cache) {
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01005052 bs->drv->bdrv_invalidate_cache(bs, &local_err);
Kevin Wolf3456a8d2014-03-11 10:58:39 +01005053 } else if (bs->file) {
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01005054 bdrv_invalidate_cache(bs->file, &local_err);
5055 }
5056 if (local_err) {
5057 error_propagate(errp, local_err);
5058 return;
Kevin Wolf3456a8d2014-03-11 10:58:39 +01005059 }
5060
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01005061 ret = refresh_total_sectors(bs, bs->total_sectors);
5062 if (ret < 0) {
5063 error_setg_errno(errp, -ret, "Could not refresh total sector count");
5064 return;
5065 }
Anthony Liguori0f154232011-11-14 15:09:45 -06005066}
5067
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01005068void bdrv_invalidate_cache_all(Error **errp)
Anthony Liguori0f154232011-11-14 15:09:45 -06005069{
5070 BlockDriverState *bs;
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01005071 Error *local_err = NULL;
Anthony Liguori0f154232011-11-14 15:09:45 -06005072
Benoît Canetdc364f42014-01-23 21:31:32 +01005073 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02005074 AioContext *aio_context = bdrv_get_aio_context(bs);
5075
5076 aio_context_acquire(aio_context);
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01005077 bdrv_invalidate_cache(bs, &local_err);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02005078 aio_context_release(aio_context);
Kevin Wolf5a8a30d2014-03-12 15:59:16 +01005079 if (local_err) {
5080 error_propagate(errp, local_err);
5081 return;
5082 }
Anthony Liguori0f154232011-11-14 15:09:45 -06005083 }
5084}
5085
Benoît Canet07789262012-03-23 08:36:49 +01005086void bdrv_clear_incoming_migration_all(void)
5087{
5088 BlockDriverState *bs;
5089
Benoît Canetdc364f42014-01-23 21:31:32 +01005090 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02005091 AioContext *aio_context = bdrv_get_aio_context(bs);
5092
5093 aio_context_acquire(aio_context);
Benoît Canet07789262012-03-23 08:36:49 +01005094 bs->open_flags = bs->open_flags & ~(BDRV_O_INCOMING);
Stefan Hajnoczied78cda2014-05-08 16:34:35 +02005095 aio_context_release(aio_context);
Benoît Canet07789262012-03-23 08:36:49 +01005096 }
5097}
5098
Paolo Bonzini07f07612011-10-17 12:32:12 +02005099int bdrv_flush(BlockDriverState *bs)
5100{
5101 Coroutine *co;
5102 RwCo rwco = {
5103 .bs = bs,
5104 .ret = NOT_DONE,
5105 };
5106
5107 if (qemu_in_coroutine()) {
5108 /* Fast-path if already in coroutine context */
5109 bdrv_flush_co_entry(&rwco);
5110 } else {
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02005111 AioContext *aio_context = bdrv_get_aio_context(bs);
5112
Paolo Bonzini07f07612011-10-17 12:32:12 +02005113 co = qemu_coroutine_create(bdrv_flush_co_entry);
5114 qemu_coroutine_enter(co, &rwco);
5115 while (rwco.ret == NOT_DONE) {
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02005116 aio_poll(aio_context, true);
Paolo Bonzini07f07612011-10-17 12:32:12 +02005117 }
5118 }
5119
5120 return rwco.ret;
Kevin Wolfe7a8a782011-07-15 16:05:00 +02005121}
5122
Kevin Wolf775aa8b2013-12-05 12:09:38 +01005123typedef struct DiscardCo {
5124 BlockDriverState *bs;
5125 int64_t sector_num;
5126 int nb_sectors;
5127 int ret;
5128} DiscardCo;
Paolo Bonzini4265d622011-10-17 12:32:14 +02005129static void coroutine_fn bdrv_discard_co_entry(void *opaque)
5130{
Kevin Wolf775aa8b2013-12-05 12:09:38 +01005131 DiscardCo *rwco = opaque;
Paolo Bonzini4265d622011-10-17 12:32:14 +02005132
5133 rwco->ret = bdrv_co_discard(rwco->bs, rwco->sector_num, rwco->nb_sectors);
5134}
5135
Peter Lieven6f14da52013-10-24 12:06:59 +02005136/* if no limit is specified in the BlockLimits use a default
5137 * of 32768 512-byte sectors (16 MiB) per request.
5138 */
5139#define MAX_DISCARD_DEFAULT 32768
5140
Paolo Bonzini4265d622011-10-17 12:32:14 +02005141int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
5142 int nb_sectors)
5143{
Paolo Bonzinid51e9fe2013-11-22 13:39:43 +01005144 int max_discard;
5145
Paolo Bonzini4265d622011-10-17 12:32:14 +02005146 if (!bs->drv) {
5147 return -ENOMEDIUM;
5148 } else if (bdrv_check_request(bs, sector_num, nb_sectors)) {
5149 return -EIO;
5150 } else if (bs->read_only) {
5151 return -EROFS;
Paolo Bonzinidf702c92013-01-14 16:26:58 +01005152 }
5153
Fam Zhenge4654d22013-11-13 18:29:43 +08005154 bdrv_reset_dirty(bs, sector_num, nb_sectors);
Paolo Bonzinidf702c92013-01-14 16:26:58 +01005155
Paolo Bonzini9e8f1832013-02-08 14:06:11 +01005156 /* Do nothing if disabled. */
5157 if (!(bs->open_flags & BDRV_O_UNMAP)) {
5158 return 0;
5159 }
5160
Paolo Bonzinid51e9fe2013-11-22 13:39:43 +01005161 if (!bs->drv->bdrv_co_discard && !bs->drv->bdrv_aio_discard) {
Paolo Bonzini4265d622011-10-17 12:32:14 +02005162 return 0;
5163 }
Paolo Bonzinid51e9fe2013-11-22 13:39:43 +01005164
5165 max_discard = bs->bl.max_discard ? bs->bl.max_discard : MAX_DISCARD_DEFAULT;
5166 while (nb_sectors > 0) {
5167 int ret;
5168 int num = nb_sectors;
5169
5170 /* align request */
5171 if (bs->bl.discard_alignment &&
5172 num >= bs->bl.discard_alignment &&
5173 sector_num % bs->bl.discard_alignment) {
5174 if (num > bs->bl.discard_alignment) {
5175 num = bs->bl.discard_alignment;
5176 }
5177 num -= sector_num % bs->bl.discard_alignment;
5178 }
5179
5180 /* limit request size */
5181 if (num > max_discard) {
5182 num = max_discard;
5183 }
5184
5185 if (bs->drv->bdrv_co_discard) {
5186 ret = bs->drv->bdrv_co_discard(bs, sector_num, num);
5187 } else {
5188 BlockDriverAIOCB *acb;
5189 CoroutineIOCompletion co = {
5190 .coroutine = qemu_coroutine_self(),
5191 };
5192
5193 acb = bs->drv->bdrv_aio_discard(bs, sector_num, nb_sectors,
5194 bdrv_co_io_em_complete, &co);
5195 if (acb == NULL) {
5196 return -EIO;
5197 } else {
5198 qemu_coroutine_yield();
5199 ret = co.ret;
5200 }
5201 }
Paolo Bonzini7ce21012013-11-22 13:39:47 +01005202 if (ret && ret != -ENOTSUP) {
Paolo Bonzinid51e9fe2013-11-22 13:39:43 +01005203 return ret;
5204 }
5205
5206 sector_num += num;
5207 nb_sectors -= num;
5208 }
5209 return 0;
Paolo Bonzini4265d622011-10-17 12:32:14 +02005210}
5211
5212int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
5213{
5214 Coroutine *co;
Kevin Wolf775aa8b2013-12-05 12:09:38 +01005215 DiscardCo rwco = {
Paolo Bonzini4265d622011-10-17 12:32:14 +02005216 .bs = bs,
5217 .sector_num = sector_num,
5218 .nb_sectors = nb_sectors,
5219 .ret = NOT_DONE,
5220 };
5221
5222 if (qemu_in_coroutine()) {
5223 /* Fast-path if already in coroutine context */
5224 bdrv_discard_co_entry(&rwco);
5225 } else {
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02005226 AioContext *aio_context = bdrv_get_aio_context(bs);
5227
Paolo Bonzini4265d622011-10-17 12:32:14 +02005228 co = qemu_coroutine_create(bdrv_discard_co_entry);
5229 qemu_coroutine_enter(co, &rwco);
5230 while (rwco.ret == NOT_DONE) {
Stefan Hajnoczi2572b372014-05-08 16:34:34 +02005231 aio_poll(aio_context, true);
Paolo Bonzini4265d622011-10-17 12:32:14 +02005232 }
5233 }
5234
5235 return rwco.ret;
5236}
5237
Kevin Wolff9f05dc2011-07-15 13:50:26 +02005238/**************************************************************/
bellard19cb3732006-08-19 11:45:59 +00005239/* removable device support */
5240
5241/**
5242 * Return TRUE if the media is present
5243 */
5244int bdrv_is_inserted(BlockDriverState *bs)
5245{
5246 BlockDriver *drv = bs->drv;
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02005247
bellard19cb3732006-08-19 11:45:59 +00005248 if (!drv)
5249 return 0;
5250 if (!drv->bdrv_is_inserted)
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02005251 return 1;
5252 return drv->bdrv_is_inserted(bs);
bellard19cb3732006-08-19 11:45:59 +00005253}
5254
5255/**
Markus Armbruster8e49ca42011-08-03 15:08:08 +02005256 * Return whether the media changed since the last call to this
5257 * function, or -ENOTSUP if we don't know. Most drivers don't know.
bellard19cb3732006-08-19 11:45:59 +00005258 */
5259int bdrv_media_changed(BlockDriverState *bs)
5260{
5261 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00005262
Markus Armbruster8e49ca42011-08-03 15:08:08 +02005263 if (drv && drv->bdrv_media_changed) {
5264 return drv->bdrv_media_changed(bs);
5265 }
5266 return -ENOTSUP;
bellard19cb3732006-08-19 11:45:59 +00005267}
5268
5269/**
5270 * If eject_flag is TRUE, eject the media. Otherwise, close the tray
5271 */
Luiz Capitulinof36f3942012-02-03 16:24:53 -02005272void bdrv_eject(BlockDriverState *bs, bool eject_flag)
bellard19cb3732006-08-19 11:45:59 +00005273{
5274 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00005275
Markus Armbruster822e1cd2011-07-20 18:23:42 +02005276 if (drv && drv->bdrv_eject) {
5277 drv->bdrv_eject(bs, eject_flag);
bellard19cb3732006-08-19 11:45:59 +00005278 }
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02005279
5280 if (bs->device_name[0] != '\0') {
Wenchao Xiaa5ee7bd2014-06-18 08:43:44 +02005281 qapi_event_send_device_tray_moved(bdrv_get_device_name(bs),
5282 eject_flag, &error_abort);
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02005283 }
bellard19cb3732006-08-19 11:45:59 +00005284}
5285
bellard19cb3732006-08-19 11:45:59 +00005286/**
5287 * Lock or unlock the media (if it is locked, the user won't be able
5288 * to eject it manually).
5289 */
Markus Armbruster025e8492011-09-06 18:58:47 +02005290void bdrv_lock_medium(BlockDriverState *bs, bool locked)
bellard19cb3732006-08-19 11:45:59 +00005291{
5292 BlockDriver *drv = bs->drv;
5293
Markus Armbruster025e8492011-09-06 18:58:47 +02005294 trace_bdrv_lock_medium(bs, locked);
Stefan Hajnoczib8c6d092011-03-29 20:04:40 +01005295
Markus Armbruster025e8492011-09-06 18:58:47 +02005296 if (drv && drv->bdrv_lock_medium) {
5297 drv->bdrv_lock_medium(bs, locked);
bellard19cb3732006-08-19 11:45:59 +00005298 }
5299}
ths985a03b2007-12-24 16:10:43 +00005300
5301/* needed for generic scsi interface */
5302
5303int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
5304{
5305 BlockDriver *drv = bs->drv;
5306
5307 if (drv && drv->bdrv_ioctl)
5308 return drv->bdrv_ioctl(bs, req, buf);
5309 return -ENOTSUP;
5310}
aliguori7d780662009-03-12 19:57:08 +00005311
aliguori221f7152009-03-28 17:28:41 +00005312BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
5313 unsigned long int req, void *buf,
5314 BlockDriverCompletionFunc *cb, void *opaque)
aliguori7d780662009-03-12 19:57:08 +00005315{
aliguori221f7152009-03-28 17:28:41 +00005316 BlockDriver *drv = bs->drv;
aliguori7d780662009-03-12 19:57:08 +00005317
aliguori221f7152009-03-28 17:28:41 +00005318 if (drv && drv->bdrv_aio_ioctl)
5319 return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
5320 return NULL;
aliguori7d780662009-03-12 19:57:08 +00005321}
aliguorie268ca52009-04-22 20:20:00 +00005322
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01005323void bdrv_set_guest_block_size(BlockDriverState *bs, int align)
Markus Armbruster7b6f9302011-09-06 18:58:56 +02005324{
Paolo Bonzini1b7fd722011-11-29 11:35:47 +01005325 bs->guest_block_size = align;
Markus Armbruster7b6f9302011-09-06 18:58:56 +02005326}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02005327
aliguorie268ca52009-04-22 20:20:00 +00005328void *qemu_blockalign(BlockDriverState *bs, size_t size)
5329{
Kevin Wolf339064d2013-11-28 10:23:32 +01005330 return qemu_memalign(bdrv_opt_mem_align(bs), size);
aliguorie268ca52009-04-22 20:20:00 +00005331}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02005332
Kevin Wolf7d2a35c2014-05-20 12:24:05 +02005333void *qemu_try_blockalign(BlockDriverState *bs, size_t size)
5334{
5335 size_t align = bdrv_opt_mem_align(bs);
5336
5337 /* Ensure that NULL is never returned on success */
5338 assert(align > 0);
5339 if (size == 0) {
5340 size = align;
5341 }
5342
5343 return qemu_try_memalign(align, size);
5344}
5345
Stefan Hajnoczic53b1c52013-01-11 16:41:27 +01005346/*
5347 * Check if all memory in this vector is sector aligned.
5348 */
5349bool bdrv_qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov)
5350{
5351 int i;
Kevin Wolf339064d2013-11-28 10:23:32 +01005352 size_t alignment = bdrv_opt_mem_align(bs);
Stefan Hajnoczic53b1c52013-01-11 16:41:27 +01005353
5354 for (i = 0; i < qiov->niov; i++) {
Kevin Wolf339064d2013-11-28 10:23:32 +01005355 if ((uintptr_t) qiov->iov[i].iov_base % alignment) {
Stefan Hajnoczic53b1c52013-01-11 16:41:27 +01005356 return false;
5357 }
Kevin Wolf339064d2013-11-28 10:23:32 +01005358 if (qiov->iov[i].iov_len % alignment) {
Kevin Wolf1ff735b2013-12-05 13:01:46 +01005359 return false;
5360 }
Stefan Hajnoczic53b1c52013-01-11 16:41:27 +01005361 }
5362
5363 return true;
5364}
5365
Fam Zhengb8afb522014-04-16 09:34:30 +08005366BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs, int granularity,
5367 Error **errp)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02005368{
5369 int64_t bitmap_size;
Fam Zhenge4654d22013-11-13 18:29:43 +08005370 BdrvDirtyBitmap *bitmap;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01005371
Paolo Bonzini50717e92013-01-21 17:09:45 +01005372 assert((granularity & (granularity - 1)) == 0);
5373
Fam Zhenge4654d22013-11-13 18:29:43 +08005374 granularity >>= BDRV_SECTOR_BITS;
5375 assert(granularity);
Markus Armbruster57322b72014-06-26 13:23:22 +02005376 bitmap_size = bdrv_nb_sectors(bs);
Fam Zhengb8afb522014-04-16 09:34:30 +08005377 if (bitmap_size < 0) {
5378 error_setg_errno(errp, -bitmap_size, "could not get length of device");
5379 errno = -bitmap_size;
5380 return NULL;
5381 }
Markus Armbruster5839e532014-08-19 10:31:08 +02005382 bitmap = g_new0(BdrvDirtyBitmap, 1);
Fam Zhenge4654d22013-11-13 18:29:43 +08005383 bitmap->bitmap = hbitmap_alloc(bitmap_size, ffs(granularity) - 1);
5384 QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
5385 return bitmap;
5386}
5387
5388void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
5389{
5390 BdrvDirtyBitmap *bm, *next;
5391 QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
5392 if (bm == bitmap) {
5393 QLIST_REMOVE(bitmap, list);
5394 hbitmap_free(bitmap->bitmap);
5395 g_free(bitmap);
5396 return;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01005397 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02005398 }
5399}
5400
Fam Zheng21b56832013-11-13 18:29:44 +08005401BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
5402{
5403 BdrvDirtyBitmap *bm;
5404 BlockDirtyInfoList *list = NULL;
5405 BlockDirtyInfoList **plist = &list;
5406
5407 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
Markus Armbruster5839e532014-08-19 10:31:08 +02005408 BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
5409 BlockDirtyInfoList *entry = g_new0(BlockDirtyInfoList, 1);
Fam Zheng21b56832013-11-13 18:29:44 +08005410 info->count = bdrv_get_dirty_count(bs, bm);
5411 info->granularity =
5412 ((int64_t) BDRV_SECTOR_SIZE << hbitmap_granularity(bm->bitmap));
5413 entry->value = info;
5414 *plist = entry;
5415 plist = &entry->next;
5416 }
5417
5418 return list;
5419}
5420
Fam Zhenge4654d22013-11-13 18:29:43 +08005421int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02005422{
Fam Zhenge4654d22013-11-13 18:29:43 +08005423 if (bitmap) {
5424 return hbitmap_get(bitmap->bitmap, sector);
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02005425 } else {
5426 return 0;
5427 }
5428}
5429
Fam Zhenge4654d22013-11-13 18:29:43 +08005430void bdrv_dirty_iter_init(BlockDriverState *bs,
5431 BdrvDirtyBitmap *bitmap, HBitmapIter *hbi)
Paolo Bonzini1755da12012-10-18 16:49:18 +02005432{
Fam Zhenge4654d22013-11-13 18:29:43 +08005433 hbitmap_iter_init(hbi, bitmap->bitmap, 0);
Paolo Bonzini1755da12012-10-18 16:49:18 +02005434}
5435
5436void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,
5437 int nr_sectors)
5438{
Fam Zhenge4654d22013-11-13 18:29:43 +08005439 BdrvDirtyBitmap *bitmap;
5440 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
5441 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
Paolo Bonzini8f0720e2013-01-21 17:09:41 +01005442 }
Liran Schouraaa0eb72010-01-26 10:31:48 +02005443}
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005444
Fam Zhenge4654d22013-11-13 18:29:43 +08005445void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector, int nr_sectors)
5446{
5447 BdrvDirtyBitmap *bitmap;
5448 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
5449 hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
5450 }
5451}
5452
5453int64_t bdrv_get_dirty_count(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
5454{
5455 return hbitmap_count(bitmap->bitmap);
5456}
5457
Fam Zheng9fcb0252013-08-23 09:14:46 +08005458/* Get a reference to bs */
5459void bdrv_ref(BlockDriverState *bs)
5460{
5461 bs->refcnt++;
5462}
5463
5464/* Release a previously grabbed reference to bs.
5465 * If after releasing, reference count is zero, the BlockDriverState is
5466 * deleted. */
5467void bdrv_unref(BlockDriverState *bs)
5468{
Jeff Cody9a4d5ca2014-07-23 17:22:57 -04005469 if (!bs) {
5470 return;
5471 }
Fam Zheng9fcb0252013-08-23 09:14:46 +08005472 assert(bs->refcnt > 0);
5473 if (--bs->refcnt == 0) {
5474 bdrv_delete(bs);
5475 }
5476}
5477
Fam Zhengfbe40ff2014-05-23 21:29:42 +08005478struct BdrvOpBlocker {
5479 Error *reason;
5480 QLIST_ENTRY(BdrvOpBlocker) list;
5481};
5482
5483bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
5484{
5485 BdrvOpBlocker *blocker;
5486 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
5487 if (!QLIST_EMPTY(&bs->op_blockers[op])) {
5488 blocker = QLIST_FIRST(&bs->op_blockers[op]);
5489 if (errp) {
5490 error_setg(errp, "Device '%s' is busy: %s",
5491 bs->device_name, error_get_pretty(blocker->reason));
5492 }
5493 return true;
5494 }
5495 return false;
5496}
5497
5498void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason)
5499{
5500 BdrvOpBlocker *blocker;
5501 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
5502
Markus Armbruster5839e532014-08-19 10:31:08 +02005503 blocker = g_new0(BdrvOpBlocker, 1);
Fam Zhengfbe40ff2014-05-23 21:29:42 +08005504 blocker->reason = reason;
5505 QLIST_INSERT_HEAD(&bs->op_blockers[op], blocker, list);
5506}
5507
5508void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason)
5509{
5510 BdrvOpBlocker *blocker, *next;
5511 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
5512 QLIST_FOREACH_SAFE(blocker, &bs->op_blockers[op], list, next) {
5513 if (blocker->reason == reason) {
5514 QLIST_REMOVE(blocker, list);
5515 g_free(blocker);
5516 }
5517 }
5518}
5519
5520void bdrv_op_block_all(BlockDriverState *bs, Error *reason)
5521{
5522 int i;
5523 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
5524 bdrv_op_block(bs, i, reason);
5525 }
5526}
5527
5528void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason)
5529{
5530 int i;
5531 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
5532 bdrv_op_unblock(bs, i, reason);
5533 }
5534}
5535
5536bool bdrv_op_blocker_is_empty(BlockDriverState *bs)
5537{
5538 int i;
5539
5540 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
5541 if (!QLIST_EMPTY(&bs->op_blockers[i])) {
5542 return false;
5543 }
5544 }
5545 return true;
5546}
5547
Luiz Capitulino28a72822011-09-26 17:43:50 -03005548void bdrv_iostatus_enable(BlockDriverState *bs)
5549{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03005550 bs->iostatus_enabled = true;
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03005551 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Luiz Capitulino28a72822011-09-26 17:43:50 -03005552}
5553
5554/* The I/O status is only enabled if the drive explicitly
5555 * enables it _and_ the VM is configured to stop on errors */
5556bool bdrv_iostatus_is_enabled(const BlockDriverState *bs)
5557{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03005558 return (bs->iostatus_enabled &&
Paolo Bonzini92aa5c62012-09-28 17:22:55 +02005559 (bs->on_write_error == BLOCKDEV_ON_ERROR_ENOSPC ||
5560 bs->on_write_error == BLOCKDEV_ON_ERROR_STOP ||
5561 bs->on_read_error == BLOCKDEV_ON_ERROR_STOP));
Luiz Capitulino28a72822011-09-26 17:43:50 -03005562}
5563
5564void bdrv_iostatus_disable(BlockDriverState *bs)
5565{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03005566 bs->iostatus_enabled = false;
Luiz Capitulino28a72822011-09-26 17:43:50 -03005567}
5568
5569void bdrv_iostatus_reset(BlockDriverState *bs)
5570{
5571 if (bdrv_iostatus_is_enabled(bs)) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03005572 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Paolo Bonzini3bd293c2012-10-18 16:49:27 +02005573 if (bs->job) {
5574 block_job_iostatus_reset(bs->job);
5575 }
Luiz Capitulino28a72822011-09-26 17:43:50 -03005576 }
5577}
5578
Luiz Capitulino28a72822011-09-26 17:43:50 -03005579void bdrv_iostatus_set_err(BlockDriverState *bs, int error)
5580{
Paolo Bonzini3e1caa52012-09-28 17:22:57 +02005581 assert(bdrv_iostatus_is_enabled(bs));
5582 if (bs->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03005583 bs->iostatus = error == ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOSPACE :
5584 BLOCK_DEVICE_IO_STATUS_FAILED;
Luiz Capitulino28a72822011-09-26 17:43:50 -03005585 }
5586}
5587
Luiz Capitulinod92ada22012-11-30 10:52:09 -02005588void bdrv_img_create(const char *filename, const char *fmt,
5589 const char *base_filename, const char *base_fmt,
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01005590 char *options, uint64_t img_size, int flags,
5591 Error **errp, bool quiet)
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005592{
Chunyan Liu83d05212014-06-05 17:20:51 +08005593 QemuOptsList *create_opts = NULL;
5594 QemuOpts *opts = NULL;
5595 const char *backing_fmt, *backing_file;
5596 int64_t size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005597 BlockDriver *drv, *proto_drv;
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00005598 BlockDriver *backing_drv = NULL;
Max Reitzcc84d902013-09-06 17:14:26 +02005599 Error *local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005600 int ret = 0;
5601
5602 /* Find driver and parse its options */
5603 drv = bdrv_find_format(fmt);
5604 if (!drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02005605 error_setg(errp, "Unknown file format '%s'", fmt);
Luiz Capitulinod92ada22012-11-30 10:52:09 -02005606 return;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005607 }
5608
Kevin Wolf98289622013-07-10 15:47:39 +02005609 proto_drv = bdrv_find_protocol(filename, true);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005610 if (!proto_drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02005611 error_setg(errp, "Unknown protocol '%s'", filename);
Luiz Capitulinod92ada22012-11-30 10:52:09 -02005612 return;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005613 }
5614
Chunyan Liuc282e1f2014-06-05 17:21:11 +08005615 create_opts = qemu_opts_append(create_opts, drv->create_opts);
5616 create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005617
5618 /* Create parameter list with default values */
Chunyan Liu83d05212014-06-05 17:20:51 +08005619 opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
5620 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005621
5622 /* Parse -o options */
5623 if (options) {
Chunyan Liu83d05212014-06-05 17:20:51 +08005624 if (qemu_opts_do_parse(opts, options, NULL) != 0) {
5625 error_setg(errp, "Invalid options for file format '%s'", fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005626 goto out;
5627 }
5628 }
5629
5630 if (base_filename) {
Chunyan Liu83d05212014-06-05 17:20:51 +08005631 if (qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename)) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02005632 error_setg(errp, "Backing file not supported for file format '%s'",
5633 fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005634 goto out;
5635 }
5636 }
5637
5638 if (base_fmt) {
Chunyan Liu83d05212014-06-05 17:20:51 +08005639 if (qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt)) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02005640 error_setg(errp, "Backing file format not supported for file "
5641 "format '%s'", fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005642 goto out;
5643 }
5644 }
5645
Chunyan Liu83d05212014-06-05 17:20:51 +08005646 backing_file = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
5647 if (backing_file) {
5648 if (!strcmp(filename, backing_file)) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02005649 error_setg(errp, "Error: Trying to create an image with the "
5650 "same filename as the backing file");
Jes Sorensen792da932010-12-16 13:52:17 +01005651 goto out;
5652 }
5653 }
5654
Chunyan Liu83d05212014-06-05 17:20:51 +08005655 backing_fmt = qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT);
5656 if (backing_fmt) {
5657 backing_drv = bdrv_find_format(backing_fmt);
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00005658 if (!backing_drv) {
Luiz Capitulino71c79812012-11-30 10:52:04 -02005659 error_setg(errp, "Unknown backing file format '%s'",
Chunyan Liu83d05212014-06-05 17:20:51 +08005660 backing_fmt);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005661 goto out;
5662 }
5663 }
5664
5665 // The size for the image must always be specified, with one exception:
5666 // If we are using a backing file, we can obtain the size from there
Chunyan Liu83d05212014-06-05 17:20:51 +08005667 size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, 0);
5668 if (size == -1) {
5669 if (backing_file) {
Max Reitz66f6b812013-12-03 14:57:52 +01005670 BlockDriverState *bs;
Markus Armbruster52bf1e72014-06-26 13:23:25 +02005671 int64_t size;
Paolo Bonzini63090da2012-04-12 14:01:03 +02005672 int back_flags;
5673
5674 /* backing files always opened read-only */
5675 back_flags =
5676 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005677
Max Reitzf67503e2014-02-18 18:33:05 +01005678 bs = NULL;
Chunyan Liu83d05212014-06-05 17:20:51 +08005679 ret = bdrv_open(&bs, backing_file, NULL, NULL, back_flags,
Max Reitzcc84d902013-09-06 17:14:26 +02005680 backing_drv, &local_err);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005681 if (ret < 0) {
Max Reitzcc84d902013-09-06 17:14:26 +02005682 error_setg_errno(errp, -ret, "Could not open '%s': %s",
Chunyan Liu83d05212014-06-05 17:20:51 +08005683 backing_file,
Max Reitzcc84d902013-09-06 17:14:26 +02005684 error_get_pretty(local_err));
5685 error_free(local_err);
5686 local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005687 goto out;
5688 }
Markus Armbruster52bf1e72014-06-26 13:23:25 +02005689 size = bdrv_getlength(bs);
5690 if (size < 0) {
5691 error_setg_errno(errp, -size, "Could not get size of '%s'",
5692 backing_file);
5693 bdrv_unref(bs);
5694 goto out;
5695 }
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005696
Chunyan Liu83d05212014-06-05 17:20:51 +08005697 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, size);
Max Reitz66f6b812013-12-03 14:57:52 +01005698
5699 bdrv_unref(bs);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005700 } else {
Luiz Capitulino71c79812012-11-30 10:52:04 -02005701 error_setg(errp, "Image creation needs a size parameter");
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005702 goto out;
5703 }
5704 }
5705
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01005706 if (!quiet) {
5707 printf("Formatting '%s', fmt=%s ", filename, fmt);
Chunyan Liu83d05212014-06-05 17:20:51 +08005708 qemu_opts_print(opts);
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01005709 puts("");
5710 }
Chunyan Liu83d05212014-06-05 17:20:51 +08005711
Chunyan Liuc282e1f2014-06-05 17:21:11 +08005712 ret = bdrv_create(drv, filename, opts, &local_err);
Chunyan Liu83d05212014-06-05 17:20:51 +08005713
Max Reitzcc84d902013-09-06 17:14:26 +02005714 if (ret == -EFBIG) {
5715 /* This is generally a better message than whatever the driver would
5716 * deliver (especially because of the cluster_size_hint), since that
5717 * is most probably not much different from "image too large". */
5718 const char *cluster_size_hint = "";
Chunyan Liu83d05212014-06-05 17:20:51 +08005719 if (qemu_opt_get_size(opts, BLOCK_OPT_CLUSTER_SIZE, 0)) {
Max Reitzcc84d902013-09-06 17:14:26 +02005720 cluster_size_hint = " (try using a larger cluster size)";
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005721 }
Max Reitzcc84d902013-09-06 17:14:26 +02005722 error_setg(errp, "The image size is too large for file format '%s'"
5723 "%s", fmt, cluster_size_hint);
5724 error_free(local_err);
5725 local_err = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005726 }
5727
5728out:
Chunyan Liu83d05212014-06-05 17:20:51 +08005729 qemu_opts_del(opts);
5730 qemu_opts_free(create_opts);
Markus Armbruster84d18f02014-01-30 15:07:28 +01005731 if (local_err) {
Max Reitzcc84d902013-09-06 17:14:26 +02005732 error_propagate(errp, local_err);
5733 }
Jes Sorensenf88e1a42010-12-16 13:52:15 +01005734}
Stefan Hajnoczi85d126f2013-03-07 13:41:48 +01005735
5736AioContext *bdrv_get_aio_context(BlockDriverState *bs)
5737{
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02005738 return bs->aio_context;
5739}
5740
5741void bdrv_detach_aio_context(BlockDriverState *bs)
5742{
Max Reitz33384422014-06-20 21:57:33 +02005743 BdrvAioNotifier *baf;
5744
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02005745 if (!bs->drv) {
5746 return;
5747 }
5748
Max Reitz33384422014-06-20 21:57:33 +02005749 QLIST_FOREACH(baf, &bs->aio_notifiers, list) {
5750 baf->detach_aio_context(baf->opaque);
5751 }
5752
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02005753 if (bs->io_limits_enabled) {
5754 throttle_detach_aio_context(&bs->throttle_state);
5755 }
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02005756 if (bs->drv->bdrv_detach_aio_context) {
5757 bs->drv->bdrv_detach_aio_context(bs);
5758 }
5759 if (bs->file) {
5760 bdrv_detach_aio_context(bs->file);
5761 }
5762 if (bs->backing_hd) {
5763 bdrv_detach_aio_context(bs->backing_hd);
5764 }
5765
5766 bs->aio_context = NULL;
5767}
5768
5769void bdrv_attach_aio_context(BlockDriverState *bs,
5770 AioContext *new_context)
5771{
Max Reitz33384422014-06-20 21:57:33 +02005772 BdrvAioNotifier *ban;
5773
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02005774 if (!bs->drv) {
5775 return;
5776 }
5777
5778 bs->aio_context = new_context;
5779
5780 if (bs->backing_hd) {
5781 bdrv_attach_aio_context(bs->backing_hd, new_context);
5782 }
5783 if (bs->file) {
5784 bdrv_attach_aio_context(bs->file, new_context);
5785 }
5786 if (bs->drv->bdrv_attach_aio_context) {
5787 bs->drv->bdrv_attach_aio_context(bs, new_context);
5788 }
Stefan Hajnoczi13af91e2014-05-14 16:22:45 +02005789 if (bs->io_limits_enabled) {
5790 throttle_attach_aio_context(&bs->throttle_state, new_context);
5791 }
Max Reitz33384422014-06-20 21:57:33 +02005792
5793 QLIST_FOREACH(ban, &bs->aio_notifiers, list) {
5794 ban->attached_aio_context(new_context, ban->opaque);
5795 }
Stefan Hajnoczidcd04222014-05-08 16:34:37 +02005796}
5797
5798void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
5799{
5800 bdrv_drain_all(); /* ensure there are no in-flight requests */
5801
5802 bdrv_detach_aio_context(bs);
5803
5804 /* This function executes in the old AioContext so acquire the new one in
5805 * case it runs in a different thread.
5806 */
5807 aio_context_acquire(new_context);
5808 bdrv_attach_aio_context(bs, new_context);
5809 aio_context_release(new_context);
Stefan Hajnoczi85d126f2013-03-07 13:41:48 +01005810}
Stefan Hajnoczid616b222013-06-24 17:13:10 +02005811
Max Reitz33384422014-06-20 21:57:33 +02005812void bdrv_add_aio_context_notifier(BlockDriverState *bs,
5813 void (*attached_aio_context)(AioContext *new_context, void *opaque),
5814 void (*detach_aio_context)(void *opaque), void *opaque)
5815{
5816 BdrvAioNotifier *ban = g_new(BdrvAioNotifier, 1);
5817 *ban = (BdrvAioNotifier){
5818 .attached_aio_context = attached_aio_context,
5819 .detach_aio_context = detach_aio_context,
5820 .opaque = opaque
5821 };
5822
5823 QLIST_INSERT_HEAD(&bs->aio_notifiers, ban, list);
5824}
5825
5826void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
5827 void (*attached_aio_context)(AioContext *,
5828 void *),
5829 void (*detach_aio_context)(void *),
5830 void *opaque)
5831{
5832 BdrvAioNotifier *ban, *ban_next;
5833
5834 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
5835 if (ban->attached_aio_context == attached_aio_context &&
5836 ban->detach_aio_context == detach_aio_context &&
5837 ban->opaque == opaque)
5838 {
5839 QLIST_REMOVE(ban, list);
5840 g_free(ban);
5841
5842 return;
5843 }
5844 }
5845
5846 abort();
5847}
5848
Stefan Hajnoczid616b222013-06-24 17:13:10 +02005849void bdrv_add_before_write_notifier(BlockDriverState *bs,
5850 NotifierWithReturn *notifier)
5851{
5852 notifier_with_return_list_add(&bs->before_write_notifiers, notifier);
5853}
Max Reitz6f176b42013-09-03 10:09:50 +02005854
Chunyan Liuc282e1f2014-06-05 17:21:11 +08005855int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts)
Max Reitz6f176b42013-09-03 10:09:50 +02005856{
Chunyan Liuc282e1f2014-06-05 17:21:11 +08005857 if (!bs->drv->bdrv_amend_options) {
Max Reitz6f176b42013-09-03 10:09:50 +02005858 return -ENOTSUP;
5859 }
Chunyan Liuc282e1f2014-06-05 17:21:11 +08005860 return bs->drv->bdrv_amend_options(bs, opts);
Max Reitz6f176b42013-09-03 10:09:50 +02005861}
Benoît Canetf6186f42013-10-02 14:33:48 +02005862
Benoît Canetb5042a32014-03-03 19:11:34 +01005863/* This function will be called by the bdrv_recurse_is_first_non_filter method
5864 * of block filter and by bdrv_is_first_non_filter.
5865 * It is used to test if the given bs is the candidate or recurse more in the
5866 * node graph.
Benoît Canet212a5a82014-01-23 21:31:36 +01005867 */
Benoît Canet212a5a82014-01-23 21:31:36 +01005868bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
5869 BlockDriverState *candidate)
Benoît Canetf6186f42013-10-02 14:33:48 +02005870{
Benoît Canetb5042a32014-03-03 19:11:34 +01005871 /* return false if basic checks fails */
5872 if (!bs || !bs->drv) {
5873 return false;
5874 }
5875
5876 /* the code reached a non block filter driver -> check if the bs is
5877 * the same as the candidate. It's the recursion termination condition.
5878 */
5879 if (!bs->drv->is_filter) {
5880 return bs == candidate;
5881 }
5882 /* Down this path the driver is a block filter driver */
5883
5884 /* If the block filter recursion method is defined use it to recurse down
5885 * the node graph.
5886 */
5887 if (bs->drv->bdrv_recurse_is_first_non_filter) {
Benoît Canet212a5a82014-01-23 21:31:36 +01005888 return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate);
5889 }
5890
Benoît Canetb5042a32014-03-03 19:11:34 +01005891 /* the driver is a block filter but don't allow to recurse -> return false
5892 */
5893 return false;
Benoît Canet212a5a82014-01-23 21:31:36 +01005894}
5895
5896/* This function checks if the candidate is the first non filter bs down it's
5897 * bs chain. Since we don't have pointers to parents it explore all bs chains
5898 * from the top. Some filters can choose not to pass down the recursion.
5899 */
5900bool bdrv_is_first_non_filter(BlockDriverState *candidate)
5901{
5902 BlockDriverState *bs;
5903
5904 /* walk down the bs forest recursively */
5905 QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
5906 bool perm;
5907
Benoît Canetb5042a32014-03-03 19:11:34 +01005908 /* try to recurse in this top level bs */
Kevin Wolfe6dc8a12014-02-04 11:45:31 +01005909 perm = bdrv_recurse_is_first_non_filter(bs, candidate);
Benoît Canet212a5a82014-01-23 21:31:36 +01005910
5911 /* candidate is the first non filter */
5912 if (perm) {
5913 return true;
5914 }
5915 }
5916
5917 return false;
Benoît Canetf6186f42013-10-02 14:33:48 +02005918}
Benoît Canet09158f02014-06-27 18:25:25 +02005919
5920BlockDriverState *check_to_replace_node(const char *node_name, Error **errp)
5921{
5922 BlockDriverState *to_replace_bs = bdrv_find_node(node_name);
5923 if (!to_replace_bs) {
5924 error_setg(errp, "Node name '%s' not found", node_name);
5925 return NULL;
5926 }
5927
5928 if (bdrv_op_is_blocked(to_replace_bs, BLOCK_OP_TYPE_REPLACE, errp)) {
5929 return NULL;
5930 }
5931
5932 /* We don't want arbitrary node of the BDS chain to be replaced only the top
5933 * most non filter in order to prevent data corruption.
5934 * Another benefit is that this tests exclude backing files which are
5935 * blocked by the backing blockers.
5936 */
5937 if (!bdrv_is_first_non_filter(to_replace_bs)) {
5938 error_setg(errp, "Only top most non filter can be replaced");
5939 return NULL;
5940 }
5941
5942 return to_replace_bs;
5943}
Ming Lei448ad912014-07-04 18:04:33 +08005944
5945void bdrv_io_plug(BlockDriverState *bs)
5946{
5947 BlockDriver *drv = bs->drv;
5948 if (drv && drv->bdrv_io_plug) {
5949 drv->bdrv_io_plug(bs);
5950 } else if (bs->file) {
5951 bdrv_io_plug(bs->file);
5952 }
5953}
5954
5955void bdrv_io_unplug(BlockDriverState *bs)
5956{
5957 BlockDriver *drv = bs->drv;
5958 if (drv && drv->bdrv_io_unplug) {
5959 drv->bdrv_io_unplug(bs);
5960 } else if (bs->file) {
5961 bdrv_io_unplug(bs->file);
5962 }
5963}
5964
5965void bdrv_flush_io_queue(BlockDriverState *bs)
5966{
5967 BlockDriver *drv = bs->drv;
5968 if (drv && drv->bdrv_flush_io_queue) {
5969 drv->bdrv_flush_io_queue(bs);
5970 } else if (bs->file) {
5971 bdrv_flush_io_queue(bs->file);
5972 }
5973}
Max Reitz91af7012014-07-18 20:24:56 +02005974
5975static bool append_open_options(QDict *d, BlockDriverState *bs)
5976{
5977 const QDictEntry *entry;
5978 bool found_any = false;
5979
5980 for (entry = qdict_first(bs->options); entry;
5981 entry = qdict_next(bs->options, entry))
5982 {
5983 /* Only take options for this level and exclude all non-driver-specific
5984 * options */
5985 if (!strchr(qdict_entry_key(entry), '.') &&
5986 strcmp(qdict_entry_key(entry), "node-name"))
5987 {
5988 qobject_incref(qdict_entry_value(entry));
5989 qdict_put_obj(d, qdict_entry_key(entry), qdict_entry_value(entry));
5990 found_any = true;
5991 }
5992 }
5993
5994 return found_any;
5995}
5996
5997/* Updates the following BDS fields:
5998 * - exact_filename: A filename which may be used for opening a block device
5999 * which (mostly) equals the given BDS (even without any
6000 * other options; so reading and writing must return the same
6001 * results, but caching etc. may be different)
6002 * - full_open_options: Options which, when given when opening a block device
6003 * (without a filename), result in a BDS (mostly)
6004 * equalling the given one
6005 * - filename: If exact_filename is set, it is copied here. Otherwise,
6006 * full_open_options is converted to a JSON object, prefixed with
6007 * "json:" (for use through the JSON pseudo protocol) and put here.
6008 */
6009void bdrv_refresh_filename(BlockDriverState *bs)
6010{
6011 BlockDriver *drv = bs->drv;
6012 QDict *opts;
6013
6014 if (!drv) {
6015 return;
6016 }
6017
6018 /* This BDS's file name will most probably depend on its file's name, so
6019 * refresh that first */
6020 if (bs->file) {
6021 bdrv_refresh_filename(bs->file);
6022 }
6023
6024 if (drv->bdrv_refresh_filename) {
6025 /* Obsolete information is of no use here, so drop the old file name
6026 * information before refreshing it */
6027 bs->exact_filename[0] = '\0';
6028 if (bs->full_open_options) {
6029 QDECREF(bs->full_open_options);
6030 bs->full_open_options = NULL;
6031 }
6032
6033 drv->bdrv_refresh_filename(bs);
6034 } else if (bs->file) {
6035 /* Try to reconstruct valid information from the underlying file */
6036 bool has_open_options;
6037
6038 bs->exact_filename[0] = '\0';
6039 if (bs->full_open_options) {
6040 QDECREF(bs->full_open_options);
6041 bs->full_open_options = NULL;
6042 }
6043
6044 opts = qdict_new();
6045 has_open_options = append_open_options(opts, bs);
6046
6047 /* If no specific options have been given for this BDS, the filename of
6048 * the underlying file should suffice for this one as well */
6049 if (bs->file->exact_filename[0] && !has_open_options) {
6050 strcpy(bs->exact_filename, bs->file->exact_filename);
6051 }
6052 /* Reconstructing the full options QDict is simple for most format block
6053 * drivers, as long as the full options are known for the underlying
6054 * file BDS. The full options QDict of that file BDS should somehow
6055 * contain a representation of the filename, therefore the following
6056 * suffices without querying the (exact_)filename of this BDS. */
6057 if (bs->file->full_open_options) {
6058 qdict_put_obj(opts, "driver",
6059 QOBJECT(qstring_from_str(drv->format_name)));
6060 QINCREF(bs->file->full_open_options);
6061 qdict_put_obj(opts, "file", QOBJECT(bs->file->full_open_options));
6062
6063 bs->full_open_options = opts;
6064 } else {
6065 QDECREF(opts);
6066 }
6067 } else if (!bs->full_open_options && qdict_size(bs->options)) {
6068 /* There is no underlying file BDS (at least referenced by BDS.file),
6069 * so the full options QDict should be equal to the options given
6070 * specifically for this block device when it was opened (plus the
6071 * driver specification).
6072 * Because those options don't change, there is no need to update
6073 * full_open_options when it's already set. */
6074
6075 opts = qdict_new();
6076 append_open_options(opts, bs);
6077 qdict_put_obj(opts, "driver",
6078 QOBJECT(qstring_from_str(drv->format_name)));
6079
6080 if (bs->exact_filename[0]) {
6081 /* This may not work for all block protocol drivers (some may
6082 * require this filename to be parsed), but we have to find some
6083 * default solution here, so just include it. If some block driver
6084 * does not support pure options without any filename at all or
6085 * needs some special format of the options QDict, it needs to
6086 * implement the driver-specific bdrv_refresh_filename() function.
6087 */
6088 qdict_put_obj(opts, "filename",
6089 QOBJECT(qstring_from_str(bs->exact_filename)));
6090 }
6091
6092 bs->full_open_options = opts;
6093 }
6094
6095 if (bs->exact_filename[0]) {
6096 pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename);
6097 } else if (bs->full_open_options) {
6098 QString *json = qobject_to_json(QOBJECT(bs->full_open_options));
6099 snprintf(bs->filename, sizeof(bs->filename), "json:%s",
6100 qstring_get_str(json));
6101 QDECREF(json);
6102 }
6103}
Benoît Canet5366d0c2014-09-05 15:46:18 +02006104
6105/* This accessor function purpose is to allow the device models to access the
6106 * BlockAcctStats structure embedded inside a BlockDriverState without being
6107 * aware of the BlockDriverState structure layout.
6108 * It will go away when the BlockAcctStats structure will be moved inside
6109 * the device models.
6110 */
6111BlockAcctStats *bdrv_get_stats(BlockDriverState *bs)
6112{
6113 return &bs->stats;
6114}