blob: fe74dddb134d240f2857625626a922232303d02d [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"
aliguori376253e2009-03-05 23:01:23 +000027#include "monitor.h"
bellardea2384d2004-08-01 21:59:26 +000028#include "block_int.h"
Anthony Liguori5efa9d52009-05-09 17:03:42 -050029#include "module.h"
Luiz Capitulinof795e742011-10-21 16:05:43 -020030#include "qjson.h"
Kevin Wolf68485422011-06-30 10:05:46 +020031#include "qemu-coroutine.h"
Luiz Capitulinob2023812011-09-21 17:16:47 -030032#include "qmp-commands.h"
Zhi Yong Wu0563e192011-11-03 16:57:25 +080033#include "qemu-timer.h"
bellardfc01f7e2003-06-30 10:03:06 +000034
Juan Quintela71e72a12009-07-27 16:12:56 +020035#ifdef CONFIG_BSD
bellard7674e7b2005-04-26 21:59:26 +000036#include <sys/types.h>
37#include <sys/stat.h>
38#include <sys/ioctl.h>
Blue Swirl72cf2d42009-09-12 07:36:22 +000039#include <sys/queue.h>
blueswir1c5e97232009-03-07 20:06:23 +000040#ifndef __DragonFly__
bellard7674e7b2005-04-26 21:59:26 +000041#include <sys/disk.h>
42#endif
blueswir1c5e97232009-03-07 20:06:23 +000043#endif
bellard7674e7b2005-04-26 21:59:26 +000044
aliguori49dc7682009-03-08 16:26:59 +000045#ifdef _WIN32
46#include <windows.h>
47#endif
48
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +010049#define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */
50
Stefan Hajnoczi470c0502012-01-18 14:40:42 +000051typedef enum {
52 BDRV_REQ_COPY_ON_READ = 0x1,
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +000053 BDRV_REQ_ZERO_WRITE = 0x2,
Stefan Hajnoczi470c0502012-01-18 14:40:42 +000054} BdrvRequestFlags;
55
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +020056static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load);
aliguorif141eaf2009-04-07 18:43:24 +000057static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
58 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
aliguoric87c0672009-04-07 18:43:20 +000059 BlockDriverCompletionFunc *cb, void *opaque);
aliguorif141eaf2009-04-07 18:43:24 +000060static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
61 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
pbrookce1a14d2006-08-07 02:38:06 +000062 BlockDriverCompletionFunc *cb, void *opaque);
Kevin Wolff9f05dc2011-07-15 13:50:26 +020063static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
64 int64_t sector_num, int nb_sectors,
65 QEMUIOVector *iov);
66static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
67 int64_t sector_num, int nb_sectors,
68 QEMUIOVector *iov);
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +010069static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
Stefan Hajnoczi470c0502012-01-18 14:40:42 +000070 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
71 BdrvRequestFlags flags);
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +010072static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +000073 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
74 BdrvRequestFlags flags);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +010075static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
76 int64_t sector_num,
77 QEMUIOVector *qiov,
78 int nb_sectors,
79 BlockDriverCompletionFunc *cb,
80 void *opaque,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +010081 bool is_write);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +010082static void coroutine_fn bdrv_co_do_rw(void *opaque);
Kevin Wolf621f0582012-03-20 15:12:58 +010083static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
84 int64_t sector_num, int nb_sectors);
bellardec530c82006-04-25 22:36:06 +000085
Zhi Yong Wu98f90db2011-11-08 13:00:14 +080086static bool bdrv_exceed_bps_limits(BlockDriverState *bs, int nb_sectors,
87 bool is_write, double elapsed_time, uint64_t *wait);
88static bool bdrv_exceed_iops_limits(BlockDriverState *bs, bool is_write,
89 double elapsed_time, uint64_t *wait);
90static bool bdrv_exceed_io_limits(BlockDriverState *bs, int nb_sectors,
91 bool is_write, int64_t *wait);
92
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +010093static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
94 QTAILQ_HEAD_INITIALIZER(bdrv_states);
blueswir17ee930d2008-09-17 19:04:14 +000095
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +010096static QLIST_HEAD(, BlockDriver) bdrv_drivers =
97 QLIST_HEAD_INITIALIZER(bdrv_drivers);
bellardea2384d2004-08-01 21:59:26 +000098
Markus Armbrusterf9092b12010-06-25 10:33:39 +020099/* The device to use for VM snapshots */
100static BlockDriverState *bs_snapshots;
101
Markus Armbrustereb852012009-10-27 18:41:44 +0100102/* If non-zero, use only whitelisted block drivers */
103static int use_bdrv_whitelist;
104
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000105#ifdef _WIN32
106static int is_windows_drive_prefix(const char *filename)
107{
108 return (((filename[0] >= 'a' && filename[0] <= 'z') ||
109 (filename[0] >= 'A' && filename[0] <= 'Z')) &&
110 filename[1] == ':');
111}
112
113int is_windows_drive(const char *filename)
114{
115 if (is_windows_drive_prefix(filename) &&
116 filename[2] == '\0')
117 return 1;
118 if (strstart(filename, "\\\\.\\", NULL) ||
119 strstart(filename, "//./", NULL))
120 return 1;
121 return 0;
122}
123#endif
124
Zhi Yong Wu0563e192011-11-03 16:57:25 +0800125/* throttling disk I/O limits */
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800126void bdrv_io_limits_disable(BlockDriverState *bs)
127{
128 bs->io_limits_enabled = false;
129
130 while (qemu_co_queue_next(&bs->throttled_reqs));
131
132 if (bs->block_timer) {
133 qemu_del_timer(bs->block_timer);
134 qemu_free_timer(bs->block_timer);
135 bs->block_timer = NULL;
136 }
137
138 bs->slice_start = 0;
139 bs->slice_end = 0;
140 bs->slice_time = 0;
141 memset(&bs->io_base, 0, sizeof(bs->io_base));
142}
143
Zhi Yong Wu0563e192011-11-03 16:57:25 +0800144static void bdrv_block_timer(void *opaque)
145{
146 BlockDriverState *bs = opaque;
147
148 qemu_co_queue_next(&bs->throttled_reqs);
149}
150
151void bdrv_io_limits_enable(BlockDriverState *bs)
152{
153 qemu_co_queue_init(&bs->throttled_reqs);
154 bs->block_timer = qemu_new_timer_ns(vm_clock, bdrv_block_timer, bs);
155 bs->slice_time = 5 * BLOCK_IO_SLICE_TIME;
156 bs->slice_start = qemu_get_clock_ns(vm_clock);
157 bs->slice_end = bs->slice_start + bs->slice_time;
158 memset(&bs->io_base, 0, sizeof(bs->io_base));
159 bs->io_limits_enabled = true;
160}
161
162bool bdrv_io_limits_enabled(BlockDriverState *bs)
163{
164 BlockIOLimit *io_limits = &bs->io_limits;
165 return io_limits->bps[BLOCK_IO_LIMIT_READ]
166 || io_limits->bps[BLOCK_IO_LIMIT_WRITE]
167 || io_limits->bps[BLOCK_IO_LIMIT_TOTAL]
168 || io_limits->iops[BLOCK_IO_LIMIT_READ]
169 || io_limits->iops[BLOCK_IO_LIMIT_WRITE]
170 || io_limits->iops[BLOCK_IO_LIMIT_TOTAL];
171}
172
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800173static void bdrv_io_limits_intercept(BlockDriverState *bs,
174 bool is_write, int nb_sectors)
175{
176 int64_t wait_time = -1;
177
178 if (!qemu_co_queue_empty(&bs->throttled_reqs)) {
179 qemu_co_queue_wait(&bs->throttled_reqs);
180 }
181
182 /* In fact, we hope to keep each request's timing, in FIFO mode. The next
183 * throttled requests will not be dequeued until the current request is
184 * allowed to be serviced. So if the current request still exceeds the
185 * limits, it will be inserted to the head. All requests followed it will
186 * be still in throttled_reqs queue.
187 */
188
189 while (bdrv_exceed_io_limits(bs, nb_sectors, is_write, &wait_time)) {
190 qemu_mod_timer(bs->block_timer,
191 wait_time + qemu_get_clock_ns(vm_clock));
192 qemu_co_queue_wait_insert_head(&bs->throttled_reqs);
193 }
194
195 qemu_co_queue_next(&bs->throttled_reqs);
196}
197
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000198/* check if the path starts with "<protocol>:" */
199static int path_has_protocol(const char *path)
200{
201#ifdef _WIN32
202 if (is_windows_drive(path) ||
203 is_windows_drive_prefix(path)) {
204 return 0;
205 }
206#endif
207
208 return strchr(path, ':') != NULL;
209}
210
bellard83f64092006-08-01 16:21:11 +0000211int path_is_absolute(const char *path)
212{
213 const char *p;
bellard21664422007-01-07 18:22:37 +0000214#ifdef _WIN32
215 /* specific case for names like: "\\.\d:" */
216 if (*path == '/' || *path == '\\')
217 return 1;
218#endif
bellard83f64092006-08-01 16:21:11 +0000219 p = strchr(path, ':');
220 if (p)
221 p++;
222 else
223 p = path;
bellard3b9f94e2007-01-07 17:27:07 +0000224#ifdef _WIN32
225 return (*p == '/' || *p == '\\');
226#else
227 return (*p == '/');
228#endif
bellard83f64092006-08-01 16:21:11 +0000229}
230
231/* if filename is absolute, just copy it to dest. Otherwise, build a
232 path to it by considering it is relative to base_path. URL are
233 supported. */
234void path_combine(char *dest, int dest_size,
235 const char *base_path,
236 const char *filename)
237{
238 const char *p, *p1;
239 int len;
240
241 if (dest_size <= 0)
242 return;
243 if (path_is_absolute(filename)) {
244 pstrcpy(dest, dest_size, filename);
245 } else {
246 p = strchr(base_path, ':');
247 if (p)
248 p++;
249 else
250 p = base_path;
bellard3b9f94e2007-01-07 17:27:07 +0000251 p1 = strrchr(base_path, '/');
252#ifdef _WIN32
253 {
254 const char *p2;
255 p2 = strrchr(base_path, '\\');
256 if (!p1 || p2 > p1)
257 p1 = p2;
258 }
259#endif
bellard83f64092006-08-01 16:21:11 +0000260 if (p1)
261 p1++;
262 else
263 p1 = base_path;
264 if (p1 > p)
265 p = p1;
266 len = p - base_path;
267 if (len > dest_size - 1)
268 len = dest_size - 1;
269 memcpy(dest, base_path, len);
270 dest[len] = '\0';
271 pstrcat(dest, dest_size, filename);
272 }
273}
274
Anthony Liguori5efa9d52009-05-09 17:03:42 -0500275void bdrv_register(BlockDriver *bdrv)
bellardea2384d2004-08-01 21:59:26 +0000276{
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +0100277 /* Block drivers without coroutine functions need emulation */
278 if (!bdrv->bdrv_co_readv) {
Kevin Wolff9f05dc2011-07-15 13:50:26 +0200279 bdrv->bdrv_co_readv = bdrv_co_readv_em;
280 bdrv->bdrv_co_writev = bdrv_co_writev_em;
281
Stefan Hajnoczif8c35c12011-10-13 21:09:31 +0100282 /* bdrv_co_readv_em()/brdv_co_writev_em() work in terms of aio, so if
283 * the block driver lacks aio we need to emulate that too.
284 */
Kevin Wolff9f05dc2011-07-15 13:50:26 +0200285 if (!bdrv->bdrv_aio_readv) {
286 /* add AIO emulation layer */
287 bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
288 bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
Kevin Wolff9f05dc2011-07-15 13:50:26 +0200289 }
bellard83f64092006-08-01 16:21:11 +0000290 }
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +0200291
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100292 QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
bellardea2384d2004-08-01 21:59:26 +0000293}
bellardb3380822004-03-14 21:38:54 +0000294
295/* create a new block device (by default it is empty) */
296BlockDriverState *bdrv_new(const char *device_name)
bellardfc01f7e2003-06-30 10:03:06 +0000297{
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +0100298 BlockDriverState *bs;
bellardb3380822004-03-14 21:38:54 +0000299
Anthony Liguori7267c092011-08-20 22:09:37 -0500300 bs = g_malloc0(sizeof(BlockDriverState));
bellardb3380822004-03-14 21:38:54 +0000301 pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
bellardea2384d2004-08-01 21:59:26 +0000302 if (device_name[0] != '\0') {
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +0100303 QTAILQ_INSERT_TAIL(&bdrv_states, bs, list);
bellardea2384d2004-08-01 21:59:26 +0000304 }
Luiz Capitulino28a72822011-09-26 17:43:50 -0300305 bdrv_iostatus_disable(bs);
bellardb3380822004-03-14 21:38:54 +0000306 return bs;
307}
308
bellardea2384d2004-08-01 21:59:26 +0000309BlockDriver *bdrv_find_format(const char *format_name)
310{
311 BlockDriver *drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100312 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
313 if (!strcmp(drv1->format_name, format_name)) {
bellardea2384d2004-08-01 21:59:26 +0000314 return drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100315 }
bellardea2384d2004-08-01 21:59:26 +0000316 }
317 return NULL;
318}
319
Markus Armbrustereb852012009-10-27 18:41:44 +0100320static int bdrv_is_whitelisted(BlockDriver *drv)
321{
322 static const char *whitelist[] = {
323 CONFIG_BDRV_WHITELIST
324 };
325 const char **p;
326
327 if (!whitelist[0])
328 return 1; /* no whitelist, anything goes */
329
330 for (p = whitelist; *p; p++) {
331 if (!strcmp(drv->format_name, *p)) {
332 return 1;
333 }
334 }
335 return 0;
336}
337
338BlockDriver *bdrv_find_whitelisted_format(const char *format_name)
339{
340 BlockDriver *drv = bdrv_find_format(format_name);
341 return drv && bdrv_is_whitelisted(drv) ? drv : NULL;
342}
343
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200344int bdrv_create(BlockDriver *drv, const char* filename,
345 QEMUOptionParameter *options)
bellardea2384d2004-08-01 21:59:26 +0000346{
347 if (!drv->bdrv_create)
348 return -ENOTSUP;
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200349
350 return drv->bdrv_create(filename, options);
bellardea2384d2004-08-01 21:59:26 +0000351}
352
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200353int bdrv_create_file(const char* filename, QEMUOptionParameter *options)
354{
355 BlockDriver *drv;
356
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900357 drv = bdrv_find_protocol(filename);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200358 if (drv == NULL) {
Stefan Hajnoczi16905d72010-11-30 15:14:14 +0000359 return -ENOENT;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200360 }
361
362 return bdrv_create(drv, filename, options);
363}
364
bellardd5249392004-08-03 21:14:23 +0000365#ifdef _WIN32
bellard95389c82005-12-18 18:28:15 +0000366void get_tmp_filename(char *filename, int size)
bellardd5249392004-08-03 21:14:23 +0000367{
bellard3b9f94e2007-01-07 17:27:07 +0000368 char temp_dir[MAX_PATH];
ths3b46e622007-09-17 08:09:54 +0000369
bellard3b9f94e2007-01-07 17:27:07 +0000370 GetTempPath(MAX_PATH, temp_dir);
371 GetTempFileName(temp_dir, "qem", 0, filename);
bellardd5249392004-08-03 21:14:23 +0000372}
373#else
bellard95389c82005-12-18 18:28:15 +0000374void get_tmp_filename(char *filename, int size)
bellardea2384d2004-08-01 21:59:26 +0000375{
376 int fd;
blueswir17ccfb2e2008-09-14 06:45:34 +0000377 const char *tmpdir;
bellardd5249392004-08-03 21:14:23 +0000378 /* XXX: race condition possible */
aurel320badc1e2008-03-10 00:05:34 +0000379 tmpdir = getenv("TMPDIR");
380 if (!tmpdir)
381 tmpdir = "/tmp";
382 snprintf(filename, size, "%s/vl.XXXXXX", tmpdir);
bellardea2384d2004-08-01 21:59:26 +0000383 fd = mkstemp(filename);
384 close(fd);
385}
bellardd5249392004-08-03 21:14:23 +0000386#endif
bellardea2384d2004-08-01 21:59:26 +0000387
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200388/*
389 * Detect host devices. By convention, /dev/cdrom[N] is always
390 * recognized as a host CDROM.
391 */
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200392static BlockDriver *find_hdev_driver(const char *filename)
393{
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200394 int score_max = 0, score;
395 BlockDriver *drv = NULL, *d;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200396
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100397 QLIST_FOREACH(d, &bdrv_drivers, list) {
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200398 if (d->bdrv_probe_device) {
399 score = d->bdrv_probe_device(filename);
400 if (score > score_max) {
401 score_max = score;
402 drv = d;
403 }
404 }
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200405 }
406
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200407 return drv;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200408}
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200409
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900410BlockDriver *bdrv_find_protocol(const char *filename)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200411{
412 BlockDriver *drv1;
413 char protocol[128];
414 int len;
415 const char *p;
416
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200417 /* TODO Drivers without bdrv_file_open must be specified explicitly */
418
Christoph Hellwig39508e72010-06-23 12:25:17 +0200419 /*
420 * XXX(hch): we really should not let host device detection
421 * override an explicit protocol specification, but moving this
422 * later breaks access to device names with colons in them.
423 * Thanks to the brain-dead persistent naming schemes on udev-
424 * based Linux systems those actually are quite common.
425 */
426 drv1 = find_hdev_driver(filename);
427 if (drv1) {
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200428 return drv1;
429 }
Christoph Hellwig39508e72010-06-23 12:25:17 +0200430
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000431 if (!path_has_protocol(filename)) {
Christoph Hellwig39508e72010-06-23 12:25:17 +0200432 return bdrv_find_format("file");
433 }
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000434 p = strchr(filename, ':');
435 assert(p != NULL);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200436 len = p - filename;
437 if (len > sizeof(protocol) - 1)
438 len = sizeof(protocol) - 1;
439 memcpy(protocol, filename, len);
440 protocol[len] = '\0';
441 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
442 if (drv1->protocol_name &&
443 !strcmp(drv1->protocol_name, protocol)) {
444 return drv1;
445 }
446 }
447 return NULL;
448}
449
Stefan Weilc98ac352010-07-21 21:51:51 +0200450static int find_image_format(const char *filename, BlockDriver **pdrv)
bellardea2384d2004-08-01 21:59:26 +0000451{
bellard83f64092006-08-01 16:21:11 +0000452 int ret, score, score_max;
bellardea2384d2004-08-01 21:59:26 +0000453 BlockDriver *drv1, *drv;
bellard83f64092006-08-01 16:21:11 +0000454 uint8_t buf[2048];
455 BlockDriverState *bs;
ths3b46e622007-09-17 08:09:54 +0000456
Naphtali Spreif5edb012010-01-17 16:48:13 +0200457 ret = bdrv_file_open(&bs, filename, 0);
Stefan Weilc98ac352010-07-21 21:51:51 +0200458 if (ret < 0) {
459 *pdrv = NULL;
460 return ret;
461 }
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700462
Kevin Wolf08a00552010-06-01 18:37:31 +0200463 /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
464 if (bs->sg || !bdrv_is_inserted(bs)) {
Nicholas A. Bellinger1a396852010-05-27 08:56:28 -0700465 bdrv_delete(bs);
Stefan Weilc98ac352010-07-21 21:51:51 +0200466 drv = bdrv_find_format("raw");
467 if (!drv) {
468 ret = -ENOENT;
469 }
470 *pdrv = drv;
471 return ret;
Nicholas A. Bellinger1a396852010-05-27 08:56:28 -0700472 }
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700473
bellard83f64092006-08-01 16:21:11 +0000474 ret = bdrv_pread(bs, 0, buf, sizeof(buf));
475 bdrv_delete(bs);
476 if (ret < 0) {
Stefan Weilc98ac352010-07-21 21:51:51 +0200477 *pdrv = NULL;
478 return ret;
bellard83f64092006-08-01 16:21:11 +0000479 }
480
bellardea2384d2004-08-01 21:59:26 +0000481 score_max = 0;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200482 drv = NULL;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100483 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
bellard83f64092006-08-01 16:21:11 +0000484 if (drv1->bdrv_probe) {
485 score = drv1->bdrv_probe(buf, ret, filename);
486 if (score > score_max) {
487 score_max = score;
488 drv = drv1;
489 }
bellardea2384d2004-08-01 21:59:26 +0000490 }
491 }
Stefan Weilc98ac352010-07-21 21:51:51 +0200492 if (!drv) {
493 ret = -ENOENT;
494 }
495 *pdrv = drv;
496 return ret;
bellardea2384d2004-08-01 21:59:26 +0000497}
498
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100499/**
500 * Set the current 'total_sectors' value
501 */
502static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
503{
504 BlockDriver *drv = bs->drv;
505
Nicholas Bellinger396759a2010-05-17 09:46:04 -0700506 /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
507 if (bs->sg)
508 return 0;
509
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100510 /* query actual device if possible, otherwise just trust the hint */
511 if (drv->bdrv_getlength) {
512 int64_t length = drv->bdrv_getlength(bs);
513 if (length < 0) {
514 return length;
515 }
516 hint = length >> BDRV_SECTOR_BITS;
517 }
518
519 bs->total_sectors = hint;
520 return 0;
521}
522
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100523/**
524 * Set open flags for a given cache mode
525 *
526 * Return 0 on success, -1 if the cache mode was invalid.
527 */
528int bdrv_parse_cache_flags(const char *mode, int *flags)
529{
530 *flags &= ~BDRV_O_CACHE_MASK;
531
532 if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
533 *flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
Stefan Hajnoczi92196b22011-08-04 12:26:52 +0100534 } else if (!strcmp(mode, "directsync")) {
535 *flags |= BDRV_O_NOCACHE;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100536 } else if (!strcmp(mode, "writeback")) {
537 *flags |= BDRV_O_CACHE_WB;
538 } else if (!strcmp(mode, "unsafe")) {
539 *flags |= BDRV_O_CACHE_WB;
540 *flags |= BDRV_O_NO_FLUSH;
541 } else if (!strcmp(mode, "writethrough")) {
542 /* this is the default */
543 } else {
544 return -1;
545 }
546
547 return 0;
548}
549
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000550/**
551 * The copy-on-read flag is actually a reference count so multiple users may
552 * use the feature without worrying about clobbering its previous state.
553 * Copy-on-read stays enabled until all users have called to disable it.
554 */
555void bdrv_enable_copy_on_read(BlockDriverState *bs)
556{
557 bs->copy_on_read++;
558}
559
560void bdrv_disable_copy_on_read(BlockDriverState *bs)
561{
562 assert(bs->copy_on_read > 0);
563 bs->copy_on_read--;
564}
565
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200566/*
Kevin Wolf57915332010-04-14 15:24:50 +0200567 * Common part for opening disk images and files
568 */
569static int bdrv_open_common(BlockDriverState *bs, const char *filename,
570 int flags, BlockDriver *drv)
571{
572 int ret, open_flags;
573
574 assert(drv != NULL);
575
Stefan Hajnoczi28dcee12011-09-22 20:14:12 +0100576 trace_bdrv_open_common(bs, filename, flags, drv->format_name);
577
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200578 bs->file = NULL;
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100579 bs->total_sectors = 0;
Kevin Wolf57915332010-04-14 15:24:50 +0200580 bs->encrypted = 0;
581 bs->valid_key = 0;
Stefan Hajnoczi03f541b2011-10-27 10:54:28 +0100582 bs->sg = 0;
Kevin Wolf57915332010-04-14 15:24:50 +0200583 bs->open_flags = flags;
Stefan Hajnoczi03f541b2011-10-27 10:54:28 +0100584 bs->growable = 0;
Kevin Wolf57915332010-04-14 15:24:50 +0200585 bs->buffer_alignment = 512;
586
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000587 assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */
588 if ((flags & BDRV_O_RDWR) && (flags & BDRV_O_COPY_ON_READ)) {
589 bdrv_enable_copy_on_read(bs);
590 }
591
Kevin Wolf57915332010-04-14 15:24:50 +0200592 pstrcpy(bs->filename, sizeof(bs->filename), filename);
Stefan Hajnoczi03f541b2011-10-27 10:54:28 +0100593 bs->backing_file[0] = '\0';
Kevin Wolf57915332010-04-14 15:24:50 +0200594
595 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv)) {
596 return -ENOTSUP;
597 }
598
599 bs->drv = drv;
Anthony Liguori7267c092011-08-20 22:09:37 -0500600 bs->opaque = g_malloc0(drv->instance_size);
Kevin Wolf57915332010-04-14 15:24:50 +0200601
Stefan Hajnoczi03f541b2011-10-27 10:54:28 +0100602 bs->enable_write_cache = !!(flags & BDRV_O_CACHE_WB);
Kevin Wolf57915332010-04-14 15:24:50 +0200603
604 /*
605 * Clear flags that are internal to the block layer before opening the
606 * image.
607 */
608 open_flags = flags & ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
609
610 /*
Stefan Weilebabb672011-04-26 10:29:36 +0200611 * Snapshots should be writable.
Kevin Wolf57915332010-04-14 15:24:50 +0200612 */
613 if (bs->is_temporary) {
614 open_flags |= BDRV_O_RDWR;
615 }
616
Stefan Hajnoczie7c63792011-10-27 10:54:27 +0100617 bs->keep_read_only = bs->read_only = !(open_flags & BDRV_O_RDWR);
618
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200619 /* Open the image, either directly or using a protocol */
620 if (drv->bdrv_file_open) {
621 ret = drv->bdrv_file_open(bs, filename, open_flags);
622 } else {
623 ret = bdrv_file_open(&bs->file, filename, open_flags);
624 if (ret >= 0) {
625 ret = drv->bdrv_open(bs, open_flags);
626 }
627 }
628
Kevin Wolf57915332010-04-14 15:24:50 +0200629 if (ret < 0) {
630 goto free_and_fail;
631 }
632
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100633 ret = refresh_total_sectors(bs, bs->total_sectors);
634 if (ret < 0) {
635 goto free_and_fail;
Kevin Wolf57915332010-04-14 15:24:50 +0200636 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100637
Kevin Wolf57915332010-04-14 15:24:50 +0200638#ifndef _WIN32
639 if (bs->is_temporary) {
640 unlink(filename);
641 }
642#endif
643 return 0;
644
645free_and_fail:
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200646 if (bs->file) {
647 bdrv_delete(bs->file);
648 bs->file = NULL;
649 }
Anthony Liguori7267c092011-08-20 22:09:37 -0500650 g_free(bs->opaque);
Kevin Wolf57915332010-04-14 15:24:50 +0200651 bs->opaque = NULL;
652 bs->drv = NULL;
653 return ret;
654}
655
656/*
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200657 * Opens a file using a protocol (file, host_device, nbd, ...)
658 */
bellard83f64092006-08-01 16:21:11 +0000659int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
bellardb3380822004-03-14 21:38:54 +0000660{
bellard83f64092006-08-01 16:21:11 +0000661 BlockDriverState *bs;
Christoph Hellwig6db95602010-04-05 16:53:57 +0200662 BlockDriver *drv;
bellard83f64092006-08-01 16:21:11 +0000663 int ret;
664
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900665 drv = bdrv_find_protocol(filename);
Christoph Hellwig6db95602010-04-05 16:53:57 +0200666 if (!drv) {
667 return -ENOENT;
668 }
669
bellard83f64092006-08-01 16:21:11 +0000670 bs = bdrv_new("");
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200671 ret = bdrv_open_common(bs, filename, flags, drv);
bellard83f64092006-08-01 16:21:11 +0000672 if (ret < 0) {
673 bdrv_delete(bs);
674 return ret;
bellard3b0d4f62005-10-30 18:30:10 +0000675 }
aliguori71d07702009-03-03 17:37:16 +0000676 bs->growable = 1;
bellard83f64092006-08-01 16:21:11 +0000677 *pbs = bs;
678 return 0;
bellardea2384d2004-08-01 21:59:26 +0000679}
bellardfc01f7e2003-06-30 10:03:06 +0000680
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200681/*
682 * Opens a disk image (raw, qcow2, vmdk, ...)
683 */
Kevin Wolfd6e90982010-03-31 14:40:27 +0200684int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
685 BlockDriver *drv)
bellardea2384d2004-08-01 21:59:26 +0000686{
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200687 int ret;
Kevin Wolf2b572812011-10-26 11:03:01 +0200688 char tmp_filename[PATH_MAX];
bellard712e7872005-04-28 21:09:32 +0000689
bellard83f64092006-08-01 16:21:11 +0000690 if (flags & BDRV_O_SNAPSHOT) {
bellardea2384d2004-08-01 21:59:26 +0000691 BlockDriverState *bs1;
692 int64_t total_size;
aliguori7c96d462008-09-12 17:54:13 +0000693 int is_protocol = 0;
Kevin Wolf91a073a2009-05-27 14:48:06 +0200694 BlockDriver *bdrv_qcow2;
695 QEMUOptionParameter *options;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200696 char backing_filename[PATH_MAX];
ths3b46e622007-09-17 08:09:54 +0000697
bellardea2384d2004-08-01 21:59:26 +0000698 /* if snapshot, we create a temporary backing file and open it
699 instead of opening 'filename' directly */
700
701 /* if there is a backing file, use it */
702 bs1 = bdrv_new("");
Kevin Wolfd6e90982010-03-31 14:40:27 +0200703 ret = bdrv_open(bs1, filename, 0, drv);
aliguori51d7c002009-03-05 23:00:29 +0000704 if (ret < 0) {
bellardea2384d2004-08-01 21:59:26 +0000705 bdrv_delete(bs1);
aliguori51d7c002009-03-05 23:00:29 +0000706 return ret;
bellardea2384d2004-08-01 21:59:26 +0000707 }
Jes Sorensen3e829902010-05-27 16:20:30 +0200708 total_size = bdrv_getlength(bs1) & BDRV_SECTOR_MASK;
aliguori7c96d462008-09-12 17:54:13 +0000709
710 if (bs1->drv && bs1->drv->protocol_name)
711 is_protocol = 1;
712
bellardea2384d2004-08-01 21:59:26 +0000713 bdrv_delete(bs1);
ths3b46e622007-09-17 08:09:54 +0000714
bellardea2384d2004-08-01 21:59:26 +0000715 get_tmp_filename(tmp_filename, sizeof(tmp_filename));
aliguori7c96d462008-09-12 17:54:13 +0000716
717 /* Real path is meaningless for protocols */
718 if (is_protocol)
719 snprintf(backing_filename, sizeof(backing_filename),
720 "%s", filename);
Kirill A. Shutemov114cdfa2009-12-25 18:19:22 +0000721 else if (!realpath(filename, backing_filename))
722 return -errno;
aliguori7c96d462008-09-12 17:54:13 +0000723
Kevin Wolf91a073a2009-05-27 14:48:06 +0200724 bdrv_qcow2 = bdrv_find_format("qcow2");
725 options = parse_option_parameters("", bdrv_qcow2->create_options, NULL);
726
Jes Sorensen3e829902010-05-27 16:20:30 +0200727 set_option_parameter_int(options, BLOCK_OPT_SIZE, total_size);
Kevin Wolf91a073a2009-05-27 14:48:06 +0200728 set_option_parameter(options, BLOCK_OPT_BACKING_FILE, backing_filename);
729 if (drv) {
730 set_option_parameter(options, BLOCK_OPT_BACKING_FMT,
731 drv->format_name);
732 }
733
734 ret = bdrv_create(bdrv_qcow2, tmp_filename, options);
Jan Kiszkad7487682010-04-29 18:24:50 +0200735 free_option_parameters(options);
aliguori51d7c002009-03-05 23:00:29 +0000736 if (ret < 0) {
737 return ret;
bellardea2384d2004-08-01 21:59:26 +0000738 }
Kevin Wolf91a073a2009-05-27 14:48:06 +0200739
bellardea2384d2004-08-01 21:59:26 +0000740 filename = tmp_filename;
Kevin Wolf91a073a2009-05-27 14:48:06 +0200741 drv = bdrv_qcow2;
bellardea2384d2004-08-01 21:59:26 +0000742 bs->is_temporary = 1;
743 }
bellard712e7872005-04-28 21:09:32 +0000744
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200745 /* Find the right image format driver */
Christoph Hellwig6db95602010-04-05 16:53:57 +0200746 if (!drv) {
Stefan Weilc98ac352010-07-21 21:51:51 +0200747 ret = find_image_format(filename, &drv);
aliguori51d7c002009-03-05 23:00:29 +0000748 }
Christoph Hellwig69873072010-01-20 18:13:25 +0100749
aliguori51d7c002009-03-05 23:00:29 +0000750 if (!drv) {
aliguori51d7c002009-03-05 23:00:29 +0000751 goto unlink_and_fail;
bellardea2384d2004-08-01 21:59:26 +0000752 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200753
754 /* Open the image */
755 ret = bdrv_open_common(bs, filename, flags, drv);
756 if (ret < 0) {
Christoph Hellwig69873072010-01-20 18:13:25 +0100757 goto unlink_and_fail;
758 }
759
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200760 /* If there is a backing file, use it */
761 if ((flags & BDRV_O_NO_BACKING) == 0 && bs->backing_file[0] != '\0') {
762 char backing_filename[PATH_MAX];
763 int back_flags;
764 BlockDriver *back_drv = NULL;
765
766 bs->backing_hd = bdrv_new("");
Stefan Hajnoczidf2dbb42010-12-02 16:54:13 +0000767
768 if (path_has_protocol(bs->backing_file)) {
769 pstrcpy(backing_filename, sizeof(backing_filename),
770 bs->backing_file);
771 } else {
772 path_combine(backing_filename, sizeof(backing_filename),
773 filename, bs->backing_file);
774 }
775
776 if (bs->backing_format[0] != '\0') {
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200777 back_drv = bdrv_find_format(bs->backing_format);
Stefan Hajnoczidf2dbb42010-12-02 16:54:13 +0000778 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200779
780 /* backing files always opened read-only */
781 back_flags =
782 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
783
784 ret = bdrv_open(bs->backing_hd, backing_filename, back_flags, back_drv);
785 if (ret < 0) {
786 bdrv_close(bs);
787 return ret;
788 }
789 if (bs->is_temporary) {
790 bs->backing_hd->keep_read_only = !(flags & BDRV_O_RDWR);
791 } else {
792 /* base image inherits from "parent" */
793 bs->backing_hd->keep_read_only = bs->keep_read_only;
794 }
795 }
796
797 if (!bdrv_key_required(bs)) {
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +0200798 bdrv_dev_change_media_cb(bs, true);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200799 }
800
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800801 /* throttling disk I/O limits */
802 if (bs->io_limits_enabled) {
803 bdrv_io_limits_enable(bs);
804 }
805
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200806 return 0;
807
808unlink_and_fail:
809 if (bs->is_temporary) {
810 unlink(filename);
811 }
812 return ret;
813}
814
bellardfc01f7e2003-06-30 10:03:06 +0000815void bdrv_close(BlockDriverState *bs)
816{
Liu Yuan80ccf932012-04-20 17:10:56 +0800817 bdrv_flush(bs);
bellard19cb3732006-08-19 11:45:59 +0000818 if (bs->drv) {
Paolo Bonzini3e914652012-03-30 13:17:11 +0200819 if (bs->job) {
820 block_job_cancel_sync(bs->job);
821 }
Kevin Wolf7094f122012-04-11 11:06:37 +0200822 bdrv_drain_all();
823
Markus Armbrusterf9092b12010-06-25 10:33:39 +0200824 if (bs == bs_snapshots) {
825 bs_snapshots = NULL;
826 }
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +0100827 if (bs->backing_hd) {
bellardea2384d2004-08-01 21:59:26 +0000828 bdrv_delete(bs->backing_hd);
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +0100829 bs->backing_hd = NULL;
830 }
bellardea2384d2004-08-01 21:59:26 +0000831 bs->drv->bdrv_close(bs);
Anthony Liguori7267c092011-08-20 22:09:37 -0500832 g_free(bs->opaque);
bellardea2384d2004-08-01 21:59:26 +0000833#ifdef _WIN32
834 if (bs->is_temporary) {
835 unlink(bs->filename);
836 }
bellard67b915a2004-03-31 23:37:16 +0000837#endif
bellardea2384d2004-08-01 21:59:26 +0000838 bs->opaque = NULL;
839 bs->drv = NULL;
Stefan Hajnoczi53fec9d2011-11-28 16:08:47 +0000840 bs->copy_on_read = 0;
bellardb3380822004-03-14 21:38:54 +0000841
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200842 if (bs->file != NULL) {
843 bdrv_close(bs->file);
844 }
845
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +0200846 bdrv_dev_change_media_cb(bs, false);
bellardb3380822004-03-14 21:38:54 +0000847 }
Zhi Yong Wu98f90db2011-11-08 13:00:14 +0800848
849 /*throttling disk I/O limits*/
850 if (bs->io_limits_enabled) {
851 bdrv_io_limits_disable(bs);
852 }
bellardb3380822004-03-14 21:38:54 +0000853}
854
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +0900855void bdrv_close_all(void)
856{
857 BlockDriverState *bs;
858
859 QTAILQ_FOREACH(bs, &bdrv_states, list) {
860 bdrv_close(bs);
861 }
862}
863
Stefan Hajnoczi922453b2011-11-30 12:23:43 +0000864/*
865 * Wait for pending requests to complete across all BlockDriverStates
866 *
867 * This function does not flush data to disk, use bdrv_flush_all() for that
868 * after calling this function.
869 */
870void bdrv_drain_all(void)
871{
872 BlockDriverState *bs;
873
874 qemu_aio_flush();
875
876 /* If requests are still pending there is a bug somewhere */
877 QTAILQ_FOREACH(bs, &bdrv_states, list) {
878 assert(QLIST_EMPTY(&bs->tracked_requests));
879 assert(qemu_co_queue_empty(&bs->throttled_reqs));
880 }
881}
882
Ryan Harperd22b2f42011-03-29 20:51:47 -0500883/* make a BlockDriverState anonymous by removing from bdrv_state list.
884 Also, NULL terminate the device_name to prevent double remove */
885void bdrv_make_anon(BlockDriverState *bs)
886{
887 if (bs->device_name[0] != '\0') {
888 QTAILQ_REMOVE(&bdrv_states, bs, list);
889 }
890 bs->device_name[0] = '\0';
891}
892
Jeff Cody8802d1f2012-02-28 15:54:06 -0500893/*
894 * Add new bs contents at the top of an image chain while the chain is
895 * live, while keeping required fields on the top layer.
896 *
897 * This will modify the BlockDriverState fields, and swap contents
898 * between bs_new and bs_top. Both bs_new and bs_top are modified.
899 *
Jeff Codyf6801b82012-03-27 16:30:19 -0400900 * bs_new is required to be anonymous.
901 *
Jeff Cody8802d1f2012-02-28 15:54:06 -0500902 * This function does not create any image files.
903 */
904void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
905{
906 BlockDriverState tmp;
907
Jeff Codyf6801b82012-03-27 16:30:19 -0400908 /* bs_new must be anonymous */
909 assert(bs_new->device_name[0] == '\0');
Jeff Cody8802d1f2012-02-28 15:54:06 -0500910
911 tmp = *bs_new;
912
913 /* there are some fields that need to stay on the top layer: */
914
915 /* dev info */
916 tmp.dev_ops = bs_top->dev_ops;
917 tmp.dev_opaque = bs_top->dev_opaque;
918 tmp.dev = bs_top->dev;
919 tmp.buffer_alignment = bs_top->buffer_alignment;
920 tmp.copy_on_read = bs_top->copy_on_read;
921
922 /* i/o timing parameters */
923 tmp.slice_time = bs_top->slice_time;
924 tmp.slice_start = bs_top->slice_start;
925 tmp.slice_end = bs_top->slice_end;
926 tmp.io_limits = bs_top->io_limits;
927 tmp.io_base = bs_top->io_base;
928 tmp.throttled_reqs = bs_top->throttled_reqs;
929 tmp.block_timer = bs_top->block_timer;
930 tmp.io_limits_enabled = bs_top->io_limits_enabled;
931
932 /* geometry */
933 tmp.cyls = bs_top->cyls;
934 tmp.heads = bs_top->heads;
935 tmp.secs = bs_top->secs;
936 tmp.translation = bs_top->translation;
937
938 /* r/w error */
939 tmp.on_read_error = bs_top->on_read_error;
940 tmp.on_write_error = bs_top->on_write_error;
941
942 /* i/o status */
943 tmp.iostatus_enabled = bs_top->iostatus_enabled;
944 tmp.iostatus = bs_top->iostatus;
945
946 /* keep the same entry in bdrv_states */
947 pstrcpy(tmp.device_name, sizeof(tmp.device_name), bs_top->device_name);
948 tmp.list = bs_top->list;
949
950 /* The contents of 'tmp' will become bs_top, as we are
951 * swapping bs_new and bs_top contents. */
952 tmp.backing_hd = bs_new;
953 pstrcpy(tmp.backing_file, sizeof(tmp.backing_file), bs_top->filename);
Jeff Codyf6801b82012-03-27 16:30:19 -0400954 bdrv_get_format(bs_top, tmp.backing_format, sizeof(tmp.backing_format));
Jeff Cody8802d1f2012-02-28 15:54:06 -0500955
956 /* swap contents of the fixed new bs and the current top */
957 *bs_new = *bs_top;
958 *bs_top = tmp;
959
Jeff Codyf6801b82012-03-27 16:30:19 -0400960 /* device_name[] was carried over from the old bs_top. bs_new
961 * shouldn't be in bdrv_states, so we need to make device_name[]
962 * reflect the anonymity of bs_new
963 */
964 bs_new->device_name[0] = '\0';
965
Jeff Cody8802d1f2012-02-28 15:54:06 -0500966 /* clear the copied fields in the new backing file */
967 bdrv_detach_dev(bs_new, bs_new->dev);
968
969 qemu_co_queue_init(&bs_new->throttled_reqs);
970 memset(&bs_new->io_base, 0, sizeof(bs_new->io_base));
971 memset(&bs_new->io_limits, 0, sizeof(bs_new->io_limits));
972 bdrv_iostatus_disable(bs_new);
973
974 /* we don't use bdrv_io_limits_disable() for this, because we don't want
975 * to affect or delete the block_timer, as it has been moved to bs_top */
976 bs_new->io_limits_enabled = false;
977 bs_new->block_timer = NULL;
978 bs_new->slice_time = 0;
979 bs_new->slice_start = 0;
980 bs_new->slice_end = 0;
981}
982
bellardb3380822004-03-14 21:38:54 +0000983void bdrv_delete(BlockDriverState *bs)
984{
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200985 assert(!bs->dev);
Paolo Bonzini3e914652012-03-30 13:17:11 +0200986 assert(!bs->job);
987 assert(!bs->in_use);
Markus Armbruster18846de2010-06-29 16:58:30 +0200988
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +0100989 /* remove from list, if necessary */
Ryan Harperd22b2f42011-03-29 20:51:47 -0500990 bdrv_make_anon(bs);
aurel3234c6f052008-04-08 19:51:21 +0000991
bellardb3380822004-03-14 21:38:54 +0000992 bdrv_close(bs);
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200993 if (bs->file != NULL) {
994 bdrv_delete(bs->file);
995 }
996
Markus Armbrusterf9092b12010-06-25 10:33:39 +0200997 assert(bs != bs_snapshots);
Anthony Liguori7267c092011-08-20 22:09:37 -0500998 g_free(bs);
bellardfc01f7e2003-06-30 10:03:06 +0000999}
1000
Markus Armbrusterfa879d62011-08-03 15:07:40 +02001001int bdrv_attach_dev(BlockDriverState *bs, void *dev)
1002/* TODO change to DeviceState *dev when all users are qdevified */
Markus Armbruster18846de2010-06-29 16:58:30 +02001003{
Markus Armbrusterfa879d62011-08-03 15:07:40 +02001004 if (bs->dev) {
Markus Armbruster18846de2010-06-29 16:58:30 +02001005 return -EBUSY;
1006 }
Markus Armbrusterfa879d62011-08-03 15:07:40 +02001007 bs->dev = dev;
Luiz Capitulino28a72822011-09-26 17:43:50 -03001008 bdrv_iostatus_reset(bs);
Markus Armbruster18846de2010-06-29 16:58:30 +02001009 return 0;
1010}
1011
Markus Armbrusterfa879d62011-08-03 15:07:40 +02001012/* TODO qdevified devices don't use this, remove when devices are qdevified */
1013void bdrv_attach_dev_nofail(BlockDriverState *bs, void *dev)
Markus Armbruster18846de2010-06-29 16:58:30 +02001014{
Markus Armbrusterfa879d62011-08-03 15:07:40 +02001015 if (bdrv_attach_dev(bs, dev) < 0) {
1016 abort();
1017 }
1018}
1019
1020void bdrv_detach_dev(BlockDriverState *bs, void *dev)
1021/* TODO change to DeviceState *dev when all users are qdevified */
1022{
1023 assert(bs->dev == dev);
1024 bs->dev = NULL;
Markus Armbruster0e49de52011-08-03 15:07:41 +02001025 bs->dev_ops = NULL;
1026 bs->dev_opaque = NULL;
Markus Armbruster29e05f22011-09-06 18:58:57 +02001027 bs->buffer_alignment = 512;
Markus Armbruster18846de2010-06-29 16:58:30 +02001028}
1029
Markus Armbrusterfa879d62011-08-03 15:07:40 +02001030/* TODO change to return DeviceState * when all users are qdevified */
1031void *bdrv_get_attached_dev(BlockDriverState *bs)
Markus Armbruster18846de2010-06-29 16:58:30 +02001032{
Markus Armbrusterfa879d62011-08-03 15:07:40 +02001033 return bs->dev;
Markus Armbruster18846de2010-06-29 16:58:30 +02001034}
1035
Markus Armbruster0e49de52011-08-03 15:07:41 +02001036void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
1037 void *opaque)
1038{
1039 bs->dev_ops = ops;
1040 bs->dev_opaque = opaque;
Markus Armbruster2c6942f2011-09-06 18:58:51 +02001041 if (bdrv_dev_has_removable_media(bs) && bs == bs_snapshots) {
1042 bs_snapshots = NULL;
1043 }
Markus Armbruster0e49de52011-08-03 15:07:41 +02001044}
1045
Luiz Capitulino329c0a42012-01-25 16:59:43 -02001046void bdrv_emit_qmp_error_event(const BlockDriverState *bdrv,
1047 BlockQMPEventAction action, int is_read)
1048{
1049 QObject *data;
1050 const char *action_str;
1051
1052 switch (action) {
1053 case BDRV_ACTION_REPORT:
1054 action_str = "report";
1055 break;
1056 case BDRV_ACTION_IGNORE:
1057 action_str = "ignore";
1058 break;
1059 case BDRV_ACTION_STOP:
1060 action_str = "stop";
1061 break;
1062 default:
1063 abort();
1064 }
1065
1066 data = qobject_from_jsonf("{ 'device': %s, 'action': %s, 'operation': %s }",
1067 bdrv->device_name,
1068 action_str,
1069 is_read ? "read" : "write");
1070 monitor_protocol_event(QEVENT_BLOCK_IO_ERROR, data);
1071
1072 qobject_decref(data);
1073}
1074
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02001075static void bdrv_emit_qmp_eject_event(BlockDriverState *bs, bool ejected)
1076{
1077 QObject *data;
1078
1079 data = qobject_from_jsonf("{ 'device': %s, 'tray-open': %i }",
1080 bdrv_get_device_name(bs), ejected);
1081 monitor_protocol_event(QEVENT_DEVICE_TRAY_MOVED, data);
1082
1083 qobject_decref(data);
1084}
1085
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +02001086static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load)
Markus Armbruster0e49de52011-08-03 15:07:41 +02001087{
Markus Armbruster145feb12011-08-03 15:07:42 +02001088 if (bs->dev_ops && bs->dev_ops->change_media_cb) {
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02001089 bool tray_was_closed = !bdrv_dev_is_tray_open(bs);
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +02001090 bs->dev_ops->change_media_cb(bs->dev_opaque, load);
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02001091 if (tray_was_closed) {
1092 /* tray open */
1093 bdrv_emit_qmp_eject_event(bs, true);
1094 }
1095 if (load) {
1096 /* tray close */
1097 bdrv_emit_qmp_eject_event(bs, false);
1098 }
Markus Armbruster145feb12011-08-03 15:07:42 +02001099 }
1100}
1101
Markus Armbruster2c6942f2011-09-06 18:58:51 +02001102bool bdrv_dev_has_removable_media(BlockDriverState *bs)
1103{
1104 return !bs->dev || (bs->dev_ops && bs->dev_ops->change_media_cb);
1105}
1106
Paolo Bonzini025ccaa2011-11-07 17:50:13 +01001107void bdrv_dev_eject_request(BlockDriverState *bs, bool force)
1108{
1109 if (bs->dev_ops && bs->dev_ops->eject_request_cb) {
1110 bs->dev_ops->eject_request_cb(bs->dev_opaque, force);
1111 }
1112}
1113
Markus Armbrustere4def802011-09-06 18:58:53 +02001114bool bdrv_dev_is_tray_open(BlockDriverState *bs)
1115{
1116 if (bs->dev_ops && bs->dev_ops->is_tray_open) {
1117 return bs->dev_ops->is_tray_open(bs->dev_opaque);
1118 }
1119 return false;
1120}
1121
Markus Armbruster145feb12011-08-03 15:07:42 +02001122static void bdrv_dev_resize_cb(BlockDriverState *bs)
1123{
1124 if (bs->dev_ops && bs->dev_ops->resize_cb) {
1125 bs->dev_ops->resize_cb(bs->dev_opaque);
Markus Armbruster0e49de52011-08-03 15:07:41 +02001126 }
1127}
1128
Markus Armbrusterf1076392011-09-06 18:58:46 +02001129bool bdrv_dev_is_medium_locked(BlockDriverState *bs)
1130{
1131 if (bs->dev_ops && bs->dev_ops->is_medium_locked) {
1132 return bs->dev_ops->is_medium_locked(bs->dev_opaque);
1133 }
1134 return false;
1135}
1136
aliguorie97fc192009-04-21 23:11:50 +00001137/*
1138 * Run consistency checks on an image
1139 *
Kevin Wolfe076f332010-06-29 11:43:13 +02001140 * Returns 0 if the check could be completed (it doesn't mean that the image is
Stefan Weila1c72732011-04-28 17:20:38 +02001141 * free of errors) or -errno when an internal error occurred. The results of the
Kevin Wolfe076f332010-06-29 11:43:13 +02001142 * check are stored in res.
aliguorie97fc192009-04-21 23:11:50 +00001143 */
Kevin Wolfe076f332010-06-29 11:43:13 +02001144int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res)
aliguorie97fc192009-04-21 23:11:50 +00001145{
1146 if (bs->drv->bdrv_check == NULL) {
1147 return -ENOTSUP;
1148 }
1149
Kevin Wolfe076f332010-06-29 11:43:13 +02001150 memset(res, 0, sizeof(*res));
Kevin Wolf9ac228e2010-06-29 12:37:54 +02001151 return bs->drv->bdrv_check(bs, res);
aliguorie97fc192009-04-21 23:11:50 +00001152}
1153
Kevin Wolf8a426612010-07-16 17:17:01 +02001154#define COMMIT_BUF_SECTORS 2048
1155
bellard33e39632003-07-06 17:15:21 +00001156/* commit COW file into the raw image */
1157int bdrv_commit(BlockDriverState *bs)
1158{
bellard19cb3732006-08-19 11:45:59 +00001159 BlockDriver *drv = bs->drv;
Kevin Wolfee181192010-08-05 13:05:22 +02001160 BlockDriver *backing_drv;
Kevin Wolf8a426612010-07-16 17:17:01 +02001161 int64_t sector, total_sectors;
1162 int n, ro, open_flags;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001163 int ret = 0, rw_ret = 0;
Kevin Wolf8a426612010-07-16 17:17:01 +02001164 uint8_t *buf;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001165 char filename[1024];
1166 BlockDriverState *bs_rw, *bs_ro;
bellard33e39632003-07-06 17:15:21 +00001167
bellard19cb3732006-08-19 11:45:59 +00001168 if (!drv)
1169 return -ENOMEDIUM;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001170
1171 if (!bs->backing_hd) {
1172 return -ENOTSUP;
bellard33e39632003-07-06 17:15:21 +00001173 }
1174
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001175 if (bs->backing_hd->keep_read_only) {
1176 return -EACCES;
1177 }
Kevin Wolfee181192010-08-05 13:05:22 +02001178
Stefan Hajnoczi2d3735d2012-01-18 14:40:41 +00001179 if (bdrv_in_use(bs) || bdrv_in_use(bs->backing_hd)) {
1180 return -EBUSY;
1181 }
1182
Kevin Wolfee181192010-08-05 13:05:22 +02001183 backing_drv = bs->backing_hd->drv;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001184 ro = bs->backing_hd->read_only;
1185 strncpy(filename, bs->backing_hd->filename, sizeof(filename));
1186 open_flags = bs->backing_hd->open_flags;
1187
1188 if (ro) {
1189 /* re-open as RW */
1190 bdrv_delete(bs->backing_hd);
1191 bs->backing_hd = NULL;
1192 bs_rw = bdrv_new("");
Kevin Wolfee181192010-08-05 13:05:22 +02001193 rw_ret = bdrv_open(bs_rw, filename, open_flags | BDRV_O_RDWR,
1194 backing_drv);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001195 if (rw_ret < 0) {
1196 bdrv_delete(bs_rw);
1197 /* try to re-open read-only */
1198 bs_ro = bdrv_new("");
Kevin Wolfee181192010-08-05 13:05:22 +02001199 ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR,
1200 backing_drv);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001201 if (ret < 0) {
1202 bdrv_delete(bs_ro);
1203 /* drive not functional anymore */
1204 bs->drv = NULL;
1205 return ret;
1206 }
1207 bs->backing_hd = bs_ro;
1208 return rw_ret;
1209 }
1210 bs->backing_hd = bs_rw;
bellard33e39632003-07-06 17:15:21 +00001211 }
bellardea2384d2004-08-01 21:59:26 +00001212
Jan Kiszka6ea44302009-11-30 18:21:19 +01001213 total_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
Anthony Liguori7267c092011-08-20 22:09:37 -05001214 buf = g_malloc(COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
bellardea2384d2004-08-01 21:59:26 +00001215
Kevin Wolf8a426612010-07-16 17:17:01 +02001216 for (sector = 0; sector < total_sectors; sector += n) {
Stefan Hajnoczi05c4af52011-11-14 12:44:18 +00001217 if (bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n)) {
Kevin Wolf8a426612010-07-16 17:17:01 +02001218
1219 if (bdrv_read(bs, sector, buf, n) != 0) {
1220 ret = -EIO;
1221 goto ro_cleanup;
1222 }
1223
1224 if (bdrv_write(bs->backing_hd, sector, buf, n) != 0) {
1225 ret = -EIO;
1226 goto ro_cleanup;
1227 }
bellardea2384d2004-08-01 21:59:26 +00001228 }
1229 }
bellard95389c82005-12-18 18:28:15 +00001230
Christoph Hellwig1d449522010-01-17 12:32:30 +01001231 if (drv->bdrv_make_empty) {
1232 ret = drv->bdrv_make_empty(bs);
1233 bdrv_flush(bs);
1234 }
bellard95389c82005-12-18 18:28:15 +00001235
Christoph Hellwig3f5075a2010-01-12 13:49:23 +01001236 /*
1237 * Make sure all data we wrote to the backing device is actually
1238 * stable on disk.
1239 */
1240 if (bs->backing_hd)
1241 bdrv_flush(bs->backing_hd);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001242
1243ro_cleanup:
Anthony Liguori7267c092011-08-20 22:09:37 -05001244 g_free(buf);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001245
1246 if (ro) {
1247 /* re-open as RO */
1248 bdrv_delete(bs->backing_hd);
1249 bs->backing_hd = NULL;
1250 bs_ro = bdrv_new("");
Kevin Wolfee181192010-08-05 13:05:22 +02001251 ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR,
1252 backing_drv);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +02001253 if (ret < 0) {
1254 bdrv_delete(bs_ro);
1255 /* drive not functional anymore */
1256 bs->drv = NULL;
1257 return ret;
1258 }
1259 bs->backing_hd = bs_ro;
1260 bs->backing_hd->keep_read_only = 0;
1261 }
1262
Christoph Hellwig1d449522010-01-17 12:32:30 +01001263 return ret;
bellard33e39632003-07-06 17:15:21 +00001264}
1265
Stefan Hajnoczie8877492012-03-05 18:10:11 +00001266int bdrv_commit_all(void)
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02001267{
1268 BlockDriverState *bs;
1269
1270 QTAILQ_FOREACH(bs, &bdrv_states, list) {
Stefan Hajnoczie8877492012-03-05 18:10:11 +00001271 int ret = bdrv_commit(bs);
1272 if (ret < 0) {
1273 return ret;
1274 }
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02001275 }
Stefan Hajnoczie8877492012-03-05 18:10:11 +00001276 return 0;
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +02001277}
1278
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001279struct BdrvTrackedRequest {
1280 BlockDriverState *bs;
1281 int64_t sector_num;
1282 int nb_sectors;
1283 bool is_write;
1284 QLIST_ENTRY(BdrvTrackedRequest) list;
Stefan Hajnoczi5f8b6492011-11-30 12:23:42 +00001285 Coroutine *co; /* owner, used for deadlock detection */
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001286 CoQueue wait_queue; /* coroutines blocked on this request */
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001287};
1288
1289/**
1290 * Remove an active request from the tracked requests list
1291 *
1292 * This function should be called when a tracked request is completing.
1293 */
1294static void tracked_request_end(BdrvTrackedRequest *req)
1295{
1296 QLIST_REMOVE(req, list);
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001297 qemu_co_queue_restart_all(&req->wait_queue);
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001298}
1299
1300/**
1301 * Add an active request to the tracked requests list
1302 */
1303static void tracked_request_begin(BdrvTrackedRequest *req,
1304 BlockDriverState *bs,
1305 int64_t sector_num,
1306 int nb_sectors, bool is_write)
1307{
1308 *req = (BdrvTrackedRequest){
1309 .bs = bs,
1310 .sector_num = sector_num,
1311 .nb_sectors = nb_sectors,
1312 .is_write = is_write,
Stefan Hajnoczi5f8b6492011-11-30 12:23:42 +00001313 .co = qemu_coroutine_self(),
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001314 };
1315
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001316 qemu_co_queue_init(&req->wait_queue);
1317
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001318 QLIST_INSERT_HEAD(&bs->tracked_requests, req, list);
1319}
1320
Stefan Hajnoczid83947a2011-11-23 11:47:56 +00001321/**
1322 * Round a region to cluster boundaries
1323 */
1324static void round_to_clusters(BlockDriverState *bs,
1325 int64_t sector_num, int nb_sectors,
1326 int64_t *cluster_sector_num,
1327 int *cluster_nb_sectors)
1328{
1329 BlockDriverInfo bdi;
1330
1331 if (bdrv_get_info(bs, &bdi) < 0 || bdi.cluster_size == 0) {
1332 *cluster_sector_num = sector_num;
1333 *cluster_nb_sectors = nb_sectors;
1334 } else {
1335 int64_t c = bdi.cluster_size / BDRV_SECTOR_SIZE;
1336 *cluster_sector_num = QEMU_ALIGN_DOWN(sector_num, c);
1337 *cluster_nb_sectors = QEMU_ALIGN_UP(sector_num - *cluster_sector_num +
1338 nb_sectors, c);
1339 }
1340}
1341
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001342static bool tracked_request_overlaps(BdrvTrackedRequest *req,
1343 int64_t sector_num, int nb_sectors) {
Stefan Hajnoczid83947a2011-11-23 11:47:56 +00001344 /* aaaa bbbb */
1345 if (sector_num >= req->sector_num + req->nb_sectors) {
1346 return false;
1347 }
1348 /* bbbb aaaa */
1349 if (req->sector_num >= sector_num + nb_sectors) {
1350 return false;
1351 }
1352 return true;
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001353}
1354
1355static void coroutine_fn wait_for_overlapping_requests(BlockDriverState *bs,
1356 int64_t sector_num, int nb_sectors)
1357{
1358 BdrvTrackedRequest *req;
Stefan Hajnoczid83947a2011-11-23 11:47:56 +00001359 int64_t cluster_sector_num;
1360 int cluster_nb_sectors;
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001361 bool retry;
1362
Stefan Hajnoczid83947a2011-11-23 11:47:56 +00001363 /* If we touch the same cluster it counts as an overlap. This guarantees
1364 * that allocating writes will be serialized and not race with each other
1365 * for the same cluster. For example, in copy-on-read it ensures that the
1366 * CoR read and write operations are atomic and guest writes cannot
1367 * interleave between them.
1368 */
1369 round_to_clusters(bs, sector_num, nb_sectors,
1370 &cluster_sector_num, &cluster_nb_sectors);
1371
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001372 do {
1373 retry = false;
1374 QLIST_FOREACH(req, &bs->tracked_requests, list) {
Stefan Hajnoczid83947a2011-11-23 11:47:56 +00001375 if (tracked_request_overlaps(req, cluster_sector_num,
1376 cluster_nb_sectors)) {
Stefan Hajnoczi5f8b6492011-11-30 12:23:42 +00001377 /* Hitting this means there was a reentrant request, for
1378 * example, a block driver issuing nested requests. This must
1379 * never happen since it means deadlock.
1380 */
1381 assert(qemu_coroutine_self() != req->co);
1382
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001383 qemu_co_queue_wait(&req->wait_queue);
1384 retry = true;
1385 break;
1386 }
1387 }
1388 } while (retry);
1389}
1390
Kevin Wolf756e6732010-01-12 12:55:17 +01001391/*
1392 * Return values:
1393 * 0 - success
1394 * -EINVAL - backing format specified, but no file
1395 * -ENOSPC - can't update the backing file because no space is left in the
1396 * image file header
1397 * -ENOTSUP - format driver doesn't support changing the backing file
1398 */
1399int bdrv_change_backing_file(BlockDriverState *bs,
1400 const char *backing_file, const char *backing_fmt)
1401{
1402 BlockDriver *drv = bs->drv;
1403
1404 if (drv->bdrv_change_backing_file != NULL) {
1405 return drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
1406 } else {
1407 return -ENOTSUP;
1408 }
1409}
1410
aliguori71d07702009-03-03 17:37:16 +00001411static int bdrv_check_byte_request(BlockDriverState *bs, int64_t offset,
1412 size_t size)
1413{
1414 int64_t len;
1415
1416 if (!bdrv_is_inserted(bs))
1417 return -ENOMEDIUM;
1418
1419 if (bs->growable)
1420 return 0;
1421
1422 len = bdrv_getlength(bs);
1423
Kevin Wolffbb7b4e2009-05-08 14:47:24 +02001424 if (offset < 0)
1425 return -EIO;
1426
1427 if ((offset > len) || (len - offset < size))
aliguori71d07702009-03-03 17:37:16 +00001428 return -EIO;
1429
1430 return 0;
1431}
1432
1433static int bdrv_check_request(BlockDriverState *bs, int64_t sector_num,
1434 int nb_sectors)
1435{
Jes Sorenseneb5a3162010-05-27 16:20:31 +02001436 return bdrv_check_byte_request(bs, sector_num * BDRV_SECTOR_SIZE,
1437 nb_sectors * BDRV_SECTOR_SIZE);
aliguori71d07702009-03-03 17:37:16 +00001438}
1439
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001440typedef struct RwCo {
1441 BlockDriverState *bs;
1442 int64_t sector_num;
1443 int nb_sectors;
1444 QEMUIOVector *qiov;
1445 bool is_write;
1446 int ret;
1447} RwCo;
1448
1449static void coroutine_fn bdrv_rw_co_entry(void *opaque)
1450{
1451 RwCo *rwco = opaque;
1452
1453 if (!rwco->is_write) {
1454 rwco->ret = bdrv_co_do_readv(rwco->bs, rwco->sector_num,
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00001455 rwco->nb_sectors, rwco->qiov, 0);
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001456 } else {
1457 rwco->ret = bdrv_co_do_writev(rwco->bs, rwco->sector_num,
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00001458 rwco->nb_sectors, rwco->qiov, 0);
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001459 }
1460}
1461
1462/*
1463 * Process a synchronous request using coroutines
1464 */
1465static int bdrv_rw_co(BlockDriverState *bs, int64_t sector_num, uint8_t *buf,
1466 int nb_sectors, bool is_write)
1467{
1468 QEMUIOVector qiov;
1469 struct iovec iov = {
1470 .iov_base = (void *)buf,
1471 .iov_len = nb_sectors * BDRV_SECTOR_SIZE,
1472 };
1473 Coroutine *co;
1474 RwCo rwco = {
1475 .bs = bs,
1476 .sector_num = sector_num,
1477 .nb_sectors = nb_sectors,
1478 .qiov = &qiov,
1479 .is_write = is_write,
1480 .ret = NOT_DONE,
1481 };
1482
1483 qemu_iovec_init_external(&qiov, &iov, 1);
1484
Zhi Yong Wu498e3862012-04-02 18:59:34 +08001485 /**
1486 * In sync call context, when the vcpu is blocked, this throttling timer
1487 * will not fire; so the I/O throttling function has to be disabled here
1488 * if it has been enabled.
1489 */
1490 if (bs->io_limits_enabled) {
1491 fprintf(stderr, "Disabling I/O throttling on '%s' due "
1492 "to synchronous I/O.\n", bdrv_get_device_name(bs));
1493 bdrv_io_limits_disable(bs);
1494 }
1495
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001496 if (qemu_in_coroutine()) {
1497 /* Fast-path if already in coroutine context */
1498 bdrv_rw_co_entry(&rwco);
1499 } else {
1500 co = qemu_coroutine_create(bdrv_rw_co_entry);
1501 qemu_coroutine_enter(co, &rwco);
1502 while (rwco.ret == NOT_DONE) {
1503 qemu_aio_wait();
1504 }
1505 }
1506 return rwco.ret;
1507}
1508
bellard19cb3732006-08-19 11:45:59 +00001509/* return < 0 if error. See bdrv_write() for the return codes */
ths5fafdf22007-09-16 21:08:06 +00001510int bdrv_read(BlockDriverState *bs, int64_t sector_num,
bellardfc01f7e2003-06-30 10:03:06 +00001511 uint8_t *buf, int nb_sectors)
1512{
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001513 return bdrv_rw_co(bs, sector_num, buf, nb_sectors, false);
bellardfc01f7e2003-06-30 10:03:06 +00001514}
1515
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02001516static void set_dirty_bitmap(BlockDriverState *bs, int64_t sector_num,
Jan Kiszkaa55eb922009-11-30 18:21:19 +01001517 int nb_sectors, int dirty)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02001518{
1519 int64_t start, end;
Jan Kiszkac6d22832009-11-30 18:21:20 +01001520 unsigned long val, idx, bit;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01001521
Jan Kiszka6ea44302009-11-30 18:21:19 +01001522 start = sector_num / BDRV_SECTORS_PER_DIRTY_CHUNK;
Jan Kiszkac6d22832009-11-30 18:21:20 +01001523 end = (sector_num + nb_sectors - 1) / BDRV_SECTORS_PER_DIRTY_CHUNK;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01001524
1525 for (; start <= end; start++) {
Jan Kiszkac6d22832009-11-30 18:21:20 +01001526 idx = start / (sizeof(unsigned long) * 8);
1527 bit = start % (sizeof(unsigned long) * 8);
1528 val = bs->dirty_bitmap[idx];
1529 if (dirty) {
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001530 if (!(val & (1UL << bit))) {
Liran Schouraaa0eb72010-01-26 10:31:48 +02001531 bs->dirty_count++;
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001532 val |= 1UL << bit;
Liran Schouraaa0eb72010-01-26 10:31:48 +02001533 }
Jan Kiszkac6d22832009-11-30 18:21:20 +01001534 } else {
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001535 if (val & (1UL << bit)) {
Liran Schouraaa0eb72010-01-26 10:31:48 +02001536 bs->dirty_count--;
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001537 val &= ~(1UL << bit);
Liran Schouraaa0eb72010-01-26 10:31:48 +02001538 }
Jan Kiszkac6d22832009-11-30 18:21:20 +01001539 }
1540 bs->dirty_bitmap[idx] = val;
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02001541 }
1542}
1543
ths5fafdf22007-09-16 21:08:06 +00001544/* Return < 0 if error. Important errors are:
bellard19cb3732006-08-19 11:45:59 +00001545 -EIO generic I/O error (may happen for all errors)
1546 -ENOMEDIUM No media inserted.
1547 -EINVAL Invalid sector number or nb_sectors
1548 -EACCES Trying to write a read-only device
1549*/
ths5fafdf22007-09-16 21:08:06 +00001550int bdrv_write(BlockDriverState *bs, int64_t sector_num,
bellardfc01f7e2003-06-30 10:03:06 +00001551 const uint8_t *buf, int nb_sectors)
1552{
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001553 return bdrv_rw_co(bs, sector_num, (uint8_t *)buf, nb_sectors, true);
bellard83f64092006-08-01 16:21:11 +00001554}
1555
aliguorieda578e2009-03-12 19:57:16 +00001556int bdrv_pread(BlockDriverState *bs, int64_t offset,
1557 void *buf, int count1)
bellard83f64092006-08-01 16:21:11 +00001558{
Jan Kiszka6ea44302009-11-30 18:21:19 +01001559 uint8_t tmp_buf[BDRV_SECTOR_SIZE];
bellard83f64092006-08-01 16:21:11 +00001560 int len, nb_sectors, count;
1561 int64_t sector_num;
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001562 int ret;
bellard83f64092006-08-01 16:21:11 +00001563
1564 count = count1;
1565 /* first read to align to sector start */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001566 len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
bellard83f64092006-08-01 16:21:11 +00001567 if (len > count)
1568 len = count;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001569 sector_num = offset >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001570 if (len > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001571 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1572 return ret;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001573 memcpy(buf, tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), len);
bellard83f64092006-08-01 16:21:11 +00001574 count -= len;
1575 if (count == 0)
1576 return count1;
1577 sector_num++;
1578 buf += len;
1579 }
1580
1581 /* read the sectors "in place" */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001582 nb_sectors = count >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001583 if (nb_sectors > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001584 if ((ret = bdrv_read(bs, sector_num, buf, nb_sectors)) < 0)
1585 return ret;
bellard83f64092006-08-01 16:21:11 +00001586 sector_num += nb_sectors;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001587 len = nb_sectors << BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001588 buf += len;
1589 count -= len;
1590 }
1591
1592 /* add data from the last sector */
1593 if (count > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001594 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1595 return ret;
bellard83f64092006-08-01 16:21:11 +00001596 memcpy(buf, tmp_buf, count);
1597 }
1598 return count1;
1599}
1600
aliguorieda578e2009-03-12 19:57:16 +00001601int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
1602 const void *buf, int count1)
bellard83f64092006-08-01 16:21:11 +00001603{
Jan Kiszka6ea44302009-11-30 18:21:19 +01001604 uint8_t tmp_buf[BDRV_SECTOR_SIZE];
bellard83f64092006-08-01 16:21:11 +00001605 int len, nb_sectors, count;
1606 int64_t sector_num;
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001607 int ret;
bellard83f64092006-08-01 16:21:11 +00001608
1609 count = count1;
1610 /* first write to align to sector start */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001611 len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
bellard83f64092006-08-01 16:21:11 +00001612 if (len > count)
1613 len = count;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001614 sector_num = offset >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001615 if (len > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001616 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1617 return ret;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001618 memcpy(tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), buf, len);
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001619 if ((ret = bdrv_write(bs, sector_num, tmp_buf, 1)) < 0)
1620 return ret;
bellard83f64092006-08-01 16:21:11 +00001621 count -= len;
1622 if (count == 0)
1623 return count1;
1624 sector_num++;
1625 buf += len;
1626 }
1627
1628 /* write the sectors "in place" */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001629 nb_sectors = count >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001630 if (nb_sectors > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001631 if ((ret = bdrv_write(bs, sector_num, buf, nb_sectors)) < 0)
1632 return ret;
bellard83f64092006-08-01 16:21:11 +00001633 sector_num += nb_sectors;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001634 len = nb_sectors << BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001635 buf += len;
1636 count -= len;
1637 }
1638
1639 /* add data from the last sector */
1640 if (count > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001641 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1642 return ret;
bellard83f64092006-08-01 16:21:11 +00001643 memcpy(tmp_buf, buf, count);
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001644 if ((ret = bdrv_write(bs, sector_num, tmp_buf, 1)) < 0)
1645 return ret;
bellard83f64092006-08-01 16:21:11 +00001646 }
1647 return count1;
1648}
bellard83f64092006-08-01 16:21:11 +00001649
Kevin Wolff08145f2010-06-16 16:38:15 +02001650/*
1651 * Writes to the file and ensures that no writes are reordered across this
1652 * request (acts as a barrier)
1653 *
1654 * Returns 0 on success, -errno in error cases.
1655 */
1656int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
1657 const void *buf, int count)
1658{
1659 int ret;
1660
1661 ret = bdrv_pwrite(bs, offset, buf, count);
1662 if (ret < 0) {
1663 return ret;
1664 }
1665
Stefan Hajnoczi92196b22011-08-04 12:26:52 +01001666 /* No flush needed for cache modes that use O_DSYNC */
1667 if ((bs->open_flags & BDRV_O_CACHE_WB) != 0) {
Kevin Wolff08145f2010-06-16 16:38:15 +02001668 bdrv_flush(bs);
1669 }
1670
1671 return 0;
1672}
1673
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00001674static int coroutine_fn bdrv_co_do_copy_on_readv(BlockDriverState *bs,
Stefan Hajnocziab185922011-11-17 13:40:31 +00001675 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
1676{
1677 /* Perform I/O through a temporary buffer so that users who scribble over
1678 * their read buffer while the operation is in progress do not end up
1679 * modifying the image file. This is critical for zero-copy guest I/O
1680 * where anything might happen inside guest memory.
1681 */
1682 void *bounce_buffer;
1683
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00001684 BlockDriver *drv = bs->drv;
Stefan Hajnocziab185922011-11-17 13:40:31 +00001685 struct iovec iov;
1686 QEMUIOVector bounce_qiov;
1687 int64_t cluster_sector_num;
1688 int cluster_nb_sectors;
1689 size_t skip_bytes;
1690 int ret;
1691
1692 /* Cover entire cluster so no additional backing file I/O is required when
1693 * allocating cluster in the image file.
1694 */
1695 round_to_clusters(bs, sector_num, nb_sectors,
1696 &cluster_sector_num, &cluster_nb_sectors);
1697
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00001698 trace_bdrv_co_do_copy_on_readv(bs, sector_num, nb_sectors,
1699 cluster_sector_num, cluster_nb_sectors);
Stefan Hajnocziab185922011-11-17 13:40:31 +00001700
1701 iov.iov_len = cluster_nb_sectors * BDRV_SECTOR_SIZE;
1702 iov.iov_base = bounce_buffer = qemu_blockalign(bs, iov.iov_len);
1703 qemu_iovec_init_external(&bounce_qiov, &iov, 1);
1704
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00001705 ret = drv->bdrv_co_readv(bs, cluster_sector_num, cluster_nb_sectors,
1706 &bounce_qiov);
Stefan Hajnocziab185922011-11-17 13:40:31 +00001707 if (ret < 0) {
1708 goto err;
1709 }
1710
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00001711 if (drv->bdrv_co_write_zeroes &&
1712 buffer_is_zero(bounce_buffer, iov.iov_len)) {
Kevin Wolf621f0582012-03-20 15:12:58 +01001713 ret = bdrv_co_do_write_zeroes(bs, cluster_sector_num,
1714 cluster_nb_sectors);
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00001715 } else {
1716 ret = drv->bdrv_co_writev(bs, cluster_sector_num, cluster_nb_sectors,
Stefan Hajnocziab185922011-11-17 13:40:31 +00001717 &bounce_qiov);
Stefan Hajnoczi79c053b2012-02-07 13:27:26 +00001718 }
1719
Stefan Hajnocziab185922011-11-17 13:40:31 +00001720 if (ret < 0) {
1721 /* It might be okay to ignore write errors for guest requests. If this
1722 * is a deliberate copy-on-read then we don't want to ignore the error.
1723 * Simply report it in all cases.
1724 */
1725 goto err;
1726 }
1727
1728 skip_bytes = (sector_num - cluster_sector_num) * BDRV_SECTOR_SIZE;
1729 qemu_iovec_from_buffer(qiov, bounce_buffer + skip_bytes,
1730 nb_sectors * BDRV_SECTOR_SIZE);
1731
1732err:
1733 qemu_vfree(bounce_buffer);
1734 return ret;
1735}
1736
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001737/*
1738 * Handle a read request in coroutine context
1739 */
1740static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00001741 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
1742 BdrvRequestFlags flags)
Kevin Wolfda1fa912011-07-14 17:27:13 +02001743{
1744 BlockDriver *drv = bs->drv;
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001745 BdrvTrackedRequest req;
1746 int ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02001747
Kevin Wolfda1fa912011-07-14 17:27:13 +02001748 if (!drv) {
1749 return -ENOMEDIUM;
1750 }
1751 if (bdrv_check_request(bs, sector_num, nb_sectors)) {
1752 return -EIO;
1753 }
1754
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001755 /* throttling disk read I/O */
1756 if (bs->io_limits_enabled) {
1757 bdrv_io_limits_intercept(bs, false, nb_sectors);
1758 }
1759
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001760 if (bs->copy_on_read) {
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00001761 flags |= BDRV_REQ_COPY_ON_READ;
1762 }
1763 if (flags & BDRV_REQ_COPY_ON_READ) {
1764 bs->copy_on_read_in_flight++;
1765 }
1766
1767 if (bs->copy_on_read_in_flight) {
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001768 wait_for_overlapping_requests(bs, sector_num, nb_sectors);
1769 }
1770
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001771 tracked_request_begin(&req, bs, sector_num, nb_sectors, false);
Stefan Hajnocziab185922011-11-17 13:40:31 +00001772
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00001773 if (flags & BDRV_REQ_COPY_ON_READ) {
Stefan Hajnocziab185922011-11-17 13:40:31 +00001774 int pnum;
1775
1776 ret = bdrv_co_is_allocated(bs, sector_num, nb_sectors, &pnum);
1777 if (ret < 0) {
1778 goto out;
1779 }
1780
1781 if (!ret || pnum != nb_sectors) {
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00001782 ret = bdrv_co_do_copy_on_readv(bs, sector_num, nb_sectors, qiov);
Stefan Hajnocziab185922011-11-17 13:40:31 +00001783 goto out;
1784 }
1785 }
1786
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001787 ret = drv->bdrv_co_readv(bs, sector_num, nb_sectors, qiov);
Stefan Hajnocziab185922011-11-17 13:40:31 +00001788
1789out:
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001790 tracked_request_end(&req);
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00001791
1792 if (flags & BDRV_REQ_COPY_ON_READ) {
1793 bs->copy_on_read_in_flight--;
1794 }
1795
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001796 return ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02001797}
1798
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001799int coroutine_fn bdrv_co_readv(BlockDriverState *bs, int64_t sector_num,
Kevin Wolfda1fa912011-07-14 17:27:13 +02001800 int nb_sectors, QEMUIOVector *qiov)
1801{
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001802 trace_bdrv_co_readv(bs, sector_num, nb_sectors);
Kevin Wolfda1fa912011-07-14 17:27:13 +02001803
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00001804 return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov, 0);
1805}
1806
1807int coroutine_fn bdrv_co_copy_on_readv(BlockDriverState *bs,
1808 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
1809{
1810 trace_bdrv_co_copy_on_readv(bs, sector_num, nb_sectors);
1811
1812 return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov,
1813 BDRV_REQ_COPY_ON_READ);
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001814}
1815
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00001816static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
1817 int64_t sector_num, int nb_sectors)
1818{
1819 BlockDriver *drv = bs->drv;
1820 QEMUIOVector qiov;
1821 struct iovec iov;
1822 int ret;
1823
Kevin Wolf621f0582012-03-20 15:12:58 +01001824 /* TODO Emulate only part of misaligned requests instead of letting block
1825 * drivers return -ENOTSUP and emulate everything */
1826
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00001827 /* First try the efficient write zeroes operation */
1828 if (drv->bdrv_co_write_zeroes) {
Kevin Wolf621f0582012-03-20 15:12:58 +01001829 ret = drv->bdrv_co_write_zeroes(bs, sector_num, nb_sectors);
1830 if (ret != -ENOTSUP) {
1831 return ret;
1832 }
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00001833 }
1834
1835 /* Fall back to bounce buffer if write zeroes is unsupported */
1836 iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
1837 iov.iov_base = qemu_blockalign(bs, iov.iov_len);
1838 memset(iov.iov_base, 0, iov.iov_len);
1839 qemu_iovec_init_external(&qiov, &iov, 1);
1840
1841 ret = drv->bdrv_co_writev(bs, sector_num, nb_sectors, &qiov);
1842
1843 qemu_vfree(iov.iov_base);
1844 return ret;
1845}
1846
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001847/*
1848 * Handle a write request in coroutine context
1849 */
1850static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00001851 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
1852 BdrvRequestFlags flags)
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001853{
1854 BlockDriver *drv = bs->drv;
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001855 BdrvTrackedRequest req;
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01001856 int ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02001857
1858 if (!bs->drv) {
1859 return -ENOMEDIUM;
1860 }
1861 if (bs->read_only) {
1862 return -EACCES;
1863 }
1864 if (bdrv_check_request(bs, sector_num, nb_sectors)) {
1865 return -EIO;
1866 }
1867
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08001868 /* throttling disk write I/O */
1869 if (bs->io_limits_enabled) {
1870 bdrv_io_limits_intercept(bs, true, nb_sectors);
1871 }
1872
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00001873 if (bs->copy_on_read_in_flight) {
Stefan Hajnoczif4658282011-11-17 13:40:29 +00001874 wait_for_overlapping_requests(bs, sector_num, nb_sectors);
1875 }
1876
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001877 tracked_request_begin(&req, bs, sector_num, nb_sectors, true);
1878
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00001879 if (flags & BDRV_REQ_ZERO_WRITE) {
1880 ret = bdrv_co_do_write_zeroes(bs, sector_num, nb_sectors);
1881 } else {
1882 ret = drv->bdrv_co_writev(bs, sector_num, nb_sectors, qiov);
1883 }
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01001884
Kevin Wolfda1fa912011-07-14 17:27:13 +02001885 if (bs->dirty_bitmap) {
1886 set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
1887 }
1888
1889 if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
1890 bs->wr_highest_sector = sector_num + nb_sectors - 1;
1891 }
1892
Stefan Hajnoczidbffbdc2011-11-17 13:40:27 +00001893 tracked_request_end(&req);
1894
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01001895 return ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02001896}
1897
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001898int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
1899 int nb_sectors, QEMUIOVector *qiov)
1900{
1901 trace_bdrv_co_writev(bs, sector_num, nb_sectors);
1902
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00001903 return bdrv_co_do_writev(bs, sector_num, nb_sectors, qiov, 0);
1904}
1905
1906int coroutine_fn bdrv_co_write_zeroes(BlockDriverState *bs,
1907 int64_t sector_num, int nb_sectors)
1908{
1909 trace_bdrv_co_write_zeroes(bs, sector_num, nb_sectors);
1910
1911 return bdrv_co_do_writev(bs, sector_num, nb_sectors, NULL,
1912 BDRV_REQ_ZERO_WRITE);
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001913}
1914
bellard83f64092006-08-01 16:21:11 +00001915/**
bellard83f64092006-08-01 16:21:11 +00001916 * Truncate file to 'offset' bytes (needed only for file protocols)
1917 */
1918int bdrv_truncate(BlockDriverState *bs, int64_t offset)
1919{
1920 BlockDriver *drv = bs->drv;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001921 int ret;
bellard83f64092006-08-01 16:21:11 +00001922 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00001923 return -ENOMEDIUM;
bellard83f64092006-08-01 16:21:11 +00001924 if (!drv->bdrv_truncate)
1925 return -ENOTSUP;
Naphtali Sprei59f26892009-10-26 16:25:16 +02001926 if (bs->read_only)
1927 return -EACCES;
Marcelo Tosatti85916752011-01-26 12:12:35 -02001928 if (bdrv_in_use(bs))
1929 return -EBUSY;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001930 ret = drv->bdrv_truncate(bs, offset);
1931 if (ret == 0) {
1932 ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
Markus Armbruster145feb12011-08-03 15:07:42 +02001933 bdrv_dev_resize_cb(bs);
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001934 }
1935 return ret;
bellard83f64092006-08-01 16:21:11 +00001936}
1937
1938/**
Fam Zheng4a1d5e12011-07-12 19:56:39 +08001939 * Length of a allocated file in bytes. Sparse files are counted by actual
1940 * allocated space. Return < 0 if error or unknown.
1941 */
1942int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
1943{
1944 BlockDriver *drv = bs->drv;
1945 if (!drv) {
1946 return -ENOMEDIUM;
1947 }
1948 if (drv->bdrv_get_allocated_file_size) {
1949 return drv->bdrv_get_allocated_file_size(bs);
1950 }
1951 if (bs->file) {
1952 return bdrv_get_allocated_file_size(bs->file);
1953 }
1954 return -ENOTSUP;
1955}
1956
1957/**
bellard83f64092006-08-01 16:21:11 +00001958 * Length of a file in bytes. Return < 0 if error or unknown.
1959 */
1960int64_t bdrv_getlength(BlockDriverState *bs)
1961{
1962 BlockDriver *drv = bs->drv;
1963 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00001964 return -ENOMEDIUM;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001965
Markus Armbruster2c6942f2011-09-06 18:58:51 +02001966 if (bs->growable || bdrv_dev_has_removable_media(bs)) {
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01001967 if (drv->bdrv_getlength) {
1968 return drv->bdrv_getlength(bs);
1969 }
bellard83f64092006-08-01 16:21:11 +00001970 }
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01001971 return bs->total_sectors * BDRV_SECTOR_SIZE;
bellardfc01f7e2003-06-30 10:03:06 +00001972}
1973
bellard19cb3732006-08-19 11:45:59 +00001974/* return 0 as number of sectors if no device present or error */
ths96b8f132007-12-17 01:35:20 +00001975void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
bellardfc01f7e2003-06-30 10:03:06 +00001976{
bellard19cb3732006-08-19 11:45:59 +00001977 int64_t length;
1978 length = bdrv_getlength(bs);
1979 if (length < 0)
1980 length = 0;
1981 else
Jan Kiszka6ea44302009-11-30 18:21:19 +01001982 length = length >> BDRV_SECTOR_BITS;
bellard19cb3732006-08-19 11:45:59 +00001983 *nb_sectors_ptr = length;
bellardfc01f7e2003-06-30 10:03:06 +00001984}
bellardcf989512004-02-16 21:56:36 +00001985
aliguorif3d54fc2008-11-25 21:50:24 +00001986struct partition {
1987 uint8_t boot_ind; /* 0x80 - active */
1988 uint8_t head; /* starting head */
1989 uint8_t sector; /* starting sector */
1990 uint8_t cyl; /* starting cylinder */
1991 uint8_t sys_ind; /* What partition type */
1992 uint8_t end_head; /* end head */
1993 uint8_t end_sector; /* end sector */
1994 uint8_t end_cyl; /* end cylinder */
1995 uint32_t start_sect; /* starting sector counting from 0 */
1996 uint32_t nr_sects; /* nr of sectors in partition */
Stefan Weil541dc0d2011-08-31 12:38:01 +02001997} QEMU_PACKED;
aliguorif3d54fc2008-11-25 21:50:24 +00001998
1999/* try to guess the disk logical geometry from the MSDOS partition table. Return 0 if OK, -1 if could not guess */
2000static int guess_disk_lchs(BlockDriverState *bs,
2001 int *pcylinders, int *pheads, int *psectors)
2002{
Jes Sorenseneb5a3162010-05-27 16:20:31 +02002003 uint8_t buf[BDRV_SECTOR_SIZE];
aliguorif3d54fc2008-11-25 21:50:24 +00002004 int ret, i, heads, sectors, cylinders;
2005 struct partition *p;
2006 uint32_t nr_sects;
blueswir1a38131b2008-12-05 17:56:40 +00002007 uint64_t nb_sectors;
Zhi Yong Wu498e3862012-04-02 18:59:34 +08002008 bool enabled;
aliguorif3d54fc2008-11-25 21:50:24 +00002009
2010 bdrv_get_geometry(bs, &nb_sectors);
2011
Zhi Yong Wu498e3862012-04-02 18:59:34 +08002012 /**
2013 * The function will be invoked during startup not only in sync I/O mode,
2014 * but also in async I/O mode. So the I/O throttling function has to
2015 * be disabled temporarily here, not permanently.
2016 */
2017 enabled = bs->io_limits_enabled;
2018 bs->io_limits_enabled = false;
aliguorif3d54fc2008-11-25 21:50:24 +00002019 ret = bdrv_read(bs, 0, buf, 1);
Zhi Yong Wu498e3862012-04-02 18:59:34 +08002020 bs->io_limits_enabled = enabled;
aliguorif3d54fc2008-11-25 21:50:24 +00002021 if (ret < 0)
2022 return -1;
2023 /* test msdos magic */
2024 if (buf[510] != 0x55 || buf[511] != 0xaa)
2025 return -1;
2026 for(i = 0; i < 4; i++) {
2027 p = ((struct partition *)(buf + 0x1be)) + i;
2028 nr_sects = le32_to_cpu(p->nr_sects);
2029 if (nr_sects && p->end_head) {
2030 /* We make the assumption that the partition terminates on
2031 a cylinder boundary */
2032 heads = p->end_head + 1;
2033 sectors = p->end_sector & 63;
2034 if (sectors == 0)
2035 continue;
2036 cylinders = nb_sectors / (heads * sectors);
2037 if (cylinders < 1 || cylinders > 16383)
2038 continue;
2039 *pheads = heads;
2040 *psectors = sectors;
2041 *pcylinders = cylinders;
2042#if 0
2043 printf("guessed geometry: LCHS=%d %d %d\n",
2044 cylinders, heads, sectors);
2045#endif
2046 return 0;
2047 }
2048 }
2049 return -1;
2050}
2051
2052void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs)
2053{
2054 int translation, lba_detected = 0;
2055 int cylinders, heads, secs;
blueswir1a38131b2008-12-05 17:56:40 +00002056 uint64_t nb_sectors;
aliguorif3d54fc2008-11-25 21:50:24 +00002057
2058 /* if a geometry hint is available, use it */
2059 bdrv_get_geometry(bs, &nb_sectors);
2060 bdrv_get_geometry_hint(bs, &cylinders, &heads, &secs);
2061 translation = bdrv_get_translation_hint(bs);
2062 if (cylinders != 0) {
2063 *pcyls = cylinders;
2064 *pheads = heads;
2065 *psecs = secs;
2066 } else {
2067 if (guess_disk_lchs(bs, &cylinders, &heads, &secs) == 0) {
2068 if (heads > 16) {
2069 /* if heads > 16, it means that a BIOS LBA
2070 translation was active, so the default
2071 hardware geometry is OK */
2072 lba_detected = 1;
2073 goto default_geometry;
2074 } else {
2075 *pcyls = cylinders;
2076 *pheads = heads;
2077 *psecs = secs;
2078 /* disable any translation to be in sync with
2079 the logical geometry */
2080 if (translation == BIOS_ATA_TRANSLATION_AUTO) {
2081 bdrv_set_translation_hint(bs,
2082 BIOS_ATA_TRANSLATION_NONE);
2083 }
2084 }
2085 } else {
2086 default_geometry:
2087 /* if no geometry, use a standard physical disk geometry */
2088 cylinders = nb_sectors / (16 * 63);
2089
2090 if (cylinders > 16383)
2091 cylinders = 16383;
2092 else if (cylinders < 2)
2093 cylinders = 2;
2094 *pcyls = cylinders;
2095 *pheads = 16;
2096 *psecs = 63;
2097 if ((lba_detected == 1) && (translation == BIOS_ATA_TRANSLATION_AUTO)) {
2098 if ((*pcyls * *pheads) <= 131072) {
2099 bdrv_set_translation_hint(bs,
2100 BIOS_ATA_TRANSLATION_LARGE);
2101 } else {
2102 bdrv_set_translation_hint(bs,
2103 BIOS_ATA_TRANSLATION_LBA);
2104 }
2105 }
2106 }
2107 bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs);
2108 }
2109}
2110
ths5fafdf22007-09-16 21:08:06 +00002111void bdrv_set_geometry_hint(BlockDriverState *bs,
bellardb3380822004-03-14 21:38:54 +00002112 int cyls, int heads, int secs)
2113{
2114 bs->cyls = cyls;
2115 bs->heads = heads;
2116 bs->secs = secs;
2117}
2118
bellard46d47672004-11-16 01:45:27 +00002119void bdrv_set_translation_hint(BlockDriverState *bs, int translation)
2120{
2121 bs->translation = translation;
2122}
2123
ths5fafdf22007-09-16 21:08:06 +00002124void bdrv_get_geometry_hint(BlockDriverState *bs,
bellardb3380822004-03-14 21:38:54 +00002125 int *pcyls, int *pheads, int *psecs)
2126{
2127 *pcyls = bs->cyls;
2128 *pheads = bs->heads;
2129 *psecs = bs->secs;
2130}
2131
Zhi Yong Wu0563e192011-11-03 16:57:25 +08002132/* throttling disk io limits */
2133void bdrv_set_io_limits(BlockDriverState *bs,
2134 BlockIOLimit *io_limits)
2135{
2136 bs->io_limits = *io_limits;
2137 bs->io_limits_enabled = bdrv_io_limits_enabled(bs);
2138}
2139
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002140/* Recognize floppy formats */
2141typedef struct FDFormat {
2142 FDriveType drive;
2143 uint8_t last_sect;
2144 uint8_t max_track;
2145 uint8_t max_head;
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002146 FDriveRate rate;
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002147} FDFormat;
2148
2149static const FDFormat fd_formats[] = {
2150 /* First entry is default format */
2151 /* 1.44 MB 3"1/2 floppy disks */
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002152 { FDRIVE_DRV_144, 18, 80, 1, FDRIVE_RATE_500K, },
2153 { FDRIVE_DRV_144, 20, 80, 1, FDRIVE_RATE_500K, },
2154 { FDRIVE_DRV_144, 21, 80, 1, FDRIVE_RATE_500K, },
2155 { FDRIVE_DRV_144, 21, 82, 1, FDRIVE_RATE_500K, },
2156 { FDRIVE_DRV_144, 21, 83, 1, FDRIVE_RATE_500K, },
2157 { FDRIVE_DRV_144, 22, 80, 1, FDRIVE_RATE_500K, },
2158 { FDRIVE_DRV_144, 23, 80, 1, FDRIVE_RATE_500K, },
2159 { FDRIVE_DRV_144, 24, 80, 1, FDRIVE_RATE_500K, },
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002160 /* 2.88 MB 3"1/2 floppy disks */
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002161 { FDRIVE_DRV_288, 36, 80, 1, FDRIVE_RATE_1M, },
2162 { FDRIVE_DRV_288, 39, 80, 1, FDRIVE_RATE_1M, },
2163 { FDRIVE_DRV_288, 40, 80, 1, FDRIVE_RATE_1M, },
2164 { FDRIVE_DRV_288, 44, 80, 1, FDRIVE_RATE_1M, },
2165 { FDRIVE_DRV_288, 48, 80, 1, FDRIVE_RATE_1M, },
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002166 /* 720 kB 3"1/2 floppy disks */
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002167 { FDRIVE_DRV_144, 9, 80, 1, FDRIVE_RATE_250K, },
2168 { FDRIVE_DRV_144, 10, 80, 1, FDRIVE_RATE_250K, },
2169 { FDRIVE_DRV_144, 10, 82, 1, FDRIVE_RATE_250K, },
2170 { FDRIVE_DRV_144, 10, 83, 1, FDRIVE_RATE_250K, },
2171 { FDRIVE_DRV_144, 13, 80, 1, FDRIVE_RATE_250K, },
2172 { FDRIVE_DRV_144, 14, 80, 1, FDRIVE_RATE_250K, },
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002173 /* 1.2 MB 5"1/4 floppy disks */
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002174 { FDRIVE_DRV_120, 15, 80, 1, FDRIVE_RATE_500K, },
2175 { FDRIVE_DRV_120, 18, 80, 1, FDRIVE_RATE_500K, },
2176 { FDRIVE_DRV_120, 18, 82, 1, FDRIVE_RATE_500K, },
2177 { FDRIVE_DRV_120, 18, 83, 1, FDRIVE_RATE_500K, },
2178 { FDRIVE_DRV_120, 20, 80, 1, FDRIVE_RATE_500K, },
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002179 /* 720 kB 5"1/4 floppy disks */
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002180 { FDRIVE_DRV_120, 9, 80, 1, FDRIVE_RATE_250K, },
2181 { FDRIVE_DRV_120, 11, 80, 1, FDRIVE_RATE_250K, },
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002182 /* 360 kB 5"1/4 floppy disks */
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002183 { FDRIVE_DRV_120, 9, 40, 1, FDRIVE_RATE_300K, },
2184 { FDRIVE_DRV_120, 9, 40, 0, FDRIVE_RATE_300K, },
2185 { FDRIVE_DRV_120, 10, 41, 1, FDRIVE_RATE_300K, },
2186 { FDRIVE_DRV_120, 10, 42, 1, FDRIVE_RATE_300K, },
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002187 /* 320 kB 5"1/4 floppy disks */
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002188 { FDRIVE_DRV_120, 8, 40, 1, FDRIVE_RATE_250K, },
2189 { FDRIVE_DRV_120, 8, 40, 0, FDRIVE_RATE_250K, },
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002190 /* 360 kB must match 5"1/4 better than 3"1/2... */
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002191 { FDRIVE_DRV_144, 9, 80, 0, FDRIVE_RATE_250K, },
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002192 /* end */
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002193 { FDRIVE_DRV_NONE, -1, -1, 0, 0, },
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002194};
2195
2196void bdrv_get_floppy_geometry_hint(BlockDriverState *bs, int *nb_heads,
2197 int *max_track, int *last_sect,
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002198 FDriveType drive_in, FDriveType *drive,
2199 FDriveRate *rate)
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002200{
2201 const FDFormat *parse;
2202 uint64_t nb_sectors, size;
2203 int i, first_match, match;
2204
2205 bdrv_get_geometry_hint(bs, nb_heads, max_track, last_sect);
2206 if (*nb_heads != 0 && *max_track != 0 && *last_sect != 0) {
2207 /* User defined disk */
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002208 *rate = FDRIVE_RATE_500K;
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002209 } else {
2210 bdrv_get_geometry(bs, &nb_sectors);
2211 match = -1;
2212 first_match = -1;
2213 for (i = 0; ; i++) {
2214 parse = &fd_formats[i];
2215 if (parse->drive == FDRIVE_DRV_NONE) {
2216 break;
2217 }
2218 if (drive_in == parse->drive ||
2219 drive_in == FDRIVE_DRV_NONE) {
2220 size = (parse->max_head + 1) * parse->max_track *
2221 parse->last_sect;
2222 if (nb_sectors == size) {
2223 match = i;
2224 break;
2225 }
2226 if (first_match == -1) {
2227 first_match = i;
2228 }
2229 }
2230 }
2231 if (match == -1) {
2232 if (first_match == -1) {
2233 match = 1;
2234 } else {
2235 match = first_match;
2236 }
2237 parse = &fd_formats[match];
2238 }
2239 *nb_heads = parse->max_head + 1;
2240 *max_track = parse->max_track;
2241 *last_sect = parse->last_sect;
2242 *drive = parse->drive;
Hervé Poussineauf8d3d122012-02-06 22:29:07 +01002243 *rate = parse->rate;
Blue Swirl5bbdbb42011-02-12 20:43:32 +00002244 }
2245}
2246
bellard46d47672004-11-16 01:45:27 +00002247int bdrv_get_translation_hint(BlockDriverState *bs)
2248{
2249 return bs->translation;
2250}
2251
Markus Armbrusterabd7f682010-06-02 18:55:17 +02002252void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error,
2253 BlockErrorAction on_write_error)
2254{
2255 bs->on_read_error = on_read_error;
2256 bs->on_write_error = on_write_error;
2257}
2258
2259BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read)
2260{
2261 return is_read ? bs->on_read_error : bs->on_write_error;
2262}
2263
bellardb3380822004-03-14 21:38:54 +00002264int bdrv_is_read_only(BlockDriverState *bs)
2265{
2266 return bs->read_only;
2267}
2268
ths985a03b2007-12-24 16:10:43 +00002269int bdrv_is_sg(BlockDriverState *bs)
2270{
2271 return bs->sg;
2272}
2273
Christoph Hellwige900a7b2009-09-04 19:01:15 +02002274int bdrv_enable_write_cache(BlockDriverState *bs)
2275{
2276 return bs->enable_write_cache;
2277}
2278
bellardea2384d2004-08-01 21:59:26 +00002279int bdrv_is_encrypted(BlockDriverState *bs)
2280{
2281 if (bs->backing_hd && bs->backing_hd->encrypted)
2282 return 1;
2283 return bs->encrypted;
2284}
2285
aliguoric0f4ce72009-03-05 23:01:01 +00002286int bdrv_key_required(BlockDriverState *bs)
2287{
2288 BlockDriverState *backing_hd = bs->backing_hd;
2289
2290 if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
2291 return 1;
2292 return (bs->encrypted && !bs->valid_key);
2293}
2294
bellardea2384d2004-08-01 21:59:26 +00002295int bdrv_set_key(BlockDriverState *bs, const char *key)
2296{
2297 int ret;
2298 if (bs->backing_hd && bs->backing_hd->encrypted) {
2299 ret = bdrv_set_key(bs->backing_hd, key);
2300 if (ret < 0)
2301 return ret;
2302 if (!bs->encrypted)
2303 return 0;
2304 }
Shahar Havivifd04a2a2010-03-06 00:26:13 +02002305 if (!bs->encrypted) {
2306 return -EINVAL;
2307 } else if (!bs->drv || !bs->drv->bdrv_set_key) {
2308 return -ENOMEDIUM;
2309 }
aliguoric0f4ce72009-03-05 23:01:01 +00002310 ret = bs->drv->bdrv_set_key(bs, key);
aliguoribb5fc202009-03-05 23:01:15 +00002311 if (ret < 0) {
2312 bs->valid_key = 0;
2313 } else if (!bs->valid_key) {
2314 bs->valid_key = 1;
2315 /* call the change callback now, we skipped it on open */
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +02002316 bdrv_dev_change_media_cb(bs, true);
aliguoribb5fc202009-03-05 23:01:15 +00002317 }
aliguoric0f4ce72009-03-05 23:01:01 +00002318 return ret;
bellardea2384d2004-08-01 21:59:26 +00002319}
2320
2321void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
2322{
bellard19cb3732006-08-19 11:45:59 +00002323 if (!bs->drv) {
bellardea2384d2004-08-01 21:59:26 +00002324 buf[0] = '\0';
2325 } else {
2326 pstrcpy(buf, buf_size, bs->drv->format_name);
2327 }
2328}
2329
ths5fafdf22007-09-16 21:08:06 +00002330void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
bellardea2384d2004-08-01 21:59:26 +00002331 void *opaque)
2332{
2333 BlockDriver *drv;
2334
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +01002335 QLIST_FOREACH(drv, &bdrv_drivers, list) {
bellardea2384d2004-08-01 21:59:26 +00002336 it(opaque, drv->format_name);
2337 }
2338}
2339
bellardb3380822004-03-14 21:38:54 +00002340BlockDriverState *bdrv_find(const char *name)
2341{
2342 BlockDriverState *bs;
2343
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002344 QTAILQ_FOREACH(bs, &bdrv_states, list) {
2345 if (!strcmp(name, bs->device_name)) {
bellardb3380822004-03-14 21:38:54 +00002346 return bs;
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002347 }
bellardb3380822004-03-14 21:38:54 +00002348 }
2349 return NULL;
2350}
2351
Markus Armbruster2f399b02010-06-02 18:55:20 +02002352BlockDriverState *bdrv_next(BlockDriverState *bs)
2353{
2354 if (!bs) {
2355 return QTAILQ_FIRST(&bdrv_states);
2356 }
2357 return QTAILQ_NEXT(bs, list);
2358}
2359
aliguori51de9762009-03-05 23:00:43 +00002360void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
bellard81d09122004-07-14 17:21:37 +00002361{
2362 BlockDriverState *bs;
2363
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002364 QTAILQ_FOREACH(bs, &bdrv_states, list) {
aliguori51de9762009-03-05 23:00:43 +00002365 it(opaque, bs);
bellard81d09122004-07-14 17:21:37 +00002366 }
2367}
2368
bellardea2384d2004-08-01 21:59:26 +00002369const char *bdrv_get_device_name(BlockDriverState *bs)
2370{
2371 return bs->device_name;
2372}
2373
aliguoric6ca28d2008-10-06 13:55:43 +00002374void bdrv_flush_all(void)
2375{
2376 BlockDriverState *bs;
2377
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002378 QTAILQ_FOREACH(bs, &bdrv_states, list) {
Paolo Bonzini29cdb252012-03-12 18:26:01 +01002379 bdrv_flush(bs);
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002380 }
aliguoric6ca28d2008-10-06 13:55:43 +00002381}
2382
Kevin Wolff2feebb2010-04-14 17:30:35 +02002383int bdrv_has_zero_init(BlockDriverState *bs)
2384{
2385 assert(bs->drv);
2386
Kevin Wolf336c1c12010-07-28 11:26:29 +02002387 if (bs->drv->bdrv_has_zero_init) {
2388 return bs->drv->bdrv_has_zero_init(bs);
Kevin Wolff2feebb2010-04-14 17:30:35 +02002389 }
2390
2391 return 1;
2392}
2393
Stefan Hajnoczi376ae3f2011-11-14 12:44:19 +00002394typedef struct BdrvCoIsAllocatedData {
2395 BlockDriverState *bs;
2396 int64_t sector_num;
2397 int nb_sectors;
2398 int *pnum;
2399 int ret;
2400 bool done;
2401} BdrvCoIsAllocatedData;
2402
thsf58c7b32008-06-05 21:53:49 +00002403/*
2404 * Returns true iff the specified sector is present in the disk image. Drivers
2405 * not implementing the functionality are assumed to not support backing files,
2406 * hence all their sectors are reported as allocated.
2407 *
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00002408 * If 'sector_num' is beyond the end of the disk image the return value is 0
2409 * and 'pnum' is set to 0.
2410 *
thsf58c7b32008-06-05 21:53:49 +00002411 * 'pnum' is set to the number of sectors (including and immediately following
2412 * the specified sector) that are known to be in the same
2413 * allocated/unallocated state.
2414 *
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00002415 * 'nb_sectors' is the max value 'pnum' should be set to. If nb_sectors goes
2416 * beyond the end of the disk image it will be clamped.
thsf58c7b32008-06-05 21:53:49 +00002417 */
Stefan Hajnoczi060f51c2011-11-14 12:44:26 +00002418int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs, int64_t sector_num,
2419 int nb_sectors, int *pnum)
thsf58c7b32008-06-05 21:53:49 +00002420{
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00002421 int64_t n;
2422
2423 if (sector_num >= bs->total_sectors) {
2424 *pnum = 0;
2425 return 0;
2426 }
2427
2428 n = bs->total_sectors - sector_num;
2429 if (n < nb_sectors) {
2430 nb_sectors = n;
2431 }
2432
Stefan Hajnoczi6aebab12011-11-14 12:44:25 +00002433 if (!bs->drv->bdrv_co_is_allocated) {
Stefan Hajnoczibd9533e2011-11-29 13:49:51 +00002434 *pnum = nb_sectors;
thsf58c7b32008-06-05 21:53:49 +00002435 return 1;
2436 }
Stefan Hajnoczi6aebab12011-11-14 12:44:25 +00002437
Stefan Hajnoczi060f51c2011-11-14 12:44:26 +00002438 return bs->drv->bdrv_co_is_allocated(bs, sector_num, nb_sectors, pnum);
2439}
2440
2441/* Coroutine wrapper for bdrv_is_allocated() */
2442static void coroutine_fn bdrv_is_allocated_co_entry(void *opaque)
2443{
2444 BdrvCoIsAllocatedData *data = opaque;
2445 BlockDriverState *bs = data->bs;
2446
2447 data->ret = bdrv_co_is_allocated(bs, data->sector_num, data->nb_sectors,
2448 data->pnum);
2449 data->done = true;
2450}
2451
2452/*
2453 * Synchronous wrapper around bdrv_co_is_allocated().
2454 *
2455 * See bdrv_co_is_allocated() for details.
2456 */
2457int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
2458 int *pnum)
2459{
Stefan Hajnoczi6aebab12011-11-14 12:44:25 +00002460 Coroutine *co;
2461 BdrvCoIsAllocatedData data = {
2462 .bs = bs,
2463 .sector_num = sector_num,
2464 .nb_sectors = nb_sectors,
2465 .pnum = pnum,
2466 .done = false,
2467 };
2468
2469 co = qemu_coroutine_create(bdrv_is_allocated_co_entry);
2470 qemu_coroutine_enter(co, &data);
2471 while (!data.done) {
2472 qemu_aio_wait();
2473 }
2474 return data.ret;
thsf58c7b32008-06-05 21:53:49 +00002475}
2476
Luiz Capitulinob2023812011-09-21 17:16:47 -03002477BlockInfoList *qmp_query_block(Error **errp)
bellardb3380822004-03-14 21:38:54 +00002478{
Luiz Capitulinob2023812011-09-21 17:16:47 -03002479 BlockInfoList *head = NULL, *cur_item = NULL;
bellardb3380822004-03-14 21:38:54 +00002480 BlockDriverState *bs;
2481
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002482 QTAILQ_FOREACH(bs, &bdrv_states, list) {
Luiz Capitulinob2023812011-09-21 17:16:47 -03002483 BlockInfoList *info = g_malloc0(sizeof(*info));
Luiz Capitulinod15e5462009-12-10 17:16:06 -02002484
Luiz Capitulinob2023812011-09-21 17:16:47 -03002485 info->value = g_malloc0(sizeof(*info->value));
2486 info->value->device = g_strdup(bs->device_name);
2487 info->value->type = g_strdup("unknown");
2488 info->value->locked = bdrv_dev_is_medium_locked(bs);
2489 info->value->removable = bdrv_dev_has_removable_media(bs);
Luiz Capitulinod15e5462009-12-10 17:16:06 -02002490
Markus Armbrustere4def802011-09-06 18:58:53 +02002491 if (bdrv_dev_has_removable_media(bs)) {
Luiz Capitulinob2023812011-09-21 17:16:47 -03002492 info->value->has_tray_open = true;
2493 info->value->tray_open = bdrv_dev_is_tray_open(bs);
Markus Armbrustere4def802011-09-06 18:58:53 +02002494 }
Luiz Capitulinof04ef602011-09-26 17:43:54 -03002495
2496 if (bdrv_iostatus_is_enabled(bs)) {
Luiz Capitulinob2023812011-09-21 17:16:47 -03002497 info->value->has_io_status = true;
2498 info->value->io_status = bs->iostatus;
Luiz Capitulinof04ef602011-09-26 17:43:54 -03002499 }
2500
bellard19cb3732006-08-19 11:45:59 +00002501 if (bs->drv) {
Luiz Capitulinob2023812011-09-21 17:16:47 -03002502 info->value->has_inserted = true;
2503 info->value->inserted = g_malloc0(sizeof(*info->value->inserted));
2504 info->value->inserted->file = g_strdup(bs->filename);
2505 info->value->inserted->ro = bs->read_only;
2506 info->value->inserted->drv = g_strdup(bs->drv->format_name);
2507 info->value->inserted->encrypted = bs->encrypted;
2508 if (bs->backing_file[0]) {
2509 info->value->inserted->has_backing_file = true;
2510 info->value->inserted->backing_file = g_strdup(bs->backing_file);
aliguori376253e2009-03-05 23:01:23 +00002511 }
Zhi Yong Wu727f0052011-11-08 13:00:31 +08002512
2513 if (bs->io_limits_enabled) {
2514 info->value->inserted->bps =
2515 bs->io_limits.bps[BLOCK_IO_LIMIT_TOTAL];
2516 info->value->inserted->bps_rd =
2517 bs->io_limits.bps[BLOCK_IO_LIMIT_READ];
2518 info->value->inserted->bps_wr =
2519 bs->io_limits.bps[BLOCK_IO_LIMIT_WRITE];
2520 info->value->inserted->iops =
2521 bs->io_limits.iops[BLOCK_IO_LIMIT_TOTAL];
2522 info->value->inserted->iops_rd =
2523 bs->io_limits.iops[BLOCK_IO_LIMIT_READ];
2524 info->value->inserted->iops_wr =
2525 bs->io_limits.iops[BLOCK_IO_LIMIT_WRITE];
2526 }
bellardb3380822004-03-14 21:38:54 +00002527 }
Luiz Capitulinob2023812011-09-21 17:16:47 -03002528
2529 /* XXX: waiting for the qapi to support GSList */
2530 if (!cur_item) {
2531 head = cur_item = info;
2532 } else {
2533 cur_item->next = info;
2534 cur_item = info;
2535 }
bellardb3380822004-03-14 21:38:54 +00002536 }
Luiz Capitulinod15e5462009-12-10 17:16:06 -02002537
Luiz Capitulinob2023812011-09-21 17:16:47 -03002538 return head;
bellardb3380822004-03-14 21:38:54 +00002539}
thsa36e69d2007-12-02 05:18:19 +00002540
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002541/* Consider exposing this as a full fledged QMP command */
2542static BlockStats *qmp_query_blockstat(const BlockDriverState *bs, Error **errp)
thsa36e69d2007-12-02 05:18:19 +00002543{
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002544 BlockStats *s;
Luiz Capitulino218a5362009-12-10 17:16:07 -02002545
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002546 s = g_malloc0(sizeof(*s));
Luiz Capitulino218a5362009-12-10 17:16:07 -02002547
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002548 if (bs->device_name[0]) {
2549 s->has_device = true;
2550 s->device = g_strdup(bs->device_name);
Kevin Wolf294cc352010-04-28 14:34:01 +02002551 }
2552
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002553 s->stats = g_malloc0(sizeof(*s->stats));
2554 s->stats->rd_bytes = bs->nr_bytes[BDRV_ACCT_READ];
2555 s->stats->wr_bytes = bs->nr_bytes[BDRV_ACCT_WRITE];
2556 s->stats->rd_operations = bs->nr_ops[BDRV_ACCT_READ];
2557 s->stats->wr_operations = bs->nr_ops[BDRV_ACCT_WRITE];
2558 s->stats->wr_highest_offset = bs->wr_highest_sector * BDRV_SECTOR_SIZE;
2559 s->stats->flush_operations = bs->nr_ops[BDRV_ACCT_FLUSH];
2560 s->stats->wr_total_time_ns = bs->total_time_ns[BDRV_ACCT_WRITE];
2561 s->stats->rd_total_time_ns = bs->total_time_ns[BDRV_ACCT_READ];
2562 s->stats->flush_total_time_ns = bs->total_time_ns[BDRV_ACCT_FLUSH];
2563
Kevin Wolf294cc352010-04-28 14:34:01 +02002564 if (bs->file) {
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002565 s->has_parent = true;
2566 s->parent = qmp_query_blockstat(bs->file, NULL);
Kevin Wolf294cc352010-04-28 14:34:01 +02002567 }
2568
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002569 return s;
Kevin Wolf294cc352010-04-28 14:34:01 +02002570}
2571
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002572BlockStatsList *qmp_query_blockstats(Error **errp)
Luiz Capitulino218a5362009-12-10 17:16:07 -02002573{
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002574 BlockStatsList *head = NULL, *cur_item = NULL;
thsa36e69d2007-12-02 05:18:19 +00002575 BlockDriverState *bs;
2576
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002577 QTAILQ_FOREACH(bs, &bdrv_states, list) {
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002578 BlockStatsList *info = g_malloc0(sizeof(*info));
2579 info->value = qmp_query_blockstat(bs, NULL);
2580
2581 /* XXX: waiting for the qapi to support GSList */
2582 if (!cur_item) {
2583 head = cur_item = info;
2584 } else {
2585 cur_item->next = info;
2586 cur_item = info;
2587 }
thsa36e69d2007-12-02 05:18:19 +00002588 }
Luiz Capitulino218a5362009-12-10 17:16:07 -02002589
Luiz Capitulinof11f57e2011-09-22 15:56:36 -03002590 return head;
thsa36e69d2007-12-02 05:18:19 +00002591}
bellardea2384d2004-08-01 21:59:26 +00002592
aliguori045df332009-03-05 23:00:48 +00002593const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
2594{
2595 if (bs->backing_hd && bs->backing_hd->encrypted)
2596 return bs->backing_file;
2597 else if (bs->encrypted)
2598 return bs->filename;
2599 else
2600 return NULL;
2601}
2602
ths5fafdf22007-09-16 21:08:06 +00002603void bdrv_get_backing_filename(BlockDriverState *bs,
bellard83f64092006-08-01 16:21:11 +00002604 char *filename, int filename_size)
bellardea2384d2004-08-01 21:59:26 +00002605{
Kevin Wolf3574c602011-10-26 11:02:11 +02002606 pstrcpy(filename, filename_size, bs->backing_file);
bellardea2384d2004-08-01 21:59:26 +00002607}
2608
ths5fafdf22007-09-16 21:08:06 +00002609int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
bellardfaea38e2006-08-05 21:31:00 +00002610 const uint8_t *buf, int nb_sectors)
2611{
2612 BlockDriver *drv = bs->drv;
2613 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002614 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00002615 if (!drv->bdrv_write_compressed)
2616 return -ENOTSUP;
Kevin Wolffbb7b4e2009-05-08 14:47:24 +02002617 if (bdrv_check_request(bs, sector_num, nb_sectors))
2618 return -EIO;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01002619
Jan Kiszkac6d22832009-11-30 18:21:20 +01002620 if (bs->dirty_bitmap) {
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02002621 set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
2622 }
Jan Kiszkaa55eb922009-11-30 18:21:19 +01002623
bellardfaea38e2006-08-05 21:31:00 +00002624 return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
2625}
ths3b46e622007-09-17 08:09:54 +00002626
bellardfaea38e2006-08-05 21:31:00 +00002627int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
2628{
2629 BlockDriver *drv = bs->drv;
2630 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002631 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00002632 if (!drv->bdrv_get_info)
2633 return -ENOTSUP;
2634 memset(bdi, 0, sizeof(*bdi));
2635 return drv->bdrv_get_info(bs, bdi);
2636}
2637
Christoph Hellwig45566e92009-07-10 23:11:57 +02002638int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
2639 int64_t pos, int size)
aliguori178e08a2009-04-05 19:10:55 +00002640{
2641 BlockDriver *drv = bs->drv;
2642 if (!drv)
2643 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002644 if (drv->bdrv_save_vmstate)
2645 return drv->bdrv_save_vmstate(bs, buf, pos, size);
2646 if (bs->file)
2647 return bdrv_save_vmstate(bs->file, buf, pos, size);
2648 return -ENOTSUP;
aliguori178e08a2009-04-05 19:10:55 +00002649}
2650
Christoph Hellwig45566e92009-07-10 23:11:57 +02002651int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
2652 int64_t pos, int size)
aliguori178e08a2009-04-05 19:10:55 +00002653{
2654 BlockDriver *drv = bs->drv;
2655 if (!drv)
2656 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002657 if (drv->bdrv_load_vmstate)
2658 return drv->bdrv_load_vmstate(bs, buf, pos, size);
2659 if (bs->file)
2660 return bdrv_load_vmstate(bs->file, buf, pos, size);
2661 return -ENOTSUP;
aliguori178e08a2009-04-05 19:10:55 +00002662}
2663
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002664void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event)
2665{
2666 BlockDriver *drv = bs->drv;
2667
2668 if (!drv || !drv->bdrv_debug_event) {
2669 return;
2670 }
2671
2672 return drv->bdrv_debug_event(bs, event);
2673
2674}
2675
bellardfaea38e2006-08-05 21:31:00 +00002676/**************************************************************/
2677/* handling of snapshots */
2678
Miguel Di Ciurcio Filhofeeee5a2010-06-08 10:40:55 -03002679int bdrv_can_snapshot(BlockDriverState *bs)
2680{
2681 BlockDriver *drv = bs->drv;
Markus Armbruster07b70bf2011-08-03 15:08:11 +02002682 if (!drv || !bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
Miguel Di Ciurcio Filhofeeee5a2010-06-08 10:40:55 -03002683 return 0;
2684 }
2685
2686 if (!drv->bdrv_snapshot_create) {
2687 if (bs->file != NULL) {
2688 return bdrv_can_snapshot(bs->file);
2689 }
2690 return 0;
2691 }
2692
2693 return 1;
2694}
2695
Blue Swirl199630b2010-07-25 20:49:34 +00002696int bdrv_is_snapshot(BlockDriverState *bs)
2697{
2698 return !!(bs->open_flags & BDRV_O_SNAPSHOT);
2699}
2700
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002701BlockDriverState *bdrv_snapshots(void)
2702{
2703 BlockDriverState *bs;
2704
Markus Armbruster3ac906f2010-07-01 09:30:38 +02002705 if (bs_snapshots) {
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002706 return bs_snapshots;
Markus Armbruster3ac906f2010-07-01 09:30:38 +02002707 }
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002708
2709 bs = NULL;
2710 while ((bs = bdrv_next(bs))) {
2711 if (bdrv_can_snapshot(bs)) {
Markus Armbruster3ac906f2010-07-01 09:30:38 +02002712 bs_snapshots = bs;
2713 return bs;
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002714 }
2715 }
2716 return NULL;
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002717}
2718
ths5fafdf22007-09-16 21:08:06 +00002719int bdrv_snapshot_create(BlockDriverState *bs,
bellardfaea38e2006-08-05 21:31:00 +00002720 QEMUSnapshotInfo *sn_info)
2721{
2722 BlockDriver *drv = bs->drv;
2723 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002724 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002725 if (drv->bdrv_snapshot_create)
2726 return drv->bdrv_snapshot_create(bs, sn_info);
2727 if (bs->file)
2728 return bdrv_snapshot_create(bs->file, sn_info);
2729 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002730}
2731
ths5fafdf22007-09-16 21:08:06 +00002732int bdrv_snapshot_goto(BlockDriverState *bs,
bellardfaea38e2006-08-05 21:31:00 +00002733 const char *snapshot_id)
2734{
2735 BlockDriver *drv = bs->drv;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002736 int ret, open_ret;
2737
bellardfaea38e2006-08-05 21:31:00 +00002738 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002739 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002740 if (drv->bdrv_snapshot_goto)
2741 return drv->bdrv_snapshot_goto(bs, snapshot_id);
2742
2743 if (bs->file) {
2744 drv->bdrv_close(bs);
2745 ret = bdrv_snapshot_goto(bs->file, snapshot_id);
2746 open_ret = drv->bdrv_open(bs, bs->open_flags);
2747 if (open_ret < 0) {
2748 bdrv_delete(bs->file);
2749 bs->drv = NULL;
2750 return open_ret;
2751 }
2752 return ret;
2753 }
2754
2755 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002756}
2757
2758int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
2759{
2760 BlockDriver *drv = bs->drv;
2761 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002762 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002763 if (drv->bdrv_snapshot_delete)
2764 return drv->bdrv_snapshot_delete(bs, snapshot_id);
2765 if (bs->file)
2766 return bdrv_snapshot_delete(bs->file, snapshot_id);
2767 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002768}
2769
ths5fafdf22007-09-16 21:08:06 +00002770int bdrv_snapshot_list(BlockDriverState *bs,
bellardfaea38e2006-08-05 21:31:00 +00002771 QEMUSnapshotInfo **psn_info)
2772{
2773 BlockDriver *drv = bs->drv;
2774 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002775 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002776 if (drv->bdrv_snapshot_list)
2777 return drv->bdrv_snapshot_list(bs, psn_info);
2778 if (bs->file)
2779 return bdrv_snapshot_list(bs->file, psn_info);
2780 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002781}
2782
edison51ef6722010-09-21 19:58:41 -07002783int bdrv_snapshot_load_tmp(BlockDriverState *bs,
2784 const char *snapshot_name)
2785{
2786 BlockDriver *drv = bs->drv;
2787 if (!drv) {
2788 return -ENOMEDIUM;
2789 }
2790 if (!bs->read_only) {
2791 return -EINVAL;
2792 }
2793 if (drv->bdrv_snapshot_load_tmp) {
2794 return drv->bdrv_snapshot_load_tmp(bs, snapshot_name);
2795 }
2796 return -ENOTSUP;
2797}
2798
Marcelo Tosattie8a6bb92012-01-18 14:40:51 +00002799BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
2800 const char *backing_file)
2801{
2802 if (!bs->drv) {
2803 return NULL;
2804 }
2805
2806 if (bs->backing_hd) {
2807 if (strcmp(bs->backing_file, backing_file) == 0) {
2808 return bs->backing_hd;
2809 } else {
2810 return bdrv_find_backing_image(bs->backing_hd, backing_file);
2811 }
2812 }
2813
2814 return NULL;
2815}
2816
bellardfaea38e2006-08-05 21:31:00 +00002817#define NB_SUFFIXES 4
2818
2819char *get_human_readable_size(char *buf, int buf_size, int64_t size)
2820{
2821 static const char suffixes[NB_SUFFIXES] = "KMGT";
2822 int64_t base;
2823 int i;
2824
2825 if (size <= 999) {
2826 snprintf(buf, buf_size, "%" PRId64, size);
2827 } else {
2828 base = 1024;
2829 for(i = 0; i < NB_SUFFIXES; i++) {
2830 if (size < (10 * base)) {
ths5fafdf22007-09-16 21:08:06 +00002831 snprintf(buf, buf_size, "%0.1f%c",
bellardfaea38e2006-08-05 21:31:00 +00002832 (double)size / base,
2833 suffixes[i]);
2834 break;
2835 } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) {
ths5fafdf22007-09-16 21:08:06 +00002836 snprintf(buf, buf_size, "%" PRId64 "%c",
bellardfaea38e2006-08-05 21:31:00 +00002837 ((size + (base >> 1)) / base),
2838 suffixes[i]);
2839 break;
2840 }
2841 base = base * 1024;
2842 }
2843 }
2844 return buf;
2845}
2846
2847char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
2848{
2849 char buf1[128], date_buf[128], clock_buf[128];
bellard3b9f94e2007-01-07 17:27:07 +00002850#ifdef _WIN32
2851 struct tm *ptm;
2852#else
bellardfaea38e2006-08-05 21:31:00 +00002853 struct tm tm;
bellard3b9f94e2007-01-07 17:27:07 +00002854#endif
bellardfaea38e2006-08-05 21:31:00 +00002855 time_t ti;
2856 int64_t secs;
2857
2858 if (!sn) {
ths5fafdf22007-09-16 21:08:06 +00002859 snprintf(buf, buf_size,
2860 "%-10s%-20s%7s%20s%15s",
bellardfaea38e2006-08-05 21:31:00 +00002861 "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
2862 } else {
2863 ti = sn->date_sec;
bellard3b9f94e2007-01-07 17:27:07 +00002864#ifdef _WIN32
2865 ptm = localtime(&ti);
2866 strftime(date_buf, sizeof(date_buf),
2867 "%Y-%m-%d %H:%M:%S", ptm);
2868#else
bellardfaea38e2006-08-05 21:31:00 +00002869 localtime_r(&ti, &tm);
2870 strftime(date_buf, sizeof(date_buf),
2871 "%Y-%m-%d %H:%M:%S", &tm);
bellard3b9f94e2007-01-07 17:27:07 +00002872#endif
bellardfaea38e2006-08-05 21:31:00 +00002873 secs = sn->vm_clock_nsec / 1000000000;
2874 snprintf(clock_buf, sizeof(clock_buf),
2875 "%02d:%02d:%02d.%03d",
2876 (int)(secs / 3600),
2877 (int)((secs / 60) % 60),
ths5fafdf22007-09-16 21:08:06 +00002878 (int)(secs % 60),
bellardfaea38e2006-08-05 21:31:00 +00002879 (int)((sn->vm_clock_nsec / 1000000) % 1000));
2880 snprintf(buf, buf_size,
ths5fafdf22007-09-16 21:08:06 +00002881 "%-10s%-20s%7s%20s%15s",
bellardfaea38e2006-08-05 21:31:00 +00002882 sn->id_str, sn->name,
2883 get_human_readable_size(buf1, sizeof(buf1), sn->vm_state_size),
2884 date_buf,
2885 clock_buf);
2886 }
2887 return buf;
2888}
2889
bellard83f64092006-08-01 16:21:11 +00002890/**************************************************************/
2891/* async I/Os */
2892
aliguori3b69e4b2009-01-22 16:59:24 +00002893BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
aliguorif141eaf2009-04-07 18:43:24 +00002894 QEMUIOVector *qiov, int nb_sectors,
aliguori3b69e4b2009-01-22 16:59:24 +00002895 BlockDriverCompletionFunc *cb, void *opaque)
2896{
Stefan Hajnoczibbf0a442010-10-05 14:28:53 +01002897 trace_bdrv_aio_readv(bs, sector_num, nb_sectors, opaque);
2898
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002899 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01002900 cb, opaque, false);
bellard83f64092006-08-01 16:21:11 +00002901}
2902
aliguorif141eaf2009-04-07 18:43:24 +00002903BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
2904 QEMUIOVector *qiov, int nb_sectors,
2905 BlockDriverCompletionFunc *cb, void *opaque)
bellard83f64092006-08-01 16:21:11 +00002906{
Stefan Hajnoczibbf0a442010-10-05 14:28:53 +01002907 trace_bdrv_aio_writev(bs, sector_num, nb_sectors, opaque);
2908
Stefan Hajnoczi1a6e1152011-10-13 13:08:25 +01002909 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01002910 cb, opaque, true);
bellard83f64092006-08-01 16:21:11 +00002911}
2912
Kevin Wolf40b4f532009-09-09 17:53:37 +02002913
2914typedef struct MultiwriteCB {
2915 int error;
2916 int num_requests;
2917 int num_callbacks;
2918 struct {
2919 BlockDriverCompletionFunc *cb;
2920 void *opaque;
2921 QEMUIOVector *free_qiov;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002922 } callbacks[];
2923} MultiwriteCB;
2924
2925static void multiwrite_user_cb(MultiwriteCB *mcb)
2926{
2927 int i;
2928
2929 for (i = 0; i < mcb->num_callbacks; i++) {
2930 mcb->callbacks[i].cb(mcb->callbacks[i].opaque, mcb->error);
Stefan Hajnoczi1e1ea482010-04-21 20:35:45 +01002931 if (mcb->callbacks[i].free_qiov) {
2932 qemu_iovec_destroy(mcb->callbacks[i].free_qiov);
2933 }
Anthony Liguori7267c092011-08-20 22:09:37 -05002934 g_free(mcb->callbacks[i].free_qiov);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002935 }
2936}
2937
2938static void multiwrite_cb(void *opaque, int ret)
2939{
2940 MultiwriteCB *mcb = opaque;
2941
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002942 trace_multiwrite_cb(mcb, ret);
2943
Kevin Wolfcb6d3ca2010-04-01 22:48:44 +02002944 if (ret < 0 && !mcb->error) {
Kevin Wolf40b4f532009-09-09 17:53:37 +02002945 mcb->error = ret;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002946 }
2947
2948 mcb->num_requests--;
2949 if (mcb->num_requests == 0) {
Kevin Wolfde189a12010-07-01 16:08:51 +02002950 multiwrite_user_cb(mcb);
Anthony Liguori7267c092011-08-20 22:09:37 -05002951 g_free(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002952 }
2953}
2954
2955static int multiwrite_req_compare(const void *a, const void *b)
2956{
Christoph Hellwig77be4362010-05-19 20:53:10 +02002957 const BlockRequest *req1 = a, *req2 = b;
2958
2959 /*
2960 * Note that we can't simply subtract req2->sector from req1->sector
2961 * here as that could overflow the return value.
2962 */
2963 if (req1->sector > req2->sector) {
2964 return 1;
2965 } else if (req1->sector < req2->sector) {
2966 return -1;
2967 } else {
2968 return 0;
2969 }
Kevin Wolf40b4f532009-09-09 17:53:37 +02002970}
2971
2972/*
2973 * Takes a bunch of requests and tries to merge them. Returns the number of
2974 * requests that remain after merging.
2975 */
2976static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs,
2977 int num_reqs, MultiwriteCB *mcb)
2978{
2979 int i, outidx;
2980
2981 // Sort requests by start sector
2982 qsort(reqs, num_reqs, sizeof(*reqs), &multiwrite_req_compare);
2983
2984 // Check if adjacent requests touch the same clusters. If so, combine them,
2985 // filling up gaps with zero sectors.
2986 outidx = 0;
2987 for (i = 1; i < num_reqs; i++) {
2988 int merge = 0;
2989 int64_t oldreq_last = reqs[outidx].sector + reqs[outidx].nb_sectors;
2990
Paolo Bonzinib6a127a2012-02-21 16:43:52 +01002991 // Handle exactly sequential writes and overlapping writes.
Kevin Wolf40b4f532009-09-09 17:53:37 +02002992 if (reqs[i].sector <= oldreq_last) {
2993 merge = 1;
2994 }
2995
Christoph Hellwige2a305f2010-01-26 14:49:08 +01002996 if (reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1 > IOV_MAX) {
2997 merge = 0;
2998 }
2999
Kevin Wolf40b4f532009-09-09 17:53:37 +02003000 if (merge) {
3001 size_t size;
Anthony Liguori7267c092011-08-20 22:09:37 -05003002 QEMUIOVector *qiov = g_malloc0(sizeof(*qiov));
Kevin Wolf40b4f532009-09-09 17:53:37 +02003003 qemu_iovec_init(qiov,
3004 reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1);
3005
3006 // Add the first request to the merged one. If the requests are
3007 // overlapping, drop the last sectors of the first request.
3008 size = (reqs[i].sector - reqs[outidx].sector) << 9;
3009 qemu_iovec_concat(qiov, reqs[outidx].qiov, size);
3010
Paolo Bonzinib6a127a2012-02-21 16:43:52 +01003011 // We should need to add any zeros between the two requests
3012 assert (reqs[i].sector <= oldreq_last);
Kevin Wolf40b4f532009-09-09 17:53:37 +02003013
3014 // Add the second request
3015 qemu_iovec_concat(qiov, reqs[i].qiov, reqs[i].qiov->size);
3016
Kevin Wolfcbf1dff2010-05-21 11:09:42 +02003017 reqs[outidx].nb_sectors = qiov->size >> 9;
Kevin Wolf40b4f532009-09-09 17:53:37 +02003018 reqs[outidx].qiov = qiov;
3019
3020 mcb->callbacks[i].free_qiov = reqs[outidx].qiov;
3021 } else {
3022 outidx++;
3023 reqs[outidx].sector = reqs[i].sector;
3024 reqs[outidx].nb_sectors = reqs[i].nb_sectors;
3025 reqs[outidx].qiov = reqs[i].qiov;
3026 }
3027 }
3028
3029 return outidx + 1;
3030}
3031
3032/*
3033 * Submit multiple AIO write requests at once.
3034 *
3035 * On success, the function returns 0 and all requests in the reqs array have
3036 * been submitted. In error case this function returns -1, and any of the
3037 * requests may or may not be submitted yet. In particular, this means that the
3038 * callback will be called for some of the requests, for others it won't. The
3039 * caller must check the error field of the BlockRequest to wait for the right
3040 * callbacks (if error != 0, no callback will be called).
3041 *
3042 * The implementation may modify the contents of the reqs array, e.g. to merge
3043 * requests. However, the fields opaque and error are left unmodified as they
3044 * are used to signal failure for a single request to the caller.
3045 */
3046int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs)
3047{
Kevin Wolf40b4f532009-09-09 17:53:37 +02003048 MultiwriteCB *mcb;
3049 int i;
3050
Ryan Harper301db7c2011-03-07 10:01:04 -06003051 /* don't submit writes if we don't have a medium */
3052 if (bs->drv == NULL) {
3053 for (i = 0; i < num_reqs; i++) {
3054 reqs[i].error = -ENOMEDIUM;
3055 }
3056 return -1;
3057 }
3058
Kevin Wolf40b4f532009-09-09 17:53:37 +02003059 if (num_reqs == 0) {
3060 return 0;
3061 }
3062
3063 // Create MultiwriteCB structure
Anthony Liguori7267c092011-08-20 22:09:37 -05003064 mcb = g_malloc0(sizeof(*mcb) + num_reqs * sizeof(*mcb->callbacks));
Kevin Wolf40b4f532009-09-09 17:53:37 +02003065 mcb->num_requests = 0;
3066 mcb->num_callbacks = num_reqs;
3067
3068 for (i = 0; i < num_reqs; i++) {
3069 mcb->callbacks[i].cb = reqs[i].cb;
3070 mcb->callbacks[i].opaque = reqs[i].opaque;
3071 }
3072
3073 // Check for mergable requests
3074 num_reqs = multiwrite_merge(bs, reqs, num_reqs, mcb);
3075
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01003076 trace_bdrv_aio_multiwrite(mcb, mcb->num_callbacks, num_reqs);
3077
Paolo Bonzinidf9309f2011-11-14 17:50:50 +01003078 /* Run the aio requests. */
3079 mcb->num_requests = num_reqs;
Kevin Wolf40b4f532009-09-09 17:53:37 +02003080 for (i = 0; i < num_reqs; i++) {
Paolo Bonziniad54ae82011-11-30 09:12:30 +01003081 bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov,
Kevin Wolf40b4f532009-09-09 17:53:37 +02003082 reqs[i].nb_sectors, multiwrite_cb, mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02003083 }
3084
3085 return 0;
Kevin Wolf40b4f532009-09-09 17:53:37 +02003086}
3087
bellard83f64092006-08-01 16:21:11 +00003088void bdrv_aio_cancel(BlockDriverAIOCB *acb)
pbrookce1a14d2006-08-07 02:38:06 +00003089{
aliguori6bbff9a2009-03-20 18:25:59 +00003090 acb->pool->cancel(acb);
bellard83f64092006-08-01 16:21:11 +00003091}
3092
Zhi Yong Wu98f90db2011-11-08 13:00:14 +08003093/* block I/O throttling */
3094static bool bdrv_exceed_bps_limits(BlockDriverState *bs, int nb_sectors,
3095 bool is_write, double elapsed_time, uint64_t *wait)
3096{
3097 uint64_t bps_limit = 0;
3098 double bytes_limit, bytes_base, bytes_res;
3099 double slice_time, wait_time;
3100
3101 if (bs->io_limits.bps[BLOCK_IO_LIMIT_TOTAL]) {
3102 bps_limit = bs->io_limits.bps[BLOCK_IO_LIMIT_TOTAL];
3103 } else if (bs->io_limits.bps[is_write]) {
3104 bps_limit = bs->io_limits.bps[is_write];
3105 } else {
3106 if (wait) {
3107 *wait = 0;
3108 }
3109
3110 return false;
3111 }
3112
3113 slice_time = bs->slice_end - bs->slice_start;
3114 slice_time /= (NANOSECONDS_PER_SECOND);
3115 bytes_limit = bps_limit * slice_time;
3116 bytes_base = bs->nr_bytes[is_write] - bs->io_base.bytes[is_write];
3117 if (bs->io_limits.bps[BLOCK_IO_LIMIT_TOTAL]) {
3118 bytes_base += bs->nr_bytes[!is_write] - bs->io_base.bytes[!is_write];
3119 }
3120
3121 /* bytes_base: the bytes of data which have been read/written; and
3122 * it is obtained from the history statistic info.
3123 * bytes_res: the remaining bytes of data which need to be read/written.
3124 * (bytes_base + bytes_res) / bps_limit: used to calcuate
3125 * the total time for completing reading/writting all data.
3126 */
3127 bytes_res = (unsigned) nb_sectors * BDRV_SECTOR_SIZE;
3128
3129 if (bytes_base + bytes_res <= bytes_limit) {
3130 if (wait) {
3131 *wait = 0;
3132 }
3133
3134 return false;
3135 }
3136
3137 /* Calc approx time to dispatch */
3138 wait_time = (bytes_base + bytes_res) / bps_limit - elapsed_time;
3139
3140 /* When the I/O rate at runtime exceeds the limits,
3141 * bs->slice_end need to be extended in order that the current statistic
3142 * info can be kept until the timer fire, so it is increased and tuned
3143 * based on the result of experiment.
3144 */
3145 bs->slice_time = wait_time * BLOCK_IO_SLICE_TIME * 10;
3146 bs->slice_end += bs->slice_time - 3 * BLOCK_IO_SLICE_TIME;
3147 if (wait) {
3148 *wait = wait_time * BLOCK_IO_SLICE_TIME * 10;
3149 }
3150
3151 return true;
3152}
3153
3154static bool bdrv_exceed_iops_limits(BlockDriverState *bs, bool is_write,
3155 double elapsed_time, uint64_t *wait)
3156{
3157 uint64_t iops_limit = 0;
3158 double ios_limit, ios_base;
3159 double slice_time, wait_time;
3160
3161 if (bs->io_limits.iops[BLOCK_IO_LIMIT_TOTAL]) {
3162 iops_limit = bs->io_limits.iops[BLOCK_IO_LIMIT_TOTAL];
3163 } else if (bs->io_limits.iops[is_write]) {
3164 iops_limit = bs->io_limits.iops[is_write];
3165 } else {
3166 if (wait) {
3167 *wait = 0;
3168 }
3169
3170 return false;
3171 }
3172
3173 slice_time = bs->slice_end - bs->slice_start;
3174 slice_time /= (NANOSECONDS_PER_SECOND);
3175 ios_limit = iops_limit * slice_time;
3176 ios_base = bs->nr_ops[is_write] - bs->io_base.ios[is_write];
3177 if (bs->io_limits.iops[BLOCK_IO_LIMIT_TOTAL]) {
3178 ios_base += bs->nr_ops[!is_write] - bs->io_base.ios[!is_write];
3179 }
3180
3181 if (ios_base + 1 <= ios_limit) {
3182 if (wait) {
3183 *wait = 0;
3184 }
3185
3186 return false;
3187 }
3188
3189 /* Calc approx time to dispatch */
3190 wait_time = (ios_base + 1) / iops_limit;
3191 if (wait_time > elapsed_time) {
3192 wait_time = wait_time - elapsed_time;
3193 } else {
3194 wait_time = 0;
3195 }
3196
3197 bs->slice_time = wait_time * BLOCK_IO_SLICE_TIME * 10;
3198 bs->slice_end += bs->slice_time - 3 * BLOCK_IO_SLICE_TIME;
3199 if (wait) {
3200 *wait = wait_time * BLOCK_IO_SLICE_TIME * 10;
3201 }
3202
3203 return true;
3204}
3205
3206static bool bdrv_exceed_io_limits(BlockDriverState *bs, int nb_sectors,
3207 bool is_write, int64_t *wait)
3208{
3209 int64_t now, max_wait;
3210 uint64_t bps_wait = 0, iops_wait = 0;
3211 double elapsed_time;
3212 int bps_ret, iops_ret;
3213
3214 now = qemu_get_clock_ns(vm_clock);
3215 if ((bs->slice_start < now)
3216 && (bs->slice_end > now)) {
3217 bs->slice_end = now + bs->slice_time;
3218 } else {
3219 bs->slice_time = 5 * BLOCK_IO_SLICE_TIME;
3220 bs->slice_start = now;
3221 bs->slice_end = now + bs->slice_time;
3222
3223 bs->io_base.bytes[is_write] = bs->nr_bytes[is_write];
3224 bs->io_base.bytes[!is_write] = bs->nr_bytes[!is_write];
3225
3226 bs->io_base.ios[is_write] = bs->nr_ops[is_write];
3227 bs->io_base.ios[!is_write] = bs->nr_ops[!is_write];
3228 }
3229
3230 elapsed_time = now - bs->slice_start;
3231 elapsed_time /= (NANOSECONDS_PER_SECOND);
3232
3233 bps_ret = bdrv_exceed_bps_limits(bs, nb_sectors,
3234 is_write, elapsed_time, &bps_wait);
3235 iops_ret = bdrv_exceed_iops_limits(bs, is_write,
3236 elapsed_time, &iops_wait);
3237 if (bps_ret || iops_ret) {
3238 max_wait = bps_wait > iops_wait ? bps_wait : iops_wait;
3239 if (wait) {
3240 *wait = max_wait;
3241 }
3242
3243 now = qemu_get_clock_ns(vm_clock);
3244 if (bs->slice_end < now + max_wait) {
3245 bs->slice_end = now + max_wait;
3246 }
3247
3248 return true;
3249 }
3250
3251 if (wait) {
3252 *wait = 0;
3253 }
3254
3255 return false;
3256}
pbrookce1a14d2006-08-07 02:38:06 +00003257
bellard83f64092006-08-01 16:21:11 +00003258/**************************************************************/
3259/* async block device emulation */
3260
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02003261typedef struct BlockDriverAIOCBSync {
3262 BlockDriverAIOCB common;
3263 QEMUBH *bh;
3264 int ret;
3265 /* vector translation state */
3266 QEMUIOVector *qiov;
3267 uint8_t *bounce;
3268 int is_write;
3269} BlockDriverAIOCBSync;
3270
3271static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
3272{
Kevin Wolfb666d232010-05-05 11:44:39 +02003273 BlockDriverAIOCBSync *acb =
3274 container_of(blockacb, BlockDriverAIOCBSync, common);
Dor Laor6a7ad292009-06-01 12:07:23 +03003275 qemu_bh_delete(acb->bh);
Avi Kivity36afc452009-06-23 16:20:36 +03003276 acb->bh = NULL;
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02003277 qemu_aio_release(acb);
3278}
3279
3280static AIOPool bdrv_em_aio_pool = {
3281 .aiocb_size = sizeof(BlockDriverAIOCBSync),
3282 .cancel = bdrv_aio_cancel_em,
3283};
3284
bellard83f64092006-08-01 16:21:11 +00003285static void bdrv_aio_bh_cb(void *opaque)
bellardbeac80c2006-06-26 20:08:57 +00003286{
pbrookce1a14d2006-08-07 02:38:06 +00003287 BlockDriverAIOCBSync *acb = opaque;
aliguorif141eaf2009-04-07 18:43:24 +00003288
aliguorif141eaf2009-04-07 18:43:24 +00003289 if (!acb->is_write)
3290 qemu_iovec_from_buffer(acb->qiov, acb->bounce, acb->qiov->size);
aliguoriceb42de2009-04-07 18:43:28 +00003291 qemu_vfree(acb->bounce);
pbrookce1a14d2006-08-07 02:38:06 +00003292 acb->common.cb(acb->common.opaque, acb->ret);
Dor Laor6a7ad292009-06-01 12:07:23 +03003293 qemu_bh_delete(acb->bh);
Avi Kivity36afc452009-06-23 16:20:36 +03003294 acb->bh = NULL;
pbrookce1a14d2006-08-07 02:38:06 +00003295 qemu_aio_release(acb);
bellardbeac80c2006-06-26 20:08:57 +00003296}
bellardbeac80c2006-06-26 20:08:57 +00003297
aliguorif141eaf2009-04-07 18:43:24 +00003298static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
3299 int64_t sector_num,
3300 QEMUIOVector *qiov,
3301 int nb_sectors,
3302 BlockDriverCompletionFunc *cb,
3303 void *opaque,
3304 int is_write)
3305
bellardea2384d2004-08-01 21:59:26 +00003306{
pbrookce1a14d2006-08-07 02:38:06 +00003307 BlockDriverAIOCBSync *acb;
pbrookce1a14d2006-08-07 02:38:06 +00003308
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02003309 acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
aliguorif141eaf2009-04-07 18:43:24 +00003310 acb->is_write = is_write;
3311 acb->qiov = qiov;
aliguorie268ca52009-04-22 20:20:00 +00003312 acb->bounce = qemu_blockalign(bs, qiov->size);
Paolo Bonzini3f3aace2011-11-14 17:50:54 +01003313 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
aliguorif141eaf2009-04-07 18:43:24 +00003314
3315 if (is_write) {
3316 qemu_iovec_to_buffer(acb->qiov, acb->bounce);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01003317 acb->ret = bs->drv->bdrv_write(bs, sector_num, acb->bounce, nb_sectors);
aliguorif141eaf2009-04-07 18:43:24 +00003318 } else {
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01003319 acb->ret = bs->drv->bdrv_read(bs, sector_num, acb->bounce, nb_sectors);
aliguorif141eaf2009-04-07 18:43:24 +00003320 }
3321
pbrookce1a14d2006-08-07 02:38:06 +00003322 qemu_bh_schedule(acb->bh);
aliguorif141eaf2009-04-07 18:43:24 +00003323
pbrookce1a14d2006-08-07 02:38:06 +00003324 return &acb->common;
pbrook7a6cba62006-06-04 11:39:07 +00003325}
3326
aliguorif141eaf2009-04-07 18:43:24 +00003327static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
3328 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
pbrookce1a14d2006-08-07 02:38:06 +00003329 BlockDriverCompletionFunc *cb, void *opaque)
bellard83f64092006-08-01 16:21:11 +00003330{
aliguorif141eaf2009-04-07 18:43:24 +00003331 return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
bellard83f64092006-08-01 16:21:11 +00003332}
3333
aliguorif141eaf2009-04-07 18:43:24 +00003334static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
3335 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
3336 BlockDriverCompletionFunc *cb, void *opaque)
3337{
3338 return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
3339}
3340
Kevin Wolf68485422011-06-30 10:05:46 +02003341
3342typedef struct BlockDriverAIOCBCoroutine {
3343 BlockDriverAIOCB common;
3344 BlockRequest req;
3345 bool is_write;
3346 QEMUBH* bh;
3347} BlockDriverAIOCBCoroutine;
3348
3349static void bdrv_aio_co_cancel_em(BlockDriverAIOCB *blockacb)
3350{
3351 qemu_aio_flush();
3352}
3353
3354static AIOPool bdrv_em_co_aio_pool = {
3355 .aiocb_size = sizeof(BlockDriverAIOCBCoroutine),
3356 .cancel = bdrv_aio_co_cancel_em,
3357};
3358
Paolo Bonzini35246a62011-10-14 10:41:29 +02003359static void bdrv_co_em_bh(void *opaque)
Kevin Wolf68485422011-06-30 10:05:46 +02003360{
3361 BlockDriverAIOCBCoroutine *acb = opaque;
3362
3363 acb->common.cb(acb->common.opaque, acb->req.error);
3364 qemu_bh_delete(acb->bh);
3365 qemu_aio_release(acb);
3366}
3367
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01003368/* Invoke bdrv_co_do_readv/bdrv_co_do_writev */
3369static void coroutine_fn bdrv_co_do_rw(void *opaque)
3370{
3371 BlockDriverAIOCBCoroutine *acb = opaque;
3372 BlockDriverState *bs = acb->common.bs;
3373
3374 if (!acb->is_write) {
3375 acb->req.error = bdrv_co_do_readv(bs, acb->req.sector,
Stefan Hajnoczi470c0502012-01-18 14:40:42 +00003376 acb->req.nb_sectors, acb->req.qiov, 0);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01003377 } else {
3378 acb->req.error = bdrv_co_do_writev(bs, acb->req.sector,
Stefan Hajnoczif08f2dd2012-02-07 13:27:25 +00003379 acb->req.nb_sectors, acb->req.qiov, 0);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01003380 }
3381
Paolo Bonzini35246a62011-10-14 10:41:29 +02003382 acb->bh = qemu_bh_new(bdrv_co_em_bh, acb);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01003383 qemu_bh_schedule(acb->bh);
3384}
3385
Kevin Wolf68485422011-06-30 10:05:46 +02003386static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
3387 int64_t sector_num,
3388 QEMUIOVector *qiov,
3389 int nb_sectors,
3390 BlockDriverCompletionFunc *cb,
3391 void *opaque,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01003392 bool is_write)
Kevin Wolf68485422011-06-30 10:05:46 +02003393{
3394 Coroutine *co;
3395 BlockDriverAIOCBCoroutine *acb;
3396
3397 acb = qemu_aio_get(&bdrv_em_co_aio_pool, bs, cb, opaque);
3398 acb->req.sector = sector_num;
3399 acb->req.nb_sectors = nb_sectors;
3400 acb->req.qiov = qiov;
3401 acb->is_write = is_write;
3402
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01003403 co = qemu_coroutine_create(bdrv_co_do_rw);
Kevin Wolf68485422011-06-30 10:05:46 +02003404 qemu_coroutine_enter(co, acb);
3405
3406 return &acb->common;
3407}
3408
Paolo Bonzini07f07612011-10-17 12:32:12 +02003409static void coroutine_fn bdrv_aio_flush_co_entry(void *opaque)
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02003410{
Paolo Bonzini07f07612011-10-17 12:32:12 +02003411 BlockDriverAIOCBCoroutine *acb = opaque;
3412 BlockDriverState *bs = acb->common.bs;
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02003413
Paolo Bonzini07f07612011-10-17 12:32:12 +02003414 acb->req.error = bdrv_co_flush(bs);
3415 acb->bh = qemu_bh_new(bdrv_co_em_bh, acb);
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02003416 qemu_bh_schedule(acb->bh);
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02003417}
3418
Paolo Bonzini07f07612011-10-17 12:32:12 +02003419BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
Alexander Graf016f5cf2010-05-26 17:51:49 +02003420 BlockDriverCompletionFunc *cb, void *opaque)
3421{
Paolo Bonzini07f07612011-10-17 12:32:12 +02003422 trace_bdrv_aio_flush(bs, opaque);
Alexander Graf016f5cf2010-05-26 17:51:49 +02003423
Paolo Bonzini07f07612011-10-17 12:32:12 +02003424 Coroutine *co;
3425 BlockDriverAIOCBCoroutine *acb;
Alexander Graf016f5cf2010-05-26 17:51:49 +02003426
Paolo Bonzini07f07612011-10-17 12:32:12 +02003427 acb = qemu_aio_get(&bdrv_em_co_aio_pool, bs, cb, opaque);
3428 co = qemu_coroutine_create(bdrv_aio_flush_co_entry);
3429 qemu_coroutine_enter(co, acb);
Alexander Graf016f5cf2010-05-26 17:51:49 +02003430
Alexander Graf016f5cf2010-05-26 17:51:49 +02003431 return &acb->common;
3432}
3433
Paolo Bonzini4265d622011-10-17 12:32:14 +02003434static void coroutine_fn bdrv_aio_discard_co_entry(void *opaque)
3435{
3436 BlockDriverAIOCBCoroutine *acb = opaque;
3437 BlockDriverState *bs = acb->common.bs;
3438
3439 acb->req.error = bdrv_co_discard(bs, acb->req.sector, acb->req.nb_sectors);
3440 acb->bh = qemu_bh_new(bdrv_co_em_bh, acb);
3441 qemu_bh_schedule(acb->bh);
3442}
3443
3444BlockDriverAIOCB *bdrv_aio_discard(BlockDriverState *bs,
3445 int64_t sector_num, int nb_sectors,
3446 BlockDriverCompletionFunc *cb, void *opaque)
3447{
3448 Coroutine *co;
3449 BlockDriverAIOCBCoroutine *acb;
3450
3451 trace_bdrv_aio_discard(bs, sector_num, nb_sectors, opaque);
3452
3453 acb = qemu_aio_get(&bdrv_em_co_aio_pool, bs, cb, opaque);
3454 acb->req.sector = sector_num;
3455 acb->req.nb_sectors = nb_sectors;
3456 co = qemu_coroutine_create(bdrv_aio_discard_co_entry);
3457 qemu_coroutine_enter(co, acb);
3458
3459 return &acb->common;
3460}
3461
bellardea2384d2004-08-01 21:59:26 +00003462void bdrv_init(void)
3463{
Anthony Liguori5efa9d52009-05-09 17:03:42 -05003464 module_call_init(MODULE_INIT_BLOCK);
bellardea2384d2004-08-01 21:59:26 +00003465}
pbrookce1a14d2006-08-07 02:38:06 +00003466
Markus Armbrustereb852012009-10-27 18:41:44 +01003467void bdrv_init_with_whitelist(void)
3468{
3469 use_bdrv_whitelist = 1;
3470 bdrv_init();
3471}
3472
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02003473void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
3474 BlockDriverCompletionFunc *cb, void *opaque)
aliguori6bbff9a2009-03-20 18:25:59 +00003475{
pbrookce1a14d2006-08-07 02:38:06 +00003476 BlockDriverAIOCB *acb;
3477
aliguori6bbff9a2009-03-20 18:25:59 +00003478 if (pool->free_aiocb) {
3479 acb = pool->free_aiocb;
3480 pool->free_aiocb = acb->next;
pbrookce1a14d2006-08-07 02:38:06 +00003481 } else {
Anthony Liguori7267c092011-08-20 22:09:37 -05003482 acb = g_malloc0(pool->aiocb_size);
aliguori6bbff9a2009-03-20 18:25:59 +00003483 acb->pool = pool;
pbrookce1a14d2006-08-07 02:38:06 +00003484 }
3485 acb->bs = bs;
3486 acb->cb = cb;
3487 acb->opaque = opaque;
3488 return acb;
3489}
3490
3491void qemu_aio_release(void *p)
3492{
aliguori6bbff9a2009-03-20 18:25:59 +00003493 BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p;
3494 AIOPool *pool = acb->pool;
3495 acb->next = pool->free_aiocb;
3496 pool->free_aiocb = acb;
pbrookce1a14d2006-08-07 02:38:06 +00003497}
bellard19cb3732006-08-19 11:45:59 +00003498
3499/**************************************************************/
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003500/* Coroutine block device emulation */
3501
3502typedef struct CoroutineIOCompletion {
3503 Coroutine *coroutine;
3504 int ret;
3505} CoroutineIOCompletion;
3506
3507static void bdrv_co_io_em_complete(void *opaque, int ret)
3508{
3509 CoroutineIOCompletion *co = opaque;
3510
3511 co->ret = ret;
3512 qemu_coroutine_enter(co->coroutine, NULL);
3513}
3514
3515static int coroutine_fn bdrv_co_io_em(BlockDriverState *bs, int64_t sector_num,
3516 int nb_sectors, QEMUIOVector *iov,
3517 bool is_write)
3518{
3519 CoroutineIOCompletion co = {
3520 .coroutine = qemu_coroutine_self(),
3521 };
3522 BlockDriverAIOCB *acb;
3523
3524 if (is_write) {
Stefan Hajnoczia652d162011-10-05 17:17:02 +01003525 acb = bs->drv->bdrv_aio_writev(bs, sector_num, iov, nb_sectors,
3526 bdrv_co_io_em_complete, &co);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003527 } else {
Stefan Hajnoczia652d162011-10-05 17:17:02 +01003528 acb = bs->drv->bdrv_aio_readv(bs, sector_num, iov, nb_sectors,
3529 bdrv_co_io_em_complete, &co);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003530 }
3531
Stefan Hajnoczi59370aa2011-09-30 17:34:58 +01003532 trace_bdrv_co_io_em(bs, sector_num, nb_sectors, is_write, acb);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003533 if (!acb) {
3534 return -EIO;
3535 }
3536 qemu_coroutine_yield();
3537
3538 return co.ret;
3539}
3540
3541static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
3542 int64_t sector_num, int nb_sectors,
3543 QEMUIOVector *iov)
3544{
3545 return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, false);
3546}
3547
3548static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
3549 int64_t sector_num, int nb_sectors,
3550 QEMUIOVector *iov)
3551{
3552 return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, true);
3553}
3554
Paolo Bonzini07f07612011-10-17 12:32:12 +02003555static void coroutine_fn bdrv_flush_co_entry(void *opaque)
Kevin Wolfe7a8a782011-07-15 16:05:00 +02003556{
Paolo Bonzini07f07612011-10-17 12:32:12 +02003557 RwCo *rwco = opaque;
Kevin Wolfe7a8a782011-07-15 16:05:00 +02003558
Paolo Bonzini07f07612011-10-17 12:32:12 +02003559 rwco->ret = bdrv_co_flush(rwco->bs);
3560}
3561
3562int coroutine_fn bdrv_co_flush(BlockDriverState *bs)
3563{
Kevin Wolfeb489bb2011-11-10 18:10:11 +01003564 int ret;
3565
Paolo Bonzini29cdb252012-03-12 18:26:01 +01003566 if (!bs || !bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
Paolo Bonzini07f07612011-10-17 12:32:12 +02003567 return 0;
Kevin Wolfeb489bb2011-11-10 18:10:11 +01003568 }
3569
Kevin Wolfca716362011-11-10 18:13:59 +01003570 /* Write back cached data to the OS even with cache=unsafe */
Kevin Wolfeb489bb2011-11-10 18:10:11 +01003571 if (bs->drv->bdrv_co_flush_to_os) {
3572 ret = bs->drv->bdrv_co_flush_to_os(bs);
3573 if (ret < 0) {
3574 return ret;
3575 }
3576 }
3577
Kevin Wolfca716362011-11-10 18:13:59 +01003578 /* But don't actually force it to the disk with cache=unsafe */
3579 if (bs->open_flags & BDRV_O_NO_FLUSH) {
3580 return 0;
3581 }
3582
Kevin Wolfeb489bb2011-11-10 18:10:11 +01003583 if (bs->drv->bdrv_co_flush_to_disk) {
Paolo Bonzini29cdb252012-03-12 18:26:01 +01003584 ret = bs->drv->bdrv_co_flush_to_disk(bs);
Paolo Bonzini07f07612011-10-17 12:32:12 +02003585 } else if (bs->drv->bdrv_aio_flush) {
3586 BlockDriverAIOCB *acb;
3587 CoroutineIOCompletion co = {
3588 .coroutine = qemu_coroutine_self(),
3589 };
3590
3591 acb = bs->drv->bdrv_aio_flush(bs, bdrv_co_io_em_complete, &co);
3592 if (acb == NULL) {
Paolo Bonzini29cdb252012-03-12 18:26:01 +01003593 ret = -EIO;
Paolo Bonzini07f07612011-10-17 12:32:12 +02003594 } else {
3595 qemu_coroutine_yield();
Paolo Bonzini29cdb252012-03-12 18:26:01 +01003596 ret = co.ret;
Paolo Bonzini07f07612011-10-17 12:32:12 +02003597 }
Paolo Bonzini07f07612011-10-17 12:32:12 +02003598 } else {
3599 /*
3600 * Some block drivers always operate in either writethrough or unsafe
3601 * mode and don't support bdrv_flush therefore. Usually qemu doesn't
3602 * know how the server works (because the behaviour is hardcoded or
3603 * depends on server-side configuration), so we can't ensure that
3604 * everything is safe on disk. Returning an error doesn't work because
3605 * that would break guests even if the server operates in writethrough
3606 * mode.
3607 *
3608 * Let's hope the user knows what he's doing.
3609 */
Paolo Bonzini29cdb252012-03-12 18:26:01 +01003610 ret = 0;
Kevin Wolfe7a8a782011-07-15 16:05:00 +02003611 }
Paolo Bonzini29cdb252012-03-12 18:26:01 +01003612 if (ret < 0) {
3613 return ret;
3614 }
3615
3616 /* Now flush the underlying protocol. It will also have BDRV_O_NO_FLUSH
3617 * in the case of cache=unsafe, so there are no useless flushes.
3618 */
3619 return bdrv_co_flush(bs->file);
Paolo Bonzini07f07612011-10-17 12:32:12 +02003620}
3621
Anthony Liguori0f154232011-11-14 15:09:45 -06003622void bdrv_invalidate_cache(BlockDriverState *bs)
3623{
3624 if (bs->drv && bs->drv->bdrv_invalidate_cache) {
3625 bs->drv->bdrv_invalidate_cache(bs);
3626 }
3627}
3628
3629void bdrv_invalidate_cache_all(void)
3630{
3631 BlockDriverState *bs;
3632
3633 QTAILQ_FOREACH(bs, &bdrv_states, list) {
3634 bdrv_invalidate_cache(bs);
3635 }
3636}
3637
Benoît Canet07789262012-03-23 08:36:49 +01003638void bdrv_clear_incoming_migration_all(void)
3639{
3640 BlockDriverState *bs;
3641
3642 QTAILQ_FOREACH(bs, &bdrv_states, list) {
3643 bs->open_flags = bs->open_flags & ~(BDRV_O_INCOMING);
3644 }
3645}
3646
Paolo Bonzini07f07612011-10-17 12:32:12 +02003647int bdrv_flush(BlockDriverState *bs)
3648{
3649 Coroutine *co;
3650 RwCo rwco = {
3651 .bs = bs,
3652 .ret = NOT_DONE,
3653 };
3654
3655 if (qemu_in_coroutine()) {
3656 /* Fast-path if already in coroutine context */
3657 bdrv_flush_co_entry(&rwco);
3658 } else {
3659 co = qemu_coroutine_create(bdrv_flush_co_entry);
3660 qemu_coroutine_enter(co, &rwco);
3661 while (rwco.ret == NOT_DONE) {
3662 qemu_aio_wait();
3663 }
3664 }
3665
3666 return rwco.ret;
Kevin Wolfe7a8a782011-07-15 16:05:00 +02003667}
3668
Paolo Bonzini4265d622011-10-17 12:32:14 +02003669static void coroutine_fn bdrv_discard_co_entry(void *opaque)
3670{
3671 RwCo *rwco = opaque;
3672
3673 rwco->ret = bdrv_co_discard(rwco->bs, rwco->sector_num, rwco->nb_sectors);
3674}
3675
3676int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
3677 int nb_sectors)
3678{
3679 if (!bs->drv) {
3680 return -ENOMEDIUM;
3681 } else if (bdrv_check_request(bs, sector_num, nb_sectors)) {
3682 return -EIO;
3683 } else if (bs->read_only) {
3684 return -EROFS;
3685 } else if (bs->drv->bdrv_co_discard) {
3686 return bs->drv->bdrv_co_discard(bs, sector_num, nb_sectors);
3687 } else if (bs->drv->bdrv_aio_discard) {
3688 BlockDriverAIOCB *acb;
3689 CoroutineIOCompletion co = {
3690 .coroutine = qemu_coroutine_self(),
3691 };
3692
3693 acb = bs->drv->bdrv_aio_discard(bs, sector_num, nb_sectors,
3694 bdrv_co_io_em_complete, &co);
3695 if (acb == NULL) {
3696 return -EIO;
3697 } else {
3698 qemu_coroutine_yield();
3699 return co.ret;
3700 }
Paolo Bonzini4265d622011-10-17 12:32:14 +02003701 } else {
3702 return 0;
3703 }
3704}
3705
3706int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
3707{
3708 Coroutine *co;
3709 RwCo rwco = {
3710 .bs = bs,
3711 .sector_num = sector_num,
3712 .nb_sectors = nb_sectors,
3713 .ret = NOT_DONE,
3714 };
3715
3716 if (qemu_in_coroutine()) {
3717 /* Fast-path if already in coroutine context */
3718 bdrv_discard_co_entry(&rwco);
3719 } else {
3720 co = qemu_coroutine_create(bdrv_discard_co_entry);
3721 qemu_coroutine_enter(co, &rwco);
3722 while (rwco.ret == NOT_DONE) {
3723 qemu_aio_wait();
3724 }
3725 }
3726
3727 return rwco.ret;
3728}
3729
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003730/**************************************************************/
bellard19cb3732006-08-19 11:45:59 +00003731/* removable device support */
3732
3733/**
3734 * Return TRUE if the media is present
3735 */
3736int bdrv_is_inserted(BlockDriverState *bs)
3737{
3738 BlockDriver *drv = bs->drv;
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003739
bellard19cb3732006-08-19 11:45:59 +00003740 if (!drv)
3741 return 0;
3742 if (!drv->bdrv_is_inserted)
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003743 return 1;
3744 return drv->bdrv_is_inserted(bs);
bellard19cb3732006-08-19 11:45:59 +00003745}
3746
3747/**
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003748 * Return whether the media changed since the last call to this
3749 * function, or -ENOTSUP if we don't know. Most drivers don't know.
bellard19cb3732006-08-19 11:45:59 +00003750 */
3751int bdrv_media_changed(BlockDriverState *bs)
3752{
3753 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003754
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003755 if (drv && drv->bdrv_media_changed) {
3756 return drv->bdrv_media_changed(bs);
3757 }
3758 return -ENOTSUP;
bellard19cb3732006-08-19 11:45:59 +00003759}
3760
3761/**
3762 * If eject_flag is TRUE, eject the media. Otherwise, close the tray
3763 */
Luiz Capitulinof36f3942012-02-03 16:24:53 -02003764void bdrv_eject(BlockDriverState *bs, bool eject_flag)
bellard19cb3732006-08-19 11:45:59 +00003765{
3766 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003767
Markus Armbruster822e1cd2011-07-20 18:23:42 +02003768 if (drv && drv->bdrv_eject) {
3769 drv->bdrv_eject(bs, eject_flag);
bellard19cb3732006-08-19 11:45:59 +00003770 }
Luiz Capitulino6f382ed2012-02-14 13:41:13 -02003771
3772 if (bs->device_name[0] != '\0') {
3773 bdrv_emit_qmp_eject_event(bs, eject_flag);
3774 }
bellard19cb3732006-08-19 11:45:59 +00003775}
3776
bellard19cb3732006-08-19 11:45:59 +00003777/**
3778 * Lock or unlock the media (if it is locked, the user won't be able
3779 * to eject it manually).
3780 */
Markus Armbruster025e8492011-09-06 18:58:47 +02003781void bdrv_lock_medium(BlockDriverState *bs, bool locked)
bellard19cb3732006-08-19 11:45:59 +00003782{
3783 BlockDriver *drv = bs->drv;
3784
Markus Armbruster025e8492011-09-06 18:58:47 +02003785 trace_bdrv_lock_medium(bs, locked);
Stefan Hajnoczib8c6d092011-03-29 20:04:40 +01003786
Markus Armbruster025e8492011-09-06 18:58:47 +02003787 if (drv && drv->bdrv_lock_medium) {
3788 drv->bdrv_lock_medium(bs, locked);
bellard19cb3732006-08-19 11:45:59 +00003789 }
3790}
ths985a03b2007-12-24 16:10:43 +00003791
3792/* needed for generic scsi interface */
3793
3794int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
3795{
3796 BlockDriver *drv = bs->drv;
3797
3798 if (drv && drv->bdrv_ioctl)
3799 return drv->bdrv_ioctl(bs, req, buf);
3800 return -ENOTSUP;
3801}
aliguori7d780662009-03-12 19:57:08 +00003802
aliguori221f7152009-03-28 17:28:41 +00003803BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
3804 unsigned long int req, void *buf,
3805 BlockDriverCompletionFunc *cb, void *opaque)
aliguori7d780662009-03-12 19:57:08 +00003806{
aliguori221f7152009-03-28 17:28:41 +00003807 BlockDriver *drv = bs->drv;
aliguori7d780662009-03-12 19:57:08 +00003808
aliguori221f7152009-03-28 17:28:41 +00003809 if (drv && drv->bdrv_aio_ioctl)
3810 return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
3811 return NULL;
aliguori7d780662009-03-12 19:57:08 +00003812}
aliguorie268ca52009-04-22 20:20:00 +00003813
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003814void bdrv_set_buffer_alignment(BlockDriverState *bs, int align)
3815{
3816 bs->buffer_alignment = align;
3817}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003818
aliguorie268ca52009-04-22 20:20:00 +00003819void *qemu_blockalign(BlockDriverState *bs, size_t size)
3820{
3821 return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
3822}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003823
3824void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable)
3825{
3826 int64_t bitmap_size;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003827
Liran Schouraaa0eb72010-01-26 10:31:48 +02003828 bs->dirty_count = 0;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003829 if (enable) {
Jan Kiszkac6d22832009-11-30 18:21:20 +01003830 if (!bs->dirty_bitmap) {
3831 bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) +
3832 BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1;
3833 bitmap_size /= BDRV_SECTORS_PER_DIRTY_CHUNK * 8;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003834
Anthony Liguori7267c092011-08-20 22:09:37 -05003835 bs->dirty_bitmap = g_malloc0(bitmap_size);
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003836 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003837 } else {
Jan Kiszkac6d22832009-11-30 18:21:20 +01003838 if (bs->dirty_bitmap) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003839 g_free(bs->dirty_bitmap);
Jan Kiszkac6d22832009-11-30 18:21:20 +01003840 bs->dirty_bitmap = NULL;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003841 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003842 }
3843}
3844
3845int bdrv_get_dirty(BlockDriverState *bs, int64_t sector)
3846{
Jan Kiszka6ea44302009-11-30 18:21:19 +01003847 int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003848
Jan Kiszkac6d22832009-11-30 18:21:20 +01003849 if (bs->dirty_bitmap &&
3850 (sector << BDRV_SECTOR_BITS) < bdrv_getlength(bs)) {
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02003851 return !!(bs->dirty_bitmap[chunk / (sizeof(unsigned long) * 8)] &
3852 (1UL << (chunk % (sizeof(unsigned long) * 8))));
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003853 } else {
3854 return 0;
3855 }
3856}
3857
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003858void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
3859 int nr_sectors)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003860{
3861 set_dirty_bitmap(bs, cur_sector, nr_sectors, 0);
3862}
Liran Schouraaa0eb72010-01-26 10:31:48 +02003863
3864int64_t bdrv_get_dirty_count(BlockDriverState *bs)
3865{
3866 return bs->dirty_count;
3867}
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003868
Marcelo Tosattidb593f22011-01-26 12:12:34 -02003869void bdrv_set_in_use(BlockDriverState *bs, int in_use)
3870{
3871 assert(bs->in_use != in_use);
3872 bs->in_use = in_use;
3873}
3874
3875int bdrv_in_use(BlockDriverState *bs)
3876{
3877 return bs->in_use;
3878}
3879
Luiz Capitulino28a72822011-09-26 17:43:50 -03003880void bdrv_iostatus_enable(BlockDriverState *bs)
3881{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003882 bs->iostatus_enabled = true;
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003883 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003884}
3885
3886/* The I/O status is only enabled if the drive explicitly
3887 * enables it _and_ the VM is configured to stop on errors */
3888bool bdrv_iostatus_is_enabled(const BlockDriverState *bs)
3889{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003890 return (bs->iostatus_enabled &&
Luiz Capitulino28a72822011-09-26 17:43:50 -03003891 (bs->on_write_error == BLOCK_ERR_STOP_ENOSPC ||
3892 bs->on_write_error == BLOCK_ERR_STOP_ANY ||
3893 bs->on_read_error == BLOCK_ERR_STOP_ANY));
3894}
3895
3896void bdrv_iostatus_disable(BlockDriverState *bs)
3897{
Luiz Capitulinod6bf2792011-10-14 17:11:23 -03003898 bs->iostatus_enabled = false;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003899}
3900
3901void bdrv_iostatus_reset(BlockDriverState *bs)
3902{
3903 if (bdrv_iostatus_is_enabled(bs)) {
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003904 bs->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003905 }
3906}
3907
3908/* XXX: Today this is set by device models because it makes the implementation
3909 quite simple. However, the block layer knows about the error, so it's
3910 possible to implement this without device models being involved */
3911void bdrv_iostatus_set_err(BlockDriverState *bs, int error)
3912{
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003913 if (bdrv_iostatus_is_enabled(bs) &&
3914 bs->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
Luiz Capitulino28a72822011-09-26 17:43:50 -03003915 assert(error >= 0);
Luiz Capitulino58e21ef2011-10-14 17:22:24 -03003916 bs->iostatus = error == ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOSPACE :
3917 BLOCK_DEVICE_IO_STATUS_FAILED;
Luiz Capitulino28a72822011-09-26 17:43:50 -03003918 }
3919}
3920
Christoph Hellwiga597e792011-08-25 08:26:01 +02003921void
3922bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, int64_t bytes,
3923 enum BlockAcctType type)
3924{
3925 assert(type < BDRV_MAX_IOTYPE);
3926
3927 cookie->bytes = bytes;
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02003928 cookie->start_time_ns = get_clock();
Christoph Hellwiga597e792011-08-25 08:26:01 +02003929 cookie->type = type;
3930}
3931
3932void
3933bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie)
3934{
3935 assert(cookie->type < BDRV_MAX_IOTYPE);
3936
3937 bs->nr_bytes[cookie->type] += cookie->bytes;
3938 bs->nr_ops[cookie->type]++;
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02003939 bs->total_time_ns[cookie->type] += get_clock() - cookie->start_time_ns;
Christoph Hellwiga597e792011-08-25 08:26:01 +02003940}
3941
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003942int bdrv_img_create(const char *filename, const char *fmt,
3943 const char *base_filename, const char *base_fmt,
3944 char *options, uint64_t img_size, int flags)
3945{
3946 QEMUOptionParameter *param = NULL, *create_options = NULL;
Kevin Wolfd2208942011-06-01 14:03:31 +02003947 QEMUOptionParameter *backing_fmt, *backing_file, *size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003948 BlockDriverState *bs = NULL;
3949 BlockDriver *drv, *proto_drv;
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003950 BlockDriver *backing_drv = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003951 int ret = 0;
3952
3953 /* Find driver and parse its options */
3954 drv = bdrv_find_format(fmt);
3955 if (!drv) {
3956 error_report("Unknown file format '%s'", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003957 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003958 goto out;
3959 }
3960
3961 proto_drv = bdrv_find_protocol(filename);
3962 if (!proto_drv) {
3963 error_report("Unknown protocol '%s'", filename);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003964 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003965 goto out;
3966 }
3967
3968 create_options = append_option_parameters(create_options,
3969 drv->create_options);
3970 create_options = append_option_parameters(create_options,
3971 proto_drv->create_options);
3972
3973 /* Create parameter list with default values */
3974 param = parse_option_parameters("", create_options, param);
3975
3976 set_option_parameter_int(param, BLOCK_OPT_SIZE, img_size);
3977
3978 /* Parse -o options */
3979 if (options) {
3980 param = parse_option_parameters(options, create_options, param);
3981 if (param == NULL) {
3982 error_report("Invalid options for file format '%s'.", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003983 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003984 goto out;
3985 }
3986 }
3987
3988 if (base_filename) {
3989 if (set_option_parameter(param, BLOCK_OPT_BACKING_FILE,
3990 base_filename)) {
3991 error_report("Backing file not supported for file format '%s'",
3992 fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003993 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003994 goto out;
3995 }
3996 }
3997
3998 if (base_fmt) {
3999 if (set_option_parameter(param, BLOCK_OPT_BACKING_FMT, base_fmt)) {
4000 error_report("Backing file format not supported for file "
4001 "format '%s'", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01004002 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004003 goto out;
4004 }
4005 }
4006
Jes Sorensen792da932010-12-16 13:52:17 +01004007 backing_file = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
4008 if (backing_file && backing_file->value.s) {
4009 if (!strcmp(filename, backing_file->value.s)) {
4010 error_report("Error: Trying to create an image with the "
4011 "same filename as the backing file");
Jes Sorensen4f70f242010-12-16 13:52:18 +01004012 ret = -EINVAL;
Jes Sorensen792da932010-12-16 13:52:17 +01004013 goto out;
4014 }
4015 }
4016
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004017 backing_fmt = get_option_parameter(param, BLOCK_OPT_BACKING_FMT);
4018 if (backing_fmt && backing_fmt->value.s) {
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00004019 backing_drv = bdrv_find_format(backing_fmt->value.s);
4020 if (!backing_drv) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004021 error_report("Unknown backing file format '%s'",
4022 backing_fmt->value.s);
Jes Sorensen4f70f242010-12-16 13:52:18 +01004023 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004024 goto out;
4025 }
4026 }
4027
4028 // The size for the image must always be specified, with one exception:
4029 // If we are using a backing file, we can obtain the size from there
Kevin Wolfd2208942011-06-01 14:03:31 +02004030 size = get_option_parameter(param, BLOCK_OPT_SIZE);
4031 if (size && size->value.n == -1) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004032 if (backing_file && backing_file->value.s) {
4033 uint64_t size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004034 char buf[32];
4035
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004036 bs = bdrv_new("");
4037
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00004038 ret = bdrv_open(bs, backing_file->value.s, flags, backing_drv);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004039 if (ret < 0) {
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00004040 error_report("Could not open '%s'", backing_file->value.s);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004041 goto out;
4042 }
4043 bdrv_get_geometry(bs, &size);
4044 size *= 512;
4045
4046 snprintf(buf, sizeof(buf), "%" PRId64, size);
4047 set_option_parameter(param, BLOCK_OPT_SIZE, buf);
4048 } else {
4049 error_report("Image creation needs a size parameter");
Jes Sorensen4f70f242010-12-16 13:52:18 +01004050 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004051 goto out;
4052 }
4053 }
4054
4055 printf("Formatting '%s', fmt=%s ", filename, fmt);
4056 print_option_parameters(param);
4057 puts("");
4058
4059 ret = bdrv_create(drv, filename, param);
4060
4061 if (ret < 0) {
4062 if (ret == -ENOTSUP) {
4063 error_report("Formatting or formatting option not supported for "
4064 "file format '%s'", fmt);
4065 } else if (ret == -EFBIG) {
4066 error_report("The image size is too large for file format '%s'",
4067 fmt);
4068 } else {
4069 error_report("%s: error while creating %s: %s", filename, fmt,
4070 strerror(-ret));
4071 }
4072 }
4073
4074out:
4075 free_option_parameters(create_options);
4076 free_option_parameters(param);
4077
4078 if (bs) {
4079 bdrv_delete(bs);
4080 }
Jes Sorensen4f70f242010-12-16 13:52:18 +01004081
4082 return ret;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01004083}
Stefan Hajnoczieeec61f2012-01-18 14:40:43 +00004084
4085void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs,
4086 BlockDriverCompletionFunc *cb, void *opaque)
4087{
4088 BlockJob *job;
4089
4090 if (bs->job || bdrv_in_use(bs)) {
4091 return NULL;
4092 }
4093 bdrv_set_in_use(bs, 1);
4094
4095 job = g_malloc0(job_type->instance_size);
4096 job->job_type = job_type;
4097 job->bs = bs;
4098 job->cb = cb;
4099 job->opaque = opaque;
4100 bs->job = job;
4101 return job;
4102}
4103
4104void block_job_complete(BlockJob *job, int ret)
4105{
4106 BlockDriverState *bs = job->bs;
4107
4108 assert(bs->job == job);
4109 job->cb(job->opaque, ret);
4110 bs->job = NULL;
4111 g_free(job);
4112 bdrv_set_in_use(bs, 0);
4113}
4114
4115int block_job_set_speed(BlockJob *job, int64_t value)
4116{
Paolo Bonzini9f25ecc2012-03-30 13:17:12 +02004117 int rc;
4118
Stefan Hajnoczieeec61f2012-01-18 14:40:43 +00004119 if (!job->job_type->set_speed) {
4120 return -ENOTSUP;
4121 }
Paolo Bonzini9f25ecc2012-03-30 13:17:12 +02004122 rc = job->job_type->set_speed(job, value);
4123 if (rc == 0) {
4124 job->speed = value;
4125 }
4126 return rc;
Stefan Hajnoczieeec61f2012-01-18 14:40:43 +00004127}
4128
4129void block_job_cancel(BlockJob *job)
4130{
4131 job->cancelled = true;
4132}
4133
4134bool block_job_is_cancelled(BlockJob *job)
4135{
4136 return job->cancelled;
4137}
Paolo Bonzini3e914652012-03-30 13:17:11 +02004138
4139void block_job_cancel_sync(BlockJob *job)
4140{
4141 BlockDriverState *bs = job->bs;
4142
4143 assert(bs->job == job);
4144 block_job_cancel(job);
4145 while (bs->job != NULL && bs->job->busy) {
4146 qemu_aio_wait();
4147 }
4148}