blob: 3d27babf68087a986e4fc10537d0bcce29b68ca2 [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 Capitulinod15e5462009-12-10 17:16:06 -020030#include "qemu-objects.h"
Kevin Wolf68485422011-06-30 10:05:46 +020031#include "qemu-coroutine.h"
bellardfc01f7e2003-06-30 10:03:06 +000032
Juan Quintela71e72a12009-07-27 16:12:56 +020033#ifdef CONFIG_BSD
bellard7674e7b2005-04-26 21:59:26 +000034#include <sys/types.h>
35#include <sys/stat.h>
36#include <sys/ioctl.h>
Blue Swirl72cf2d42009-09-12 07:36:22 +000037#include <sys/queue.h>
blueswir1c5e97232009-03-07 20:06:23 +000038#ifndef __DragonFly__
bellard7674e7b2005-04-26 21:59:26 +000039#include <sys/disk.h>
40#endif
blueswir1c5e97232009-03-07 20:06:23 +000041#endif
bellard7674e7b2005-04-26 21:59:26 +000042
aliguori49dc7682009-03-08 16:26:59 +000043#ifdef _WIN32
44#include <windows.h>
45#endif
46
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +010047#define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */
48
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +020049static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load);
aliguorif141eaf2009-04-07 18:43:24 +000050static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
51 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
aliguoric87c0672009-04-07 18:43:20 +000052 BlockDriverCompletionFunc *cb, void *opaque);
aliguorif141eaf2009-04-07 18:43:24 +000053static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
54 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
pbrookce1a14d2006-08-07 02:38:06 +000055 BlockDriverCompletionFunc *cb, void *opaque);
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +020056static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
57 BlockDriverCompletionFunc *cb, void *opaque);
Alexander Graf016f5cf2010-05-26 17:51:49 +020058static BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
59 BlockDriverCompletionFunc *cb, void *opaque);
ths5fafdf22007-09-16 21:08:06 +000060static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
bellard83f64092006-08-01 16:21:11 +000061 uint8_t *buf, int nb_sectors);
62static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
63 const uint8_t *buf, int nb_sectors);
Kevin Wolff9f05dc2011-07-15 13:50:26 +020064static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
65 int64_t sector_num, int nb_sectors,
66 QEMUIOVector *iov);
67static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
68 int64_t sector_num, int nb_sectors,
69 QEMUIOVector *iov);
Kevin Wolfe7a8a782011-07-15 16:05:00 +020070static int coroutine_fn bdrv_co_flush_em(BlockDriverState *bs);
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +010071static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
72 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +010073static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
74 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
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);
bellardec530c82006-04-25 22:36:06 +000083
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +010084static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
85 QTAILQ_HEAD_INITIALIZER(bdrv_states);
blueswir17ee930d2008-09-17 19:04:14 +000086
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +010087static QLIST_HEAD(, BlockDriver) bdrv_drivers =
88 QLIST_HEAD_INITIALIZER(bdrv_drivers);
bellardea2384d2004-08-01 21:59:26 +000089
Markus Armbrusterf9092b12010-06-25 10:33:39 +020090/* The device to use for VM snapshots */
91static BlockDriverState *bs_snapshots;
92
Markus Armbrustereb852012009-10-27 18:41:44 +010093/* If non-zero, use only whitelisted block drivers */
94static int use_bdrv_whitelist;
95
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +000096#ifdef _WIN32
97static int is_windows_drive_prefix(const char *filename)
98{
99 return (((filename[0] >= 'a' && filename[0] <= 'z') ||
100 (filename[0] >= 'A' && filename[0] <= 'Z')) &&
101 filename[1] == ':');
102}
103
104int is_windows_drive(const char *filename)
105{
106 if (is_windows_drive_prefix(filename) &&
107 filename[2] == '\0')
108 return 1;
109 if (strstart(filename, "\\\\.\\", NULL) ||
110 strstart(filename, "//./", NULL))
111 return 1;
112 return 0;
113}
114#endif
115
116/* check if the path starts with "<protocol>:" */
117static int path_has_protocol(const char *path)
118{
119#ifdef _WIN32
120 if (is_windows_drive(path) ||
121 is_windows_drive_prefix(path)) {
122 return 0;
123 }
124#endif
125
126 return strchr(path, ':') != NULL;
127}
128
bellard83f64092006-08-01 16:21:11 +0000129int path_is_absolute(const char *path)
130{
131 const char *p;
bellard21664422007-01-07 18:22:37 +0000132#ifdef _WIN32
133 /* specific case for names like: "\\.\d:" */
134 if (*path == '/' || *path == '\\')
135 return 1;
136#endif
bellard83f64092006-08-01 16:21:11 +0000137 p = strchr(path, ':');
138 if (p)
139 p++;
140 else
141 p = path;
bellard3b9f94e2007-01-07 17:27:07 +0000142#ifdef _WIN32
143 return (*p == '/' || *p == '\\');
144#else
145 return (*p == '/');
146#endif
bellard83f64092006-08-01 16:21:11 +0000147}
148
149/* if filename is absolute, just copy it to dest. Otherwise, build a
150 path to it by considering it is relative to base_path. URL are
151 supported. */
152void path_combine(char *dest, int dest_size,
153 const char *base_path,
154 const char *filename)
155{
156 const char *p, *p1;
157 int len;
158
159 if (dest_size <= 0)
160 return;
161 if (path_is_absolute(filename)) {
162 pstrcpy(dest, dest_size, filename);
163 } else {
164 p = strchr(base_path, ':');
165 if (p)
166 p++;
167 else
168 p = base_path;
bellard3b9f94e2007-01-07 17:27:07 +0000169 p1 = strrchr(base_path, '/');
170#ifdef _WIN32
171 {
172 const char *p2;
173 p2 = strrchr(base_path, '\\');
174 if (!p1 || p2 > p1)
175 p1 = p2;
176 }
177#endif
bellard83f64092006-08-01 16:21:11 +0000178 if (p1)
179 p1++;
180 else
181 p1 = base_path;
182 if (p1 > p)
183 p = p1;
184 len = p - base_path;
185 if (len > dest_size - 1)
186 len = dest_size - 1;
187 memcpy(dest, base_path, len);
188 dest[len] = '\0';
189 pstrcat(dest, dest_size, filename);
190 }
191}
192
Anthony Liguori5efa9d52009-05-09 17:03:42 -0500193void bdrv_register(BlockDriver *bdrv)
bellardea2384d2004-08-01 21:59:26 +0000194{
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +0100195 /* Block drivers without coroutine functions need emulation */
196 if (!bdrv->bdrv_co_readv) {
Kevin Wolff9f05dc2011-07-15 13:50:26 +0200197 bdrv->bdrv_co_readv = bdrv_co_readv_em;
198 bdrv->bdrv_co_writev = bdrv_co_writev_em;
199
200 if (!bdrv->bdrv_aio_readv) {
201 /* add AIO emulation layer */
202 bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
203 bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
204 } else if (!bdrv->bdrv_read) {
205 /* add synchronous IO emulation layer */
206 bdrv->bdrv_read = bdrv_read_em;
207 bdrv->bdrv_write = bdrv_write_em;
208 }
bellard83f64092006-08-01 16:21:11 +0000209 }
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +0200210
211 if (!bdrv->bdrv_aio_flush)
212 bdrv->bdrv_aio_flush = bdrv_aio_flush_em;
213
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100214 QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
bellardea2384d2004-08-01 21:59:26 +0000215}
bellardb3380822004-03-14 21:38:54 +0000216
217/* create a new block device (by default it is empty) */
218BlockDriverState *bdrv_new(const char *device_name)
bellardfc01f7e2003-06-30 10:03:06 +0000219{
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +0100220 BlockDriverState *bs;
bellardb3380822004-03-14 21:38:54 +0000221
Anthony Liguori7267c092011-08-20 22:09:37 -0500222 bs = g_malloc0(sizeof(BlockDriverState));
bellardb3380822004-03-14 21:38:54 +0000223 pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
bellardea2384d2004-08-01 21:59:26 +0000224 if (device_name[0] != '\0') {
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +0100225 QTAILQ_INSERT_TAIL(&bdrv_states, bs, list);
bellardea2384d2004-08-01 21:59:26 +0000226 }
Luiz Capitulino28a72822011-09-26 17:43:50 -0300227 bdrv_iostatus_disable(bs);
bellardb3380822004-03-14 21:38:54 +0000228 return bs;
229}
230
bellardea2384d2004-08-01 21:59:26 +0000231BlockDriver *bdrv_find_format(const char *format_name)
232{
233 BlockDriver *drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100234 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
235 if (!strcmp(drv1->format_name, format_name)) {
bellardea2384d2004-08-01 21:59:26 +0000236 return drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100237 }
bellardea2384d2004-08-01 21:59:26 +0000238 }
239 return NULL;
240}
241
Markus Armbrustereb852012009-10-27 18:41:44 +0100242static int bdrv_is_whitelisted(BlockDriver *drv)
243{
244 static const char *whitelist[] = {
245 CONFIG_BDRV_WHITELIST
246 };
247 const char **p;
248
249 if (!whitelist[0])
250 return 1; /* no whitelist, anything goes */
251
252 for (p = whitelist; *p; p++) {
253 if (!strcmp(drv->format_name, *p)) {
254 return 1;
255 }
256 }
257 return 0;
258}
259
260BlockDriver *bdrv_find_whitelisted_format(const char *format_name)
261{
262 BlockDriver *drv = bdrv_find_format(format_name);
263 return drv && bdrv_is_whitelisted(drv) ? drv : NULL;
264}
265
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200266int bdrv_create(BlockDriver *drv, const char* filename,
267 QEMUOptionParameter *options)
bellardea2384d2004-08-01 21:59:26 +0000268{
269 if (!drv->bdrv_create)
270 return -ENOTSUP;
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200271
272 return drv->bdrv_create(filename, options);
bellardea2384d2004-08-01 21:59:26 +0000273}
274
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200275int bdrv_create_file(const char* filename, QEMUOptionParameter *options)
276{
277 BlockDriver *drv;
278
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900279 drv = bdrv_find_protocol(filename);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200280 if (drv == NULL) {
Stefan Hajnoczi16905d72010-11-30 15:14:14 +0000281 return -ENOENT;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200282 }
283
284 return bdrv_create(drv, filename, options);
285}
286
bellardd5249392004-08-03 21:14:23 +0000287#ifdef _WIN32
bellard95389c82005-12-18 18:28:15 +0000288void get_tmp_filename(char *filename, int size)
bellardd5249392004-08-03 21:14:23 +0000289{
bellard3b9f94e2007-01-07 17:27:07 +0000290 char temp_dir[MAX_PATH];
ths3b46e622007-09-17 08:09:54 +0000291
bellard3b9f94e2007-01-07 17:27:07 +0000292 GetTempPath(MAX_PATH, temp_dir);
293 GetTempFileName(temp_dir, "qem", 0, filename);
bellardd5249392004-08-03 21:14:23 +0000294}
295#else
bellard95389c82005-12-18 18:28:15 +0000296void get_tmp_filename(char *filename, int size)
bellardea2384d2004-08-01 21:59:26 +0000297{
298 int fd;
blueswir17ccfb2e2008-09-14 06:45:34 +0000299 const char *tmpdir;
bellardd5249392004-08-03 21:14:23 +0000300 /* XXX: race condition possible */
aurel320badc1e2008-03-10 00:05:34 +0000301 tmpdir = getenv("TMPDIR");
302 if (!tmpdir)
303 tmpdir = "/tmp";
304 snprintf(filename, size, "%s/vl.XXXXXX", tmpdir);
bellardea2384d2004-08-01 21:59:26 +0000305 fd = mkstemp(filename);
306 close(fd);
307}
bellardd5249392004-08-03 21:14:23 +0000308#endif
bellardea2384d2004-08-01 21:59:26 +0000309
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200310/*
311 * Detect host devices. By convention, /dev/cdrom[N] is always
312 * recognized as a host CDROM.
313 */
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200314static BlockDriver *find_hdev_driver(const char *filename)
315{
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200316 int score_max = 0, score;
317 BlockDriver *drv = NULL, *d;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200318
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100319 QLIST_FOREACH(d, &bdrv_drivers, list) {
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200320 if (d->bdrv_probe_device) {
321 score = d->bdrv_probe_device(filename);
322 if (score > score_max) {
323 score_max = score;
324 drv = d;
325 }
326 }
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200327 }
328
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200329 return drv;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200330}
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200331
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900332BlockDriver *bdrv_find_protocol(const char *filename)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200333{
334 BlockDriver *drv1;
335 char protocol[128];
336 int len;
337 const char *p;
338
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200339 /* TODO Drivers without bdrv_file_open must be specified explicitly */
340
Christoph Hellwig39508e72010-06-23 12:25:17 +0200341 /*
342 * XXX(hch): we really should not let host device detection
343 * override an explicit protocol specification, but moving this
344 * later breaks access to device names with colons in them.
345 * Thanks to the brain-dead persistent naming schemes on udev-
346 * based Linux systems those actually are quite common.
347 */
348 drv1 = find_hdev_driver(filename);
349 if (drv1) {
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200350 return drv1;
351 }
Christoph Hellwig39508e72010-06-23 12:25:17 +0200352
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000353 if (!path_has_protocol(filename)) {
Christoph Hellwig39508e72010-06-23 12:25:17 +0200354 return bdrv_find_format("file");
355 }
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000356 p = strchr(filename, ':');
357 assert(p != NULL);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200358 len = p - filename;
359 if (len > sizeof(protocol) - 1)
360 len = sizeof(protocol) - 1;
361 memcpy(protocol, filename, len);
362 protocol[len] = '\0';
363 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
364 if (drv1->protocol_name &&
365 !strcmp(drv1->protocol_name, protocol)) {
366 return drv1;
367 }
368 }
369 return NULL;
370}
371
Stefan Weilc98ac352010-07-21 21:51:51 +0200372static int find_image_format(const char *filename, BlockDriver **pdrv)
bellardea2384d2004-08-01 21:59:26 +0000373{
bellard83f64092006-08-01 16:21:11 +0000374 int ret, score, score_max;
bellardea2384d2004-08-01 21:59:26 +0000375 BlockDriver *drv1, *drv;
bellard83f64092006-08-01 16:21:11 +0000376 uint8_t buf[2048];
377 BlockDriverState *bs;
ths3b46e622007-09-17 08:09:54 +0000378
Naphtali Spreif5edb012010-01-17 16:48:13 +0200379 ret = bdrv_file_open(&bs, filename, 0);
Stefan Weilc98ac352010-07-21 21:51:51 +0200380 if (ret < 0) {
381 *pdrv = NULL;
382 return ret;
383 }
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700384
Kevin Wolf08a00552010-06-01 18:37:31 +0200385 /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
386 if (bs->sg || !bdrv_is_inserted(bs)) {
Nicholas A. Bellinger1a396852010-05-27 08:56:28 -0700387 bdrv_delete(bs);
Stefan Weilc98ac352010-07-21 21:51:51 +0200388 drv = bdrv_find_format("raw");
389 if (!drv) {
390 ret = -ENOENT;
391 }
392 *pdrv = drv;
393 return ret;
Nicholas A. Bellinger1a396852010-05-27 08:56:28 -0700394 }
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700395
bellard83f64092006-08-01 16:21:11 +0000396 ret = bdrv_pread(bs, 0, buf, sizeof(buf));
397 bdrv_delete(bs);
398 if (ret < 0) {
Stefan Weilc98ac352010-07-21 21:51:51 +0200399 *pdrv = NULL;
400 return ret;
bellard83f64092006-08-01 16:21:11 +0000401 }
402
bellardea2384d2004-08-01 21:59:26 +0000403 score_max = 0;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200404 drv = NULL;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100405 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
bellard83f64092006-08-01 16:21:11 +0000406 if (drv1->bdrv_probe) {
407 score = drv1->bdrv_probe(buf, ret, filename);
408 if (score > score_max) {
409 score_max = score;
410 drv = drv1;
411 }
bellardea2384d2004-08-01 21:59:26 +0000412 }
413 }
Stefan Weilc98ac352010-07-21 21:51:51 +0200414 if (!drv) {
415 ret = -ENOENT;
416 }
417 *pdrv = drv;
418 return ret;
bellardea2384d2004-08-01 21:59:26 +0000419}
420
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100421/**
422 * Set the current 'total_sectors' value
423 */
424static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
425{
426 BlockDriver *drv = bs->drv;
427
Nicholas Bellinger396759a2010-05-17 09:46:04 -0700428 /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
429 if (bs->sg)
430 return 0;
431
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100432 /* query actual device if possible, otherwise just trust the hint */
433 if (drv->bdrv_getlength) {
434 int64_t length = drv->bdrv_getlength(bs);
435 if (length < 0) {
436 return length;
437 }
438 hint = length >> BDRV_SECTOR_BITS;
439 }
440
441 bs->total_sectors = hint;
442 return 0;
443}
444
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100445/**
446 * Set open flags for a given cache mode
447 *
448 * Return 0 on success, -1 if the cache mode was invalid.
449 */
450int bdrv_parse_cache_flags(const char *mode, int *flags)
451{
452 *flags &= ~BDRV_O_CACHE_MASK;
453
454 if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
455 *flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
Stefan Hajnoczi92196b22011-08-04 12:26:52 +0100456 } else if (!strcmp(mode, "directsync")) {
457 *flags |= BDRV_O_NOCACHE;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100458 } else if (!strcmp(mode, "writeback")) {
459 *flags |= BDRV_O_CACHE_WB;
460 } else if (!strcmp(mode, "unsafe")) {
461 *flags |= BDRV_O_CACHE_WB;
462 *flags |= BDRV_O_NO_FLUSH;
463 } else if (!strcmp(mode, "writethrough")) {
464 /* this is the default */
465 } else {
466 return -1;
467 }
468
469 return 0;
470}
471
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200472/*
Kevin Wolf57915332010-04-14 15:24:50 +0200473 * Common part for opening disk images and files
474 */
475static int bdrv_open_common(BlockDriverState *bs, const char *filename,
476 int flags, BlockDriver *drv)
477{
478 int ret, open_flags;
479
480 assert(drv != NULL);
481
Stefan Hajnoczi28dcee12011-09-22 20:14:12 +0100482 trace_bdrv_open_common(bs, filename, flags, drv->format_name);
483
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200484 bs->file = NULL;
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100485 bs->total_sectors = 0;
Kevin Wolf57915332010-04-14 15:24:50 +0200486 bs->encrypted = 0;
487 bs->valid_key = 0;
488 bs->open_flags = flags;
Kevin Wolf57915332010-04-14 15:24:50 +0200489 bs->buffer_alignment = 512;
490
491 pstrcpy(bs->filename, sizeof(bs->filename), filename);
492
493 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv)) {
494 return -ENOTSUP;
495 }
496
497 bs->drv = drv;
Anthony Liguori7267c092011-08-20 22:09:37 -0500498 bs->opaque = g_malloc0(drv->instance_size);
Kevin Wolf57915332010-04-14 15:24:50 +0200499
Christoph Hellwiga6599792011-05-17 18:04:06 +0200500 if (flags & BDRV_O_CACHE_WB)
Kevin Wolf57915332010-04-14 15:24:50 +0200501 bs->enable_write_cache = 1;
502
503 /*
504 * Clear flags that are internal to the block layer before opening the
505 * image.
506 */
507 open_flags = flags & ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
508
509 /*
Stefan Weilebabb672011-04-26 10:29:36 +0200510 * Snapshots should be writable.
Kevin Wolf57915332010-04-14 15:24:50 +0200511 */
512 if (bs->is_temporary) {
513 open_flags |= BDRV_O_RDWR;
514 }
515
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200516 /* Open the image, either directly or using a protocol */
517 if (drv->bdrv_file_open) {
518 ret = drv->bdrv_file_open(bs, filename, open_flags);
519 } else {
520 ret = bdrv_file_open(&bs->file, filename, open_flags);
521 if (ret >= 0) {
522 ret = drv->bdrv_open(bs, open_flags);
523 }
524 }
525
Kevin Wolf57915332010-04-14 15:24:50 +0200526 if (ret < 0) {
527 goto free_and_fail;
528 }
529
530 bs->keep_read_only = bs->read_only = !(open_flags & BDRV_O_RDWR);
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100531
532 ret = refresh_total_sectors(bs, bs->total_sectors);
533 if (ret < 0) {
534 goto free_and_fail;
Kevin Wolf57915332010-04-14 15:24:50 +0200535 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100536
Kevin Wolf57915332010-04-14 15:24:50 +0200537#ifndef _WIN32
538 if (bs->is_temporary) {
539 unlink(filename);
540 }
541#endif
542 return 0;
543
544free_and_fail:
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200545 if (bs->file) {
546 bdrv_delete(bs->file);
547 bs->file = NULL;
548 }
Anthony Liguori7267c092011-08-20 22:09:37 -0500549 g_free(bs->opaque);
Kevin Wolf57915332010-04-14 15:24:50 +0200550 bs->opaque = NULL;
551 bs->drv = NULL;
552 return ret;
553}
554
555/*
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200556 * Opens a file using a protocol (file, host_device, nbd, ...)
557 */
bellard83f64092006-08-01 16:21:11 +0000558int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
bellardb3380822004-03-14 21:38:54 +0000559{
bellard83f64092006-08-01 16:21:11 +0000560 BlockDriverState *bs;
Christoph Hellwig6db95602010-04-05 16:53:57 +0200561 BlockDriver *drv;
bellard83f64092006-08-01 16:21:11 +0000562 int ret;
563
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900564 drv = bdrv_find_protocol(filename);
Christoph Hellwig6db95602010-04-05 16:53:57 +0200565 if (!drv) {
566 return -ENOENT;
567 }
568
bellard83f64092006-08-01 16:21:11 +0000569 bs = bdrv_new("");
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200570 ret = bdrv_open_common(bs, filename, flags, drv);
bellard83f64092006-08-01 16:21:11 +0000571 if (ret < 0) {
572 bdrv_delete(bs);
573 return ret;
bellard3b0d4f62005-10-30 18:30:10 +0000574 }
aliguori71d07702009-03-03 17:37:16 +0000575 bs->growable = 1;
bellard83f64092006-08-01 16:21:11 +0000576 *pbs = bs;
577 return 0;
bellardea2384d2004-08-01 21:59:26 +0000578}
bellardfc01f7e2003-06-30 10:03:06 +0000579
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200580/*
581 * Opens a disk image (raw, qcow2, vmdk, ...)
582 */
Kevin Wolfd6e90982010-03-31 14:40:27 +0200583int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
584 BlockDriver *drv)
bellardea2384d2004-08-01 21:59:26 +0000585{
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200586 int ret;
bellard712e7872005-04-28 21:09:32 +0000587
bellard83f64092006-08-01 16:21:11 +0000588 if (flags & BDRV_O_SNAPSHOT) {
bellardea2384d2004-08-01 21:59:26 +0000589 BlockDriverState *bs1;
590 int64_t total_size;
aliguori7c96d462008-09-12 17:54:13 +0000591 int is_protocol = 0;
Kevin Wolf91a073a2009-05-27 14:48:06 +0200592 BlockDriver *bdrv_qcow2;
593 QEMUOptionParameter *options;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200594 char tmp_filename[PATH_MAX];
595 char backing_filename[PATH_MAX];
ths3b46e622007-09-17 08:09:54 +0000596
bellardea2384d2004-08-01 21:59:26 +0000597 /* if snapshot, we create a temporary backing file and open it
598 instead of opening 'filename' directly */
599
600 /* if there is a backing file, use it */
601 bs1 = bdrv_new("");
Kevin Wolfd6e90982010-03-31 14:40:27 +0200602 ret = bdrv_open(bs1, filename, 0, drv);
aliguori51d7c002009-03-05 23:00:29 +0000603 if (ret < 0) {
bellardea2384d2004-08-01 21:59:26 +0000604 bdrv_delete(bs1);
aliguori51d7c002009-03-05 23:00:29 +0000605 return ret;
bellardea2384d2004-08-01 21:59:26 +0000606 }
Jes Sorensen3e829902010-05-27 16:20:30 +0200607 total_size = bdrv_getlength(bs1) & BDRV_SECTOR_MASK;
aliguori7c96d462008-09-12 17:54:13 +0000608
609 if (bs1->drv && bs1->drv->protocol_name)
610 is_protocol = 1;
611
bellardea2384d2004-08-01 21:59:26 +0000612 bdrv_delete(bs1);
ths3b46e622007-09-17 08:09:54 +0000613
bellardea2384d2004-08-01 21:59:26 +0000614 get_tmp_filename(tmp_filename, sizeof(tmp_filename));
aliguori7c96d462008-09-12 17:54:13 +0000615
616 /* Real path is meaningless for protocols */
617 if (is_protocol)
618 snprintf(backing_filename, sizeof(backing_filename),
619 "%s", filename);
Kirill A. Shutemov114cdfa2009-12-25 18:19:22 +0000620 else if (!realpath(filename, backing_filename))
621 return -errno;
aliguori7c96d462008-09-12 17:54:13 +0000622
Kevin Wolf91a073a2009-05-27 14:48:06 +0200623 bdrv_qcow2 = bdrv_find_format("qcow2");
624 options = parse_option_parameters("", bdrv_qcow2->create_options, NULL);
625
Jes Sorensen3e829902010-05-27 16:20:30 +0200626 set_option_parameter_int(options, BLOCK_OPT_SIZE, total_size);
Kevin Wolf91a073a2009-05-27 14:48:06 +0200627 set_option_parameter(options, BLOCK_OPT_BACKING_FILE, backing_filename);
628 if (drv) {
629 set_option_parameter(options, BLOCK_OPT_BACKING_FMT,
630 drv->format_name);
631 }
632
633 ret = bdrv_create(bdrv_qcow2, tmp_filename, options);
Jan Kiszkad7487682010-04-29 18:24:50 +0200634 free_option_parameters(options);
aliguori51d7c002009-03-05 23:00:29 +0000635 if (ret < 0) {
636 return ret;
bellardea2384d2004-08-01 21:59:26 +0000637 }
Kevin Wolf91a073a2009-05-27 14:48:06 +0200638
bellardea2384d2004-08-01 21:59:26 +0000639 filename = tmp_filename;
Kevin Wolf91a073a2009-05-27 14:48:06 +0200640 drv = bdrv_qcow2;
bellardea2384d2004-08-01 21:59:26 +0000641 bs->is_temporary = 1;
642 }
bellard712e7872005-04-28 21:09:32 +0000643
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200644 /* Find the right image format driver */
Christoph Hellwig6db95602010-04-05 16:53:57 +0200645 if (!drv) {
Stefan Weilc98ac352010-07-21 21:51:51 +0200646 ret = find_image_format(filename, &drv);
aliguori51d7c002009-03-05 23:00:29 +0000647 }
Christoph Hellwig69873072010-01-20 18:13:25 +0100648
aliguori51d7c002009-03-05 23:00:29 +0000649 if (!drv) {
aliguori51d7c002009-03-05 23:00:29 +0000650 goto unlink_and_fail;
bellardea2384d2004-08-01 21:59:26 +0000651 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200652
653 /* Open the image */
654 ret = bdrv_open_common(bs, filename, flags, drv);
655 if (ret < 0) {
Christoph Hellwig69873072010-01-20 18:13:25 +0100656 goto unlink_and_fail;
657 }
658
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200659 /* If there is a backing file, use it */
660 if ((flags & BDRV_O_NO_BACKING) == 0 && bs->backing_file[0] != '\0') {
661 char backing_filename[PATH_MAX];
662 int back_flags;
663 BlockDriver *back_drv = NULL;
664
665 bs->backing_hd = bdrv_new("");
Stefan Hajnoczidf2dbb42010-12-02 16:54:13 +0000666
667 if (path_has_protocol(bs->backing_file)) {
668 pstrcpy(backing_filename, sizeof(backing_filename),
669 bs->backing_file);
670 } else {
671 path_combine(backing_filename, sizeof(backing_filename),
672 filename, bs->backing_file);
673 }
674
675 if (bs->backing_format[0] != '\0') {
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200676 back_drv = bdrv_find_format(bs->backing_format);
Stefan Hajnoczidf2dbb42010-12-02 16:54:13 +0000677 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200678
679 /* backing files always opened read-only */
680 back_flags =
681 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
682
683 ret = bdrv_open(bs->backing_hd, backing_filename, back_flags, back_drv);
684 if (ret < 0) {
685 bdrv_close(bs);
686 return ret;
687 }
688 if (bs->is_temporary) {
689 bs->backing_hd->keep_read_only = !(flags & BDRV_O_RDWR);
690 } else {
691 /* base image inherits from "parent" */
692 bs->backing_hd->keep_read_only = bs->keep_read_only;
693 }
694 }
695
696 if (!bdrv_key_required(bs)) {
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +0200697 bdrv_dev_change_media_cb(bs, true);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200698 }
699
700 return 0;
701
702unlink_and_fail:
703 if (bs->is_temporary) {
704 unlink(filename);
705 }
706 return ret;
707}
708
bellardfc01f7e2003-06-30 10:03:06 +0000709void bdrv_close(BlockDriverState *bs)
710{
bellard19cb3732006-08-19 11:45:59 +0000711 if (bs->drv) {
Markus Armbrusterf9092b12010-06-25 10:33:39 +0200712 if (bs == bs_snapshots) {
713 bs_snapshots = NULL;
714 }
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +0100715 if (bs->backing_hd) {
bellardea2384d2004-08-01 21:59:26 +0000716 bdrv_delete(bs->backing_hd);
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +0100717 bs->backing_hd = NULL;
718 }
bellardea2384d2004-08-01 21:59:26 +0000719 bs->drv->bdrv_close(bs);
Anthony Liguori7267c092011-08-20 22:09:37 -0500720 g_free(bs->opaque);
bellardea2384d2004-08-01 21:59:26 +0000721#ifdef _WIN32
722 if (bs->is_temporary) {
723 unlink(bs->filename);
724 }
bellard67b915a2004-03-31 23:37:16 +0000725#endif
bellardea2384d2004-08-01 21:59:26 +0000726 bs->opaque = NULL;
727 bs->drv = NULL;
bellardb3380822004-03-14 21:38:54 +0000728
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200729 if (bs->file != NULL) {
730 bdrv_close(bs->file);
731 }
732
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +0200733 bdrv_dev_change_media_cb(bs, false);
bellardb3380822004-03-14 21:38:54 +0000734 }
735}
736
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +0900737void bdrv_close_all(void)
738{
739 BlockDriverState *bs;
740
741 QTAILQ_FOREACH(bs, &bdrv_states, list) {
742 bdrv_close(bs);
743 }
744}
745
Ryan Harperd22b2f42011-03-29 20:51:47 -0500746/* make a BlockDriverState anonymous by removing from bdrv_state list.
747 Also, NULL terminate the device_name to prevent double remove */
748void bdrv_make_anon(BlockDriverState *bs)
749{
750 if (bs->device_name[0] != '\0') {
751 QTAILQ_REMOVE(&bdrv_states, bs, list);
752 }
753 bs->device_name[0] = '\0';
754}
755
bellardb3380822004-03-14 21:38:54 +0000756void bdrv_delete(BlockDriverState *bs)
757{
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200758 assert(!bs->dev);
Markus Armbruster18846de2010-06-29 16:58:30 +0200759
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +0100760 /* remove from list, if necessary */
Ryan Harperd22b2f42011-03-29 20:51:47 -0500761 bdrv_make_anon(bs);
aurel3234c6f052008-04-08 19:51:21 +0000762
bellardb3380822004-03-14 21:38:54 +0000763 bdrv_close(bs);
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200764 if (bs->file != NULL) {
765 bdrv_delete(bs->file);
766 }
767
Markus Armbrusterf9092b12010-06-25 10:33:39 +0200768 assert(bs != bs_snapshots);
Anthony Liguori7267c092011-08-20 22:09:37 -0500769 g_free(bs);
bellardfc01f7e2003-06-30 10:03:06 +0000770}
771
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200772int bdrv_attach_dev(BlockDriverState *bs, void *dev)
773/* TODO change to DeviceState *dev when all users are qdevified */
Markus Armbruster18846de2010-06-29 16:58:30 +0200774{
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200775 if (bs->dev) {
Markus Armbruster18846de2010-06-29 16:58:30 +0200776 return -EBUSY;
777 }
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200778 bs->dev = dev;
Luiz Capitulino28a72822011-09-26 17:43:50 -0300779 bdrv_iostatus_reset(bs);
Markus Armbruster18846de2010-06-29 16:58:30 +0200780 return 0;
781}
782
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200783/* TODO qdevified devices don't use this, remove when devices are qdevified */
784void bdrv_attach_dev_nofail(BlockDriverState *bs, void *dev)
Markus Armbruster18846de2010-06-29 16:58:30 +0200785{
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200786 if (bdrv_attach_dev(bs, dev) < 0) {
787 abort();
788 }
789}
790
791void bdrv_detach_dev(BlockDriverState *bs, void *dev)
792/* TODO change to DeviceState *dev when all users are qdevified */
793{
794 assert(bs->dev == dev);
795 bs->dev = NULL;
Markus Armbruster0e49de52011-08-03 15:07:41 +0200796 bs->dev_ops = NULL;
797 bs->dev_opaque = NULL;
Markus Armbruster29e05f22011-09-06 18:58:57 +0200798 bs->buffer_alignment = 512;
Markus Armbruster18846de2010-06-29 16:58:30 +0200799}
800
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200801/* TODO change to return DeviceState * when all users are qdevified */
802void *bdrv_get_attached_dev(BlockDriverState *bs)
Markus Armbruster18846de2010-06-29 16:58:30 +0200803{
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200804 return bs->dev;
Markus Armbruster18846de2010-06-29 16:58:30 +0200805}
806
Markus Armbruster0e49de52011-08-03 15:07:41 +0200807void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
808 void *opaque)
809{
810 bs->dev_ops = ops;
811 bs->dev_opaque = opaque;
Markus Armbruster2c6942f2011-09-06 18:58:51 +0200812 if (bdrv_dev_has_removable_media(bs) && bs == bs_snapshots) {
813 bs_snapshots = NULL;
814 }
Markus Armbruster0e49de52011-08-03 15:07:41 +0200815}
816
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +0200817static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load)
Markus Armbruster0e49de52011-08-03 15:07:41 +0200818{
Markus Armbruster145feb12011-08-03 15:07:42 +0200819 if (bs->dev_ops && bs->dev_ops->change_media_cb) {
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +0200820 bs->dev_ops->change_media_cb(bs->dev_opaque, load);
Markus Armbruster145feb12011-08-03 15:07:42 +0200821 }
822}
823
Markus Armbruster2c6942f2011-09-06 18:58:51 +0200824bool bdrv_dev_has_removable_media(BlockDriverState *bs)
825{
826 return !bs->dev || (bs->dev_ops && bs->dev_ops->change_media_cb);
827}
828
Markus Armbrustere4def802011-09-06 18:58:53 +0200829bool bdrv_dev_is_tray_open(BlockDriverState *bs)
830{
831 if (bs->dev_ops && bs->dev_ops->is_tray_open) {
832 return bs->dev_ops->is_tray_open(bs->dev_opaque);
833 }
834 return false;
835}
836
Markus Armbruster145feb12011-08-03 15:07:42 +0200837static void bdrv_dev_resize_cb(BlockDriverState *bs)
838{
839 if (bs->dev_ops && bs->dev_ops->resize_cb) {
840 bs->dev_ops->resize_cb(bs->dev_opaque);
Markus Armbruster0e49de52011-08-03 15:07:41 +0200841 }
842}
843
Markus Armbrusterf1076392011-09-06 18:58:46 +0200844bool bdrv_dev_is_medium_locked(BlockDriverState *bs)
845{
846 if (bs->dev_ops && bs->dev_ops->is_medium_locked) {
847 return bs->dev_ops->is_medium_locked(bs->dev_opaque);
848 }
849 return false;
850}
851
aliguorie97fc192009-04-21 23:11:50 +0000852/*
853 * Run consistency checks on an image
854 *
Kevin Wolfe076f332010-06-29 11:43:13 +0200855 * Returns 0 if the check could be completed (it doesn't mean that the image is
Stefan Weila1c72732011-04-28 17:20:38 +0200856 * free of errors) or -errno when an internal error occurred. The results of the
Kevin Wolfe076f332010-06-29 11:43:13 +0200857 * check are stored in res.
aliguorie97fc192009-04-21 23:11:50 +0000858 */
Kevin Wolfe076f332010-06-29 11:43:13 +0200859int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res)
aliguorie97fc192009-04-21 23:11:50 +0000860{
861 if (bs->drv->bdrv_check == NULL) {
862 return -ENOTSUP;
863 }
864
Kevin Wolfe076f332010-06-29 11:43:13 +0200865 memset(res, 0, sizeof(*res));
Kevin Wolf9ac228e2010-06-29 12:37:54 +0200866 return bs->drv->bdrv_check(bs, res);
aliguorie97fc192009-04-21 23:11:50 +0000867}
868
Kevin Wolf8a426612010-07-16 17:17:01 +0200869#define COMMIT_BUF_SECTORS 2048
870
bellard33e39632003-07-06 17:15:21 +0000871/* commit COW file into the raw image */
872int bdrv_commit(BlockDriverState *bs)
873{
bellard19cb3732006-08-19 11:45:59 +0000874 BlockDriver *drv = bs->drv;
Kevin Wolfee181192010-08-05 13:05:22 +0200875 BlockDriver *backing_drv;
Kevin Wolf8a426612010-07-16 17:17:01 +0200876 int64_t sector, total_sectors;
877 int n, ro, open_flags;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200878 int ret = 0, rw_ret = 0;
Kevin Wolf8a426612010-07-16 17:17:01 +0200879 uint8_t *buf;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200880 char filename[1024];
881 BlockDriverState *bs_rw, *bs_ro;
bellard33e39632003-07-06 17:15:21 +0000882
bellard19cb3732006-08-19 11:45:59 +0000883 if (!drv)
884 return -ENOMEDIUM;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200885
886 if (!bs->backing_hd) {
887 return -ENOTSUP;
bellard33e39632003-07-06 17:15:21 +0000888 }
889
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200890 if (bs->backing_hd->keep_read_only) {
891 return -EACCES;
892 }
Kevin Wolfee181192010-08-05 13:05:22 +0200893
894 backing_drv = bs->backing_hd->drv;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200895 ro = bs->backing_hd->read_only;
896 strncpy(filename, bs->backing_hd->filename, sizeof(filename));
897 open_flags = bs->backing_hd->open_flags;
898
899 if (ro) {
900 /* re-open as RW */
901 bdrv_delete(bs->backing_hd);
902 bs->backing_hd = NULL;
903 bs_rw = bdrv_new("");
Kevin Wolfee181192010-08-05 13:05:22 +0200904 rw_ret = bdrv_open(bs_rw, filename, open_flags | BDRV_O_RDWR,
905 backing_drv);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200906 if (rw_ret < 0) {
907 bdrv_delete(bs_rw);
908 /* try to re-open read-only */
909 bs_ro = bdrv_new("");
Kevin Wolfee181192010-08-05 13:05:22 +0200910 ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR,
911 backing_drv);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200912 if (ret < 0) {
913 bdrv_delete(bs_ro);
914 /* drive not functional anymore */
915 bs->drv = NULL;
916 return ret;
917 }
918 bs->backing_hd = bs_ro;
919 return rw_ret;
920 }
921 bs->backing_hd = bs_rw;
bellard33e39632003-07-06 17:15:21 +0000922 }
bellardea2384d2004-08-01 21:59:26 +0000923
Jan Kiszka6ea44302009-11-30 18:21:19 +0100924 total_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
Anthony Liguori7267c092011-08-20 22:09:37 -0500925 buf = g_malloc(COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
bellardea2384d2004-08-01 21:59:26 +0000926
Kevin Wolf8a426612010-07-16 17:17:01 +0200927 for (sector = 0; sector < total_sectors; sector += n) {
928 if (drv->bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n)) {
929
930 if (bdrv_read(bs, sector, buf, n) != 0) {
931 ret = -EIO;
932 goto ro_cleanup;
933 }
934
935 if (bdrv_write(bs->backing_hd, sector, buf, n) != 0) {
936 ret = -EIO;
937 goto ro_cleanup;
938 }
bellardea2384d2004-08-01 21:59:26 +0000939 }
940 }
bellard95389c82005-12-18 18:28:15 +0000941
Christoph Hellwig1d449522010-01-17 12:32:30 +0100942 if (drv->bdrv_make_empty) {
943 ret = drv->bdrv_make_empty(bs);
944 bdrv_flush(bs);
945 }
bellard95389c82005-12-18 18:28:15 +0000946
Christoph Hellwig3f5075a2010-01-12 13:49:23 +0100947 /*
948 * Make sure all data we wrote to the backing device is actually
949 * stable on disk.
950 */
951 if (bs->backing_hd)
952 bdrv_flush(bs->backing_hd);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200953
954ro_cleanup:
Anthony Liguori7267c092011-08-20 22:09:37 -0500955 g_free(buf);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200956
957 if (ro) {
958 /* re-open as RO */
959 bdrv_delete(bs->backing_hd);
960 bs->backing_hd = NULL;
961 bs_ro = bdrv_new("");
Kevin Wolfee181192010-08-05 13:05:22 +0200962 ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR,
963 backing_drv);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200964 if (ret < 0) {
965 bdrv_delete(bs_ro);
966 /* drive not functional anymore */
967 bs->drv = NULL;
968 return ret;
969 }
970 bs->backing_hd = bs_ro;
971 bs->backing_hd->keep_read_only = 0;
972 }
973
Christoph Hellwig1d449522010-01-17 12:32:30 +0100974 return ret;
bellard33e39632003-07-06 17:15:21 +0000975}
976
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +0200977void bdrv_commit_all(void)
978{
979 BlockDriverState *bs;
980
981 QTAILQ_FOREACH(bs, &bdrv_states, list) {
982 bdrv_commit(bs);
983 }
984}
985
Kevin Wolf756e6732010-01-12 12:55:17 +0100986/*
987 * Return values:
988 * 0 - success
989 * -EINVAL - backing format specified, but no file
990 * -ENOSPC - can't update the backing file because no space is left in the
991 * image file header
992 * -ENOTSUP - format driver doesn't support changing the backing file
993 */
994int bdrv_change_backing_file(BlockDriverState *bs,
995 const char *backing_file, const char *backing_fmt)
996{
997 BlockDriver *drv = bs->drv;
998
999 if (drv->bdrv_change_backing_file != NULL) {
1000 return drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
1001 } else {
1002 return -ENOTSUP;
1003 }
1004}
1005
aliguori71d07702009-03-03 17:37:16 +00001006static int bdrv_check_byte_request(BlockDriverState *bs, int64_t offset,
1007 size_t size)
1008{
1009 int64_t len;
1010
1011 if (!bdrv_is_inserted(bs))
1012 return -ENOMEDIUM;
1013
1014 if (bs->growable)
1015 return 0;
1016
1017 len = bdrv_getlength(bs);
1018
Kevin Wolffbb7b4e2009-05-08 14:47:24 +02001019 if (offset < 0)
1020 return -EIO;
1021
1022 if ((offset > len) || (len - offset < size))
aliguori71d07702009-03-03 17:37:16 +00001023 return -EIO;
1024
1025 return 0;
1026}
1027
1028static int bdrv_check_request(BlockDriverState *bs, int64_t sector_num,
1029 int nb_sectors)
1030{
Jes Sorenseneb5a3162010-05-27 16:20:31 +02001031 return bdrv_check_byte_request(bs, sector_num * BDRV_SECTOR_SIZE,
1032 nb_sectors * BDRV_SECTOR_SIZE);
aliguori71d07702009-03-03 17:37:16 +00001033}
1034
Kevin Wolfe7a8a782011-07-15 16:05:00 +02001035static inline bool bdrv_has_async_rw(BlockDriver *drv)
1036{
1037 return drv->bdrv_co_readv != bdrv_co_readv_em
1038 || drv->bdrv_aio_readv != bdrv_aio_readv_em;
1039}
1040
1041static inline bool bdrv_has_async_flush(BlockDriver *drv)
1042{
1043 return drv->bdrv_aio_flush != bdrv_aio_flush_em;
1044}
1045
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001046typedef struct RwCo {
1047 BlockDriverState *bs;
1048 int64_t sector_num;
1049 int nb_sectors;
1050 QEMUIOVector *qiov;
1051 bool is_write;
1052 int ret;
1053} RwCo;
1054
1055static void coroutine_fn bdrv_rw_co_entry(void *opaque)
1056{
1057 RwCo *rwco = opaque;
1058
1059 if (!rwco->is_write) {
1060 rwco->ret = bdrv_co_do_readv(rwco->bs, rwco->sector_num,
1061 rwco->nb_sectors, rwco->qiov);
1062 } else {
1063 rwco->ret = bdrv_co_do_writev(rwco->bs, rwco->sector_num,
1064 rwco->nb_sectors, rwco->qiov);
1065 }
1066}
1067
1068/*
1069 * Process a synchronous request using coroutines
1070 */
1071static int bdrv_rw_co(BlockDriverState *bs, int64_t sector_num, uint8_t *buf,
1072 int nb_sectors, bool is_write)
1073{
1074 QEMUIOVector qiov;
1075 struct iovec iov = {
1076 .iov_base = (void *)buf,
1077 .iov_len = nb_sectors * BDRV_SECTOR_SIZE,
1078 };
1079 Coroutine *co;
1080 RwCo rwco = {
1081 .bs = bs,
1082 .sector_num = sector_num,
1083 .nb_sectors = nb_sectors,
1084 .qiov = &qiov,
1085 .is_write = is_write,
1086 .ret = NOT_DONE,
1087 };
1088
1089 qemu_iovec_init_external(&qiov, &iov, 1);
1090
1091 if (qemu_in_coroutine()) {
1092 /* Fast-path if already in coroutine context */
1093 bdrv_rw_co_entry(&rwco);
1094 } else {
1095 co = qemu_coroutine_create(bdrv_rw_co_entry);
1096 qemu_coroutine_enter(co, &rwco);
1097 while (rwco.ret == NOT_DONE) {
1098 qemu_aio_wait();
1099 }
1100 }
1101 return rwco.ret;
1102}
1103
bellard19cb3732006-08-19 11:45:59 +00001104/* return < 0 if error. See bdrv_write() for the return codes */
ths5fafdf22007-09-16 21:08:06 +00001105int bdrv_read(BlockDriverState *bs, int64_t sector_num,
bellardfc01f7e2003-06-30 10:03:06 +00001106 uint8_t *buf, int nb_sectors)
1107{
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001108 return bdrv_rw_co(bs, sector_num, buf, nb_sectors, false);
bellardfc01f7e2003-06-30 10:03:06 +00001109}
1110
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02001111static void set_dirty_bitmap(BlockDriverState *bs, int64_t sector_num,
Jan Kiszkaa55eb922009-11-30 18:21:19 +01001112 int nb_sectors, int dirty)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02001113{
1114 int64_t start, end;
Jan Kiszkac6d22832009-11-30 18:21:20 +01001115 unsigned long val, idx, bit;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01001116
Jan Kiszka6ea44302009-11-30 18:21:19 +01001117 start = sector_num / BDRV_SECTORS_PER_DIRTY_CHUNK;
Jan Kiszkac6d22832009-11-30 18:21:20 +01001118 end = (sector_num + nb_sectors - 1) / BDRV_SECTORS_PER_DIRTY_CHUNK;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01001119
1120 for (; start <= end; start++) {
Jan Kiszkac6d22832009-11-30 18:21:20 +01001121 idx = start / (sizeof(unsigned long) * 8);
1122 bit = start % (sizeof(unsigned long) * 8);
1123 val = bs->dirty_bitmap[idx];
1124 if (dirty) {
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001125 if (!(val & (1UL << bit))) {
Liran Schouraaa0eb72010-01-26 10:31:48 +02001126 bs->dirty_count++;
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001127 val |= 1UL << bit;
Liran Schouraaa0eb72010-01-26 10:31:48 +02001128 }
Jan Kiszkac6d22832009-11-30 18:21:20 +01001129 } else {
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001130 if (val & (1UL << bit)) {
Liran Schouraaa0eb72010-01-26 10:31:48 +02001131 bs->dirty_count--;
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001132 val &= ~(1UL << bit);
Liran Schouraaa0eb72010-01-26 10:31:48 +02001133 }
Jan Kiszkac6d22832009-11-30 18:21:20 +01001134 }
1135 bs->dirty_bitmap[idx] = val;
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02001136 }
1137}
1138
ths5fafdf22007-09-16 21:08:06 +00001139/* Return < 0 if error. Important errors are:
bellard19cb3732006-08-19 11:45:59 +00001140 -EIO generic I/O error (may happen for all errors)
1141 -ENOMEDIUM No media inserted.
1142 -EINVAL Invalid sector number or nb_sectors
1143 -EACCES Trying to write a read-only device
1144*/
ths5fafdf22007-09-16 21:08:06 +00001145int bdrv_write(BlockDriverState *bs, int64_t sector_num,
bellardfc01f7e2003-06-30 10:03:06 +00001146 const uint8_t *buf, int nb_sectors)
1147{
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001148 return bdrv_rw_co(bs, sector_num, (uint8_t *)buf, nb_sectors, true);
bellard83f64092006-08-01 16:21:11 +00001149}
1150
aliguorieda578e2009-03-12 19:57:16 +00001151int bdrv_pread(BlockDriverState *bs, int64_t offset,
1152 void *buf, int count1)
bellard83f64092006-08-01 16:21:11 +00001153{
Jan Kiszka6ea44302009-11-30 18:21:19 +01001154 uint8_t tmp_buf[BDRV_SECTOR_SIZE];
bellard83f64092006-08-01 16:21:11 +00001155 int len, nb_sectors, count;
1156 int64_t sector_num;
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001157 int ret;
bellard83f64092006-08-01 16:21:11 +00001158
1159 count = count1;
1160 /* first read to align to sector start */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001161 len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
bellard83f64092006-08-01 16:21:11 +00001162 if (len > count)
1163 len = count;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001164 sector_num = offset >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001165 if (len > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001166 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1167 return ret;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001168 memcpy(buf, tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), len);
bellard83f64092006-08-01 16:21:11 +00001169 count -= len;
1170 if (count == 0)
1171 return count1;
1172 sector_num++;
1173 buf += len;
1174 }
1175
1176 /* read the sectors "in place" */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001177 nb_sectors = count >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001178 if (nb_sectors > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001179 if ((ret = bdrv_read(bs, sector_num, buf, nb_sectors)) < 0)
1180 return ret;
bellard83f64092006-08-01 16:21:11 +00001181 sector_num += nb_sectors;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001182 len = nb_sectors << BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001183 buf += len;
1184 count -= len;
1185 }
1186
1187 /* add data from the last sector */
1188 if (count > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001189 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1190 return ret;
bellard83f64092006-08-01 16:21:11 +00001191 memcpy(buf, tmp_buf, count);
1192 }
1193 return count1;
1194}
1195
aliguorieda578e2009-03-12 19:57:16 +00001196int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
1197 const void *buf, int count1)
bellard83f64092006-08-01 16:21:11 +00001198{
Jan Kiszka6ea44302009-11-30 18:21:19 +01001199 uint8_t tmp_buf[BDRV_SECTOR_SIZE];
bellard83f64092006-08-01 16:21:11 +00001200 int len, nb_sectors, count;
1201 int64_t sector_num;
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001202 int ret;
bellard83f64092006-08-01 16:21:11 +00001203
1204 count = count1;
1205 /* first write to align to sector start */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001206 len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
bellard83f64092006-08-01 16:21:11 +00001207 if (len > count)
1208 len = count;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001209 sector_num = offset >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001210 if (len > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001211 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1212 return ret;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001213 memcpy(tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), buf, len);
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001214 if ((ret = bdrv_write(bs, sector_num, tmp_buf, 1)) < 0)
1215 return ret;
bellard83f64092006-08-01 16:21:11 +00001216 count -= len;
1217 if (count == 0)
1218 return count1;
1219 sector_num++;
1220 buf += len;
1221 }
1222
1223 /* write the sectors "in place" */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001224 nb_sectors = count >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001225 if (nb_sectors > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001226 if ((ret = bdrv_write(bs, sector_num, buf, nb_sectors)) < 0)
1227 return ret;
bellard83f64092006-08-01 16:21:11 +00001228 sector_num += nb_sectors;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001229 len = nb_sectors << BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001230 buf += len;
1231 count -= len;
1232 }
1233
1234 /* add data from the last sector */
1235 if (count > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001236 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1237 return ret;
bellard83f64092006-08-01 16:21:11 +00001238 memcpy(tmp_buf, buf, count);
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001239 if ((ret = bdrv_write(bs, sector_num, tmp_buf, 1)) < 0)
1240 return ret;
bellard83f64092006-08-01 16:21:11 +00001241 }
1242 return count1;
1243}
bellard83f64092006-08-01 16:21:11 +00001244
Kevin Wolff08145f2010-06-16 16:38:15 +02001245/*
1246 * Writes to the file and ensures that no writes are reordered across this
1247 * request (acts as a barrier)
1248 *
1249 * Returns 0 on success, -errno in error cases.
1250 */
1251int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
1252 const void *buf, int count)
1253{
1254 int ret;
1255
1256 ret = bdrv_pwrite(bs, offset, buf, count);
1257 if (ret < 0) {
1258 return ret;
1259 }
1260
Stefan Hajnoczi92196b22011-08-04 12:26:52 +01001261 /* No flush needed for cache modes that use O_DSYNC */
1262 if ((bs->open_flags & BDRV_O_CACHE_WB) != 0) {
Kevin Wolff08145f2010-06-16 16:38:15 +02001263 bdrv_flush(bs);
1264 }
1265
1266 return 0;
1267}
1268
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001269/*
1270 * Handle a read request in coroutine context
1271 */
1272static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
1273 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
Kevin Wolfda1fa912011-07-14 17:27:13 +02001274{
1275 BlockDriver *drv = bs->drv;
1276
Kevin Wolfda1fa912011-07-14 17:27:13 +02001277 if (!drv) {
1278 return -ENOMEDIUM;
1279 }
1280 if (bdrv_check_request(bs, sector_num, nb_sectors)) {
1281 return -EIO;
1282 }
1283
1284 return drv->bdrv_co_readv(bs, sector_num, nb_sectors, qiov);
1285}
1286
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001287int coroutine_fn bdrv_co_readv(BlockDriverState *bs, int64_t sector_num,
Kevin Wolfda1fa912011-07-14 17:27:13 +02001288 int nb_sectors, QEMUIOVector *qiov)
1289{
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001290 trace_bdrv_co_readv(bs, sector_num, nb_sectors);
Kevin Wolfda1fa912011-07-14 17:27:13 +02001291
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001292 return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov);
1293}
1294
1295/*
1296 * Handle a write request in coroutine context
1297 */
1298static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
1299 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
1300{
1301 BlockDriver *drv = bs->drv;
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01001302 int ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02001303
1304 if (!bs->drv) {
1305 return -ENOMEDIUM;
1306 }
1307 if (bs->read_only) {
1308 return -EACCES;
1309 }
1310 if (bdrv_check_request(bs, sector_num, nb_sectors)) {
1311 return -EIO;
1312 }
1313
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01001314 ret = drv->bdrv_co_writev(bs, sector_num, nb_sectors, qiov);
1315
Kevin Wolfda1fa912011-07-14 17:27:13 +02001316 if (bs->dirty_bitmap) {
1317 set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
1318 }
1319
1320 if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
1321 bs->wr_highest_sector = sector_num + nb_sectors - 1;
1322 }
1323
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01001324 return ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02001325}
1326
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001327int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
1328 int nb_sectors, QEMUIOVector *qiov)
1329{
1330 trace_bdrv_co_writev(bs, sector_num, nb_sectors);
1331
1332 return bdrv_co_do_writev(bs, sector_num, nb_sectors, qiov);
1333}
1334
bellard83f64092006-08-01 16:21:11 +00001335/**
bellard83f64092006-08-01 16:21:11 +00001336 * Truncate file to 'offset' bytes (needed only for file protocols)
1337 */
1338int bdrv_truncate(BlockDriverState *bs, int64_t offset)
1339{
1340 BlockDriver *drv = bs->drv;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001341 int ret;
bellard83f64092006-08-01 16:21:11 +00001342 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00001343 return -ENOMEDIUM;
bellard83f64092006-08-01 16:21:11 +00001344 if (!drv->bdrv_truncate)
1345 return -ENOTSUP;
Naphtali Sprei59f26892009-10-26 16:25:16 +02001346 if (bs->read_only)
1347 return -EACCES;
Marcelo Tosatti85916752011-01-26 12:12:35 -02001348 if (bdrv_in_use(bs))
1349 return -EBUSY;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001350 ret = drv->bdrv_truncate(bs, offset);
1351 if (ret == 0) {
1352 ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
Markus Armbruster145feb12011-08-03 15:07:42 +02001353 bdrv_dev_resize_cb(bs);
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001354 }
1355 return ret;
bellard83f64092006-08-01 16:21:11 +00001356}
1357
1358/**
Fam Zheng4a1d5e12011-07-12 19:56:39 +08001359 * Length of a allocated file in bytes. Sparse files are counted by actual
1360 * allocated space. Return < 0 if error or unknown.
1361 */
1362int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
1363{
1364 BlockDriver *drv = bs->drv;
1365 if (!drv) {
1366 return -ENOMEDIUM;
1367 }
1368 if (drv->bdrv_get_allocated_file_size) {
1369 return drv->bdrv_get_allocated_file_size(bs);
1370 }
1371 if (bs->file) {
1372 return bdrv_get_allocated_file_size(bs->file);
1373 }
1374 return -ENOTSUP;
1375}
1376
1377/**
bellard83f64092006-08-01 16:21:11 +00001378 * Length of a file in bytes. Return < 0 if error or unknown.
1379 */
1380int64_t bdrv_getlength(BlockDriverState *bs)
1381{
1382 BlockDriver *drv = bs->drv;
1383 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00001384 return -ENOMEDIUM;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001385
Markus Armbruster2c6942f2011-09-06 18:58:51 +02001386 if (bs->growable || bdrv_dev_has_removable_media(bs)) {
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01001387 if (drv->bdrv_getlength) {
1388 return drv->bdrv_getlength(bs);
1389 }
bellard83f64092006-08-01 16:21:11 +00001390 }
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01001391 return bs->total_sectors * BDRV_SECTOR_SIZE;
bellardfc01f7e2003-06-30 10:03:06 +00001392}
1393
bellard19cb3732006-08-19 11:45:59 +00001394/* return 0 as number of sectors if no device present or error */
ths96b8f132007-12-17 01:35:20 +00001395void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
bellardfc01f7e2003-06-30 10:03:06 +00001396{
bellard19cb3732006-08-19 11:45:59 +00001397 int64_t length;
1398 length = bdrv_getlength(bs);
1399 if (length < 0)
1400 length = 0;
1401 else
Jan Kiszka6ea44302009-11-30 18:21:19 +01001402 length = length >> BDRV_SECTOR_BITS;
bellard19cb3732006-08-19 11:45:59 +00001403 *nb_sectors_ptr = length;
bellardfc01f7e2003-06-30 10:03:06 +00001404}
bellardcf989512004-02-16 21:56:36 +00001405
aliguorif3d54fc2008-11-25 21:50:24 +00001406struct partition {
1407 uint8_t boot_ind; /* 0x80 - active */
1408 uint8_t head; /* starting head */
1409 uint8_t sector; /* starting sector */
1410 uint8_t cyl; /* starting cylinder */
1411 uint8_t sys_ind; /* What partition type */
1412 uint8_t end_head; /* end head */
1413 uint8_t end_sector; /* end sector */
1414 uint8_t end_cyl; /* end cylinder */
1415 uint32_t start_sect; /* starting sector counting from 0 */
1416 uint32_t nr_sects; /* nr of sectors in partition */
Stefan Weil541dc0d2011-08-31 12:38:01 +02001417} QEMU_PACKED;
aliguorif3d54fc2008-11-25 21:50:24 +00001418
1419/* try to guess the disk logical geometry from the MSDOS partition table. Return 0 if OK, -1 if could not guess */
1420static int guess_disk_lchs(BlockDriverState *bs,
1421 int *pcylinders, int *pheads, int *psectors)
1422{
Jes Sorenseneb5a3162010-05-27 16:20:31 +02001423 uint8_t buf[BDRV_SECTOR_SIZE];
aliguorif3d54fc2008-11-25 21:50:24 +00001424 int ret, i, heads, sectors, cylinders;
1425 struct partition *p;
1426 uint32_t nr_sects;
blueswir1a38131b2008-12-05 17:56:40 +00001427 uint64_t nb_sectors;
aliguorif3d54fc2008-11-25 21:50:24 +00001428
1429 bdrv_get_geometry(bs, &nb_sectors);
1430
1431 ret = bdrv_read(bs, 0, buf, 1);
1432 if (ret < 0)
1433 return -1;
1434 /* test msdos magic */
1435 if (buf[510] != 0x55 || buf[511] != 0xaa)
1436 return -1;
1437 for(i = 0; i < 4; i++) {
1438 p = ((struct partition *)(buf + 0x1be)) + i;
1439 nr_sects = le32_to_cpu(p->nr_sects);
1440 if (nr_sects && p->end_head) {
1441 /* We make the assumption that the partition terminates on
1442 a cylinder boundary */
1443 heads = p->end_head + 1;
1444 sectors = p->end_sector & 63;
1445 if (sectors == 0)
1446 continue;
1447 cylinders = nb_sectors / (heads * sectors);
1448 if (cylinders < 1 || cylinders > 16383)
1449 continue;
1450 *pheads = heads;
1451 *psectors = sectors;
1452 *pcylinders = cylinders;
1453#if 0
1454 printf("guessed geometry: LCHS=%d %d %d\n",
1455 cylinders, heads, sectors);
1456#endif
1457 return 0;
1458 }
1459 }
1460 return -1;
1461}
1462
1463void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs)
1464{
1465 int translation, lba_detected = 0;
1466 int cylinders, heads, secs;
blueswir1a38131b2008-12-05 17:56:40 +00001467 uint64_t nb_sectors;
aliguorif3d54fc2008-11-25 21:50:24 +00001468
1469 /* if a geometry hint is available, use it */
1470 bdrv_get_geometry(bs, &nb_sectors);
1471 bdrv_get_geometry_hint(bs, &cylinders, &heads, &secs);
1472 translation = bdrv_get_translation_hint(bs);
1473 if (cylinders != 0) {
1474 *pcyls = cylinders;
1475 *pheads = heads;
1476 *psecs = secs;
1477 } else {
1478 if (guess_disk_lchs(bs, &cylinders, &heads, &secs) == 0) {
1479 if (heads > 16) {
1480 /* if heads > 16, it means that a BIOS LBA
1481 translation was active, so the default
1482 hardware geometry is OK */
1483 lba_detected = 1;
1484 goto default_geometry;
1485 } else {
1486 *pcyls = cylinders;
1487 *pheads = heads;
1488 *psecs = secs;
1489 /* disable any translation to be in sync with
1490 the logical geometry */
1491 if (translation == BIOS_ATA_TRANSLATION_AUTO) {
1492 bdrv_set_translation_hint(bs,
1493 BIOS_ATA_TRANSLATION_NONE);
1494 }
1495 }
1496 } else {
1497 default_geometry:
1498 /* if no geometry, use a standard physical disk geometry */
1499 cylinders = nb_sectors / (16 * 63);
1500
1501 if (cylinders > 16383)
1502 cylinders = 16383;
1503 else if (cylinders < 2)
1504 cylinders = 2;
1505 *pcyls = cylinders;
1506 *pheads = 16;
1507 *psecs = 63;
1508 if ((lba_detected == 1) && (translation == BIOS_ATA_TRANSLATION_AUTO)) {
1509 if ((*pcyls * *pheads) <= 131072) {
1510 bdrv_set_translation_hint(bs,
1511 BIOS_ATA_TRANSLATION_LARGE);
1512 } else {
1513 bdrv_set_translation_hint(bs,
1514 BIOS_ATA_TRANSLATION_LBA);
1515 }
1516 }
1517 }
1518 bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs);
1519 }
1520}
1521
ths5fafdf22007-09-16 21:08:06 +00001522void bdrv_set_geometry_hint(BlockDriverState *bs,
bellardb3380822004-03-14 21:38:54 +00001523 int cyls, int heads, int secs)
1524{
1525 bs->cyls = cyls;
1526 bs->heads = heads;
1527 bs->secs = secs;
1528}
1529
bellard46d47672004-11-16 01:45:27 +00001530void bdrv_set_translation_hint(BlockDriverState *bs, int translation)
1531{
1532 bs->translation = translation;
1533}
1534
ths5fafdf22007-09-16 21:08:06 +00001535void bdrv_get_geometry_hint(BlockDriverState *bs,
bellardb3380822004-03-14 21:38:54 +00001536 int *pcyls, int *pheads, int *psecs)
1537{
1538 *pcyls = bs->cyls;
1539 *pheads = bs->heads;
1540 *psecs = bs->secs;
1541}
1542
Blue Swirl5bbdbb42011-02-12 20:43:32 +00001543/* Recognize floppy formats */
1544typedef struct FDFormat {
1545 FDriveType drive;
1546 uint8_t last_sect;
1547 uint8_t max_track;
1548 uint8_t max_head;
1549} FDFormat;
1550
1551static const FDFormat fd_formats[] = {
1552 /* First entry is default format */
1553 /* 1.44 MB 3"1/2 floppy disks */
1554 { FDRIVE_DRV_144, 18, 80, 1, },
1555 { FDRIVE_DRV_144, 20, 80, 1, },
1556 { FDRIVE_DRV_144, 21, 80, 1, },
1557 { FDRIVE_DRV_144, 21, 82, 1, },
1558 { FDRIVE_DRV_144, 21, 83, 1, },
1559 { FDRIVE_DRV_144, 22, 80, 1, },
1560 { FDRIVE_DRV_144, 23, 80, 1, },
1561 { FDRIVE_DRV_144, 24, 80, 1, },
1562 /* 2.88 MB 3"1/2 floppy disks */
1563 { FDRIVE_DRV_288, 36, 80, 1, },
1564 { FDRIVE_DRV_288, 39, 80, 1, },
1565 { FDRIVE_DRV_288, 40, 80, 1, },
1566 { FDRIVE_DRV_288, 44, 80, 1, },
1567 { FDRIVE_DRV_288, 48, 80, 1, },
1568 /* 720 kB 3"1/2 floppy disks */
1569 { FDRIVE_DRV_144, 9, 80, 1, },
1570 { FDRIVE_DRV_144, 10, 80, 1, },
1571 { FDRIVE_DRV_144, 10, 82, 1, },
1572 { FDRIVE_DRV_144, 10, 83, 1, },
1573 { FDRIVE_DRV_144, 13, 80, 1, },
1574 { FDRIVE_DRV_144, 14, 80, 1, },
1575 /* 1.2 MB 5"1/4 floppy disks */
1576 { FDRIVE_DRV_120, 15, 80, 1, },
1577 { FDRIVE_DRV_120, 18, 80, 1, },
1578 { FDRIVE_DRV_120, 18, 82, 1, },
1579 { FDRIVE_DRV_120, 18, 83, 1, },
1580 { FDRIVE_DRV_120, 20, 80, 1, },
1581 /* 720 kB 5"1/4 floppy disks */
1582 { FDRIVE_DRV_120, 9, 80, 1, },
1583 { FDRIVE_DRV_120, 11, 80, 1, },
1584 /* 360 kB 5"1/4 floppy disks */
1585 { FDRIVE_DRV_120, 9, 40, 1, },
1586 { FDRIVE_DRV_120, 9, 40, 0, },
1587 { FDRIVE_DRV_120, 10, 41, 1, },
1588 { FDRIVE_DRV_120, 10, 42, 1, },
1589 /* 320 kB 5"1/4 floppy disks */
1590 { FDRIVE_DRV_120, 8, 40, 1, },
1591 { FDRIVE_DRV_120, 8, 40, 0, },
1592 /* 360 kB must match 5"1/4 better than 3"1/2... */
1593 { FDRIVE_DRV_144, 9, 80, 0, },
1594 /* end */
1595 { FDRIVE_DRV_NONE, -1, -1, 0, },
1596};
1597
1598void bdrv_get_floppy_geometry_hint(BlockDriverState *bs, int *nb_heads,
1599 int *max_track, int *last_sect,
1600 FDriveType drive_in, FDriveType *drive)
1601{
1602 const FDFormat *parse;
1603 uint64_t nb_sectors, size;
1604 int i, first_match, match;
1605
1606 bdrv_get_geometry_hint(bs, nb_heads, max_track, last_sect);
1607 if (*nb_heads != 0 && *max_track != 0 && *last_sect != 0) {
1608 /* User defined disk */
1609 } else {
1610 bdrv_get_geometry(bs, &nb_sectors);
1611 match = -1;
1612 first_match = -1;
1613 for (i = 0; ; i++) {
1614 parse = &fd_formats[i];
1615 if (parse->drive == FDRIVE_DRV_NONE) {
1616 break;
1617 }
1618 if (drive_in == parse->drive ||
1619 drive_in == FDRIVE_DRV_NONE) {
1620 size = (parse->max_head + 1) * parse->max_track *
1621 parse->last_sect;
1622 if (nb_sectors == size) {
1623 match = i;
1624 break;
1625 }
1626 if (first_match == -1) {
1627 first_match = i;
1628 }
1629 }
1630 }
1631 if (match == -1) {
1632 if (first_match == -1) {
1633 match = 1;
1634 } else {
1635 match = first_match;
1636 }
1637 parse = &fd_formats[match];
1638 }
1639 *nb_heads = parse->max_head + 1;
1640 *max_track = parse->max_track;
1641 *last_sect = parse->last_sect;
1642 *drive = parse->drive;
1643 }
1644}
1645
bellard46d47672004-11-16 01:45:27 +00001646int bdrv_get_translation_hint(BlockDriverState *bs)
1647{
1648 return bs->translation;
1649}
1650
Markus Armbrusterabd7f682010-06-02 18:55:17 +02001651void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error,
1652 BlockErrorAction on_write_error)
1653{
1654 bs->on_read_error = on_read_error;
1655 bs->on_write_error = on_write_error;
1656}
1657
1658BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read)
1659{
1660 return is_read ? bs->on_read_error : bs->on_write_error;
1661}
1662
bellardb3380822004-03-14 21:38:54 +00001663int bdrv_is_read_only(BlockDriverState *bs)
1664{
1665 return bs->read_only;
1666}
1667
ths985a03b2007-12-24 16:10:43 +00001668int bdrv_is_sg(BlockDriverState *bs)
1669{
1670 return bs->sg;
1671}
1672
Christoph Hellwige900a7b2009-09-04 19:01:15 +02001673int bdrv_enable_write_cache(BlockDriverState *bs)
1674{
1675 return bs->enable_write_cache;
1676}
1677
bellardea2384d2004-08-01 21:59:26 +00001678int bdrv_is_encrypted(BlockDriverState *bs)
1679{
1680 if (bs->backing_hd && bs->backing_hd->encrypted)
1681 return 1;
1682 return bs->encrypted;
1683}
1684
aliguoric0f4ce72009-03-05 23:01:01 +00001685int bdrv_key_required(BlockDriverState *bs)
1686{
1687 BlockDriverState *backing_hd = bs->backing_hd;
1688
1689 if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
1690 return 1;
1691 return (bs->encrypted && !bs->valid_key);
1692}
1693
bellardea2384d2004-08-01 21:59:26 +00001694int bdrv_set_key(BlockDriverState *bs, const char *key)
1695{
1696 int ret;
1697 if (bs->backing_hd && bs->backing_hd->encrypted) {
1698 ret = bdrv_set_key(bs->backing_hd, key);
1699 if (ret < 0)
1700 return ret;
1701 if (!bs->encrypted)
1702 return 0;
1703 }
Shahar Havivifd04a2a2010-03-06 00:26:13 +02001704 if (!bs->encrypted) {
1705 return -EINVAL;
1706 } else if (!bs->drv || !bs->drv->bdrv_set_key) {
1707 return -ENOMEDIUM;
1708 }
aliguoric0f4ce72009-03-05 23:01:01 +00001709 ret = bs->drv->bdrv_set_key(bs, key);
aliguoribb5fc202009-03-05 23:01:15 +00001710 if (ret < 0) {
1711 bs->valid_key = 0;
1712 } else if (!bs->valid_key) {
1713 bs->valid_key = 1;
1714 /* call the change callback now, we skipped it on open */
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +02001715 bdrv_dev_change_media_cb(bs, true);
aliguoribb5fc202009-03-05 23:01:15 +00001716 }
aliguoric0f4ce72009-03-05 23:01:01 +00001717 return ret;
bellardea2384d2004-08-01 21:59:26 +00001718}
1719
1720void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
1721{
bellard19cb3732006-08-19 11:45:59 +00001722 if (!bs->drv) {
bellardea2384d2004-08-01 21:59:26 +00001723 buf[0] = '\0';
1724 } else {
1725 pstrcpy(buf, buf_size, bs->drv->format_name);
1726 }
1727}
1728
ths5fafdf22007-09-16 21:08:06 +00001729void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
bellardea2384d2004-08-01 21:59:26 +00001730 void *opaque)
1731{
1732 BlockDriver *drv;
1733
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +01001734 QLIST_FOREACH(drv, &bdrv_drivers, list) {
bellardea2384d2004-08-01 21:59:26 +00001735 it(opaque, drv->format_name);
1736 }
1737}
1738
bellardb3380822004-03-14 21:38:54 +00001739BlockDriverState *bdrv_find(const char *name)
1740{
1741 BlockDriverState *bs;
1742
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001743 QTAILQ_FOREACH(bs, &bdrv_states, list) {
1744 if (!strcmp(name, bs->device_name)) {
bellardb3380822004-03-14 21:38:54 +00001745 return bs;
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001746 }
bellardb3380822004-03-14 21:38:54 +00001747 }
1748 return NULL;
1749}
1750
Markus Armbruster2f399b02010-06-02 18:55:20 +02001751BlockDriverState *bdrv_next(BlockDriverState *bs)
1752{
1753 if (!bs) {
1754 return QTAILQ_FIRST(&bdrv_states);
1755 }
1756 return QTAILQ_NEXT(bs, list);
1757}
1758
aliguori51de9762009-03-05 23:00:43 +00001759void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
bellard81d09122004-07-14 17:21:37 +00001760{
1761 BlockDriverState *bs;
1762
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001763 QTAILQ_FOREACH(bs, &bdrv_states, list) {
aliguori51de9762009-03-05 23:00:43 +00001764 it(opaque, bs);
bellard81d09122004-07-14 17:21:37 +00001765 }
1766}
1767
bellardea2384d2004-08-01 21:59:26 +00001768const char *bdrv_get_device_name(BlockDriverState *bs)
1769{
1770 return bs->device_name;
1771}
1772
Kevin Wolf205ef792010-10-21 16:43:43 +02001773int bdrv_flush(BlockDriverState *bs)
pbrook7a6cba62006-06-04 11:39:07 +00001774{
Alexander Graf016f5cf2010-05-26 17:51:49 +02001775 if (bs->open_flags & BDRV_O_NO_FLUSH) {
Kevin Wolf205ef792010-10-21 16:43:43 +02001776 return 0;
Alexander Graf016f5cf2010-05-26 17:51:49 +02001777 }
1778
Kevin Wolfe7a8a782011-07-15 16:05:00 +02001779 if (bs->drv && bdrv_has_async_flush(bs->drv) && qemu_in_coroutine()) {
1780 return bdrv_co_flush_em(bs);
1781 }
1782
Kevin Wolf205ef792010-10-21 16:43:43 +02001783 if (bs->drv && bs->drv->bdrv_flush) {
1784 return bs->drv->bdrv_flush(bs);
1785 }
1786
1787 /*
1788 * Some block drivers always operate in either writethrough or unsafe mode
1789 * and don't support bdrv_flush therefore. Usually qemu doesn't know how
1790 * the server works (because the behaviour is hardcoded or depends on
1791 * server-side configuration), so we can't ensure that everything is safe
1792 * on disk. Returning an error doesn't work because that would break guests
1793 * even if the server operates in writethrough mode.
1794 *
1795 * Let's hope the user knows what he's doing.
1796 */
1797 return 0;
pbrook7a6cba62006-06-04 11:39:07 +00001798}
1799
aliguoric6ca28d2008-10-06 13:55:43 +00001800void bdrv_flush_all(void)
1801{
1802 BlockDriverState *bs;
1803
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001804 QTAILQ_FOREACH(bs, &bdrv_states, list) {
Markus Armbrusterc602a482011-08-03 15:08:10 +02001805 if (!bdrv_is_read_only(bs) && bdrv_is_inserted(bs)) {
aliguoric6ca28d2008-10-06 13:55:43 +00001806 bdrv_flush(bs);
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001807 }
1808 }
aliguoric6ca28d2008-10-06 13:55:43 +00001809}
1810
Kevin Wolff2feebb2010-04-14 17:30:35 +02001811int bdrv_has_zero_init(BlockDriverState *bs)
1812{
1813 assert(bs->drv);
1814
Kevin Wolf336c1c12010-07-28 11:26:29 +02001815 if (bs->drv->bdrv_has_zero_init) {
1816 return bs->drv->bdrv_has_zero_init(bs);
Kevin Wolff2feebb2010-04-14 17:30:35 +02001817 }
1818
1819 return 1;
1820}
1821
Christoph Hellwigbb8bf762010-12-16 19:36:31 +01001822int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
1823{
1824 if (!bs->drv) {
1825 return -ENOMEDIUM;
1826 }
1827 if (!bs->drv->bdrv_discard) {
1828 return 0;
1829 }
1830 return bs->drv->bdrv_discard(bs, sector_num, nb_sectors);
1831}
1832
thsf58c7b32008-06-05 21:53:49 +00001833/*
1834 * Returns true iff the specified sector is present in the disk image. Drivers
1835 * not implementing the functionality are assumed to not support backing files,
1836 * hence all their sectors are reported as allocated.
1837 *
1838 * 'pnum' is set to the number of sectors (including and immediately following
1839 * the specified sector) that are known to be in the same
1840 * allocated/unallocated state.
1841 *
1842 * 'nb_sectors' is the max value 'pnum' should be set to.
1843 */
1844int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
1845 int *pnum)
1846{
1847 int64_t n;
1848 if (!bs->drv->bdrv_is_allocated) {
1849 if (sector_num >= bs->total_sectors) {
1850 *pnum = 0;
1851 return 0;
1852 }
1853 n = bs->total_sectors - sector_num;
1854 *pnum = (n < nb_sectors) ? (n) : (nb_sectors);
1855 return 1;
1856 }
1857 return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
1858}
1859
Luiz Capitulino2582bfe2010-02-03 12:41:01 -02001860void bdrv_mon_event(const BlockDriverState *bdrv,
1861 BlockMonEventAction action, int is_read)
1862{
1863 QObject *data;
1864 const char *action_str;
1865
1866 switch (action) {
1867 case BDRV_ACTION_REPORT:
1868 action_str = "report";
1869 break;
1870 case BDRV_ACTION_IGNORE:
1871 action_str = "ignore";
1872 break;
1873 case BDRV_ACTION_STOP:
1874 action_str = "stop";
1875 break;
1876 default:
1877 abort();
1878 }
1879
1880 data = qobject_from_jsonf("{ 'device': %s, 'action': %s, 'operation': %s }",
1881 bdrv->device_name,
1882 action_str,
1883 is_read ? "read" : "write");
1884 monitor_protocol_event(QEVENT_BLOCK_IO_ERROR, data);
1885
1886 qobject_decref(data);
1887}
1888
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001889static void bdrv_print_dict(QObject *obj, void *opaque)
bellardb3380822004-03-14 21:38:54 +00001890{
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001891 QDict *bs_dict;
1892 Monitor *mon = opaque;
1893
1894 bs_dict = qobject_to_qdict(obj);
1895
Markus Armbrusterd8aeeb32011-05-16 15:04:55 +02001896 monitor_printf(mon, "%s: removable=%d",
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001897 qdict_get_str(bs_dict, "device"),
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001898 qdict_get_bool(bs_dict, "removable"));
1899
1900 if (qdict_get_bool(bs_dict, "removable")) {
1901 monitor_printf(mon, " locked=%d", qdict_get_bool(bs_dict, "locked"));
Markus Armbrustere4def802011-09-06 18:58:53 +02001902 monitor_printf(mon, " tray-open=%d",
1903 qdict_get_bool(bs_dict, "tray-open"));
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001904 }
Luiz Capitulinod2078cc2011-09-26 17:43:55 -03001905
1906 if (qdict_haskey(bs_dict, "io-status")) {
1907 monitor_printf(mon, " io-status=%s", qdict_get_str(bs_dict, "io-status"));
1908 }
1909
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001910 if (qdict_haskey(bs_dict, "inserted")) {
1911 QDict *qdict = qobject_to_qdict(qdict_get(bs_dict, "inserted"));
1912
1913 monitor_printf(mon, " file=");
1914 monitor_print_filename(mon, qdict_get_str(qdict, "file"));
1915 if (qdict_haskey(qdict, "backing_file")) {
1916 monitor_printf(mon, " backing_file=");
1917 monitor_print_filename(mon, qdict_get_str(qdict, "backing_file"));
1918 }
1919 monitor_printf(mon, " ro=%d drv=%s encrypted=%d",
1920 qdict_get_bool(qdict, "ro"),
1921 qdict_get_str(qdict, "drv"),
1922 qdict_get_bool(qdict, "encrypted"));
1923 } else {
1924 monitor_printf(mon, " [not inserted]");
1925 }
1926
1927 monitor_printf(mon, "\n");
1928}
1929
1930void bdrv_info_print(Monitor *mon, const QObject *data)
1931{
1932 qlist_iter(qobject_to_qlist(data), bdrv_print_dict, mon);
1933}
1934
Luiz Capitulinof04ef602011-09-26 17:43:54 -03001935static const char *const io_status_name[BDRV_IOS_MAX] = {
1936 [BDRV_IOS_OK] = "ok",
1937 [BDRV_IOS_FAILED] = "failed",
1938 [BDRV_IOS_ENOSPC] = "nospace",
1939};
1940
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001941void bdrv_info(Monitor *mon, QObject **ret_data)
1942{
1943 QList *bs_list;
bellardb3380822004-03-14 21:38:54 +00001944 BlockDriverState *bs;
1945
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001946 bs_list = qlist_new();
1947
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001948 QTAILQ_FOREACH(bs, &bdrv_states, list) {
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001949 QObject *bs_obj;
Markus Armbrustere4def802011-09-06 18:58:53 +02001950 QDict *bs_dict;
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001951
Markus Armbrusterd8aeeb32011-05-16 15:04:55 +02001952 bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': 'unknown', "
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001953 "'removable': %i, 'locked': %i }",
Markus Armbruster2c6942f2011-09-06 18:58:51 +02001954 bs->device_name,
1955 bdrv_dev_has_removable_media(bs),
Markus Armbrusterf1076392011-09-06 18:58:46 +02001956 bdrv_dev_is_medium_locked(bs));
Markus Armbrustere4def802011-09-06 18:58:53 +02001957 bs_dict = qobject_to_qdict(bs_obj);
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001958
Markus Armbrustere4def802011-09-06 18:58:53 +02001959 if (bdrv_dev_has_removable_media(bs)) {
1960 qdict_put(bs_dict, "tray-open",
1961 qbool_from_int(bdrv_dev_is_tray_open(bs)));
1962 }
Luiz Capitulinof04ef602011-09-26 17:43:54 -03001963
1964 if (bdrv_iostatus_is_enabled(bs)) {
1965 qdict_put(bs_dict, "io-status",
1966 qstring_from_str(io_status_name[bs->iostatus]));
1967 }
1968
bellard19cb3732006-08-19 11:45:59 +00001969 if (bs->drv) {
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001970 QObject *obj;
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001971
1972 obj = qobject_from_jsonf("{ 'file': %s, 'ro': %i, 'drv': %s, "
1973 "'encrypted': %i }",
1974 bs->filename, bs->read_only,
1975 bs->drv->format_name,
1976 bdrv_is_encrypted(bs));
thsfef30742006-12-22 14:11:32 +00001977 if (bs->backing_file[0] != '\0') {
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001978 QDict *qdict = qobject_to_qdict(obj);
1979 qdict_put(qdict, "backing_file",
1980 qstring_from_str(bs->backing_file));
aliguori376253e2009-03-05 23:01:23 +00001981 }
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001982
1983 qdict_put_obj(bs_dict, "inserted", obj);
bellardb3380822004-03-14 21:38:54 +00001984 }
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001985 qlist_append_obj(bs_list, bs_obj);
bellardb3380822004-03-14 21:38:54 +00001986 }
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001987
1988 *ret_data = QOBJECT(bs_list);
bellardb3380822004-03-14 21:38:54 +00001989}
thsa36e69d2007-12-02 05:18:19 +00001990
Luiz Capitulino218a5362009-12-10 17:16:07 -02001991static void bdrv_stats_iter(QObject *data, void *opaque)
thsa36e69d2007-12-02 05:18:19 +00001992{
Luiz Capitulino218a5362009-12-10 17:16:07 -02001993 QDict *qdict;
1994 Monitor *mon = opaque;
1995
1996 qdict = qobject_to_qdict(data);
1997 monitor_printf(mon, "%s:", qdict_get_str(qdict, "device"));
1998
1999 qdict = qobject_to_qdict(qdict_get(qdict, "stats"));
2000 monitor_printf(mon, " rd_bytes=%" PRId64
2001 " wr_bytes=%" PRId64
2002 " rd_operations=%" PRId64
2003 " wr_operations=%" PRId64
Christoph Hellwige8045d62011-08-22 00:25:58 +02002004 " flush_operations=%" PRId64
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02002005 " wr_total_time_ns=%" PRId64
2006 " rd_total_time_ns=%" PRId64
2007 " flush_total_time_ns=%" PRId64
Luiz Capitulino218a5362009-12-10 17:16:07 -02002008 "\n",
2009 qdict_get_int(qdict, "rd_bytes"),
2010 qdict_get_int(qdict, "wr_bytes"),
2011 qdict_get_int(qdict, "rd_operations"),
Christoph Hellwige8045d62011-08-22 00:25:58 +02002012 qdict_get_int(qdict, "wr_operations"),
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02002013 qdict_get_int(qdict, "flush_operations"),
2014 qdict_get_int(qdict, "wr_total_time_ns"),
2015 qdict_get_int(qdict, "rd_total_time_ns"),
2016 qdict_get_int(qdict, "flush_total_time_ns"));
Luiz Capitulino218a5362009-12-10 17:16:07 -02002017}
2018
2019void bdrv_stats_print(Monitor *mon, const QObject *data)
2020{
2021 qlist_iter(qobject_to_qlist(data), bdrv_stats_iter, mon);
2022}
2023
Kevin Wolf294cc352010-04-28 14:34:01 +02002024static QObject* bdrv_info_stats_bs(BlockDriverState *bs)
2025{
2026 QObject *res;
2027 QDict *dict;
2028
2029 res = qobject_from_jsonf("{ 'stats': {"
2030 "'rd_bytes': %" PRId64 ","
2031 "'wr_bytes': %" PRId64 ","
2032 "'rd_operations': %" PRId64 ","
2033 "'wr_operations': %" PRId64 ","
Christoph Hellwige8045d62011-08-22 00:25:58 +02002034 "'wr_highest_offset': %" PRId64 ","
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02002035 "'flush_operations': %" PRId64 ","
2036 "'wr_total_time_ns': %" PRId64 ","
2037 "'rd_total_time_ns': %" PRId64 ","
2038 "'flush_total_time_ns': %" PRId64
Kevin Wolf294cc352010-04-28 14:34:01 +02002039 "} }",
Christoph Hellwiga597e792011-08-25 08:26:01 +02002040 bs->nr_bytes[BDRV_ACCT_READ],
2041 bs->nr_bytes[BDRV_ACCT_WRITE],
2042 bs->nr_ops[BDRV_ACCT_READ],
2043 bs->nr_ops[BDRV_ACCT_WRITE],
Blue Swirl5ffbbc62010-06-14 18:55:33 +00002044 bs->wr_highest_sector *
Christoph Hellwige8045d62011-08-22 00:25:58 +02002045 (uint64_t)BDRV_SECTOR_SIZE,
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02002046 bs->nr_ops[BDRV_ACCT_FLUSH],
2047 bs->total_time_ns[BDRV_ACCT_WRITE],
2048 bs->total_time_ns[BDRV_ACCT_READ],
2049 bs->total_time_ns[BDRV_ACCT_FLUSH]);
Kevin Wolf294cc352010-04-28 14:34:01 +02002050 dict = qobject_to_qdict(res);
2051
2052 if (*bs->device_name) {
2053 qdict_put(dict, "device", qstring_from_str(bs->device_name));
2054 }
2055
2056 if (bs->file) {
2057 QObject *parent = bdrv_info_stats_bs(bs->file);
2058 qdict_put_obj(dict, "parent", parent);
2059 }
2060
2061 return res;
2062}
2063
Luiz Capitulino218a5362009-12-10 17:16:07 -02002064void bdrv_info_stats(Monitor *mon, QObject **ret_data)
2065{
2066 QObject *obj;
2067 QList *devices;
thsa36e69d2007-12-02 05:18:19 +00002068 BlockDriverState *bs;
2069
Luiz Capitulino218a5362009-12-10 17:16:07 -02002070 devices = qlist_new();
2071
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002072 QTAILQ_FOREACH(bs, &bdrv_states, list) {
Kevin Wolf294cc352010-04-28 14:34:01 +02002073 obj = bdrv_info_stats_bs(bs);
Luiz Capitulino218a5362009-12-10 17:16:07 -02002074 qlist_append_obj(devices, obj);
thsa36e69d2007-12-02 05:18:19 +00002075 }
Luiz Capitulino218a5362009-12-10 17:16:07 -02002076
2077 *ret_data = QOBJECT(devices);
thsa36e69d2007-12-02 05:18:19 +00002078}
bellardea2384d2004-08-01 21:59:26 +00002079
aliguori045df332009-03-05 23:00:48 +00002080const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
2081{
2082 if (bs->backing_hd && bs->backing_hd->encrypted)
2083 return bs->backing_file;
2084 else if (bs->encrypted)
2085 return bs->filename;
2086 else
2087 return NULL;
2088}
2089
ths5fafdf22007-09-16 21:08:06 +00002090void bdrv_get_backing_filename(BlockDriverState *bs,
bellard83f64092006-08-01 16:21:11 +00002091 char *filename, int filename_size)
bellardea2384d2004-08-01 21:59:26 +00002092{
Kevin Wolfb783e402010-01-12 12:55:16 +01002093 if (!bs->backing_file) {
bellard83f64092006-08-01 16:21:11 +00002094 pstrcpy(filename, filename_size, "");
2095 } else {
2096 pstrcpy(filename, filename_size, bs->backing_file);
2097 }
bellardea2384d2004-08-01 21:59:26 +00002098}
2099
ths5fafdf22007-09-16 21:08:06 +00002100int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
bellardfaea38e2006-08-05 21:31:00 +00002101 const uint8_t *buf, int nb_sectors)
2102{
2103 BlockDriver *drv = bs->drv;
2104 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002105 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00002106 if (!drv->bdrv_write_compressed)
2107 return -ENOTSUP;
Kevin Wolffbb7b4e2009-05-08 14:47:24 +02002108 if (bdrv_check_request(bs, sector_num, nb_sectors))
2109 return -EIO;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01002110
Jan Kiszkac6d22832009-11-30 18:21:20 +01002111 if (bs->dirty_bitmap) {
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02002112 set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
2113 }
Jan Kiszkaa55eb922009-11-30 18:21:19 +01002114
bellardfaea38e2006-08-05 21:31:00 +00002115 return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
2116}
ths3b46e622007-09-17 08:09:54 +00002117
bellardfaea38e2006-08-05 21:31:00 +00002118int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
2119{
2120 BlockDriver *drv = bs->drv;
2121 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002122 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00002123 if (!drv->bdrv_get_info)
2124 return -ENOTSUP;
2125 memset(bdi, 0, sizeof(*bdi));
2126 return drv->bdrv_get_info(bs, bdi);
2127}
2128
Christoph Hellwig45566e92009-07-10 23:11:57 +02002129int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
2130 int64_t pos, int size)
aliguori178e08a2009-04-05 19:10:55 +00002131{
2132 BlockDriver *drv = bs->drv;
2133 if (!drv)
2134 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002135 if (drv->bdrv_save_vmstate)
2136 return drv->bdrv_save_vmstate(bs, buf, pos, size);
2137 if (bs->file)
2138 return bdrv_save_vmstate(bs->file, buf, pos, size);
2139 return -ENOTSUP;
aliguori178e08a2009-04-05 19:10:55 +00002140}
2141
Christoph Hellwig45566e92009-07-10 23:11:57 +02002142int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
2143 int64_t pos, int size)
aliguori178e08a2009-04-05 19:10:55 +00002144{
2145 BlockDriver *drv = bs->drv;
2146 if (!drv)
2147 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002148 if (drv->bdrv_load_vmstate)
2149 return drv->bdrv_load_vmstate(bs, buf, pos, size);
2150 if (bs->file)
2151 return bdrv_load_vmstate(bs->file, buf, pos, size);
2152 return -ENOTSUP;
aliguori178e08a2009-04-05 19:10:55 +00002153}
2154
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002155void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event)
2156{
2157 BlockDriver *drv = bs->drv;
2158
2159 if (!drv || !drv->bdrv_debug_event) {
2160 return;
2161 }
2162
2163 return drv->bdrv_debug_event(bs, event);
2164
2165}
2166
bellardfaea38e2006-08-05 21:31:00 +00002167/**************************************************************/
2168/* handling of snapshots */
2169
Miguel Di Ciurcio Filhofeeee5a2010-06-08 10:40:55 -03002170int bdrv_can_snapshot(BlockDriverState *bs)
2171{
2172 BlockDriver *drv = bs->drv;
Markus Armbruster07b70bf2011-08-03 15:08:11 +02002173 if (!drv || !bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
Miguel Di Ciurcio Filhofeeee5a2010-06-08 10:40:55 -03002174 return 0;
2175 }
2176
2177 if (!drv->bdrv_snapshot_create) {
2178 if (bs->file != NULL) {
2179 return bdrv_can_snapshot(bs->file);
2180 }
2181 return 0;
2182 }
2183
2184 return 1;
2185}
2186
Blue Swirl199630b2010-07-25 20:49:34 +00002187int bdrv_is_snapshot(BlockDriverState *bs)
2188{
2189 return !!(bs->open_flags & BDRV_O_SNAPSHOT);
2190}
2191
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002192BlockDriverState *bdrv_snapshots(void)
2193{
2194 BlockDriverState *bs;
2195
Markus Armbruster3ac906f2010-07-01 09:30:38 +02002196 if (bs_snapshots) {
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002197 return bs_snapshots;
Markus Armbruster3ac906f2010-07-01 09:30:38 +02002198 }
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002199
2200 bs = NULL;
2201 while ((bs = bdrv_next(bs))) {
2202 if (bdrv_can_snapshot(bs)) {
Markus Armbruster3ac906f2010-07-01 09:30:38 +02002203 bs_snapshots = bs;
2204 return bs;
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002205 }
2206 }
2207 return NULL;
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002208}
2209
ths5fafdf22007-09-16 21:08:06 +00002210int bdrv_snapshot_create(BlockDriverState *bs,
bellardfaea38e2006-08-05 21:31:00 +00002211 QEMUSnapshotInfo *sn_info)
2212{
2213 BlockDriver *drv = bs->drv;
2214 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002215 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002216 if (drv->bdrv_snapshot_create)
2217 return drv->bdrv_snapshot_create(bs, sn_info);
2218 if (bs->file)
2219 return bdrv_snapshot_create(bs->file, sn_info);
2220 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002221}
2222
ths5fafdf22007-09-16 21:08:06 +00002223int bdrv_snapshot_goto(BlockDriverState *bs,
bellardfaea38e2006-08-05 21:31:00 +00002224 const char *snapshot_id)
2225{
2226 BlockDriver *drv = bs->drv;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002227 int ret, open_ret;
2228
bellardfaea38e2006-08-05 21:31:00 +00002229 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002230 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002231 if (drv->bdrv_snapshot_goto)
2232 return drv->bdrv_snapshot_goto(bs, snapshot_id);
2233
2234 if (bs->file) {
2235 drv->bdrv_close(bs);
2236 ret = bdrv_snapshot_goto(bs->file, snapshot_id);
2237 open_ret = drv->bdrv_open(bs, bs->open_flags);
2238 if (open_ret < 0) {
2239 bdrv_delete(bs->file);
2240 bs->drv = NULL;
2241 return open_ret;
2242 }
2243 return ret;
2244 }
2245
2246 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002247}
2248
2249int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
2250{
2251 BlockDriver *drv = bs->drv;
2252 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002253 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002254 if (drv->bdrv_snapshot_delete)
2255 return drv->bdrv_snapshot_delete(bs, snapshot_id);
2256 if (bs->file)
2257 return bdrv_snapshot_delete(bs->file, snapshot_id);
2258 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002259}
2260
ths5fafdf22007-09-16 21:08:06 +00002261int bdrv_snapshot_list(BlockDriverState *bs,
bellardfaea38e2006-08-05 21:31:00 +00002262 QEMUSnapshotInfo **psn_info)
2263{
2264 BlockDriver *drv = bs->drv;
2265 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002266 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002267 if (drv->bdrv_snapshot_list)
2268 return drv->bdrv_snapshot_list(bs, psn_info);
2269 if (bs->file)
2270 return bdrv_snapshot_list(bs->file, psn_info);
2271 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002272}
2273
edison51ef6722010-09-21 19:58:41 -07002274int bdrv_snapshot_load_tmp(BlockDriverState *bs,
2275 const char *snapshot_name)
2276{
2277 BlockDriver *drv = bs->drv;
2278 if (!drv) {
2279 return -ENOMEDIUM;
2280 }
2281 if (!bs->read_only) {
2282 return -EINVAL;
2283 }
2284 if (drv->bdrv_snapshot_load_tmp) {
2285 return drv->bdrv_snapshot_load_tmp(bs, snapshot_name);
2286 }
2287 return -ENOTSUP;
2288}
2289
bellardfaea38e2006-08-05 21:31:00 +00002290#define NB_SUFFIXES 4
2291
2292char *get_human_readable_size(char *buf, int buf_size, int64_t size)
2293{
2294 static const char suffixes[NB_SUFFIXES] = "KMGT";
2295 int64_t base;
2296 int i;
2297
2298 if (size <= 999) {
2299 snprintf(buf, buf_size, "%" PRId64, size);
2300 } else {
2301 base = 1024;
2302 for(i = 0; i < NB_SUFFIXES; i++) {
2303 if (size < (10 * base)) {
ths5fafdf22007-09-16 21:08:06 +00002304 snprintf(buf, buf_size, "%0.1f%c",
bellardfaea38e2006-08-05 21:31:00 +00002305 (double)size / base,
2306 suffixes[i]);
2307 break;
2308 } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) {
ths5fafdf22007-09-16 21:08:06 +00002309 snprintf(buf, buf_size, "%" PRId64 "%c",
bellardfaea38e2006-08-05 21:31:00 +00002310 ((size + (base >> 1)) / base),
2311 suffixes[i]);
2312 break;
2313 }
2314 base = base * 1024;
2315 }
2316 }
2317 return buf;
2318}
2319
2320char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
2321{
2322 char buf1[128], date_buf[128], clock_buf[128];
bellard3b9f94e2007-01-07 17:27:07 +00002323#ifdef _WIN32
2324 struct tm *ptm;
2325#else
bellardfaea38e2006-08-05 21:31:00 +00002326 struct tm tm;
bellard3b9f94e2007-01-07 17:27:07 +00002327#endif
bellardfaea38e2006-08-05 21:31:00 +00002328 time_t ti;
2329 int64_t secs;
2330
2331 if (!sn) {
ths5fafdf22007-09-16 21:08:06 +00002332 snprintf(buf, buf_size,
2333 "%-10s%-20s%7s%20s%15s",
bellardfaea38e2006-08-05 21:31:00 +00002334 "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
2335 } else {
2336 ti = sn->date_sec;
bellard3b9f94e2007-01-07 17:27:07 +00002337#ifdef _WIN32
2338 ptm = localtime(&ti);
2339 strftime(date_buf, sizeof(date_buf),
2340 "%Y-%m-%d %H:%M:%S", ptm);
2341#else
bellardfaea38e2006-08-05 21:31:00 +00002342 localtime_r(&ti, &tm);
2343 strftime(date_buf, sizeof(date_buf),
2344 "%Y-%m-%d %H:%M:%S", &tm);
bellard3b9f94e2007-01-07 17:27:07 +00002345#endif
bellardfaea38e2006-08-05 21:31:00 +00002346 secs = sn->vm_clock_nsec / 1000000000;
2347 snprintf(clock_buf, sizeof(clock_buf),
2348 "%02d:%02d:%02d.%03d",
2349 (int)(secs / 3600),
2350 (int)((secs / 60) % 60),
ths5fafdf22007-09-16 21:08:06 +00002351 (int)(secs % 60),
bellardfaea38e2006-08-05 21:31:00 +00002352 (int)((sn->vm_clock_nsec / 1000000) % 1000));
2353 snprintf(buf, buf_size,
ths5fafdf22007-09-16 21:08:06 +00002354 "%-10s%-20s%7s%20s%15s",
bellardfaea38e2006-08-05 21:31:00 +00002355 sn->id_str, sn->name,
2356 get_human_readable_size(buf1, sizeof(buf1), sn->vm_state_size),
2357 date_buf,
2358 clock_buf);
2359 }
2360 return buf;
2361}
2362
bellard83f64092006-08-01 16:21:11 +00002363/**************************************************************/
2364/* async I/Os */
2365
aliguori3b69e4b2009-01-22 16:59:24 +00002366BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
aliguorif141eaf2009-04-07 18:43:24 +00002367 QEMUIOVector *qiov, int nb_sectors,
aliguori3b69e4b2009-01-22 16:59:24 +00002368 BlockDriverCompletionFunc *cb, void *opaque)
2369{
Stefan Hajnoczibbf0a442010-10-05 14:28:53 +01002370 trace_bdrv_aio_readv(bs, sector_num, nb_sectors, opaque);
2371
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002372 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01002373 cb, opaque, false);
bellard83f64092006-08-01 16:21:11 +00002374}
2375
aliguorif141eaf2009-04-07 18:43:24 +00002376BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
2377 QEMUIOVector *qiov, int nb_sectors,
2378 BlockDriverCompletionFunc *cb, void *opaque)
bellard83f64092006-08-01 16:21:11 +00002379{
Stefan Hajnoczibbf0a442010-10-05 14:28:53 +01002380 trace_bdrv_aio_writev(bs, sector_num, nb_sectors, opaque);
2381
Stefan Hajnoczi1a6e1152011-10-13 13:08:25 +01002382 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01002383 cb, opaque, true);
bellard83f64092006-08-01 16:21:11 +00002384}
2385
Kevin Wolf40b4f532009-09-09 17:53:37 +02002386
2387typedef struct MultiwriteCB {
2388 int error;
2389 int num_requests;
2390 int num_callbacks;
2391 struct {
2392 BlockDriverCompletionFunc *cb;
2393 void *opaque;
2394 QEMUIOVector *free_qiov;
2395 void *free_buf;
2396 } callbacks[];
2397} MultiwriteCB;
2398
2399static void multiwrite_user_cb(MultiwriteCB *mcb)
2400{
2401 int i;
2402
2403 for (i = 0; i < mcb->num_callbacks; i++) {
2404 mcb->callbacks[i].cb(mcb->callbacks[i].opaque, mcb->error);
Stefan Hajnoczi1e1ea482010-04-21 20:35:45 +01002405 if (mcb->callbacks[i].free_qiov) {
2406 qemu_iovec_destroy(mcb->callbacks[i].free_qiov);
2407 }
Anthony Liguori7267c092011-08-20 22:09:37 -05002408 g_free(mcb->callbacks[i].free_qiov);
Herve Poussineauf8a83242010-01-24 21:23:56 +00002409 qemu_vfree(mcb->callbacks[i].free_buf);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002410 }
2411}
2412
2413static void multiwrite_cb(void *opaque, int ret)
2414{
2415 MultiwriteCB *mcb = opaque;
2416
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002417 trace_multiwrite_cb(mcb, ret);
2418
Kevin Wolfcb6d3ca2010-04-01 22:48:44 +02002419 if (ret < 0 && !mcb->error) {
Kevin Wolf40b4f532009-09-09 17:53:37 +02002420 mcb->error = ret;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002421 }
2422
2423 mcb->num_requests--;
2424 if (mcb->num_requests == 0) {
Kevin Wolfde189a12010-07-01 16:08:51 +02002425 multiwrite_user_cb(mcb);
Anthony Liguori7267c092011-08-20 22:09:37 -05002426 g_free(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002427 }
2428}
2429
2430static int multiwrite_req_compare(const void *a, const void *b)
2431{
Christoph Hellwig77be4362010-05-19 20:53:10 +02002432 const BlockRequest *req1 = a, *req2 = b;
2433
2434 /*
2435 * Note that we can't simply subtract req2->sector from req1->sector
2436 * here as that could overflow the return value.
2437 */
2438 if (req1->sector > req2->sector) {
2439 return 1;
2440 } else if (req1->sector < req2->sector) {
2441 return -1;
2442 } else {
2443 return 0;
2444 }
Kevin Wolf40b4f532009-09-09 17:53:37 +02002445}
2446
2447/*
2448 * Takes a bunch of requests and tries to merge them. Returns the number of
2449 * requests that remain after merging.
2450 */
2451static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs,
2452 int num_reqs, MultiwriteCB *mcb)
2453{
2454 int i, outidx;
2455
2456 // Sort requests by start sector
2457 qsort(reqs, num_reqs, sizeof(*reqs), &multiwrite_req_compare);
2458
2459 // Check if adjacent requests touch the same clusters. If so, combine them,
2460 // filling up gaps with zero sectors.
2461 outidx = 0;
2462 for (i = 1; i < num_reqs; i++) {
2463 int merge = 0;
2464 int64_t oldreq_last = reqs[outidx].sector + reqs[outidx].nb_sectors;
2465
2466 // This handles the cases that are valid for all block drivers, namely
2467 // exactly sequential writes and overlapping writes.
2468 if (reqs[i].sector <= oldreq_last) {
2469 merge = 1;
2470 }
2471
2472 // The block driver may decide that it makes sense to combine requests
2473 // even if there is a gap of some sectors between them. In this case,
2474 // the gap is filled with zeros (therefore only applicable for yet
2475 // unused space in format like qcow2).
2476 if (!merge && bs->drv->bdrv_merge_requests) {
2477 merge = bs->drv->bdrv_merge_requests(bs, &reqs[outidx], &reqs[i]);
2478 }
2479
Christoph Hellwige2a305f2010-01-26 14:49:08 +01002480 if (reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1 > IOV_MAX) {
2481 merge = 0;
2482 }
2483
Kevin Wolf40b4f532009-09-09 17:53:37 +02002484 if (merge) {
2485 size_t size;
Anthony Liguori7267c092011-08-20 22:09:37 -05002486 QEMUIOVector *qiov = g_malloc0(sizeof(*qiov));
Kevin Wolf40b4f532009-09-09 17:53:37 +02002487 qemu_iovec_init(qiov,
2488 reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1);
2489
2490 // Add the first request to the merged one. If the requests are
2491 // overlapping, drop the last sectors of the first request.
2492 size = (reqs[i].sector - reqs[outidx].sector) << 9;
2493 qemu_iovec_concat(qiov, reqs[outidx].qiov, size);
2494
2495 // We might need to add some zeros between the two requests
2496 if (reqs[i].sector > oldreq_last) {
2497 size_t zero_bytes = (reqs[i].sector - oldreq_last) << 9;
2498 uint8_t *buf = qemu_blockalign(bs, zero_bytes);
2499 memset(buf, 0, zero_bytes);
2500 qemu_iovec_add(qiov, buf, zero_bytes);
2501 mcb->callbacks[i].free_buf = buf;
2502 }
2503
2504 // Add the second request
2505 qemu_iovec_concat(qiov, reqs[i].qiov, reqs[i].qiov->size);
2506
Kevin Wolfcbf1dff2010-05-21 11:09:42 +02002507 reqs[outidx].nb_sectors = qiov->size >> 9;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002508 reqs[outidx].qiov = qiov;
2509
2510 mcb->callbacks[i].free_qiov = reqs[outidx].qiov;
2511 } else {
2512 outidx++;
2513 reqs[outidx].sector = reqs[i].sector;
2514 reqs[outidx].nb_sectors = reqs[i].nb_sectors;
2515 reqs[outidx].qiov = reqs[i].qiov;
2516 }
2517 }
2518
2519 return outidx + 1;
2520}
2521
2522/*
2523 * Submit multiple AIO write requests at once.
2524 *
2525 * On success, the function returns 0 and all requests in the reqs array have
2526 * been submitted. In error case this function returns -1, and any of the
2527 * requests may or may not be submitted yet. In particular, this means that the
2528 * callback will be called for some of the requests, for others it won't. The
2529 * caller must check the error field of the BlockRequest to wait for the right
2530 * callbacks (if error != 0, no callback will be called).
2531 *
2532 * The implementation may modify the contents of the reqs array, e.g. to merge
2533 * requests. However, the fields opaque and error are left unmodified as they
2534 * are used to signal failure for a single request to the caller.
2535 */
2536int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs)
2537{
2538 BlockDriverAIOCB *acb;
2539 MultiwriteCB *mcb;
2540 int i;
2541
Ryan Harper301db7c2011-03-07 10:01:04 -06002542 /* don't submit writes if we don't have a medium */
2543 if (bs->drv == NULL) {
2544 for (i = 0; i < num_reqs; i++) {
2545 reqs[i].error = -ENOMEDIUM;
2546 }
2547 return -1;
2548 }
2549
Kevin Wolf40b4f532009-09-09 17:53:37 +02002550 if (num_reqs == 0) {
2551 return 0;
2552 }
2553
2554 // Create MultiwriteCB structure
Anthony Liguori7267c092011-08-20 22:09:37 -05002555 mcb = g_malloc0(sizeof(*mcb) + num_reqs * sizeof(*mcb->callbacks));
Kevin Wolf40b4f532009-09-09 17:53:37 +02002556 mcb->num_requests = 0;
2557 mcb->num_callbacks = num_reqs;
2558
2559 for (i = 0; i < num_reqs; i++) {
2560 mcb->callbacks[i].cb = reqs[i].cb;
2561 mcb->callbacks[i].opaque = reqs[i].opaque;
2562 }
2563
2564 // Check for mergable requests
2565 num_reqs = multiwrite_merge(bs, reqs, num_reqs, mcb);
2566
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002567 trace_bdrv_aio_multiwrite(mcb, mcb->num_callbacks, num_reqs);
2568
Kevin Wolf453f9a12010-07-02 14:01:21 +02002569 /*
2570 * Run the aio requests. As soon as one request can't be submitted
2571 * successfully, fail all requests that are not yet submitted (we must
2572 * return failure for all requests anyway)
2573 *
2574 * num_requests cannot be set to the right value immediately: If
2575 * bdrv_aio_writev fails for some request, num_requests would be too high
2576 * and therefore multiwrite_cb() would never recognize the multiwrite
2577 * request as completed. We also cannot use the loop variable i to set it
2578 * when the first request fails because the callback may already have been
2579 * called for previously submitted requests. Thus, num_requests must be
2580 * incremented for each request that is submitted.
2581 *
2582 * The problem that callbacks may be called early also means that we need
2583 * to take care that num_requests doesn't become 0 before all requests are
2584 * submitted - multiwrite_cb() would consider the multiwrite request
2585 * completed. A dummy request that is "completed" by a manual call to
2586 * multiwrite_cb() takes care of this.
2587 */
2588 mcb->num_requests = 1;
2589
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002590 // Run the aio requests
Kevin Wolf40b4f532009-09-09 17:53:37 +02002591 for (i = 0; i < num_reqs; i++) {
Kevin Wolf453f9a12010-07-02 14:01:21 +02002592 mcb->num_requests++;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002593 acb = bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov,
2594 reqs[i].nb_sectors, multiwrite_cb, mcb);
2595
2596 if (acb == NULL) {
2597 // We can only fail the whole thing if no request has been
2598 // submitted yet. Otherwise we'll wait for the submitted AIOs to
2599 // complete and report the error in the callback.
Kevin Wolf453f9a12010-07-02 14:01:21 +02002600 if (i == 0) {
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002601 trace_bdrv_aio_multiwrite_earlyfail(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002602 goto fail;
2603 } else {
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002604 trace_bdrv_aio_multiwrite_latefail(mcb, i);
Kevin Wolf7eb58a62010-04-06 18:24:07 +02002605 multiwrite_cb(mcb, -EIO);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002606 break;
2607 }
Kevin Wolf40b4f532009-09-09 17:53:37 +02002608 }
2609 }
2610
Kevin Wolf453f9a12010-07-02 14:01:21 +02002611 /* Complete the dummy request */
2612 multiwrite_cb(mcb, 0);
2613
Kevin Wolf40b4f532009-09-09 17:53:37 +02002614 return 0;
2615
2616fail:
Kevin Wolf453f9a12010-07-02 14:01:21 +02002617 for (i = 0; i < mcb->num_callbacks; i++) {
2618 reqs[i].error = -EIO;
2619 }
Anthony Liguori7267c092011-08-20 22:09:37 -05002620 g_free(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002621 return -1;
2622}
2623
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002624BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
2625 BlockDriverCompletionFunc *cb, void *opaque)
2626{
2627 BlockDriver *drv = bs->drv;
2628
Stefan Hajnoczia13aac02011-03-07 07:58:04 +00002629 trace_bdrv_aio_flush(bs, opaque);
2630
Alexander Graf016f5cf2010-05-26 17:51:49 +02002631 if (bs->open_flags & BDRV_O_NO_FLUSH) {
2632 return bdrv_aio_noop_em(bs, cb, opaque);
2633 }
2634
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002635 if (!drv)
2636 return NULL;
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002637 return drv->bdrv_aio_flush(bs, cb, opaque);
2638}
2639
bellard83f64092006-08-01 16:21:11 +00002640void bdrv_aio_cancel(BlockDriverAIOCB *acb)
pbrookce1a14d2006-08-07 02:38:06 +00002641{
aliguori6bbff9a2009-03-20 18:25:59 +00002642 acb->pool->cancel(acb);
bellard83f64092006-08-01 16:21:11 +00002643}
2644
pbrookce1a14d2006-08-07 02:38:06 +00002645
bellard83f64092006-08-01 16:21:11 +00002646/**************************************************************/
2647/* async block device emulation */
2648
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002649typedef struct BlockDriverAIOCBSync {
2650 BlockDriverAIOCB common;
2651 QEMUBH *bh;
2652 int ret;
2653 /* vector translation state */
2654 QEMUIOVector *qiov;
2655 uint8_t *bounce;
2656 int is_write;
2657} BlockDriverAIOCBSync;
2658
2659static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
2660{
Kevin Wolfb666d232010-05-05 11:44:39 +02002661 BlockDriverAIOCBSync *acb =
2662 container_of(blockacb, BlockDriverAIOCBSync, common);
Dor Laor6a7ad292009-06-01 12:07:23 +03002663 qemu_bh_delete(acb->bh);
Avi Kivity36afc452009-06-23 16:20:36 +03002664 acb->bh = NULL;
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002665 qemu_aio_release(acb);
2666}
2667
2668static AIOPool bdrv_em_aio_pool = {
2669 .aiocb_size = sizeof(BlockDriverAIOCBSync),
2670 .cancel = bdrv_aio_cancel_em,
2671};
2672
bellard83f64092006-08-01 16:21:11 +00002673static void bdrv_aio_bh_cb(void *opaque)
bellardbeac80c2006-06-26 20:08:57 +00002674{
pbrookce1a14d2006-08-07 02:38:06 +00002675 BlockDriverAIOCBSync *acb = opaque;
aliguorif141eaf2009-04-07 18:43:24 +00002676
aliguorif141eaf2009-04-07 18:43:24 +00002677 if (!acb->is_write)
2678 qemu_iovec_from_buffer(acb->qiov, acb->bounce, acb->qiov->size);
aliguoriceb42de2009-04-07 18:43:28 +00002679 qemu_vfree(acb->bounce);
pbrookce1a14d2006-08-07 02:38:06 +00002680 acb->common.cb(acb->common.opaque, acb->ret);
Dor Laor6a7ad292009-06-01 12:07:23 +03002681 qemu_bh_delete(acb->bh);
Avi Kivity36afc452009-06-23 16:20:36 +03002682 acb->bh = NULL;
pbrookce1a14d2006-08-07 02:38:06 +00002683 qemu_aio_release(acb);
bellardbeac80c2006-06-26 20:08:57 +00002684}
bellardbeac80c2006-06-26 20:08:57 +00002685
aliguorif141eaf2009-04-07 18:43:24 +00002686static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
2687 int64_t sector_num,
2688 QEMUIOVector *qiov,
2689 int nb_sectors,
2690 BlockDriverCompletionFunc *cb,
2691 void *opaque,
2692 int is_write)
2693
bellardea2384d2004-08-01 21:59:26 +00002694{
pbrookce1a14d2006-08-07 02:38:06 +00002695 BlockDriverAIOCBSync *acb;
pbrookce1a14d2006-08-07 02:38:06 +00002696
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002697 acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
aliguorif141eaf2009-04-07 18:43:24 +00002698 acb->is_write = is_write;
2699 acb->qiov = qiov;
aliguorie268ca52009-04-22 20:20:00 +00002700 acb->bounce = qemu_blockalign(bs, qiov->size);
aliguorif141eaf2009-04-07 18:43:24 +00002701
pbrookce1a14d2006-08-07 02:38:06 +00002702 if (!acb->bh)
2703 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
aliguorif141eaf2009-04-07 18:43:24 +00002704
2705 if (is_write) {
2706 qemu_iovec_to_buffer(acb->qiov, acb->bounce);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002707 acb->ret = bs->drv->bdrv_write(bs, sector_num, acb->bounce, nb_sectors);
aliguorif141eaf2009-04-07 18:43:24 +00002708 } else {
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002709 acb->ret = bs->drv->bdrv_read(bs, sector_num, acb->bounce, nb_sectors);
aliguorif141eaf2009-04-07 18:43:24 +00002710 }
2711
pbrookce1a14d2006-08-07 02:38:06 +00002712 qemu_bh_schedule(acb->bh);
aliguorif141eaf2009-04-07 18:43:24 +00002713
pbrookce1a14d2006-08-07 02:38:06 +00002714 return &acb->common;
pbrook7a6cba62006-06-04 11:39:07 +00002715}
2716
aliguorif141eaf2009-04-07 18:43:24 +00002717static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
2718 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
pbrookce1a14d2006-08-07 02:38:06 +00002719 BlockDriverCompletionFunc *cb, void *opaque)
bellard83f64092006-08-01 16:21:11 +00002720{
aliguorif141eaf2009-04-07 18:43:24 +00002721 return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
bellard83f64092006-08-01 16:21:11 +00002722}
2723
aliguorif141eaf2009-04-07 18:43:24 +00002724static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
2725 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
2726 BlockDriverCompletionFunc *cb, void *opaque)
2727{
2728 return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
2729}
2730
Kevin Wolf68485422011-06-30 10:05:46 +02002731
2732typedef struct BlockDriverAIOCBCoroutine {
2733 BlockDriverAIOCB common;
2734 BlockRequest req;
2735 bool is_write;
2736 QEMUBH* bh;
2737} BlockDriverAIOCBCoroutine;
2738
2739static void bdrv_aio_co_cancel_em(BlockDriverAIOCB *blockacb)
2740{
2741 qemu_aio_flush();
2742}
2743
2744static AIOPool bdrv_em_co_aio_pool = {
2745 .aiocb_size = sizeof(BlockDriverAIOCBCoroutine),
2746 .cancel = bdrv_aio_co_cancel_em,
2747};
2748
2749static void bdrv_co_rw_bh(void *opaque)
2750{
2751 BlockDriverAIOCBCoroutine *acb = opaque;
2752
2753 acb->common.cb(acb->common.opaque, acb->req.error);
2754 qemu_bh_delete(acb->bh);
2755 qemu_aio_release(acb);
2756}
2757
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002758/* Invoke bdrv_co_do_readv/bdrv_co_do_writev */
2759static void coroutine_fn bdrv_co_do_rw(void *opaque)
2760{
2761 BlockDriverAIOCBCoroutine *acb = opaque;
2762 BlockDriverState *bs = acb->common.bs;
2763
2764 if (!acb->is_write) {
2765 acb->req.error = bdrv_co_do_readv(bs, acb->req.sector,
2766 acb->req.nb_sectors, acb->req.qiov);
2767 } else {
2768 acb->req.error = bdrv_co_do_writev(bs, acb->req.sector,
2769 acb->req.nb_sectors, acb->req.qiov);
2770 }
2771
2772 acb->bh = qemu_bh_new(bdrv_co_rw_bh, acb);
2773 qemu_bh_schedule(acb->bh);
2774}
2775
Kevin Wolf68485422011-06-30 10:05:46 +02002776static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
2777 int64_t sector_num,
2778 QEMUIOVector *qiov,
2779 int nb_sectors,
2780 BlockDriverCompletionFunc *cb,
2781 void *opaque,
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01002782 bool is_write)
Kevin Wolf68485422011-06-30 10:05:46 +02002783{
2784 Coroutine *co;
2785 BlockDriverAIOCBCoroutine *acb;
2786
2787 acb = qemu_aio_get(&bdrv_em_co_aio_pool, bs, cb, opaque);
2788 acb->req.sector = sector_num;
2789 acb->req.nb_sectors = nb_sectors;
2790 acb->req.qiov = qiov;
2791 acb->is_write = is_write;
2792
Stefan Hajnoczi8c5873d2011-10-13 21:09:28 +01002793 co = qemu_coroutine_create(bdrv_co_do_rw);
Kevin Wolf68485422011-06-30 10:05:46 +02002794 qemu_coroutine_enter(co, acb);
2795
2796 return &acb->common;
2797}
2798
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002799static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
2800 BlockDriverCompletionFunc *cb, void *opaque)
2801{
2802 BlockDriverAIOCBSync *acb;
2803
2804 acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
2805 acb->is_write = 1; /* don't bounce in the completion hadler */
2806 acb->qiov = NULL;
2807 acb->bounce = NULL;
2808 acb->ret = 0;
2809
2810 if (!acb->bh)
2811 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
2812
2813 bdrv_flush(bs);
2814 qemu_bh_schedule(acb->bh);
2815 return &acb->common;
2816}
2817
Alexander Graf016f5cf2010-05-26 17:51:49 +02002818static BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
2819 BlockDriverCompletionFunc *cb, void *opaque)
2820{
2821 BlockDriverAIOCBSync *acb;
2822
2823 acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
2824 acb->is_write = 1; /* don't bounce in the completion handler */
2825 acb->qiov = NULL;
2826 acb->bounce = NULL;
2827 acb->ret = 0;
2828
2829 if (!acb->bh) {
2830 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
2831 }
2832
2833 qemu_bh_schedule(acb->bh);
2834 return &acb->common;
2835}
2836
bellard83f64092006-08-01 16:21:11 +00002837/**************************************************************/
2838/* sync block device emulation */
2839
2840static void bdrv_rw_em_cb(void *opaque, int ret)
2841{
2842 *(int *)opaque = ret;
2843}
2844
ths5fafdf22007-09-16 21:08:06 +00002845static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
bellard83f64092006-08-01 16:21:11 +00002846 uint8_t *buf, int nb_sectors)
2847{
pbrookce1a14d2006-08-07 02:38:06 +00002848 int async_ret;
2849 BlockDriverAIOCB *acb;
aliguorif141eaf2009-04-07 18:43:24 +00002850 struct iovec iov;
2851 QEMUIOVector qiov;
bellard83f64092006-08-01 16:21:11 +00002852
bellard83f64092006-08-01 16:21:11 +00002853 async_ret = NOT_DONE;
blueswir13f4cb3d2009-04-13 16:31:01 +00002854 iov.iov_base = (void *)buf;
Jes Sorenseneb5a3162010-05-27 16:20:31 +02002855 iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
aliguorif141eaf2009-04-07 18:43:24 +00002856 qemu_iovec_init_external(&qiov, &iov, 1);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002857
2858 acb = bs->drv->bdrv_aio_readv(bs, sector_num, &qiov, nb_sectors,
2859 bdrv_rw_em_cb, &async_ret);
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002860 if (acb == NULL) {
2861 async_ret = -1;
2862 goto fail;
2863 }
aliguoribaf35cb2008-09-10 15:45:19 +00002864
bellard83f64092006-08-01 16:21:11 +00002865 while (async_ret == NOT_DONE) {
2866 qemu_aio_wait();
2867 }
aliguoribaf35cb2008-09-10 15:45:19 +00002868
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002869
2870fail:
bellard83f64092006-08-01 16:21:11 +00002871 return async_ret;
2872}
2873
2874static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
2875 const uint8_t *buf, int nb_sectors)
2876{
pbrookce1a14d2006-08-07 02:38:06 +00002877 int async_ret;
2878 BlockDriverAIOCB *acb;
aliguorif141eaf2009-04-07 18:43:24 +00002879 struct iovec iov;
2880 QEMUIOVector qiov;
bellard83f64092006-08-01 16:21:11 +00002881
bellard83f64092006-08-01 16:21:11 +00002882 async_ret = NOT_DONE;
aliguorif141eaf2009-04-07 18:43:24 +00002883 iov.iov_base = (void *)buf;
Jes Sorenseneb5a3162010-05-27 16:20:31 +02002884 iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
aliguorif141eaf2009-04-07 18:43:24 +00002885 qemu_iovec_init_external(&qiov, &iov, 1);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002886
2887 acb = bs->drv->bdrv_aio_writev(bs, sector_num, &qiov, nb_sectors,
2888 bdrv_rw_em_cb, &async_ret);
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002889 if (acb == NULL) {
2890 async_ret = -1;
2891 goto fail;
2892 }
bellard83f64092006-08-01 16:21:11 +00002893 while (async_ret == NOT_DONE) {
2894 qemu_aio_wait();
2895 }
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002896
2897fail:
bellard83f64092006-08-01 16:21:11 +00002898 return async_ret;
2899}
bellardea2384d2004-08-01 21:59:26 +00002900
2901void bdrv_init(void)
2902{
Anthony Liguori5efa9d52009-05-09 17:03:42 -05002903 module_call_init(MODULE_INIT_BLOCK);
bellardea2384d2004-08-01 21:59:26 +00002904}
pbrookce1a14d2006-08-07 02:38:06 +00002905
Markus Armbrustereb852012009-10-27 18:41:44 +01002906void bdrv_init_with_whitelist(void)
2907{
2908 use_bdrv_whitelist = 1;
2909 bdrv_init();
2910}
2911
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002912void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
2913 BlockDriverCompletionFunc *cb, void *opaque)
aliguori6bbff9a2009-03-20 18:25:59 +00002914{
pbrookce1a14d2006-08-07 02:38:06 +00002915 BlockDriverAIOCB *acb;
2916
aliguori6bbff9a2009-03-20 18:25:59 +00002917 if (pool->free_aiocb) {
2918 acb = pool->free_aiocb;
2919 pool->free_aiocb = acb->next;
pbrookce1a14d2006-08-07 02:38:06 +00002920 } else {
Anthony Liguori7267c092011-08-20 22:09:37 -05002921 acb = g_malloc0(pool->aiocb_size);
aliguori6bbff9a2009-03-20 18:25:59 +00002922 acb->pool = pool;
pbrookce1a14d2006-08-07 02:38:06 +00002923 }
2924 acb->bs = bs;
2925 acb->cb = cb;
2926 acb->opaque = opaque;
2927 return acb;
2928}
2929
2930void qemu_aio_release(void *p)
2931{
aliguori6bbff9a2009-03-20 18:25:59 +00002932 BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p;
2933 AIOPool *pool = acb->pool;
2934 acb->next = pool->free_aiocb;
2935 pool->free_aiocb = acb;
pbrookce1a14d2006-08-07 02:38:06 +00002936}
bellard19cb3732006-08-19 11:45:59 +00002937
2938/**************************************************************/
Kevin Wolff9f05dc2011-07-15 13:50:26 +02002939/* Coroutine block device emulation */
2940
2941typedef struct CoroutineIOCompletion {
2942 Coroutine *coroutine;
2943 int ret;
2944} CoroutineIOCompletion;
2945
2946static void bdrv_co_io_em_complete(void *opaque, int ret)
2947{
2948 CoroutineIOCompletion *co = opaque;
2949
2950 co->ret = ret;
2951 qemu_coroutine_enter(co->coroutine, NULL);
2952}
2953
2954static int coroutine_fn bdrv_co_io_em(BlockDriverState *bs, int64_t sector_num,
2955 int nb_sectors, QEMUIOVector *iov,
2956 bool is_write)
2957{
2958 CoroutineIOCompletion co = {
2959 .coroutine = qemu_coroutine_self(),
2960 };
2961 BlockDriverAIOCB *acb;
2962
2963 if (is_write) {
Stefan Hajnoczia652d162011-10-05 17:17:02 +01002964 acb = bs->drv->bdrv_aio_writev(bs, sector_num, iov, nb_sectors,
2965 bdrv_co_io_em_complete, &co);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02002966 } else {
Stefan Hajnoczia652d162011-10-05 17:17:02 +01002967 acb = bs->drv->bdrv_aio_readv(bs, sector_num, iov, nb_sectors,
2968 bdrv_co_io_em_complete, &co);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02002969 }
2970
Stefan Hajnoczi59370aa2011-09-30 17:34:58 +01002971 trace_bdrv_co_io_em(bs, sector_num, nb_sectors, is_write, acb);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02002972 if (!acb) {
2973 return -EIO;
2974 }
2975 qemu_coroutine_yield();
2976
2977 return co.ret;
2978}
2979
2980static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
2981 int64_t sector_num, int nb_sectors,
2982 QEMUIOVector *iov)
2983{
2984 return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, false);
2985}
2986
2987static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
2988 int64_t sector_num, int nb_sectors,
2989 QEMUIOVector *iov)
2990{
2991 return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, true);
2992}
2993
Kevin Wolfe7a8a782011-07-15 16:05:00 +02002994static int coroutine_fn bdrv_co_flush_em(BlockDriverState *bs)
2995{
2996 CoroutineIOCompletion co = {
2997 .coroutine = qemu_coroutine_self(),
2998 };
2999 BlockDriverAIOCB *acb;
3000
3001 acb = bdrv_aio_flush(bs, bdrv_co_io_em_complete, &co);
3002 if (!acb) {
3003 return -EIO;
3004 }
3005 qemu_coroutine_yield();
3006 return co.ret;
3007}
3008
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003009/**************************************************************/
bellard19cb3732006-08-19 11:45:59 +00003010/* removable device support */
3011
3012/**
3013 * Return TRUE if the media is present
3014 */
3015int bdrv_is_inserted(BlockDriverState *bs)
3016{
3017 BlockDriver *drv = bs->drv;
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003018
bellard19cb3732006-08-19 11:45:59 +00003019 if (!drv)
3020 return 0;
3021 if (!drv->bdrv_is_inserted)
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003022 return 1;
3023 return drv->bdrv_is_inserted(bs);
bellard19cb3732006-08-19 11:45:59 +00003024}
3025
3026/**
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003027 * Return whether the media changed since the last call to this
3028 * function, or -ENOTSUP if we don't know. Most drivers don't know.
bellard19cb3732006-08-19 11:45:59 +00003029 */
3030int bdrv_media_changed(BlockDriverState *bs)
3031{
3032 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003033
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003034 if (drv && drv->bdrv_media_changed) {
3035 return drv->bdrv_media_changed(bs);
3036 }
3037 return -ENOTSUP;
bellard19cb3732006-08-19 11:45:59 +00003038}
3039
3040/**
3041 * If eject_flag is TRUE, eject the media. Otherwise, close the tray
3042 */
Markus Armbrusterfdec4402011-09-06 18:58:45 +02003043void bdrv_eject(BlockDriverState *bs, int eject_flag)
bellard19cb3732006-08-19 11:45:59 +00003044{
3045 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003046
Markus Armbruster822e1cd2011-07-20 18:23:42 +02003047 if (drv && drv->bdrv_eject) {
3048 drv->bdrv_eject(bs, eject_flag);
bellard19cb3732006-08-19 11:45:59 +00003049 }
bellard19cb3732006-08-19 11:45:59 +00003050}
3051
bellard19cb3732006-08-19 11:45:59 +00003052/**
3053 * Lock or unlock the media (if it is locked, the user won't be able
3054 * to eject it manually).
3055 */
Markus Armbruster025e8492011-09-06 18:58:47 +02003056void bdrv_lock_medium(BlockDriverState *bs, bool locked)
bellard19cb3732006-08-19 11:45:59 +00003057{
3058 BlockDriver *drv = bs->drv;
3059
Markus Armbruster025e8492011-09-06 18:58:47 +02003060 trace_bdrv_lock_medium(bs, locked);
Stefan Hajnoczib8c6d092011-03-29 20:04:40 +01003061
Markus Armbruster025e8492011-09-06 18:58:47 +02003062 if (drv && drv->bdrv_lock_medium) {
3063 drv->bdrv_lock_medium(bs, locked);
bellard19cb3732006-08-19 11:45:59 +00003064 }
3065}
ths985a03b2007-12-24 16:10:43 +00003066
3067/* needed for generic scsi interface */
3068
3069int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
3070{
3071 BlockDriver *drv = bs->drv;
3072
3073 if (drv && drv->bdrv_ioctl)
3074 return drv->bdrv_ioctl(bs, req, buf);
3075 return -ENOTSUP;
3076}
aliguori7d780662009-03-12 19:57:08 +00003077
aliguori221f7152009-03-28 17:28:41 +00003078BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
3079 unsigned long int req, void *buf,
3080 BlockDriverCompletionFunc *cb, void *opaque)
aliguori7d780662009-03-12 19:57:08 +00003081{
aliguori221f7152009-03-28 17:28:41 +00003082 BlockDriver *drv = bs->drv;
aliguori7d780662009-03-12 19:57:08 +00003083
aliguori221f7152009-03-28 17:28:41 +00003084 if (drv && drv->bdrv_aio_ioctl)
3085 return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
3086 return NULL;
aliguori7d780662009-03-12 19:57:08 +00003087}
aliguorie268ca52009-04-22 20:20:00 +00003088
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003089void bdrv_set_buffer_alignment(BlockDriverState *bs, int align)
3090{
3091 bs->buffer_alignment = align;
3092}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003093
aliguorie268ca52009-04-22 20:20:00 +00003094void *qemu_blockalign(BlockDriverState *bs, size_t size)
3095{
3096 return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
3097}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003098
3099void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable)
3100{
3101 int64_t bitmap_size;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003102
Liran Schouraaa0eb72010-01-26 10:31:48 +02003103 bs->dirty_count = 0;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003104 if (enable) {
Jan Kiszkac6d22832009-11-30 18:21:20 +01003105 if (!bs->dirty_bitmap) {
3106 bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) +
3107 BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1;
3108 bitmap_size /= BDRV_SECTORS_PER_DIRTY_CHUNK * 8;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003109
Anthony Liguori7267c092011-08-20 22:09:37 -05003110 bs->dirty_bitmap = g_malloc0(bitmap_size);
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003111 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003112 } else {
Jan Kiszkac6d22832009-11-30 18:21:20 +01003113 if (bs->dirty_bitmap) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003114 g_free(bs->dirty_bitmap);
Jan Kiszkac6d22832009-11-30 18:21:20 +01003115 bs->dirty_bitmap = NULL;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003116 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003117 }
3118}
3119
3120int bdrv_get_dirty(BlockDriverState *bs, int64_t sector)
3121{
Jan Kiszka6ea44302009-11-30 18:21:19 +01003122 int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003123
Jan Kiszkac6d22832009-11-30 18:21:20 +01003124 if (bs->dirty_bitmap &&
3125 (sector << BDRV_SECTOR_BITS) < bdrv_getlength(bs)) {
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02003126 return !!(bs->dirty_bitmap[chunk / (sizeof(unsigned long) * 8)] &
3127 (1UL << (chunk % (sizeof(unsigned long) * 8))));
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003128 } else {
3129 return 0;
3130 }
3131}
3132
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003133void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
3134 int nr_sectors)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003135{
3136 set_dirty_bitmap(bs, cur_sector, nr_sectors, 0);
3137}
Liran Schouraaa0eb72010-01-26 10:31:48 +02003138
3139int64_t bdrv_get_dirty_count(BlockDriverState *bs)
3140{
3141 return bs->dirty_count;
3142}
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003143
Marcelo Tosattidb593f22011-01-26 12:12:34 -02003144void bdrv_set_in_use(BlockDriverState *bs, int in_use)
3145{
3146 assert(bs->in_use != in_use);
3147 bs->in_use = in_use;
3148}
3149
3150int bdrv_in_use(BlockDriverState *bs)
3151{
3152 return bs->in_use;
3153}
3154
Luiz Capitulino28a72822011-09-26 17:43:50 -03003155void bdrv_iostatus_enable(BlockDriverState *bs)
3156{
3157 bs->iostatus = BDRV_IOS_OK;
3158}
3159
3160/* The I/O status is only enabled if the drive explicitly
3161 * enables it _and_ the VM is configured to stop on errors */
3162bool bdrv_iostatus_is_enabled(const BlockDriverState *bs)
3163{
3164 return (bs->iostatus != BDRV_IOS_INVAL &&
3165 (bs->on_write_error == BLOCK_ERR_STOP_ENOSPC ||
3166 bs->on_write_error == BLOCK_ERR_STOP_ANY ||
3167 bs->on_read_error == BLOCK_ERR_STOP_ANY));
3168}
3169
3170void bdrv_iostatus_disable(BlockDriverState *bs)
3171{
3172 bs->iostatus = BDRV_IOS_INVAL;
3173}
3174
3175void bdrv_iostatus_reset(BlockDriverState *bs)
3176{
3177 if (bdrv_iostatus_is_enabled(bs)) {
3178 bs->iostatus = BDRV_IOS_OK;
3179 }
3180}
3181
3182/* XXX: Today this is set by device models because it makes the implementation
3183 quite simple. However, the block layer knows about the error, so it's
3184 possible to implement this without device models being involved */
3185void bdrv_iostatus_set_err(BlockDriverState *bs, int error)
3186{
3187 if (bdrv_iostatus_is_enabled(bs) && bs->iostatus == BDRV_IOS_OK) {
3188 assert(error >= 0);
3189 bs->iostatus = error == ENOSPC ? BDRV_IOS_ENOSPC : BDRV_IOS_FAILED;
3190 }
3191}
3192
Christoph Hellwiga597e792011-08-25 08:26:01 +02003193void
3194bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, int64_t bytes,
3195 enum BlockAcctType type)
3196{
3197 assert(type < BDRV_MAX_IOTYPE);
3198
3199 cookie->bytes = bytes;
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02003200 cookie->start_time_ns = get_clock();
Christoph Hellwiga597e792011-08-25 08:26:01 +02003201 cookie->type = type;
3202}
3203
3204void
3205bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie)
3206{
3207 assert(cookie->type < BDRV_MAX_IOTYPE);
3208
3209 bs->nr_bytes[cookie->type] += cookie->bytes;
3210 bs->nr_ops[cookie->type]++;
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02003211 bs->total_time_ns[cookie->type] += get_clock() - cookie->start_time_ns;
Christoph Hellwiga597e792011-08-25 08:26:01 +02003212}
3213
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003214int bdrv_img_create(const char *filename, const char *fmt,
3215 const char *base_filename, const char *base_fmt,
3216 char *options, uint64_t img_size, int flags)
3217{
3218 QEMUOptionParameter *param = NULL, *create_options = NULL;
Kevin Wolfd2208942011-06-01 14:03:31 +02003219 QEMUOptionParameter *backing_fmt, *backing_file, *size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003220 BlockDriverState *bs = NULL;
3221 BlockDriver *drv, *proto_drv;
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003222 BlockDriver *backing_drv = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003223 int ret = 0;
3224
3225 /* Find driver and parse its options */
3226 drv = bdrv_find_format(fmt);
3227 if (!drv) {
3228 error_report("Unknown file format '%s'", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003229 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003230 goto out;
3231 }
3232
3233 proto_drv = bdrv_find_protocol(filename);
3234 if (!proto_drv) {
3235 error_report("Unknown protocol '%s'", filename);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003236 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003237 goto out;
3238 }
3239
3240 create_options = append_option_parameters(create_options,
3241 drv->create_options);
3242 create_options = append_option_parameters(create_options,
3243 proto_drv->create_options);
3244
3245 /* Create parameter list with default values */
3246 param = parse_option_parameters("", create_options, param);
3247
3248 set_option_parameter_int(param, BLOCK_OPT_SIZE, img_size);
3249
3250 /* Parse -o options */
3251 if (options) {
3252 param = parse_option_parameters(options, create_options, param);
3253 if (param == NULL) {
3254 error_report("Invalid options for file format '%s'.", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003255 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003256 goto out;
3257 }
3258 }
3259
3260 if (base_filename) {
3261 if (set_option_parameter(param, BLOCK_OPT_BACKING_FILE,
3262 base_filename)) {
3263 error_report("Backing file not supported for file format '%s'",
3264 fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003265 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003266 goto out;
3267 }
3268 }
3269
3270 if (base_fmt) {
3271 if (set_option_parameter(param, BLOCK_OPT_BACKING_FMT, base_fmt)) {
3272 error_report("Backing file format not supported for file "
3273 "format '%s'", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003274 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003275 goto out;
3276 }
3277 }
3278
Jes Sorensen792da932010-12-16 13:52:17 +01003279 backing_file = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
3280 if (backing_file && backing_file->value.s) {
3281 if (!strcmp(filename, backing_file->value.s)) {
3282 error_report("Error: Trying to create an image with the "
3283 "same filename as the backing file");
Jes Sorensen4f70f242010-12-16 13:52:18 +01003284 ret = -EINVAL;
Jes Sorensen792da932010-12-16 13:52:17 +01003285 goto out;
3286 }
3287 }
3288
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003289 backing_fmt = get_option_parameter(param, BLOCK_OPT_BACKING_FMT);
3290 if (backing_fmt && backing_fmt->value.s) {
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003291 backing_drv = bdrv_find_format(backing_fmt->value.s);
3292 if (!backing_drv) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003293 error_report("Unknown backing file format '%s'",
3294 backing_fmt->value.s);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003295 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003296 goto out;
3297 }
3298 }
3299
3300 // The size for the image must always be specified, with one exception:
3301 // If we are using a backing file, we can obtain the size from there
Kevin Wolfd2208942011-06-01 14:03:31 +02003302 size = get_option_parameter(param, BLOCK_OPT_SIZE);
3303 if (size && size->value.n == -1) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003304 if (backing_file && backing_file->value.s) {
3305 uint64_t size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003306 char buf[32];
3307
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003308 bs = bdrv_new("");
3309
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003310 ret = bdrv_open(bs, backing_file->value.s, flags, backing_drv);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003311 if (ret < 0) {
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003312 error_report("Could not open '%s'", backing_file->value.s);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003313 goto out;
3314 }
3315 bdrv_get_geometry(bs, &size);
3316 size *= 512;
3317
3318 snprintf(buf, sizeof(buf), "%" PRId64, size);
3319 set_option_parameter(param, BLOCK_OPT_SIZE, buf);
3320 } else {
3321 error_report("Image creation needs a size parameter");
Jes Sorensen4f70f242010-12-16 13:52:18 +01003322 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003323 goto out;
3324 }
3325 }
3326
3327 printf("Formatting '%s', fmt=%s ", filename, fmt);
3328 print_option_parameters(param);
3329 puts("");
3330
3331 ret = bdrv_create(drv, filename, param);
3332
3333 if (ret < 0) {
3334 if (ret == -ENOTSUP) {
3335 error_report("Formatting or formatting option not supported for "
3336 "file format '%s'", fmt);
3337 } else if (ret == -EFBIG) {
3338 error_report("The image size is too large for file format '%s'",
3339 fmt);
3340 } else {
3341 error_report("%s: error while creating %s: %s", filename, fmt,
3342 strerror(-ret));
3343 }
3344 }
3345
3346out:
3347 free_option_parameters(create_options);
3348 free_option_parameters(param);
3349
3350 if (bs) {
3351 bdrv_delete(bs);
3352 }
Jes Sorensen4f70f242010-12-16 13:52:18 +01003353
3354 return ret;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003355}