blob: 8c7d05ea408f3c38bdfa25862b38a1baebceca6c [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 Wolf68485422011-06-30 10:05:46 +020064static BlockDriverAIOCB *bdrv_co_aio_readv_em(BlockDriverState *bs,
65 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
66 BlockDriverCompletionFunc *cb, void *opaque);
67static BlockDriverAIOCB *bdrv_co_aio_writev_em(BlockDriverState *bs,
68 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
69 BlockDriverCompletionFunc *cb, void *opaque);
Kevin Wolff9f05dc2011-07-15 13:50:26 +020070static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
71 int64_t sector_num, int nb_sectors,
72 QEMUIOVector *iov);
73static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
74 int64_t sector_num, int nb_sectors,
75 QEMUIOVector *iov);
Kevin Wolfe7a8a782011-07-15 16:05:00 +020076static int coroutine_fn bdrv_co_flush_em(BlockDriverState *bs);
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +010077static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
78 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +010079static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
80 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
Stefan Hajnoczib2a61372011-10-13 13:08:23 +010081static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
82 int64_t sector_num,
83 QEMUIOVector *qiov,
84 int nb_sectors,
85 BlockDriverCompletionFunc *cb,
86 void *opaque,
87 bool is_write,
88 CoroutineEntry *entry);
89static void coroutine_fn bdrv_co_do_rw(void *opaque);
bellardec530c82006-04-25 22:36:06 +000090
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +010091static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
92 QTAILQ_HEAD_INITIALIZER(bdrv_states);
blueswir17ee930d2008-09-17 19:04:14 +000093
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +010094static QLIST_HEAD(, BlockDriver) bdrv_drivers =
95 QLIST_HEAD_INITIALIZER(bdrv_drivers);
bellardea2384d2004-08-01 21:59:26 +000096
Markus Armbrusterf9092b12010-06-25 10:33:39 +020097/* The device to use for VM snapshots */
98static BlockDriverState *bs_snapshots;
99
Markus Armbrustereb852012009-10-27 18:41:44 +0100100/* If non-zero, use only whitelisted block drivers */
101static int use_bdrv_whitelist;
102
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000103#ifdef _WIN32
104static int is_windows_drive_prefix(const char *filename)
105{
106 return (((filename[0] >= 'a' && filename[0] <= 'z') ||
107 (filename[0] >= 'A' && filename[0] <= 'Z')) &&
108 filename[1] == ':');
109}
110
111int is_windows_drive(const char *filename)
112{
113 if (is_windows_drive_prefix(filename) &&
114 filename[2] == '\0')
115 return 1;
116 if (strstart(filename, "\\\\.\\", NULL) ||
117 strstart(filename, "//./", NULL))
118 return 1;
119 return 0;
120}
121#endif
122
123/* check if the path starts with "<protocol>:" */
124static int path_has_protocol(const char *path)
125{
126#ifdef _WIN32
127 if (is_windows_drive(path) ||
128 is_windows_drive_prefix(path)) {
129 return 0;
130 }
131#endif
132
133 return strchr(path, ':') != NULL;
134}
135
bellard83f64092006-08-01 16:21:11 +0000136int path_is_absolute(const char *path)
137{
138 const char *p;
bellard21664422007-01-07 18:22:37 +0000139#ifdef _WIN32
140 /* specific case for names like: "\\.\d:" */
141 if (*path == '/' || *path == '\\')
142 return 1;
143#endif
bellard83f64092006-08-01 16:21:11 +0000144 p = strchr(path, ':');
145 if (p)
146 p++;
147 else
148 p = path;
bellard3b9f94e2007-01-07 17:27:07 +0000149#ifdef _WIN32
150 return (*p == '/' || *p == '\\');
151#else
152 return (*p == '/');
153#endif
bellard83f64092006-08-01 16:21:11 +0000154}
155
156/* if filename is absolute, just copy it to dest. Otherwise, build a
157 path to it by considering it is relative to base_path. URL are
158 supported. */
159void path_combine(char *dest, int dest_size,
160 const char *base_path,
161 const char *filename)
162{
163 const char *p, *p1;
164 int len;
165
166 if (dest_size <= 0)
167 return;
168 if (path_is_absolute(filename)) {
169 pstrcpy(dest, dest_size, filename);
170 } else {
171 p = strchr(base_path, ':');
172 if (p)
173 p++;
174 else
175 p = base_path;
bellard3b9f94e2007-01-07 17:27:07 +0000176 p1 = strrchr(base_path, '/');
177#ifdef _WIN32
178 {
179 const char *p2;
180 p2 = strrchr(base_path, '\\');
181 if (!p1 || p2 > p1)
182 p1 = p2;
183 }
184#endif
bellard83f64092006-08-01 16:21:11 +0000185 if (p1)
186 p1++;
187 else
188 p1 = base_path;
189 if (p1 > p)
190 p = p1;
191 len = p - base_path;
192 if (len > dest_size - 1)
193 len = dest_size - 1;
194 memcpy(dest, base_path, len);
195 dest[len] = '\0';
196 pstrcat(dest, dest_size, filename);
197 }
198}
199
Anthony Liguori5efa9d52009-05-09 17:03:42 -0500200void bdrv_register(BlockDriver *bdrv)
bellardea2384d2004-08-01 21:59:26 +0000201{
Kevin Wolf68485422011-06-30 10:05:46 +0200202 if (bdrv->bdrv_co_readv) {
203 /* Emulate AIO by coroutines, and sync by AIO */
204 bdrv->bdrv_aio_readv = bdrv_co_aio_readv_em;
205 bdrv->bdrv_aio_writev = bdrv_co_aio_writev_em;
206 bdrv->bdrv_read = bdrv_read_em;
207 bdrv->bdrv_write = bdrv_write_em;
Kevin Wolff9f05dc2011-07-15 13:50:26 +0200208 } else {
209 bdrv->bdrv_co_readv = bdrv_co_readv_em;
210 bdrv->bdrv_co_writev = bdrv_co_writev_em;
211
212 if (!bdrv->bdrv_aio_readv) {
213 /* add AIO emulation layer */
214 bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
215 bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
216 } else if (!bdrv->bdrv_read) {
217 /* add synchronous IO emulation layer */
218 bdrv->bdrv_read = bdrv_read_em;
219 bdrv->bdrv_write = bdrv_write_em;
220 }
bellard83f64092006-08-01 16:21:11 +0000221 }
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +0200222
223 if (!bdrv->bdrv_aio_flush)
224 bdrv->bdrv_aio_flush = bdrv_aio_flush_em;
225
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100226 QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
bellardea2384d2004-08-01 21:59:26 +0000227}
bellardb3380822004-03-14 21:38:54 +0000228
229/* create a new block device (by default it is empty) */
230BlockDriverState *bdrv_new(const char *device_name)
bellardfc01f7e2003-06-30 10:03:06 +0000231{
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +0100232 BlockDriverState *bs;
bellardb3380822004-03-14 21:38:54 +0000233
Anthony Liguori7267c092011-08-20 22:09:37 -0500234 bs = g_malloc0(sizeof(BlockDriverState));
bellardb3380822004-03-14 21:38:54 +0000235 pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
bellardea2384d2004-08-01 21:59:26 +0000236 if (device_name[0] != '\0') {
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +0100237 QTAILQ_INSERT_TAIL(&bdrv_states, bs, list);
bellardea2384d2004-08-01 21:59:26 +0000238 }
Luiz Capitulino28a72822011-09-26 17:43:50 -0300239 bdrv_iostatus_disable(bs);
bellardb3380822004-03-14 21:38:54 +0000240 return bs;
241}
242
bellardea2384d2004-08-01 21:59:26 +0000243BlockDriver *bdrv_find_format(const char *format_name)
244{
245 BlockDriver *drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100246 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
247 if (!strcmp(drv1->format_name, format_name)) {
bellardea2384d2004-08-01 21:59:26 +0000248 return drv1;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100249 }
bellardea2384d2004-08-01 21:59:26 +0000250 }
251 return NULL;
252}
253
Markus Armbrustereb852012009-10-27 18:41:44 +0100254static int bdrv_is_whitelisted(BlockDriver *drv)
255{
256 static const char *whitelist[] = {
257 CONFIG_BDRV_WHITELIST
258 };
259 const char **p;
260
261 if (!whitelist[0])
262 return 1; /* no whitelist, anything goes */
263
264 for (p = whitelist; *p; p++) {
265 if (!strcmp(drv->format_name, *p)) {
266 return 1;
267 }
268 }
269 return 0;
270}
271
272BlockDriver *bdrv_find_whitelisted_format(const char *format_name)
273{
274 BlockDriver *drv = bdrv_find_format(format_name);
275 return drv && bdrv_is_whitelisted(drv) ? drv : NULL;
276}
277
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200278int bdrv_create(BlockDriver *drv, const char* filename,
279 QEMUOptionParameter *options)
bellardea2384d2004-08-01 21:59:26 +0000280{
281 if (!drv->bdrv_create)
282 return -ENOTSUP;
Kevin Wolf0e7e1982009-05-18 16:42:10 +0200283
284 return drv->bdrv_create(filename, options);
bellardea2384d2004-08-01 21:59:26 +0000285}
286
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200287int bdrv_create_file(const char* filename, QEMUOptionParameter *options)
288{
289 BlockDriver *drv;
290
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900291 drv = bdrv_find_protocol(filename);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200292 if (drv == NULL) {
Stefan Hajnoczi16905d72010-11-30 15:14:14 +0000293 return -ENOENT;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200294 }
295
296 return bdrv_create(drv, filename, options);
297}
298
bellardd5249392004-08-03 21:14:23 +0000299#ifdef _WIN32
bellard95389c82005-12-18 18:28:15 +0000300void get_tmp_filename(char *filename, int size)
bellardd5249392004-08-03 21:14:23 +0000301{
bellard3b9f94e2007-01-07 17:27:07 +0000302 char temp_dir[MAX_PATH];
ths3b46e622007-09-17 08:09:54 +0000303
bellard3b9f94e2007-01-07 17:27:07 +0000304 GetTempPath(MAX_PATH, temp_dir);
305 GetTempFileName(temp_dir, "qem", 0, filename);
bellardd5249392004-08-03 21:14:23 +0000306}
307#else
bellard95389c82005-12-18 18:28:15 +0000308void get_tmp_filename(char *filename, int size)
bellardea2384d2004-08-01 21:59:26 +0000309{
310 int fd;
blueswir17ccfb2e2008-09-14 06:45:34 +0000311 const char *tmpdir;
bellardd5249392004-08-03 21:14:23 +0000312 /* XXX: race condition possible */
aurel320badc1e2008-03-10 00:05:34 +0000313 tmpdir = getenv("TMPDIR");
314 if (!tmpdir)
315 tmpdir = "/tmp";
316 snprintf(filename, size, "%s/vl.XXXXXX", tmpdir);
bellardea2384d2004-08-01 21:59:26 +0000317 fd = mkstemp(filename);
318 close(fd);
319}
bellardd5249392004-08-03 21:14:23 +0000320#endif
bellardea2384d2004-08-01 21:59:26 +0000321
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200322/*
323 * Detect host devices. By convention, /dev/cdrom[N] is always
324 * recognized as a host CDROM.
325 */
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200326static BlockDriver *find_hdev_driver(const char *filename)
327{
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200328 int score_max = 0, score;
329 BlockDriver *drv = NULL, *d;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200330
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100331 QLIST_FOREACH(d, &bdrv_drivers, list) {
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200332 if (d->bdrv_probe_device) {
333 score = d->bdrv_probe_device(filename);
334 if (score > score_max) {
335 score_max = score;
336 drv = d;
337 }
338 }
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200339 }
340
Christoph Hellwig508c7cb2009-06-15 14:04:22 +0200341 return drv;
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200342}
Christoph Hellwigf3a5d3f2009-06-15 13:55:19 +0200343
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900344BlockDriver *bdrv_find_protocol(const char *filename)
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200345{
346 BlockDriver *drv1;
347 char protocol[128];
348 int len;
349 const char *p;
350
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200351 /* TODO Drivers without bdrv_file_open must be specified explicitly */
352
Christoph Hellwig39508e72010-06-23 12:25:17 +0200353 /*
354 * XXX(hch): we really should not let host device detection
355 * override an explicit protocol specification, but moving this
356 * later breaks access to device names with colons in them.
357 * Thanks to the brain-dead persistent naming schemes on udev-
358 * based Linux systems those actually are quite common.
359 */
360 drv1 = find_hdev_driver(filename);
361 if (drv1) {
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200362 return drv1;
363 }
Christoph Hellwig39508e72010-06-23 12:25:17 +0200364
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000365 if (!path_has_protocol(filename)) {
Christoph Hellwig39508e72010-06-23 12:25:17 +0200366 return bdrv_find_format("file");
367 }
Stefan Hajnoczi9e0b22f2010-12-09 11:53:00 +0000368 p = strchr(filename, ':');
369 assert(p != NULL);
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200370 len = p - filename;
371 if (len > sizeof(protocol) - 1)
372 len = sizeof(protocol) - 1;
373 memcpy(protocol, filename, len);
374 protocol[len] = '\0';
375 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
376 if (drv1->protocol_name &&
377 !strcmp(drv1->protocol_name, protocol)) {
378 return drv1;
379 }
380 }
381 return NULL;
382}
383
Stefan Weilc98ac352010-07-21 21:51:51 +0200384static int find_image_format(const char *filename, BlockDriver **pdrv)
bellardea2384d2004-08-01 21:59:26 +0000385{
bellard83f64092006-08-01 16:21:11 +0000386 int ret, score, score_max;
bellardea2384d2004-08-01 21:59:26 +0000387 BlockDriver *drv1, *drv;
bellard83f64092006-08-01 16:21:11 +0000388 uint8_t buf[2048];
389 BlockDriverState *bs;
ths3b46e622007-09-17 08:09:54 +0000390
Naphtali Spreif5edb012010-01-17 16:48:13 +0200391 ret = bdrv_file_open(&bs, filename, 0);
Stefan Weilc98ac352010-07-21 21:51:51 +0200392 if (ret < 0) {
393 *pdrv = NULL;
394 return ret;
395 }
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700396
Kevin Wolf08a00552010-06-01 18:37:31 +0200397 /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
398 if (bs->sg || !bdrv_is_inserted(bs)) {
Nicholas A. Bellinger1a396852010-05-27 08:56:28 -0700399 bdrv_delete(bs);
Stefan Weilc98ac352010-07-21 21:51:51 +0200400 drv = bdrv_find_format("raw");
401 if (!drv) {
402 ret = -ENOENT;
403 }
404 *pdrv = drv;
405 return ret;
Nicholas A. Bellinger1a396852010-05-27 08:56:28 -0700406 }
Nicholas Bellingerf8ea0b02010-05-17 09:45:57 -0700407
bellard83f64092006-08-01 16:21:11 +0000408 ret = bdrv_pread(bs, 0, buf, sizeof(buf));
409 bdrv_delete(bs);
410 if (ret < 0) {
Stefan Weilc98ac352010-07-21 21:51:51 +0200411 *pdrv = NULL;
412 return ret;
bellard83f64092006-08-01 16:21:11 +0000413 }
414
bellardea2384d2004-08-01 21:59:26 +0000415 score_max = 0;
Christoph Hellwig84a12e62010-04-07 22:30:24 +0200416 drv = NULL;
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +0100417 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
bellard83f64092006-08-01 16:21:11 +0000418 if (drv1->bdrv_probe) {
419 score = drv1->bdrv_probe(buf, ret, filename);
420 if (score > score_max) {
421 score_max = score;
422 drv = drv1;
423 }
bellardea2384d2004-08-01 21:59:26 +0000424 }
425 }
Stefan Weilc98ac352010-07-21 21:51:51 +0200426 if (!drv) {
427 ret = -ENOENT;
428 }
429 *pdrv = drv;
430 return ret;
bellardea2384d2004-08-01 21:59:26 +0000431}
432
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100433/**
434 * Set the current 'total_sectors' value
435 */
436static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
437{
438 BlockDriver *drv = bs->drv;
439
Nicholas Bellinger396759a2010-05-17 09:46:04 -0700440 /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
441 if (bs->sg)
442 return 0;
443
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100444 /* query actual device if possible, otherwise just trust the hint */
445 if (drv->bdrv_getlength) {
446 int64_t length = drv->bdrv_getlength(bs);
447 if (length < 0) {
448 return length;
449 }
450 hint = length >> BDRV_SECTOR_BITS;
451 }
452
453 bs->total_sectors = hint;
454 return 0;
455}
456
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100457/**
458 * Set open flags for a given cache mode
459 *
460 * Return 0 on success, -1 if the cache mode was invalid.
461 */
462int bdrv_parse_cache_flags(const char *mode, int *flags)
463{
464 *flags &= ~BDRV_O_CACHE_MASK;
465
466 if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
467 *flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
Stefan Hajnoczi92196b22011-08-04 12:26:52 +0100468 } else if (!strcmp(mode, "directsync")) {
469 *flags |= BDRV_O_NOCACHE;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100470 } else if (!strcmp(mode, "writeback")) {
471 *flags |= BDRV_O_CACHE_WB;
472 } else if (!strcmp(mode, "unsafe")) {
473 *flags |= BDRV_O_CACHE_WB;
474 *flags |= BDRV_O_NO_FLUSH;
475 } else if (!strcmp(mode, "writethrough")) {
476 /* this is the default */
477 } else {
478 return -1;
479 }
480
481 return 0;
482}
483
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200484/*
Kevin Wolf57915332010-04-14 15:24:50 +0200485 * Common part for opening disk images and files
486 */
487static int bdrv_open_common(BlockDriverState *bs, const char *filename,
488 int flags, BlockDriver *drv)
489{
490 int ret, open_flags;
491
492 assert(drv != NULL);
493
Stefan Hajnoczi28dcee12011-09-22 20:14:12 +0100494 trace_bdrv_open_common(bs, filename, flags, drv->format_name);
495
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200496 bs->file = NULL;
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100497 bs->total_sectors = 0;
Kevin Wolf57915332010-04-14 15:24:50 +0200498 bs->encrypted = 0;
499 bs->valid_key = 0;
500 bs->open_flags = flags;
Kevin Wolf57915332010-04-14 15:24:50 +0200501 bs->buffer_alignment = 512;
502
503 pstrcpy(bs->filename, sizeof(bs->filename), filename);
504
505 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv)) {
506 return -ENOTSUP;
507 }
508
509 bs->drv = drv;
Anthony Liguori7267c092011-08-20 22:09:37 -0500510 bs->opaque = g_malloc0(drv->instance_size);
Kevin Wolf57915332010-04-14 15:24:50 +0200511
Christoph Hellwiga6599792011-05-17 18:04:06 +0200512 if (flags & BDRV_O_CACHE_WB)
Kevin Wolf57915332010-04-14 15:24:50 +0200513 bs->enable_write_cache = 1;
514
515 /*
516 * Clear flags that are internal to the block layer before opening the
517 * image.
518 */
519 open_flags = flags & ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
520
521 /*
Stefan Weilebabb672011-04-26 10:29:36 +0200522 * Snapshots should be writable.
Kevin Wolf57915332010-04-14 15:24:50 +0200523 */
524 if (bs->is_temporary) {
525 open_flags |= BDRV_O_RDWR;
526 }
527
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200528 /* Open the image, either directly or using a protocol */
529 if (drv->bdrv_file_open) {
530 ret = drv->bdrv_file_open(bs, filename, open_flags);
531 } else {
532 ret = bdrv_file_open(&bs->file, filename, open_flags);
533 if (ret >= 0) {
534 ret = drv->bdrv_open(bs, open_flags);
535 }
536 }
537
Kevin Wolf57915332010-04-14 15:24:50 +0200538 if (ret < 0) {
539 goto free_and_fail;
540 }
541
542 bs->keep_read_only = bs->read_only = !(open_flags & BDRV_O_RDWR);
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100543
544 ret = refresh_total_sectors(bs, bs->total_sectors);
545 if (ret < 0) {
546 goto free_and_fail;
Kevin Wolf57915332010-04-14 15:24:50 +0200547 }
Stefan Hajnoczi51762282010-04-19 16:56:41 +0100548
Kevin Wolf57915332010-04-14 15:24:50 +0200549#ifndef _WIN32
550 if (bs->is_temporary) {
551 unlink(filename);
552 }
553#endif
554 return 0;
555
556free_and_fail:
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200557 if (bs->file) {
558 bdrv_delete(bs->file);
559 bs->file = NULL;
560 }
Anthony Liguori7267c092011-08-20 22:09:37 -0500561 g_free(bs->opaque);
Kevin Wolf57915332010-04-14 15:24:50 +0200562 bs->opaque = NULL;
563 bs->drv = NULL;
564 return ret;
565}
566
567/*
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200568 * Opens a file using a protocol (file, host_device, nbd, ...)
569 */
bellard83f64092006-08-01 16:21:11 +0000570int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
bellardb3380822004-03-14 21:38:54 +0000571{
bellard83f64092006-08-01 16:21:11 +0000572 BlockDriverState *bs;
Christoph Hellwig6db95602010-04-05 16:53:57 +0200573 BlockDriver *drv;
bellard83f64092006-08-01 16:21:11 +0000574 int ret;
575
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900576 drv = bdrv_find_protocol(filename);
Christoph Hellwig6db95602010-04-05 16:53:57 +0200577 if (!drv) {
578 return -ENOENT;
579 }
580
bellard83f64092006-08-01 16:21:11 +0000581 bs = bdrv_new("");
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200582 ret = bdrv_open_common(bs, filename, flags, drv);
bellard83f64092006-08-01 16:21:11 +0000583 if (ret < 0) {
584 bdrv_delete(bs);
585 return ret;
bellard3b0d4f62005-10-30 18:30:10 +0000586 }
aliguori71d07702009-03-03 17:37:16 +0000587 bs->growable = 1;
bellard83f64092006-08-01 16:21:11 +0000588 *pbs = bs;
589 return 0;
bellardea2384d2004-08-01 21:59:26 +0000590}
bellardfc01f7e2003-06-30 10:03:06 +0000591
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200592/*
593 * Opens a disk image (raw, qcow2, vmdk, ...)
594 */
Kevin Wolfd6e90982010-03-31 14:40:27 +0200595int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
596 BlockDriver *drv)
bellardea2384d2004-08-01 21:59:26 +0000597{
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200598 int ret;
bellard712e7872005-04-28 21:09:32 +0000599
bellard83f64092006-08-01 16:21:11 +0000600 if (flags & BDRV_O_SNAPSHOT) {
bellardea2384d2004-08-01 21:59:26 +0000601 BlockDriverState *bs1;
602 int64_t total_size;
aliguori7c96d462008-09-12 17:54:13 +0000603 int is_protocol = 0;
Kevin Wolf91a073a2009-05-27 14:48:06 +0200604 BlockDriver *bdrv_qcow2;
605 QEMUOptionParameter *options;
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200606 char tmp_filename[PATH_MAX];
607 char backing_filename[PATH_MAX];
ths3b46e622007-09-17 08:09:54 +0000608
bellardea2384d2004-08-01 21:59:26 +0000609 /* if snapshot, we create a temporary backing file and open it
610 instead of opening 'filename' directly */
611
612 /* if there is a backing file, use it */
613 bs1 = bdrv_new("");
Kevin Wolfd6e90982010-03-31 14:40:27 +0200614 ret = bdrv_open(bs1, filename, 0, drv);
aliguori51d7c002009-03-05 23:00:29 +0000615 if (ret < 0) {
bellardea2384d2004-08-01 21:59:26 +0000616 bdrv_delete(bs1);
aliguori51d7c002009-03-05 23:00:29 +0000617 return ret;
bellardea2384d2004-08-01 21:59:26 +0000618 }
Jes Sorensen3e829902010-05-27 16:20:30 +0200619 total_size = bdrv_getlength(bs1) & BDRV_SECTOR_MASK;
aliguori7c96d462008-09-12 17:54:13 +0000620
621 if (bs1->drv && bs1->drv->protocol_name)
622 is_protocol = 1;
623
bellardea2384d2004-08-01 21:59:26 +0000624 bdrv_delete(bs1);
ths3b46e622007-09-17 08:09:54 +0000625
bellardea2384d2004-08-01 21:59:26 +0000626 get_tmp_filename(tmp_filename, sizeof(tmp_filename));
aliguori7c96d462008-09-12 17:54:13 +0000627
628 /* Real path is meaningless for protocols */
629 if (is_protocol)
630 snprintf(backing_filename, sizeof(backing_filename),
631 "%s", filename);
Kirill A. Shutemov114cdfa2009-12-25 18:19:22 +0000632 else if (!realpath(filename, backing_filename))
633 return -errno;
aliguori7c96d462008-09-12 17:54:13 +0000634
Kevin Wolf91a073a2009-05-27 14:48:06 +0200635 bdrv_qcow2 = bdrv_find_format("qcow2");
636 options = parse_option_parameters("", bdrv_qcow2->create_options, NULL);
637
Jes Sorensen3e829902010-05-27 16:20:30 +0200638 set_option_parameter_int(options, BLOCK_OPT_SIZE, total_size);
Kevin Wolf91a073a2009-05-27 14:48:06 +0200639 set_option_parameter(options, BLOCK_OPT_BACKING_FILE, backing_filename);
640 if (drv) {
641 set_option_parameter(options, BLOCK_OPT_BACKING_FMT,
642 drv->format_name);
643 }
644
645 ret = bdrv_create(bdrv_qcow2, tmp_filename, options);
Jan Kiszkad7487682010-04-29 18:24:50 +0200646 free_option_parameters(options);
aliguori51d7c002009-03-05 23:00:29 +0000647 if (ret < 0) {
648 return ret;
bellardea2384d2004-08-01 21:59:26 +0000649 }
Kevin Wolf91a073a2009-05-27 14:48:06 +0200650
bellardea2384d2004-08-01 21:59:26 +0000651 filename = tmp_filename;
Kevin Wolf91a073a2009-05-27 14:48:06 +0200652 drv = bdrv_qcow2;
bellardea2384d2004-08-01 21:59:26 +0000653 bs->is_temporary = 1;
654 }
bellard712e7872005-04-28 21:09:32 +0000655
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200656 /* Find the right image format driver */
Christoph Hellwig6db95602010-04-05 16:53:57 +0200657 if (!drv) {
Stefan Weilc98ac352010-07-21 21:51:51 +0200658 ret = find_image_format(filename, &drv);
aliguori51d7c002009-03-05 23:00:29 +0000659 }
Christoph Hellwig69873072010-01-20 18:13:25 +0100660
aliguori51d7c002009-03-05 23:00:29 +0000661 if (!drv) {
aliguori51d7c002009-03-05 23:00:29 +0000662 goto unlink_and_fail;
bellardea2384d2004-08-01 21:59:26 +0000663 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200664
665 /* Open the image */
666 ret = bdrv_open_common(bs, filename, flags, drv);
667 if (ret < 0) {
Christoph Hellwig69873072010-01-20 18:13:25 +0100668 goto unlink_and_fail;
669 }
670
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200671 /* If there is a backing file, use it */
672 if ((flags & BDRV_O_NO_BACKING) == 0 && bs->backing_file[0] != '\0') {
673 char backing_filename[PATH_MAX];
674 int back_flags;
675 BlockDriver *back_drv = NULL;
676
677 bs->backing_hd = bdrv_new("");
Stefan Hajnoczidf2dbb42010-12-02 16:54:13 +0000678
679 if (path_has_protocol(bs->backing_file)) {
680 pstrcpy(backing_filename, sizeof(backing_filename),
681 bs->backing_file);
682 } else {
683 path_combine(backing_filename, sizeof(backing_filename),
684 filename, bs->backing_file);
685 }
686
687 if (bs->backing_format[0] != '\0') {
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200688 back_drv = bdrv_find_format(bs->backing_format);
Stefan Hajnoczidf2dbb42010-12-02 16:54:13 +0000689 }
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200690
691 /* backing files always opened read-only */
692 back_flags =
693 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
694
695 ret = bdrv_open(bs->backing_hd, backing_filename, back_flags, back_drv);
696 if (ret < 0) {
697 bdrv_close(bs);
698 return ret;
699 }
700 if (bs->is_temporary) {
701 bs->backing_hd->keep_read_only = !(flags & BDRV_O_RDWR);
702 } else {
703 /* base image inherits from "parent" */
704 bs->backing_hd->keep_read_only = bs->keep_read_only;
705 }
706 }
707
708 if (!bdrv_key_required(bs)) {
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +0200709 bdrv_dev_change_media_cb(bs, true);
Kevin Wolfb6ce07a2010-04-12 16:37:13 +0200710 }
711
712 return 0;
713
714unlink_and_fail:
715 if (bs->is_temporary) {
716 unlink(filename);
717 }
718 return ret;
719}
720
bellardfc01f7e2003-06-30 10:03:06 +0000721void bdrv_close(BlockDriverState *bs)
722{
bellard19cb3732006-08-19 11:45:59 +0000723 if (bs->drv) {
Markus Armbrusterf9092b12010-06-25 10:33:39 +0200724 if (bs == bs_snapshots) {
725 bs_snapshots = NULL;
726 }
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +0100727 if (bs->backing_hd) {
bellardea2384d2004-08-01 21:59:26 +0000728 bdrv_delete(bs->backing_hd);
Stefan Hajnoczi557df6a2010-04-17 10:49:06 +0100729 bs->backing_hd = NULL;
730 }
bellardea2384d2004-08-01 21:59:26 +0000731 bs->drv->bdrv_close(bs);
Anthony Liguori7267c092011-08-20 22:09:37 -0500732 g_free(bs->opaque);
bellardea2384d2004-08-01 21:59:26 +0000733#ifdef _WIN32
734 if (bs->is_temporary) {
735 unlink(bs->filename);
736 }
bellard67b915a2004-03-31 23:37:16 +0000737#endif
bellardea2384d2004-08-01 21:59:26 +0000738 bs->opaque = NULL;
739 bs->drv = NULL;
bellardb3380822004-03-14 21:38:54 +0000740
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200741 if (bs->file != NULL) {
742 bdrv_close(bs->file);
743 }
744
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +0200745 bdrv_dev_change_media_cb(bs, false);
bellardb3380822004-03-14 21:38:54 +0000746 }
747}
748
MORITA Kazutaka2bc93fe2010-05-28 11:44:57 +0900749void bdrv_close_all(void)
750{
751 BlockDriverState *bs;
752
753 QTAILQ_FOREACH(bs, &bdrv_states, list) {
754 bdrv_close(bs);
755 }
756}
757
Ryan Harperd22b2f42011-03-29 20:51:47 -0500758/* make a BlockDriverState anonymous by removing from bdrv_state list.
759 Also, NULL terminate the device_name to prevent double remove */
760void bdrv_make_anon(BlockDriverState *bs)
761{
762 if (bs->device_name[0] != '\0') {
763 QTAILQ_REMOVE(&bdrv_states, bs, list);
764 }
765 bs->device_name[0] = '\0';
766}
767
bellardb3380822004-03-14 21:38:54 +0000768void bdrv_delete(BlockDriverState *bs)
769{
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200770 assert(!bs->dev);
Markus Armbruster18846de2010-06-29 16:58:30 +0200771
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +0100772 /* remove from list, if necessary */
Ryan Harperd22b2f42011-03-29 20:51:47 -0500773 bdrv_make_anon(bs);
aurel3234c6f052008-04-08 19:51:21 +0000774
bellardb3380822004-03-14 21:38:54 +0000775 bdrv_close(bs);
Kevin Wolf66f82ce2010-04-14 14:17:38 +0200776 if (bs->file != NULL) {
777 bdrv_delete(bs->file);
778 }
779
Markus Armbrusterf9092b12010-06-25 10:33:39 +0200780 assert(bs != bs_snapshots);
Anthony Liguori7267c092011-08-20 22:09:37 -0500781 g_free(bs);
bellardfc01f7e2003-06-30 10:03:06 +0000782}
783
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200784int bdrv_attach_dev(BlockDriverState *bs, void *dev)
785/* TODO change to DeviceState *dev when all users are qdevified */
Markus Armbruster18846de2010-06-29 16:58:30 +0200786{
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200787 if (bs->dev) {
Markus Armbruster18846de2010-06-29 16:58:30 +0200788 return -EBUSY;
789 }
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200790 bs->dev = dev;
Luiz Capitulino28a72822011-09-26 17:43:50 -0300791 bdrv_iostatus_reset(bs);
Markus Armbruster18846de2010-06-29 16:58:30 +0200792 return 0;
793}
794
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200795/* TODO qdevified devices don't use this, remove when devices are qdevified */
796void bdrv_attach_dev_nofail(BlockDriverState *bs, void *dev)
Markus Armbruster18846de2010-06-29 16:58:30 +0200797{
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200798 if (bdrv_attach_dev(bs, dev) < 0) {
799 abort();
800 }
801}
802
803void bdrv_detach_dev(BlockDriverState *bs, void *dev)
804/* TODO change to DeviceState *dev when all users are qdevified */
805{
806 assert(bs->dev == dev);
807 bs->dev = NULL;
Markus Armbruster0e49de52011-08-03 15:07:41 +0200808 bs->dev_ops = NULL;
809 bs->dev_opaque = NULL;
Markus Armbruster29e05f22011-09-06 18:58:57 +0200810 bs->buffer_alignment = 512;
Markus Armbruster18846de2010-06-29 16:58:30 +0200811}
812
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200813/* TODO change to return DeviceState * when all users are qdevified */
814void *bdrv_get_attached_dev(BlockDriverState *bs)
Markus Armbruster18846de2010-06-29 16:58:30 +0200815{
Markus Armbrusterfa879d62011-08-03 15:07:40 +0200816 return bs->dev;
Markus Armbruster18846de2010-06-29 16:58:30 +0200817}
818
Markus Armbruster0e49de52011-08-03 15:07:41 +0200819void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
820 void *opaque)
821{
822 bs->dev_ops = ops;
823 bs->dev_opaque = opaque;
Markus Armbruster2c6942f2011-09-06 18:58:51 +0200824 if (bdrv_dev_has_removable_media(bs) && bs == bs_snapshots) {
825 bs_snapshots = NULL;
826 }
Markus Armbruster0e49de52011-08-03 15:07:41 +0200827}
828
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +0200829static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load)
Markus Armbruster0e49de52011-08-03 15:07:41 +0200830{
Markus Armbruster145feb12011-08-03 15:07:42 +0200831 if (bs->dev_ops && bs->dev_ops->change_media_cb) {
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +0200832 bs->dev_ops->change_media_cb(bs->dev_opaque, load);
Markus Armbruster145feb12011-08-03 15:07:42 +0200833 }
834}
835
Markus Armbruster2c6942f2011-09-06 18:58:51 +0200836bool bdrv_dev_has_removable_media(BlockDriverState *bs)
837{
838 return !bs->dev || (bs->dev_ops && bs->dev_ops->change_media_cb);
839}
840
Markus Armbrustere4def802011-09-06 18:58:53 +0200841bool bdrv_dev_is_tray_open(BlockDriverState *bs)
842{
843 if (bs->dev_ops && bs->dev_ops->is_tray_open) {
844 return bs->dev_ops->is_tray_open(bs->dev_opaque);
845 }
846 return false;
847}
848
Markus Armbruster145feb12011-08-03 15:07:42 +0200849static void bdrv_dev_resize_cb(BlockDriverState *bs)
850{
851 if (bs->dev_ops && bs->dev_ops->resize_cb) {
852 bs->dev_ops->resize_cb(bs->dev_opaque);
Markus Armbruster0e49de52011-08-03 15:07:41 +0200853 }
854}
855
Markus Armbrusterf1076392011-09-06 18:58:46 +0200856bool bdrv_dev_is_medium_locked(BlockDriverState *bs)
857{
858 if (bs->dev_ops && bs->dev_ops->is_medium_locked) {
859 return bs->dev_ops->is_medium_locked(bs->dev_opaque);
860 }
861 return false;
862}
863
aliguorie97fc192009-04-21 23:11:50 +0000864/*
865 * Run consistency checks on an image
866 *
Kevin Wolfe076f332010-06-29 11:43:13 +0200867 * Returns 0 if the check could be completed (it doesn't mean that the image is
Stefan Weila1c72732011-04-28 17:20:38 +0200868 * free of errors) or -errno when an internal error occurred. The results of the
Kevin Wolfe076f332010-06-29 11:43:13 +0200869 * check are stored in res.
aliguorie97fc192009-04-21 23:11:50 +0000870 */
Kevin Wolfe076f332010-06-29 11:43:13 +0200871int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res)
aliguorie97fc192009-04-21 23:11:50 +0000872{
873 if (bs->drv->bdrv_check == NULL) {
874 return -ENOTSUP;
875 }
876
Kevin Wolfe076f332010-06-29 11:43:13 +0200877 memset(res, 0, sizeof(*res));
Kevin Wolf9ac228e2010-06-29 12:37:54 +0200878 return bs->drv->bdrv_check(bs, res);
aliguorie97fc192009-04-21 23:11:50 +0000879}
880
Kevin Wolf8a426612010-07-16 17:17:01 +0200881#define COMMIT_BUF_SECTORS 2048
882
bellard33e39632003-07-06 17:15:21 +0000883/* commit COW file into the raw image */
884int bdrv_commit(BlockDriverState *bs)
885{
bellard19cb3732006-08-19 11:45:59 +0000886 BlockDriver *drv = bs->drv;
Kevin Wolfee181192010-08-05 13:05:22 +0200887 BlockDriver *backing_drv;
Kevin Wolf8a426612010-07-16 17:17:01 +0200888 int64_t sector, total_sectors;
889 int n, ro, open_flags;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200890 int ret = 0, rw_ret = 0;
Kevin Wolf8a426612010-07-16 17:17:01 +0200891 uint8_t *buf;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200892 char filename[1024];
893 BlockDriverState *bs_rw, *bs_ro;
bellard33e39632003-07-06 17:15:21 +0000894
bellard19cb3732006-08-19 11:45:59 +0000895 if (!drv)
896 return -ENOMEDIUM;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200897
898 if (!bs->backing_hd) {
899 return -ENOTSUP;
bellard33e39632003-07-06 17:15:21 +0000900 }
901
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200902 if (bs->backing_hd->keep_read_only) {
903 return -EACCES;
904 }
Kevin Wolfee181192010-08-05 13:05:22 +0200905
906 backing_drv = bs->backing_hd->drv;
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200907 ro = bs->backing_hd->read_only;
908 strncpy(filename, bs->backing_hd->filename, sizeof(filename));
909 open_flags = bs->backing_hd->open_flags;
910
911 if (ro) {
912 /* re-open as RW */
913 bdrv_delete(bs->backing_hd);
914 bs->backing_hd = NULL;
915 bs_rw = bdrv_new("");
Kevin Wolfee181192010-08-05 13:05:22 +0200916 rw_ret = bdrv_open(bs_rw, filename, open_flags | BDRV_O_RDWR,
917 backing_drv);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200918 if (rw_ret < 0) {
919 bdrv_delete(bs_rw);
920 /* try to re-open read-only */
921 bs_ro = bdrv_new("");
Kevin Wolfee181192010-08-05 13:05:22 +0200922 ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR,
923 backing_drv);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200924 if (ret < 0) {
925 bdrv_delete(bs_ro);
926 /* drive not functional anymore */
927 bs->drv = NULL;
928 return ret;
929 }
930 bs->backing_hd = bs_ro;
931 return rw_ret;
932 }
933 bs->backing_hd = bs_rw;
bellard33e39632003-07-06 17:15:21 +0000934 }
bellardea2384d2004-08-01 21:59:26 +0000935
Jan Kiszka6ea44302009-11-30 18:21:19 +0100936 total_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
Anthony Liguori7267c092011-08-20 22:09:37 -0500937 buf = g_malloc(COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
bellardea2384d2004-08-01 21:59:26 +0000938
Kevin Wolf8a426612010-07-16 17:17:01 +0200939 for (sector = 0; sector < total_sectors; sector += n) {
940 if (drv->bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n)) {
941
942 if (bdrv_read(bs, sector, buf, n) != 0) {
943 ret = -EIO;
944 goto ro_cleanup;
945 }
946
947 if (bdrv_write(bs->backing_hd, sector, buf, n) != 0) {
948 ret = -EIO;
949 goto ro_cleanup;
950 }
bellardea2384d2004-08-01 21:59:26 +0000951 }
952 }
bellard95389c82005-12-18 18:28:15 +0000953
Christoph Hellwig1d449522010-01-17 12:32:30 +0100954 if (drv->bdrv_make_empty) {
955 ret = drv->bdrv_make_empty(bs);
956 bdrv_flush(bs);
957 }
bellard95389c82005-12-18 18:28:15 +0000958
Christoph Hellwig3f5075a2010-01-12 13:49:23 +0100959 /*
960 * Make sure all data we wrote to the backing device is actually
961 * stable on disk.
962 */
963 if (bs->backing_hd)
964 bdrv_flush(bs->backing_hd);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200965
966ro_cleanup:
Anthony Liguori7267c092011-08-20 22:09:37 -0500967 g_free(buf);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200968
969 if (ro) {
970 /* re-open as RO */
971 bdrv_delete(bs->backing_hd);
972 bs->backing_hd = NULL;
973 bs_ro = bdrv_new("");
Kevin Wolfee181192010-08-05 13:05:22 +0200974 ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR,
975 backing_drv);
Naphtali Sprei4dca4b62010-02-14 13:39:18 +0200976 if (ret < 0) {
977 bdrv_delete(bs_ro);
978 /* drive not functional anymore */
979 bs->drv = NULL;
980 return ret;
981 }
982 bs->backing_hd = bs_ro;
983 bs->backing_hd->keep_read_only = 0;
984 }
985
Christoph Hellwig1d449522010-01-17 12:32:30 +0100986 return ret;
bellard33e39632003-07-06 17:15:21 +0000987}
988
Markus Armbruster6ab4b5a2010-06-02 18:55:18 +0200989void bdrv_commit_all(void)
990{
991 BlockDriverState *bs;
992
993 QTAILQ_FOREACH(bs, &bdrv_states, list) {
994 bdrv_commit(bs);
995 }
996}
997
Kevin Wolf756e6732010-01-12 12:55:17 +0100998/*
999 * Return values:
1000 * 0 - success
1001 * -EINVAL - backing format specified, but no file
1002 * -ENOSPC - can't update the backing file because no space is left in the
1003 * image file header
1004 * -ENOTSUP - format driver doesn't support changing the backing file
1005 */
1006int bdrv_change_backing_file(BlockDriverState *bs,
1007 const char *backing_file, const char *backing_fmt)
1008{
1009 BlockDriver *drv = bs->drv;
1010
1011 if (drv->bdrv_change_backing_file != NULL) {
1012 return drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
1013 } else {
1014 return -ENOTSUP;
1015 }
1016}
1017
aliguori71d07702009-03-03 17:37:16 +00001018static int bdrv_check_byte_request(BlockDriverState *bs, int64_t offset,
1019 size_t size)
1020{
1021 int64_t len;
1022
1023 if (!bdrv_is_inserted(bs))
1024 return -ENOMEDIUM;
1025
1026 if (bs->growable)
1027 return 0;
1028
1029 len = bdrv_getlength(bs);
1030
Kevin Wolffbb7b4e2009-05-08 14:47:24 +02001031 if (offset < 0)
1032 return -EIO;
1033
1034 if ((offset > len) || (len - offset < size))
aliguori71d07702009-03-03 17:37:16 +00001035 return -EIO;
1036
1037 return 0;
1038}
1039
1040static int bdrv_check_request(BlockDriverState *bs, int64_t sector_num,
1041 int nb_sectors)
1042{
Jes Sorenseneb5a3162010-05-27 16:20:31 +02001043 return bdrv_check_byte_request(bs, sector_num * BDRV_SECTOR_SIZE,
1044 nb_sectors * BDRV_SECTOR_SIZE);
aliguori71d07702009-03-03 17:37:16 +00001045}
1046
Kevin Wolfe7a8a782011-07-15 16:05:00 +02001047static inline bool bdrv_has_async_rw(BlockDriver *drv)
1048{
1049 return drv->bdrv_co_readv != bdrv_co_readv_em
1050 || drv->bdrv_aio_readv != bdrv_aio_readv_em;
1051}
1052
1053static inline bool bdrv_has_async_flush(BlockDriver *drv)
1054{
1055 return drv->bdrv_aio_flush != bdrv_aio_flush_em;
1056}
1057
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001058typedef struct RwCo {
1059 BlockDriverState *bs;
1060 int64_t sector_num;
1061 int nb_sectors;
1062 QEMUIOVector *qiov;
1063 bool is_write;
1064 int ret;
1065} RwCo;
1066
1067static void coroutine_fn bdrv_rw_co_entry(void *opaque)
1068{
1069 RwCo *rwco = opaque;
1070
1071 if (!rwco->is_write) {
1072 rwco->ret = bdrv_co_do_readv(rwco->bs, rwco->sector_num,
1073 rwco->nb_sectors, rwco->qiov);
1074 } else {
1075 rwco->ret = bdrv_co_do_writev(rwco->bs, rwco->sector_num,
1076 rwco->nb_sectors, rwco->qiov);
1077 }
1078}
1079
1080/*
1081 * Process a synchronous request using coroutines
1082 */
1083static int bdrv_rw_co(BlockDriverState *bs, int64_t sector_num, uint8_t *buf,
1084 int nb_sectors, bool is_write)
1085{
1086 QEMUIOVector qiov;
1087 struct iovec iov = {
1088 .iov_base = (void *)buf,
1089 .iov_len = nb_sectors * BDRV_SECTOR_SIZE,
1090 };
1091 Coroutine *co;
1092 RwCo rwco = {
1093 .bs = bs,
1094 .sector_num = sector_num,
1095 .nb_sectors = nb_sectors,
1096 .qiov = &qiov,
1097 .is_write = is_write,
1098 .ret = NOT_DONE,
1099 };
1100
1101 qemu_iovec_init_external(&qiov, &iov, 1);
1102
1103 if (qemu_in_coroutine()) {
1104 /* Fast-path if already in coroutine context */
1105 bdrv_rw_co_entry(&rwco);
1106 } else {
1107 co = qemu_coroutine_create(bdrv_rw_co_entry);
1108 qemu_coroutine_enter(co, &rwco);
1109 while (rwco.ret == NOT_DONE) {
1110 qemu_aio_wait();
1111 }
1112 }
1113 return rwco.ret;
1114}
1115
bellard19cb3732006-08-19 11:45:59 +00001116/* return < 0 if error. See bdrv_write() for the return codes */
ths5fafdf22007-09-16 21:08:06 +00001117int bdrv_read(BlockDriverState *bs, int64_t sector_num,
bellardfc01f7e2003-06-30 10:03:06 +00001118 uint8_t *buf, int nb_sectors)
1119{
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001120 return bdrv_rw_co(bs, sector_num, buf, nb_sectors, false);
bellardfc01f7e2003-06-30 10:03:06 +00001121}
1122
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02001123static void set_dirty_bitmap(BlockDriverState *bs, int64_t sector_num,
Jan Kiszkaa55eb922009-11-30 18:21:19 +01001124 int nb_sectors, int dirty)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02001125{
1126 int64_t start, end;
Jan Kiszkac6d22832009-11-30 18:21:20 +01001127 unsigned long val, idx, bit;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01001128
Jan Kiszka6ea44302009-11-30 18:21:19 +01001129 start = sector_num / BDRV_SECTORS_PER_DIRTY_CHUNK;
Jan Kiszkac6d22832009-11-30 18:21:20 +01001130 end = (sector_num + nb_sectors - 1) / BDRV_SECTORS_PER_DIRTY_CHUNK;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01001131
1132 for (; start <= end; start++) {
Jan Kiszkac6d22832009-11-30 18:21:20 +01001133 idx = start / (sizeof(unsigned long) * 8);
1134 bit = start % (sizeof(unsigned long) * 8);
1135 val = bs->dirty_bitmap[idx];
1136 if (dirty) {
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001137 if (!(val & (1UL << bit))) {
Liran Schouraaa0eb72010-01-26 10:31:48 +02001138 bs->dirty_count++;
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001139 val |= 1UL << bit;
Liran Schouraaa0eb72010-01-26 10:31:48 +02001140 }
Jan Kiszkac6d22832009-11-30 18:21:20 +01001141 } else {
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001142 if (val & (1UL << bit)) {
Liran Schouraaa0eb72010-01-26 10:31:48 +02001143 bs->dirty_count--;
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02001144 val &= ~(1UL << bit);
Liran Schouraaa0eb72010-01-26 10:31:48 +02001145 }
Jan Kiszkac6d22832009-11-30 18:21:20 +01001146 }
1147 bs->dirty_bitmap[idx] = val;
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02001148 }
1149}
1150
ths5fafdf22007-09-16 21:08:06 +00001151/* Return < 0 if error. Important errors are:
bellard19cb3732006-08-19 11:45:59 +00001152 -EIO generic I/O error (may happen for all errors)
1153 -ENOMEDIUM No media inserted.
1154 -EINVAL Invalid sector number or nb_sectors
1155 -EACCES Trying to write a read-only device
1156*/
ths5fafdf22007-09-16 21:08:06 +00001157int bdrv_write(BlockDriverState *bs, int64_t sector_num,
bellardfc01f7e2003-06-30 10:03:06 +00001158 const uint8_t *buf, int nb_sectors)
1159{
Stefan Hajnoczi1c9805a2011-10-13 13:08:22 +01001160 return bdrv_rw_co(bs, sector_num, (uint8_t *)buf, nb_sectors, true);
bellard83f64092006-08-01 16:21:11 +00001161}
1162
aliguorieda578e2009-03-12 19:57:16 +00001163int bdrv_pread(BlockDriverState *bs, int64_t offset,
1164 void *buf, int count1)
bellard83f64092006-08-01 16:21:11 +00001165{
Jan Kiszka6ea44302009-11-30 18:21:19 +01001166 uint8_t tmp_buf[BDRV_SECTOR_SIZE];
bellard83f64092006-08-01 16:21:11 +00001167 int len, nb_sectors, count;
1168 int64_t sector_num;
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001169 int ret;
bellard83f64092006-08-01 16:21:11 +00001170
1171 count = count1;
1172 /* first read to align to sector start */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001173 len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
bellard83f64092006-08-01 16:21:11 +00001174 if (len > count)
1175 len = count;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001176 sector_num = offset >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001177 if (len > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001178 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1179 return ret;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001180 memcpy(buf, tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), len);
bellard83f64092006-08-01 16:21:11 +00001181 count -= len;
1182 if (count == 0)
1183 return count1;
1184 sector_num++;
1185 buf += len;
1186 }
1187
1188 /* read the sectors "in place" */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001189 nb_sectors = count >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001190 if (nb_sectors > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001191 if ((ret = bdrv_read(bs, sector_num, buf, nb_sectors)) < 0)
1192 return ret;
bellard83f64092006-08-01 16:21:11 +00001193 sector_num += nb_sectors;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001194 len = nb_sectors << BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001195 buf += len;
1196 count -= len;
1197 }
1198
1199 /* add data from the last sector */
1200 if (count > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001201 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1202 return ret;
bellard83f64092006-08-01 16:21:11 +00001203 memcpy(buf, tmp_buf, count);
1204 }
1205 return count1;
1206}
1207
aliguorieda578e2009-03-12 19:57:16 +00001208int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
1209 const void *buf, int count1)
bellard83f64092006-08-01 16:21:11 +00001210{
Jan Kiszka6ea44302009-11-30 18:21:19 +01001211 uint8_t tmp_buf[BDRV_SECTOR_SIZE];
bellard83f64092006-08-01 16:21:11 +00001212 int len, nb_sectors, count;
1213 int64_t sector_num;
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001214 int ret;
bellard83f64092006-08-01 16:21:11 +00001215
1216 count = count1;
1217 /* first write to align to sector start */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001218 len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
bellard83f64092006-08-01 16:21:11 +00001219 if (len > count)
1220 len = count;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001221 sector_num = offset >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001222 if (len > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001223 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1224 return ret;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001225 memcpy(tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), buf, len);
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001226 if ((ret = bdrv_write(bs, sector_num, tmp_buf, 1)) < 0)
1227 return ret;
bellard83f64092006-08-01 16:21:11 +00001228 count -= len;
1229 if (count == 0)
1230 return count1;
1231 sector_num++;
1232 buf += len;
1233 }
1234
1235 /* write the sectors "in place" */
Jan Kiszka6ea44302009-11-30 18:21:19 +01001236 nb_sectors = count >> BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001237 if (nb_sectors > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001238 if ((ret = bdrv_write(bs, sector_num, buf, nb_sectors)) < 0)
1239 return ret;
bellard83f64092006-08-01 16:21:11 +00001240 sector_num += nb_sectors;
Jan Kiszka6ea44302009-11-30 18:21:19 +01001241 len = nb_sectors << BDRV_SECTOR_BITS;
bellard83f64092006-08-01 16:21:11 +00001242 buf += len;
1243 count -= len;
1244 }
1245
1246 /* add data from the last sector */
1247 if (count > 0) {
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001248 if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1249 return ret;
bellard83f64092006-08-01 16:21:11 +00001250 memcpy(tmp_buf, buf, count);
Kevin Wolf9a8c4cc2010-01-20 15:03:02 +01001251 if ((ret = bdrv_write(bs, sector_num, tmp_buf, 1)) < 0)
1252 return ret;
bellard83f64092006-08-01 16:21:11 +00001253 }
1254 return count1;
1255}
bellard83f64092006-08-01 16:21:11 +00001256
Kevin Wolff08145f2010-06-16 16:38:15 +02001257/*
1258 * Writes to the file and ensures that no writes are reordered across this
1259 * request (acts as a barrier)
1260 *
1261 * Returns 0 on success, -errno in error cases.
1262 */
1263int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
1264 const void *buf, int count)
1265{
1266 int ret;
1267
1268 ret = bdrv_pwrite(bs, offset, buf, count);
1269 if (ret < 0) {
1270 return ret;
1271 }
1272
Stefan Hajnoczi92196b22011-08-04 12:26:52 +01001273 /* No flush needed for cache modes that use O_DSYNC */
1274 if ((bs->open_flags & BDRV_O_CACHE_WB) != 0) {
Kevin Wolff08145f2010-06-16 16:38:15 +02001275 bdrv_flush(bs);
1276 }
1277
1278 return 0;
1279}
1280
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001281/*
1282 * Handle a read request in coroutine context
1283 */
1284static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
1285 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
Kevin Wolfda1fa912011-07-14 17:27:13 +02001286{
1287 BlockDriver *drv = bs->drv;
1288
Kevin Wolfda1fa912011-07-14 17:27:13 +02001289 if (!drv) {
1290 return -ENOMEDIUM;
1291 }
1292 if (bdrv_check_request(bs, sector_num, nb_sectors)) {
1293 return -EIO;
1294 }
1295
1296 return drv->bdrv_co_readv(bs, sector_num, nb_sectors, qiov);
1297}
1298
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001299int coroutine_fn bdrv_co_readv(BlockDriverState *bs, int64_t sector_num,
Kevin Wolfda1fa912011-07-14 17:27:13 +02001300 int nb_sectors, QEMUIOVector *qiov)
1301{
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001302 trace_bdrv_co_readv(bs, sector_num, nb_sectors);
Kevin Wolfda1fa912011-07-14 17:27:13 +02001303
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001304 return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov);
1305}
1306
1307/*
1308 * Handle a write request in coroutine context
1309 */
1310static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
1311 int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
1312{
1313 BlockDriver *drv = bs->drv;
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01001314 int ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02001315
1316 if (!bs->drv) {
1317 return -ENOMEDIUM;
1318 }
1319 if (bs->read_only) {
1320 return -EACCES;
1321 }
1322 if (bdrv_check_request(bs, sector_num, nb_sectors)) {
1323 return -EIO;
1324 }
1325
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01001326 ret = drv->bdrv_co_writev(bs, sector_num, nb_sectors, qiov);
1327
Kevin Wolfda1fa912011-07-14 17:27:13 +02001328 if (bs->dirty_bitmap) {
1329 set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
1330 }
1331
1332 if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
1333 bs->wr_highest_sector = sector_num + nb_sectors - 1;
1334 }
1335
Stefan Hajnoczi6b7cb242011-10-13 13:08:24 +01001336 return ret;
Kevin Wolfda1fa912011-07-14 17:27:13 +02001337}
1338
Stefan Hajnoczic5fbe572011-10-05 17:17:03 +01001339int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
1340 int nb_sectors, QEMUIOVector *qiov)
1341{
1342 trace_bdrv_co_writev(bs, sector_num, nb_sectors);
1343
1344 return bdrv_co_do_writev(bs, sector_num, nb_sectors, qiov);
1345}
1346
bellard83f64092006-08-01 16:21:11 +00001347/**
bellard83f64092006-08-01 16:21:11 +00001348 * Truncate file to 'offset' bytes (needed only for file protocols)
1349 */
1350int bdrv_truncate(BlockDriverState *bs, int64_t offset)
1351{
1352 BlockDriver *drv = bs->drv;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001353 int ret;
bellard83f64092006-08-01 16:21:11 +00001354 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00001355 return -ENOMEDIUM;
bellard83f64092006-08-01 16:21:11 +00001356 if (!drv->bdrv_truncate)
1357 return -ENOTSUP;
Naphtali Sprei59f26892009-10-26 16:25:16 +02001358 if (bs->read_only)
1359 return -EACCES;
Marcelo Tosatti85916752011-01-26 12:12:35 -02001360 if (bdrv_in_use(bs))
1361 return -EBUSY;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001362 ret = drv->bdrv_truncate(bs, offset);
1363 if (ret == 0) {
1364 ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
Markus Armbruster145feb12011-08-03 15:07:42 +02001365 bdrv_dev_resize_cb(bs);
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001366 }
1367 return ret;
bellard83f64092006-08-01 16:21:11 +00001368}
1369
1370/**
Fam Zheng4a1d5e12011-07-12 19:56:39 +08001371 * Length of a allocated file in bytes. Sparse files are counted by actual
1372 * allocated space. Return < 0 if error or unknown.
1373 */
1374int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
1375{
1376 BlockDriver *drv = bs->drv;
1377 if (!drv) {
1378 return -ENOMEDIUM;
1379 }
1380 if (drv->bdrv_get_allocated_file_size) {
1381 return drv->bdrv_get_allocated_file_size(bs);
1382 }
1383 if (bs->file) {
1384 return bdrv_get_allocated_file_size(bs->file);
1385 }
1386 return -ENOTSUP;
1387}
1388
1389/**
bellard83f64092006-08-01 16:21:11 +00001390 * Length of a file in bytes. Return < 0 if error or unknown.
1391 */
1392int64_t bdrv_getlength(BlockDriverState *bs)
1393{
1394 BlockDriver *drv = bs->drv;
1395 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00001396 return -ENOMEDIUM;
Stefan Hajnoczi51762282010-04-19 16:56:41 +01001397
Markus Armbruster2c6942f2011-09-06 18:58:51 +02001398 if (bs->growable || bdrv_dev_has_removable_media(bs)) {
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01001399 if (drv->bdrv_getlength) {
1400 return drv->bdrv_getlength(bs);
1401 }
bellard83f64092006-08-01 16:21:11 +00001402 }
Stefan Hajnoczi46a4e4e2011-03-29 20:04:41 +01001403 return bs->total_sectors * BDRV_SECTOR_SIZE;
bellardfc01f7e2003-06-30 10:03:06 +00001404}
1405
bellard19cb3732006-08-19 11:45:59 +00001406/* return 0 as number of sectors if no device present or error */
ths96b8f132007-12-17 01:35:20 +00001407void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
bellardfc01f7e2003-06-30 10:03:06 +00001408{
bellard19cb3732006-08-19 11:45:59 +00001409 int64_t length;
1410 length = bdrv_getlength(bs);
1411 if (length < 0)
1412 length = 0;
1413 else
Jan Kiszka6ea44302009-11-30 18:21:19 +01001414 length = length >> BDRV_SECTOR_BITS;
bellard19cb3732006-08-19 11:45:59 +00001415 *nb_sectors_ptr = length;
bellardfc01f7e2003-06-30 10:03:06 +00001416}
bellardcf989512004-02-16 21:56:36 +00001417
aliguorif3d54fc2008-11-25 21:50:24 +00001418struct partition {
1419 uint8_t boot_ind; /* 0x80 - active */
1420 uint8_t head; /* starting head */
1421 uint8_t sector; /* starting sector */
1422 uint8_t cyl; /* starting cylinder */
1423 uint8_t sys_ind; /* What partition type */
1424 uint8_t end_head; /* end head */
1425 uint8_t end_sector; /* end sector */
1426 uint8_t end_cyl; /* end cylinder */
1427 uint32_t start_sect; /* starting sector counting from 0 */
1428 uint32_t nr_sects; /* nr of sectors in partition */
Stefan Weil541dc0d2011-08-31 12:38:01 +02001429} QEMU_PACKED;
aliguorif3d54fc2008-11-25 21:50:24 +00001430
1431/* try to guess the disk logical geometry from the MSDOS partition table. Return 0 if OK, -1 if could not guess */
1432static int guess_disk_lchs(BlockDriverState *bs,
1433 int *pcylinders, int *pheads, int *psectors)
1434{
Jes Sorenseneb5a3162010-05-27 16:20:31 +02001435 uint8_t buf[BDRV_SECTOR_SIZE];
aliguorif3d54fc2008-11-25 21:50:24 +00001436 int ret, i, heads, sectors, cylinders;
1437 struct partition *p;
1438 uint32_t nr_sects;
blueswir1a38131b2008-12-05 17:56:40 +00001439 uint64_t nb_sectors;
aliguorif3d54fc2008-11-25 21:50:24 +00001440
1441 bdrv_get_geometry(bs, &nb_sectors);
1442
1443 ret = bdrv_read(bs, 0, buf, 1);
1444 if (ret < 0)
1445 return -1;
1446 /* test msdos magic */
1447 if (buf[510] != 0x55 || buf[511] != 0xaa)
1448 return -1;
1449 for(i = 0; i < 4; i++) {
1450 p = ((struct partition *)(buf + 0x1be)) + i;
1451 nr_sects = le32_to_cpu(p->nr_sects);
1452 if (nr_sects && p->end_head) {
1453 /* We make the assumption that the partition terminates on
1454 a cylinder boundary */
1455 heads = p->end_head + 1;
1456 sectors = p->end_sector & 63;
1457 if (sectors == 0)
1458 continue;
1459 cylinders = nb_sectors / (heads * sectors);
1460 if (cylinders < 1 || cylinders > 16383)
1461 continue;
1462 *pheads = heads;
1463 *psectors = sectors;
1464 *pcylinders = cylinders;
1465#if 0
1466 printf("guessed geometry: LCHS=%d %d %d\n",
1467 cylinders, heads, sectors);
1468#endif
1469 return 0;
1470 }
1471 }
1472 return -1;
1473}
1474
1475void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs)
1476{
1477 int translation, lba_detected = 0;
1478 int cylinders, heads, secs;
blueswir1a38131b2008-12-05 17:56:40 +00001479 uint64_t nb_sectors;
aliguorif3d54fc2008-11-25 21:50:24 +00001480
1481 /* if a geometry hint is available, use it */
1482 bdrv_get_geometry(bs, &nb_sectors);
1483 bdrv_get_geometry_hint(bs, &cylinders, &heads, &secs);
1484 translation = bdrv_get_translation_hint(bs);
1485 if (cylinders != 0) {
1486 *pcyls = cylinders;
1487 *pheads = heads;
1488 *psecs = secs;
1489 } else {
1490 if (guess_disk_lchs(bs, &cylinders, &heads, &secs) == 0) {
1491 if (heads > 16) {
1492 /* if heads > 16, it means that a BIOS LBA
1493 translation was active, so the default
1494 hardware geometry is OK */
1495 lba_detected = 1;
1496 goto default_geometry;
1497 } else {
1498 *pcyls = cylinders;
1499 *pheads = heads;
1500 *psecs = secs;
1501 /* disable any translation to be in sync with
1502 the logical geometry */
1503 if (translation == BIOS_ATA_TRANSLATION_AUTO) {
1504 bdrv_set_translation_hint(bs,
1505 BIOS_ATA_TRANSLATION_NONE);
1506 }
1507 }
1508 } else {
1509 default_geometry:
1510 /* if no geometry, use a standard physical disk geometry */
1511 cylinders = nb_sectors / (16 * 63);
1512
1513 if (cylinders > 16383)
1514 cylinders = 16383;
1515 else if (cylinders < 2)
1516 cylinders = 2;
1517 *pcyls = cylinders;
1518 *pheads = 16;
1519 *psecs = 63;
1520 if ((lba_detected == 1) && (translation == BIOS_ATA_TRANSLATION_AUTO)) {
1521 if ((*pcyls * *pheads) <= 131072) {
1522 bdrv_set_translation_hint(bs,
1523 BIOS_ATA_TRANSLATION_LARGE);
1524 } else {
1525 bdrv_set_translation_hint(bs,
1526 BIOS_ATA_TRANSLATION_LBA);
1527 }
1528 }
1529 }
1530 bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs);
1531 }
1532}
1533
ths5fafdf22007-09-16 21:08:06 +00001534void bdrv_set_geometry_hint(BlockDriverState *bs,
bellardb3380822004-03-14 21:38:54 +00001535 int cyls, int heads, int secs)
1536{
1537 bs->cyls = cyls;
1538 bs->heads = heads;
1539 bs->secs = secs;
1540}
1541
bellard46d47672004-11-16 01:45:27 +00001542void bdrv_set_translation_hint(BlockDriverState *bs, int translation)
1543{
1544 bs->translation = translation;
1545}
1546
ths5fafdf22007-09-16 21:08:06 +00001547void bdrv_get_geometry_hint(BlockDriverState *bs,
bellardb3380822004-03-14 21:38:54 +00001548 int *pcyls, int *pheads, int *psecs)
1549{
1550 *pcyls = bs->cyls;
1551 *pheads = bs->heads;
1552 *psecs = bs->secs;
1553}
1554
Blue Swirl5bbdbb42011-02-12 20:43:32 +00001555/* Recognize floppy formats */
1556typedef struct FDFormat {
1557 FDriveType drive;
1558 uint8_t last_sect;
1559 uint8_t max_track;
1560 uint8_t max_head;
1561} FDFormat;
1562
1563static const FDFormat fd_formats[] = {
1564 /* First entry is default format */
1565 /* 1.44 MB 3"1/2 floppy disks */
1566 { FDRIVE_DRV_144, 18, 80, 1, },
1567 { FDRIVE_DRV_144, 20, 80, 1, },
1568 { FDRIVE_DRV_144, 21, 80, 1, },
1569 { FDRIVE_DRV_144, 21, 82, 1, },
1570 { FDRIVE_DRV_144, 21, 83, 1, },
1571 { FDRIVE_DRV_144, 22, 80, 1, },
1572 { FDRIVE_DRV_144, 23, 80, 1, },
1573 { FDRIVE_DRV_144, 24, 80, 1, },
1574 /* 2.88 MB 3"1/2 floppy disks */
1575 { FDRIVE_DRV_288, 36, 80, 1, },
1576 { FDRIVE_DRV_288, 39, 80, 1, },
1577 { FDRIVE_DRV_288, 40, 80, 1, },
1578 { FDRIVE_DRV_288, 44, 80, 1, },
1579 { FDRIVE_DRV_288, 48, 80, 1, },
1580 /* 720 kB 3"1/2 floppy disks */
1581 { FDRIVE_DRV_144, 9, 80, 1, },
1582 { FDRIVE_DRV_144, 10, 80, 1, },
1583 { FDRIVE_DRV_144, 10, 82, 1, },
1584 { FDRIVE_DRV_144, 10, 83, 1, },
1585 { FDRIVE_DRV_144, 13, 80, 1, },
1586 { FDRIVE_DRV_144, 14, 80, 1, },
1587 /* 1.2 MB 5"1/4 floppy disks */
1588 { FDRIVE_DRV_120, 15, 80, 1, },
1589 { FDRIVE_DRV_120, 18, 80, 1, },
1590 { FDRIVE_DRV_120, 18, 82, 1, },
1591 { FDRIVE_DRV_120, 18, 83, 1, },
1592 { FDRIVE_DRV_120, 20, 80, 1, },
1593 /* 720 kB 5"1/4 floppy disks */
1594 { FDRIVE_DRV_120, 9, 80, 1, },
1595 { FDRIVE_DRV_120, 11, 80, 1, },
1596 /* 360 kB 5"1/4 floppy disks */
1597 { FDRIVE_DRV_120, 9, 40, 1, },
1598 { FDRIVE_DRV_120, 9, 40, 0, },
1599 { FDRIVE_DRV_120, 10, 41, 1, },
1600 { FDRIVE_DRV_120, 10, 42, 1, },
1601 /* 320 kB 5"1/4 floppy disks */
1602 { FDRIVE_DRV_120, 8, 40, 1, },
1603 { FDRIVE_DRV_120, 8, 40, 0, },
1604 /* 360 kB must match 5"1/4 better than 3"1/2... */
1605 { FDRIVE_DRV_144, 9, 80, 0, },
1606 /* end */
1607 { FDRIVE_DRV_NONE, -1, -1, 0, },
1608};
1609
1610void bdrv_get_floppy_geometry_hint(BlockDriverState *bs, int *nb_heads,
1611 int *max_track, int *last_sect,
1612 FDriveType drive_in, FDriveType *drive)
1613{
1614 const FDFormat *parse;
1615 uint64_t nb_sectors, size;
1616 int i, first_match, match;
1617
1618 bdrv_get_geometry_hint(bs, nb_heads, max_track, last_sect);
1619 if (*nb_heads != 0 && *max_track != 0 && *last_sect != 0) {
1620 /* User defined disk */
1621 } else {
1622 bdrv_get_geometry(bs, &nb_sectors);
1623 match = -1;
1624 first_match = -1;
1625 for (i = 0; ; i++) {
1626 parse = &fd_formats[i];
1627 if (parse->drive == FDRIVE_DRV_NONE) {
1628 break;
1629 }
1630 if (drive_in == parse->drive ||
1631 drive_in == FDRIVE_DRV_NONE) {
1632 size = (parse->max_head + 1) * parse->max_track *
1633 parse->last_sect;
1634 if (nb_sectors == size) {
1635 match = i;
1636 break;
1637 }
1638 if (first_match == -1) {
1639 first_match = i;
1640 }
1641 }
1642 }
1643 if (match == -1) {
1644 if (first_match == -1) {
1645 match = 1;
1646 } else {
1647 match = first_match;
1648 }
1649 parse = &fd_formats[match];
1650 }
1651 *nb_heads = parse->max_head + 1;
1652 *max_track = parse->max_track;
1653 *last_sect = parse->last_sect;
1654 *drive = parse->drive;
1655 }
1656}
1657
bellard46d47672004-11-16 01:45:27 +00001658int bdrv_get_translation_hint(BlockDriverState *bs)
1659{
1660 return bs->translation;
1661}
1662
Markus Armbrusterabd7f682010-06-02 18:55:17 +02001663void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error,
1664 BlockErrorAction on_write_error)
1665{
1666 bs->on_read_error = on_read_error;
1667 bs->on_write_error = on_write_error;
1668}
1669
1670BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read)
1671{
1672 return is_read ? bs->on_read_error : bs->on_write_error;
1673}
1674
bellardb3380822004-03-14 21:38:54 +00001675int bdrv_is_read_only(BlockDriverState *bs)
1676{
1677 return bs->read_only;
1678}
1679
ths985a03b2007-12-24 16:10:43 +00001680int bdrv_is_sg(BlockDriverState *bs)
1681{
1682 return bs->sg;
1683}
1684
Christoph Hellwige900a7b2009-09-04 19:01:15 +02001685int bdrv_enable_write_cache(BlockDriverState *bs)
1686{
1687 return bs->enable_write_cache;
1688}
1689
bellardea2384d2004-08-01 21:59:26 +00001690int bdrv_is_encrypted(BlockDriverState *bs)
1691{
1692 if (bs->backing_hd && bs->backing_hd->encrypted)
1693 return 1;
1694 return bs->encrypted;
1695}
1696
aliguoric0f4ce72009-03-05 23:01:01 +00001697int bdrv_key_required(BlockDriverState *bs)
1698{
1699 BlockDriverState *backing_hd = bs->backing_hd;
1700
1701 if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
1702 return 1;
1703 return (bs->encrypted && !bs->valid_key);
1704}
1705
bellardea2384d2004-08-01 21:59:26 +00001706int bdrv_set_key(BlockDriverState *bs, const char *key)
1707{
1708 int ret;
1709 if (bs->backing_hd && bs->backing_hd->encrypted) {
1710 ret = bdrv_set_key(bs->backing_hd, key);
1711 if (ret < 0)
1712 return ret;
1713 if (!bs->encrypted)
1714 return 0;
1715 }
Shahar Havivifd04a2a2010-03-06 00:26:13 +02001716 if (!bs->encrypted) {
1717 return -EINVAL;
1718 } else if (!bs->drv || !bs->drv->bdrv_set_key) {
1719 return -ENOMEDIUM;
1720 }
aliguoric0f4ce72009-03-05 23:01:01 +00001721 ret = bs->drv->bdrv_set_key(bs, key);
aliguoribb5fc202009-03-05 23:01:15 +00001722 if (ret < 0) {
1723 bs->valid_key = 0;
1724 } else if (!bs->valid_key) {
1725 bs->valid_key = 1;
1726 /* call the change callback now, we skipped it on open */
Markus Armbruster7d4b4ba2011-09-06 18:58:59 +02001727 bdrv_dev_change_media_cb(bs, true);
aliguoribb5fc202009-03-05 23:01:15 +00001728 }
aliguoric0f4ce72009-03-05 23:01:01 +00001729 return ret;
bellardea2384d2004-08-01 21:59:26 +00001730}
1731
1732void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
1733{
bellard19cb3732006-08-19 11:45:59 +00001734 if (!bs->drv) {
bellardea2384d2004-08-01 21:59:26 +00001735 buf[0] = '\0';
1736 } else {
1737 pstrcpy(buf, buf_size, bs->drv->format_name);
1738 }
1739}
1740
ths5fafdf22007-09-16 21:08:06 +00001741void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
bellardea2384d2004-08-01 21:59:26 +00001742 void *opaque)
1743{
1744 BlockDriver *drv;
1745
Stefan Hajnoczi8a22f022010-04-13 10:29:33 +01001746 QLIST_FOREACH(drv, &bdrv_drivers, list) {
bellardea2384d2004-08-01 21:59:26 +00001747 it(opaque, drv->format_name);
1748 }
1749}
1750
bellardb3380822004-03-14 21:38:54 +00001751BlockDriverState *bdrv_find(const char *name)
1752{
1753 BlockDriverState *bs;
1754
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001755 QTAILQ_FOREACH(bs, &bdrv_states, list) {
1756 if (!strcmp(name, bs->device_name)) {
bellardb3380822004-03-14 21:38:54 +00001757 return bs;
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001758 }
bellardb3380822004-03-14 21:38:54 +00001759 }
1760 return NULL;
1761}
1762
Markus Armbruster2f399b02010-06-02 18:55:20 +02001763BlockDriverState *bdrv_next(BlockDriverState *bs)
1764{
1765 if (!bs) {
1766 return QTAILQ_FIRST(&bdrv_states);
1767 }
1768 return QTAILQ_NEXT(bs, list);
1769}
1770
aliguori51de9762009-03-05 23:00:43 +00001771void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
bellard81d09122004-07-14 17:21:37 +00001772{
1773 BlockDriverState *bs;
1774
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001775 QTAILQ_FOREACH(bs, &bdrv_states, list) {
aliguori51de9762009-03-05 23:00:43 +00001776 it(opaque, bs);
bellard81d09122004-07-14 17:21:37 +00001777 }
1778}
1779
bellardea2384d2004-08-01 21:59:26 +00001780const char *bdrv_get_device_name(BlockDriverState *bs)
1781{
1782 return bs->device_name;
1783}
1784
Kevin Wolf205ef792010-10-21 16:43:43 +02001785int bdrv_flush(BlockDriverState *bs)
pbrook7a6cba62006-06-04 11:39:07 +00001786{
Alexander Graf016f5cf2010-05-26 17:51:49 +02001787 if (bs->open_flags & BDRV_O_NO_FLUSH) {
Kevin Wolf205ef792010-10-21 16:43:43 +02001788 return 0;
Alexander Graf016f5cf2010-05-26 17:51:49 +02001789 }
1790
Kevin Wolfe7a8a782011-07-15 16:05:00 +02001791 if (bs->drv && bdrv_has_async_flush(bs->drv) && qemu_in_coroutine()) {
1792 return bdrv_co_flush_em(bs);
1793 }
1794
Kevin Wolf205ef792010-10-21 16:43:43 +02001795 if (bs->drv && bs->drv->bdrv_flush) {
1796 return bs->drv->bdrv_flush(bs);
1797 }
1798
1799 /*
1800 * Some block drivers always operate in either writethrough or unsafe mode
1801 * and don't support bdrv_flush therefore. Usually qemu doesn't know how
1802 * the server works (because the behaviour is hardcoded or depends on
1803 * server-side configuration), so we can't ensure that everything is safe
1804 * on disk. Returning an error doesn't work because that would break guests
1805 * even if the server operates in writethrough mode.
1806 *
1807 * Let's hope the user knows what he's doing.
1808 */
1809 return 0;
pbrook7a6cba62006-06-04 11:39:07 +00001810}
1811
aliguoric6ca28d2008-10-06 13:55:43 +00001812void bdrv_flush_all(void)
1813{
1814 BlockDriverState *bs;
1815
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001816 QTAILQ_FOREACH(bs, &bdrv_states, list) {
Markus Armbrusterc602a482011-08-03 15:08:10 +02001817 if (!bdrv_is_read_only(bs) && bdrv_is_inserted(bs)) {
aliguoric6ca28d2008-10-06 13:55:43 +00001818 bdrv_flush(bs);
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001819 }
1820 }
aliguoric6ca28d2008-10-06 13:55:43 +00001821}
1822
Kevin Wolff2feebb2010-04-14 17:30:35 +02001823int bdrv_has_zero_init(BlockDriverState *bs)
1824{
1825 assert(bs->drv);
1826
Kevin Wolf336c1c12010-07-28 11:26:29 +02001827 if (bs->drv->bdrv_has_zero_init) {
1828 return bs->drv->bdrv_has_zero_init(bs);
Kevin Wolff2feebb2010-04-14 17:30:35 +02001829 }
1830
1831 return 1;
1832}
1833
Christoph Hellwigbb8bf762010-12-16 19:36:31 +01001834int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
1835{
1836 if (!bs->drv) {
1837 return -ENOMEDIUM;
1838 }
1839 if (!bs->drv->bdrv_discard) {
1840 return 0;
1841 }
1842 return bs->drv->bdrv_discard(bs, sector_num, nb_sectors);
1843}
1844
thsf58c7b32008-06-05 21:53:49 +00001845/*
1846 * Returns true iff the specified sector is present in the disk image. Drivers
1847 * not implementing the functionality are assumed to not support backing files,
1848 * hence all their sectors are reported as allocated.
1849 *
1850 * 'pnum' is set to the number of sectors (including and immediately following
1851 * the specified sector) that are known to be in the same
1852 * allocated/unallocated state.
1853 *
1854 * 'nb_sectors' is the max value 'pnum' should be set to.
1855 */
1856int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
1857 int *pnum)
1858{
1859 int64_t n;
1860 if (!bs->drv->bdrv_is_allocated) {
1861 if (sector_num >= bs->total_sectors) {
1862 *pnum = 0;
1863 return 0;
1864 }
1865 n = bs->total_sectors - sector_num;
1866 *pnum = (n < nb_sectors) ? (n) : (nb_sectors);
1867 return 1;
1868 }
1869 return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
1870}
1871
Luiz Capitulino2582bfe2010-02-03 12:41:01 -02001872void bdrv_mon_event(const BlockDriverState *bdrv,
1873 BlockMonEventAction action, int is_read)
1874{
1875 QObject *data;
1876 const char *action_str;
1877
1878 switch (action) {
1879 case BDRV_ACTION_REPORT:
1880 action_str = "report";
1881 break;
1882 case BDRV_ACTION_IGNORE:
1883 action_str = "ignore";
1884 break;
1885 case BDRV_ACTION_STOP:
1886 action_str = "stop";
1887 break;
1888 default:
1889 abort();
1890 }
1891
1892 data = qobject_from_jsonf("{ 'device': %s, 'action': %s, 'operation': %s }",
1893 bdrv->device_name,
1894 action_str,
1895 is_read ? "read" : "write");
1896 monitor_protocol_event(QEVENT_BLOCK_IO_ERROR, data);
1897
1898 qobject_decref(data);
1899}
1900
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001901static void bdrv_print_dict(QObject *obj, void *opaque)
bellardb3380822004-03-14 21:38:54 +00001902{
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001903 QDict *bs_dict;
1904 Monitor *mon = opaque;
1905
1906 bs_dict = qobject_to_qdict(obj);
1907
Markus Armbrusterd8aeeb32011-05-16 15:04:55 +02001908 monitor_printf(mon, "%s: removable=%d",
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001909 qdict_get_str(bs_dict, "device"),
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001910 qdict_get_bool(bs_dict, "removable"));
1911
1912 if (qdict_get_bool(bs_dict, "removable")) {
1913 monitor_printf(mon, " locked=%d", qdict_get_bool(bs_dict, "locked"));
Markus Armbrustere4def802011-09-06 18:58:53 +02001914 monitor_printf(mon, " tray-open=%d",
1915 qdict_get_bool(bs_dict, "tray-open"));
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001916 }
Luiz Capitulinod2078cc2011-09-26 17:43:55 -03001917
1918 if (qdict_haskey(bs_dict, "io-status")) {
1919 monitor_printf(mon, " io-status=%s", qdict_get_str(bs_dict, "io-status"));
1920 }
1921
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001922 if (qdict_haskey(bs_dict, "inserted")) {
1923 QDict *qdict = qobject_to_qdict(qdict_get(bs_dict, "inserted"));
1924
1925 monitor_printf(mon, " file=");
1926 monitor_print_filename(mon, qdict_get_str(qdict, "file"));
1927 if (qdict_haskey(qdict, "backing_file")) {
1928 monitor_printf(mon, " backing_file=");
1929 monitor_print_filename(mon, qdict_get_str(qdict, "backing_file"));
1930 }
1931 monitor_printf(mon, " ro=%d drv=%s encrypted=%d",
1932 qdict_get_bool(qdict, "ro"),
1933 qdict_get_str(qdict, "drv"),
1934 qdict_get_bool(qdict, "encrypted"));
1935 } else {
1936 monitor_printf(mon, " [not inserted]");
1937 }
1938
1939 monitor_printf(mon, "\n");
1940}
1941
1942void bdrv_info_print(Monitor *mon, const QObject *data)
1943{
1944 qlist_iter(qobject_to_qlist(data), bdrv_print_dict, mon);
1945}
1946
Luiz Capitulinof04ef602011-09-26 17:43:54 -03001947static const char *const io_status_name[BDRV_IOS_MAX] = {
1948 [BDRV_IOS_OK] = "ok",
1949 [BDRV_IOS_FAILED] = "failed",
1950 [BDRV_IOS_ENOSPC] = "nospace",
1951};
1952
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001953void bdrv_info(Monitor *mon, QObject **ret_data)
1954{
1955 QList *bs_list;
bellardb3380822004-03-14 21:38:54 +00001956 BlockDriverState *bs;
1957
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001958 bs_list = qlist_new();
1959
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01001960 QTAILQ_FOREACH(bs, &bdrv_states, list) {
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001961 QObject *bs_obj;
Markus Armbrustere4def802011-09-06 18:58:53 +02001962 QDict *bs_dict;
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001963
Markus Armbrusterd8aeeb32011-05-16 15:04:55 +02001964 bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': 'unknown', "
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001965 "'removable': %i, 'locked': %i }",
Markus Armbruster2c6942f2011-09-06 18:58:51 +02001966 bs->device_name,
1967 bdrv_dev_has_removable_media(bs),
Markus Armbrusterf1076392011-09-06 18:58:46 +02001968 bdrv_dev_is_medium_locked(bs));
Markus Armbrustere4def802011-09-06 18:58:53 +02001969 bs_dict = qobject_to_qdict(bs_obj);
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001970
Markus Armbrustere4def802011-09-06 18:58:53 +02001971 if (bdrv_dev_has_removable_media(bs)) {
1972 qdict_put(bs_dict, "tray-open",
1973 qbool_from_int(bdrv_dev_is_tray_open(bs)));
1974 }
Luiz Capitulinof04ef602011-09-26 17:43:54 -03001975
1976 if (bdrv_iostatus_is_enabled(bs)) {
1977 qdict_put(bs_dict, "io-status",
1978 qstring_from_str(io_status_name[bs->iostatus]));
1979 }
1980
bellard19cb3732006-08-19 11:45:59 +00001981 if (bs->drv) {
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001982 QObject *obj;
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001983
1984 obj = qobject_from_jsonf("{ 'file': %s, 'ro': %i, 'drv': %s, "
1985 "'encrypted': %i }",
1986 bs->filename, bs->read_only,
1987 bs->drv->format_name,
1988 bdrv_is_encrypted(bs));
thsfef30742006-12-22 14:11:32 +00001989 if (bs->backing_file[0] != '\0') {
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001990 QDict *qdict = qobject_to_qdict(obj);
1991 qdict_put(qdict, "backing_file",
1992 qstring_from_str(bs->backing_file));
aliguori376253e2009-03-05 23:01:23 +00001993 }
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001994
1995 qdict_put_obj(bs_dict, "inserted", obj);
bellardb3380822004-03-14 21:38:54 +00001996 }
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001997 qlist_append_obj(bs_list, bs_obj);
bellardb3380822004-03-14 21:38:54 +00001998 }
Luiz Capitulinod15e5462009-12-10 17:16:06 -02001999
2000 *ret_data = QOBJECT(bs_list);
bellardb3380822004-03-14 21:38:54 +00002001}
thsa36e69d2007-12-02 05:18:19 +00002002
Luiz Capitulino218a5362009-12-10 17:16:07 -02002003static void bdrv_stats_iter(QObject *data, void *opaque)
thsa36e69d2007-12-02 05:18:19 +00002004{
Luiz Capitulino218a5362009-12-10 17:16:07 -02002005 QDict *qdict;
2006 Monitor *mon = opaque;
2007
2008 qdict = qobject_to_qdict(data);
2009 monitor_printf(mon, "%s:", qdict_get_str(qdict, "device"));
2010
2011 qdict = qobject_to_qdict(qdict_get(qdict, "stats"));
2012 monitor_printf(mon, " rd_bytes=%" PRId64
2013 " wr_bytes=%" PRId64
2014 " rd_operations=%" PRId64
2015 " wr_operations=%" PRId64
Christoph Hellwige8045d62011-08-22 00:25:58 +02002016 " flush_operations=%" PRId64
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02002017 " wr_total_time_ns=%" PRId64
2018 " rd_total_time_ns=%" PRId64
2019 " flush_total_time_ns=%" PRId64
Luiz Capitulino218a5362009-12-10 17:16:07 -02002020 "\n",
2021 qdict_get_int(qdict, "rd_bytes"),
2022 qdict_get_int(qdict, "wr_bytes"),
2023 qdict_get_int(qdict, "rd_operations"),
Christoph Hellwige8045d62011-08-22 00:25:58 +02002024 qdict_get_int(qdict, "wr_operations"),
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02002025 qdict_get_int(qdict, "flush_operations"),
2026 qdict_get_int(qdict, "wr_total_time_ns"),
2027 qdict_get_int(qdict, "rd_total_time_ns"),
2028 qdict_get_int(qdict, "flush_total_time_ns"));
Luiz Capitulino218a5362009-12-10 17:16:07 -02002029}
2030
2031void bdrv_stats_print(Monitor *mon, const QObject *data)
2032{
2033 qlist_iter(qobject_to_qlist(data), bdrv_stats_iter, mon);
2034}
2035
Kevin Wolf294cc352010-04-28 14:34:01 +02002036static QObject* bdrv_info_stats_bs(BlockDriverState *bs)
2037{
2038 QObject *res;
2039 QDict *dict;
2040
2041 res = qobject_from_jsonf("{ 'stats': {"
2042 "'rd_bytes': %" PRId64 ","
2043 "'wr_bytes': %" PRId64 ","
2044 "'rd_operations': %" PRId64 ","
2045 "'wr_operations': %" PRId64 ","
Christoph Hellwige8045d62011-08-22 00:25:58 +02002046 "'wr_highest_offset': %" PRId64 ","
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02002047 "'flush_operations': %" PRId64 ","
2048 "'wr_total_time_ns': %" PRId64 ","
2049 "'rd_total_time_ns': %" PRId64 ","
2050 "'flush_total_time_ns': %" PRId64
Kevin Wolf294cc352010-04-28 14:34:01 +02002051 "} }",
Christoph Hellwiga597e792011-08-25 08:26:01 +02002052 bs->nr_bytes[BDRV_ACCT_READ],
2053 bs->nr_bytes[BDRV_ACCT_WRITE],
2054 bs->nr_ops[BDRV_ACCT_READ],
2055 bs->nr_ops[BDRV_ACCT_WRITE],
Blue Swirl5ffbbc62010-06-14 18:55:33 +00002056 bs->wr_highest_sector *
Christoph Hellwige8045d62011-08-22 00:25:58 +02002057 (uint64_t)BDRV_SECTOR_SIZE,
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02002058 bs->nr_ops[BDRV_ACCT_FLUSH],
2059 bs->total_time_ns[BDRV_ACCT_WRITE],
2060 bs->total_time_ns[BDRV_ACCT_READ],
2061 bs->total_time_ns[BDRV_ACCT_FLUSH]);
Kevin Wolf294cc352010-04-28 14:34:01 +02002062 dict = qobject_to_qdict(res);
2063
2064 if (*bs->device_name) {
2065 qdict_put(dict, "device", qstring_from_str(bs->device_name));
2066 }
2067
2068 if (bs->file) {
2069 QObject *parent = bdrv_info_stats_bs(bs->file);
2070 qdict_put_obj(dict, "parent", parent);
2071 }
2072
2073 return res;
2074}
2075
Luiz Capitulino218a5362009-12-10 17:16:07 -02002076void bdrv_info_stats(Monitor *mon, QObject **ret_data)
2077{
2078 QObject *obj;
2079 QList *devices;
thsa36e69d2007-12-02 05:18:19 +00002080 BlockDriverState *bs;
2081
Luiz Capitulino218a5362009-12-10 17:16:07 -02002082 devices = qlist_new();
2083
Stefan Hajnoczi1b7bdbc2010-04-10 07:02:42 +01002084 QTAILQ_FOREACH(bs, &bdrv_states, list) {
Kevin Wolf294cc352010-04-28 14:34:01 +02002085 obj = bdrv_info_stats_bs(bs);
Luiz Capitulino218a5362009-12-10 17:16:07 -02002086 qlist_append_obj(devices, obj);
thsa36e69d2007-12-02 05:18:19 +00002087 }
Luiz Capitulino218a5362009-12-10 17:16:07 -02002088
2089 *ret_data = QOBJECT(devices);
thsa36e69d2007-12-02 05:18:19 +00002090}
bellardea2384d2004-08-01 21:59:26 +00002091
aliguori045df332009-03-05 23:00:48 +00002092const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
2093{
2094 if (bs->backing_hd && bs->backing_hd->encrypted)
2095 return bs->backing_file;
2096 else if (bs->encrypted)
2097 return bs->filename;
2098 else
2099 return NULL;
2100}
2101
ths5fafdf22007-09-16 21:08:06 +00002102void bdrv_get_backing_filename(BlockDriverState *bs,
bellard83f64092006-08-01 16:21:11 +00002103 char *filename, int filename_size)
bellardea2384d2004-08-01 21:59:26 +00002104{
Kevin Wolfb783e402010-01-12 12:55:16 +01002105 if (!bs->backing_file) {
bellard83f64092006-08-01 16:21:11 +00002106 pstrcpy(filename, filename_size, "");
2107 } else {
2108 pstrcpy(filename, filename_size, bs->backing_file);
2109 }
bellardea2384d2004-08-01 21:59:26 +00002110}
2111
ths5fafdf22007-09-16 21:08:06 +00002112int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
bellardfaea38e2006-08-05 21:31:00 +00002113 const uint8_t *buf, int nb_sectors)
2114{
2115 BlockDriver *drv = bs->drv;
2116 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002117 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00002118 if (!drv->bdrv_write_compressed)
2119 return -ENOTSUP;
Kevin Wolffbb7b4e2009-05-08 14:47:24 +02002120 if (bdrv_check_request(bs, sector_num, nb_sectors))
2121 return -EIO;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01002122
Jan Kiszkac6d22832009-11-30 18:21:20 +01002123 if (bs->dirty_bitmap) {
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02002124 set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
2125 }
Jan Kiszkaa55eb922009-11-30 18:21:19 +01002126
bellardfaea38e2006-08-05 21:31:00 +00002127 return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
2128}
ths3b46e622007-09-17 08:09:54 +00002129
bellardfaea38e2006-08-05 21:31:00 +00002130int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
2131{
2132 BlockDriver *drv = bs->drv;
2133 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002134 return -ENOMEDIUM;
bellardfaea38e2006-08-05 21:31:00 +00002135 if (!drv->bdrv_get_info)
2136 return -ENOTSUP;
2137 memset(bdi, 0, sizeof(*bdi));
2138 return drv->bdrv_get_info(bs, bdi);
2139}
2140
Christoph Hellwig45566e92009-07-10 23:11:57 +02002141int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
2142 int64_t pos, int size)
aliguori178e08a2009-04-05 19:10:55 +00002143{
2144 BlockDriver *drv = bs->drv;
2145 if (!drv)
2146 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002147 if (drv->bdrv_save_vmstate)
2148 return drv->bdrv_save_vmstate(bs, buf, pos, size);
2149 if (bs->file)
2150 return bdrv_save_vmstate(bs->file, buf, pos, size);
2151 return -ENOTSUP;
aliguori178e08a2009-04-05 19:10:55 +00002152}
2153
Christoph Hellwig45566e92009-07-10 23:11:57 +02002154int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
2155 int64_t pos, int size)
aliguori178e08a2009-04-05 19:10:55 +00002156{
2157 BlockDriver *drv = bs->drv;
2158 if (!drv)
2159 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002160 if (drv->bdrv_load_vmstate)
2161 return drv->bdrv_load_vmstate(bs, buf, pos, size);
2162 if (bs->file)
2163 return bdrv_load_vmstate(bs->file, buf, pos, size);
2164 return -ENOTSUP;
aliguori178e08a2009-04-05 19:10:55 +00002165}
2166
Kevin Wolf8b9b0cc2010-03-15 17:27:00 +01002167void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event)
2168{
2169 BlockDriver *drv = bs->drv;
2170
2171 if (!drv || !drv->bdrv_debug_event) {
2172 return;
2173 }
2174
2175 return drv->bdrv_debug_event(bs, event);
2176
2177}
2178
bellardfaea38e2006-08-05 21:31:00 +00002179/**************************************************************/
2180/* handling of snapshots */
2181
Miguel Di Ciurcio Filhofeeee5a2010-06-08 10:40:55 -03002182int bdrv_can_snapshot(BlockDriverState *bs)
2183{
2184 BlockDriver *drv = bs->drv;
Markus Armbruster07b70bf2011-08-03 15:08:11 +02002185 if (!drv || !bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
Miguel Di Ciurcio Filhofeeee5a2010-06-08 10:40:55 -03002186 return 0;
2187 }
2188
2189 if (!drv->bdrv_snapshot_create) {
2190 if (bs->file != NULL) {
2191 return bdrv_can_snapshot(bs->file);
2192 }
2193 return 0;
2194 }
2195
2196 return 1;
2197}
2198
Blue Swirl199630b2010-07-25 20:49:34 +00002199int bdrv_is_snapshot(BlockDriverState *bs)
2200{
2201 return !!(bs->open_flags & BDRV_O_SNAPSHOT);
2202}
2203
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002204BlockDriverState *bdrv_snapshots(void)
2205{
2206 BlockDriverState *bs;
2207
Markus Armbruster3ac906f2010-07-01 09:30:38 +02002208 if (bs_snapshots) {
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002209 return bs_snapshots;
Markus Armbruster3ac906f2010-07-01 09:30:38 +02002210 }
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002211
2212 bs = NULL;
2213 while ((bs = bdrv_next(bs))) {
2214 if (bdrv_can_snapshot(bs)) {
Markus Armbruster3ac906f2010-07-01 09:30:38 +02002215 bs_snapshots = bs;
2216 return bs;
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002217 }
2218 }
2219 return NULL;
Markus Armbrusterf9092b12010-06-25 10:33:39 +02002220}
2221
ths5fafdf22007-09-16 21:08:06 +00002222int bdrv_snapshot_create(BlockDriverState *bs,
bellardfaea38e2006-08-05 21:31:00 +00002223 QEMUSnapshotInfo *sn_info)
2224{
2225 BlockDriver *drv = bs->drv;
2226 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002227 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002228 if (drv->bdrv_snapshot_create)
2229 return drv->bdrv_snapshot_create(bs, sn_info);
2230 if (bs->file)
2231 return bdrv_snapshot_create(bs->file, sn_info);
2232 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002233}
2234
ths5fafdf22007-09-16 21:08:06 +00002235int bdrv_snapshot_goto(BlockDriverState *bs,
bellardfaea38e2006-08-05 21:31:00 +00002236 const char *snapshot_id)
2237{
2238 BlockDriver *drv = bs->drv;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002239 int ret, open_ret;
2240
bellardfaea38e2006-08-05 21:31:00 +00002241 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002242 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002243 if (drv->bdrv_snapshot_goto)
2244 return drv->bdrv_snapshot_goto(bs, snapshot_id);
2245
2246 if (bs->file) {
2247 drv->bdrv_close(bs);
2248 ret = bdrv_snapshot_goto(bs->file, snapshot_id);
2249 open_ret = drv->bdrv_open(bs, bs->open_flags);
2250 if (open_ret < 0) {
2251 bdrv_delete(bs->file);
2252 bs->drv = NULL;
2253 return open_ret;
2254 }
2255 return ret;
2256 }
2257
2258 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002259}
2260
2261int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
2262{
2263 BlockDriver *drv = bs->drv;
2264 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002265 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002266 if (drv->bdrv_snapshot_delete)
2267 return drv->bdrv_snapshot_delete(bs, snapshot_id);
2268 if (bs->file)
2269 return bdrv_snapshot_delete(bs->file, snapshot_id);
2270 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002271}
2272
ths5fafdf22007-09-16 21:08:06 +00002273int bdrv_snapshot_list(BlockDriverState *bs,
bellardfaea38e2006-08-05 21:31:00 +00002274 QEMUSnapshotInfo **psn_info)
2275{
2276 BlockDriver *drv = bs->drv;
2277 if (!drv)
bellard19cb3732006-08-19 11:45:59 +00002278 return -ENOMEDIUM;
MORITA Kazutaka7cdb1f62010-05-28 11:44:58 +09002279 if (drv->bdrv_snapshot_list)
2280 return drv->bdrv_snapshot_list(bs, psn_info);
2281 if (bs->file)
2282 return bdrv_snapshot_list(bs->file, psn_info);
2283 return -ENOTSUP;
bellardfaea38e2006-08-05 21:31:00 +00002284}
2285
edison51ef6722010-09-21 19:58:41 -07002286int bdrv_snapshot_load_tmp(BlockDriverState *bs,
2287 const char *snapshot_name)
2288{
2289 BlockDriver *drv = bs->drv;
2290 if (!drv) {
2291 return -ENOMEDIUM;
2292 }
2293 if (!bs->read_only) {
2294 return -EINVAL;
2295 }
2296 if (drv->bdrv_snapshot_load_tmp) {
2297 return drv->bdrv_snapshot_load_tmp(bs, snapshot_name);
2298 }
2299 return -ENOTSUP;
2300}
2301
bellardfaea38e2006-08-05 21:31:00 +00002302#define NB_SUFFIXES 4
2303
2304char *get_human_readable_size(char *buf, int buf_size, int64_t size)
2305{
2306 static const char suffixes[NB_SUFFIXES] = "KMGT";
2307 int64_t base;
2308 int i;
2309
2310 if (size <= 999) {
2311 snprintf(buf, buf_size, "%" PRId64, size);
2312 } else {
2313 base = 1024;
2314 for(i = 0; i < NB_SUFFIXES; i++) {
2315 if (size < (10 * base)) {
ths5fafdf22007-09-16 21:08:06 +00002316 snprintf(buf, buf_size, "%0.1f%c",
bellardfaea38e2006-08-05 21:31:00 +00002317 (double)size / base,
2318 suffixes[i]);
2319 break;
2320 } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) {
ths5fafdf22007-09-16 21:08:06 +00002321 snprintf(buf, buf_size, "%" PRId64 "%c",
bellardfaea38e2006-08-05 21:31:00 +00002322 ((size + (base >> 1)) / base),
2323 suffixes[i]);
2324 break;
2325 }
2326 base = base * 1024;
2327 }
2328 }
2329 return buf;
2330}
2331
2332char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
2333{
2334 char buf1[128], date_buf[128], clock_buf[128];
bellard3b9f94e2007-01-07 17:27:07 +00002335#ifdef _WIN32
2336 struct tm *ptm;
2337#else
bellardfaea38e2006-08-05 21:31:00 +00002338 struct tm tm;
bellard3b9f94e2007-01-07 17:27:07 +00002339#endif
bellardfaea38e2006-08-05 21:31:00 +00002340 time_t ti;
2341 int64_t secs;
2342
2343 if (!sn) {
ths5fafdf22007-09-16 21:08:06 +00002344 snprintf(buf, buf_size,
2345 "%-10s%-20s%7s%20s%15s",
bellardfaea38e2006-08-05 21:31:00 +00002346 "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
2347 } else {
2348 ti = sn->date_sec;
bellard3b9f94e2007-01-07 17:27:07 +00002349#ifdef _WIN32
2350 ptm = localtime(&ti);
2351 strftime(date_buf, sizeof(date_buf),
2352 "%Y-%m-%d %H:%M:%S", ptm);
2353#else
bellardfaea38e2006-08-05 21:31:00 +00002354 localtime_r(&ti, &tm);
2355 strftime(date_buf, sizeof(date_buf),
2356 "%Y-%m-%d %H:%M:%S", &tm);
bellard3b9f94e2007-01-07 17:27:07 +00002357#endif
bellardfaea38e2006-08-05 21:31:00 +00002358 secs = sn->vm_clock_nsec / 1000000000;
2359 snprintf(clock_buf, sizeof(clock_buf),
2360 "%02d:%02d:%02d.%03d",
2361 (int)(secs / 3600),
2362 (int)((secs / 60) % 60),
ths5fafdf22007-09-16 21:08:06 +00002363 (int)(secs % 60),
bellardfaea38e2006-08-05 21:31:00 +00002364 (int)((sn->vm_clock_nsec / 1000000) % 1000));
2365 snprintf(buf, buf_size,
ths5fafdf22007-09-16 21:08:06 +00002366 "%-10s%-20s%7s%20s%15s",
bellardfaea38e2006-08-05 21:31:00 +00002367 sn->id_str, sn->name,
2368 get_human_readable_size(buf1, sizeof(buf1), sn->vm_state_size),
2369 date_buf,
2370 clock_buf);
2371 }
2372 return buf;
2373}
2374
bellard83f64092006-08-01 16:21:11 +00002375/**************************************************************/
2376/* async I/Os */
2377
aliguori3b69e4b2009-01-22 16:59:24 +00002378BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
aliguorif141eaf2009-04-07 18:43:24 +00002379 QEMUIOVector *qiov, int nb_sectors,
aliguori3b69e4b2009-01-22 16:59:24 +00002380 BlockDriverCompletionFunc *cb, void *opaque)
2381{
Stefan Hajnoczibbf0a442010-10-05 14:28:53 +01002382 trace_bdrv_aio_readv(bs, sector_num, nb_sectors, opaque);
2383
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002384 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors,
2385 cb, opaque, false, bdrv_co_do_rw);
bellard83f64092006-08-01 16:21:11 +00002386}
2387
aliguorif141eaf2009-04-07 18:43:24 +00002388BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
2389 QEMUIOVector *qiov, int nb_sectors,
2390 BlockDriverCompletionFunc *cb, void *opaque)
bellard83f64092006-08-01 16:21:11 +00002391{
Stefan Hajnoczibbf0a442010-10-05 14:28:53 +01002392 trace_bdrv_aio_writev(bs, sector_num, nb_sectors, opaque);
2393
Stefan Hajnoczi1a6e1152011-10-13 13:08:25 +01002394 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors,
2395 cb, opaque, true, bdrv_co_do_rw);
bellard83f64092006-08-01 16:21:11 +00002396}
2397
Kevin Wolf40b4f532009-09-09 17:53:37 +02002398
2399typedef struct MultiwriteCB {
2400 int error;
2401 int num_requests;
2402 int num_callbacks;
2403 struct {
2404 BlockDriverCompletionFunc *cb;
2405 void *opaque;
2406 QEMUIOVector *free_qiov;
2407 void *free_buf;
2408 } callbacks[];
2409} MultiwriteCB;
2410
2411static void multiwrite_user_cb(MultiwriteCB *mcb)
2412{
2413 int i;
2414
2415 for (i = 0; i < mcb->num_callbacks; i++) {
2416 mcb->callbacks[i].cb(mcb->callbacks[i].opaque, mcb->error);
Stefan Hajnoczi1e1ea482010-04-21 20:35:45 +01002417 if (mcb->callbacks[i].free_qiov) {
2418 qemu_iovec_destroy(mcb->callbacks[i].free_qiov);
2419 }
Anthony Liguori7267c092011-08-20 22:09:37 -05002420 g_free(mcb->callbacks[i].free_qiov);
Herve Poussineauf8a83242010-01-24 21:23:56 +00002421 qemu_vfree(mcb->callbacks[i].free_buf);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002422 }
2423}
2424
2425static void multiwrite_cb(void *opaque, int ret)
2426{
2427 MultiwriteCB *mcb = opaque;
2428
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002429 trace_multiwrite_cb(mcb, ret);
2430
Kevin Wolfcb6d3ca2010-04-01 22:48:44 +02002431 if (ret < 0 && !mcb->error) {
Kevin Wolf40b4f532009-09-09 17:53:37 +02002432 mcb->error = ret;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002433 }
2434
2435 mcb->num_requests--;
2436 if (mcb->num_requests == 0) {
Kevin Wolfde189a12010-07-01 16:08:51 +02002437 multiwrite_user_cb(mcb);
Anthony Liguori7267c092011-08-20 22:09:37 -05002438 g_free(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002439 }
2440}
2441
2442static int multiwrite_req_compare(const void *a, const void *b)
2443{
Christoph Hellwig77be4362010-05-19 20:53:10 +02002444 const BlockRequest *req1 = a, *req2 = b;
2445
2446 /*
2447 * Note that we can't simply subtract req2->sector from req1->sector
2448 * here as that could overflow the return value.
2449 */
2450 if (req1->sector > req2->sector) {
2451 return 1;
2452 } else if (req1->sector < req2->sector) {
2453 return -1;
2454 } else {
2455 return 0;
2456 }
Kevin Wolf40b4f532009-09-09 17:53:37 +02002457}
2458
2459/*
2460 * Takes a bunch of requests and tries to merge them. Returns the number of
2461 * requests that remain after merging.
2462 */
2463static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs,
2464 int num_reqs, MultiwriteCB *mcb)
2465{
2466 int i, outidx;
2467
2468 // Sort requests by start sector
2469 qsort(reqs, num_reqs, sizeof(*reqs), &multiwrite_req_compare);
2470
2471 // Check if adjacent requests touch the same clusters. If so, combine them,
2472 // filling up gaps with zero sectors.
2473 outidx = 0;
2474 for (i = 1; i < num_reqs; i++) {
2475 int merge = 0;
2476 int64_t oldreq_last = reqs[outidx].sector + reqs[outidx].nb_sectors;
2477
2478 // This handles the cases that are valid for all block drivers, namely
2479 // exactly sequential writes and overlapping writes.
2480 if (reqs[i].sector <= oldreq_last) {
2481 merge = 1;
2482 }
2483
2484 // The block driver may decide that it makes sense to combine requests
2485 // even if there is a gap of some sectors between them. In this case,
2486 // the gap is filled with zeros (therefore only applicable for yet
2487 // unused space in format like qcow2).
2488 if (!merge && bs->drv->bdrv_merge_requests) {
2489 merge = bs->drv->bdrv_merge_requests(bs, &reqs[outidx], &reqs[i]);
2490 }
2491
Christoph Hellwige2a305f2010-01-26 14:49:08 +01002492 if (reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1 > IOV_MAX) {
2493 merge = 0;
2494 }
2495
Kevin Wolf40b4f532009-09-09 17:53:37 +02002496 if (merge) {
2497 size_t size;
Anthony Liguori7267c092011-08-20 22:09:37 -05002498 QEMUIOVector *qiov = g_malloc0(sizeof(*qiov));
Kevin Wolf40b4f532009-09-09 17:53:37 +02002499 qemu_iovec_init(qiov,
2500 reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1);
2501
2502 // Add the first request to the merged one. If the requests are
2503 // overlapping, drop the last sectors of the first request.
2504 size = (reqs[i].sector - reqs[outidx].sector) << 9;
2505 qemu_iovec_concat(qiov, reqs[outidx].qiov, size);
2506
2507 // We might need to add some zeros between the two requests
2508 if (reqs[i].sector > oldreq_last) {
2509 size_t zero_bytes = (reqs[i].sector - oldreq_last) << 9;
2510 uint8_t *buf = qemu_blockalign(bs, zero_bytes);
2511 memset(buf, 0, zero_bytes);
2512 qemu_iovec_add(qiov, buf, zero_bytes);
2513 mcb->callbacks[i].free_buf = buf;
2514 }
2515
2516 // Add the second request
2517 qemu_iovec_concat(qiov, reqs[i].qiov, reqs[i].qiov->size);
2518
Kevin Wolfcbf1dff2010-05-21 11:09:42 +02002519 reqs[outidx].nb_sectors = qiov->size >> 9;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002520 reqs[outidx].qiov = qiov;
2521
2522 mcb->callbacks[i].free_qiov = reqs[outidx].qiov;
2523 } else {
2524 outidx++;
2525 reqs[outidx].sector = reqs[i].sector;
2526 reqs[outidx].nb_sectors = reqs[i].nb_sectors;
2527 reqs[outidx].qiov = reqs[i].qiov;
2528 }
2529 }
2530
2531 return outidx + 1;
2532}
2533
2534/*
2535 * Submit multiple AIO write requests at once.
2536 *
2537 * On success, the function returns 0 and all requests in the reqs array have
2538 * been submitted. In error case this function returns -1, and any of the
2539 * requests may or may not be submitted yet. In particular, this means that the
2540 * callback will be called for some of the requests, for others it won't. The
2541 * caller must check the error field of the BlockRequest to wait for the right
2542 * callbacks (if error != 0, no callback will be called).
2543 *
2544 * The implementation may modify the contents of the reqs array, e.g. to merge
2545 * requests. However, the fields opaque and error are left unmodified as they
2546 * are used to signal failure for a single request to the caller.
2547 */
2548int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs)
2549{
2550 BlockDriverAIOCB *acb;
2551 MultiwriteCB *mcb;
2552 int i;
2553
Ryan Harper301db7c2011-03-07 10:01:04 -06002554 /* don't submit writes if we don't have a medium */
2555 if (bs->drv == NULL) {
2556 for (i = 0; i < num_reqs; i++) {
2557 reqs[i].error = -ENOMEDIUM;
2558 }
2559 return -1;
2560 }
2561
Kevin Wolf40b4f532009-09-09 17:53:37 +02002562 if (num_reqs == 0) {
2563 return 0;
2564 }
2565
2566 // Create MultiwriteCB structure
Anthony Liguori7267c092011-08-20 22:09:37 -05002567 mcb = g_malloc0(sizeof(*mcb) + num_reqs * sizeof(*mcb->callbacks));
Kevin Wolf40b4f532009-09-09 17:53:37 +02002568 mcb->num_requests = 0;
2569 mcb->num_callbacks = num_reqs;
2570
2571 for (i = 0; i < num_reqs; i++) {
2572 mcb->callbacks[i].cb = reqs[i].cb;
2573 mcb->callbacks[i].opaque = reqs[i].opaque;
2574 }
2575
2576 // Check for mergable requests
2577 num_reqs = multiwrite_merge(bs, reqs, num_reqs, mcb);
2578
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002579 trace_bdrv_aio_multiwrite(mcb, mcb->num_callbacks, num_reqs);
2580
Kevin Wolf453f9a12010-07-02 14:01:21 +02002581 /*
2582 * Run the aio requests. As soon as one request can't be submitted
2583 * successfully, fail all requests that are not yet submitted (we must
2584 * return failure for all requests anyway)
2585 *
2586 * num_requests cannot be set to the right value immediately: If
2587 * bdrv_aio_writev fails for some request, num_requests would be too high
2588 * and therefore multiwrite_cb() would never recognize the multiwrite
2589 * request as completed. We also cannot use the loop variable i to set it
2590 * when the first request fails because the callback may already have been
2591 * called for previously submitted requests. Thus, num_requests must be
2592 * incremented for each request that is submitted.
2593 *
2594 * The problem that callbacks may be called early also means that we need
2595 * to take care that num_requests doesn't become 0 before all requests are
2596 * submitted - multiwrite_cb() would consider the multiwrite request
2597 * completed. A dummy request that is "completed" by a manual call to
2598 * multiwrite_cb() takes care of this.
2599 */
2600 mcb->num_requests = 1;
2601
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002602 // Run the aio requests
Kevin Wolf40b4f532009-09-09 17:53:37 +02002603 for (i = 0; i < num_reqs; i++) {
Kevin Wolf453f9a12010-07-02 14:01:21 +02002604 mcb->num_requests++;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002605 acb = bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov,
2606 reqs[i].nb_sectors, multiwrite_cb, mcb);
2607
2608 if (acb == NULL) {
2609 // We can only fail the whole thing if no request has been
2610 // submitted yet. Otherwise we'll wait for the submitted AIOs to
2611 // complete and report the error in the callback.
Kevin Wolf453f9a12010-07-02 14:01:21 +02002612 if (i == 0) {
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002613 trace_bdrv_aio_multiwrite_earlyfail(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002614 goto fail;
2615 } else {
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002616 trace_bdrv_aio_multiwrite_latefail(mcb, i);
Kevin Wolf7eb58a62010-04-06 18:24:07 +02002617 multiwrite_cb(mcb, -EIO);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002618 break;
2619 }
Kevin Wolf40b4f532009-09-09 17:53:37 +02002620 }
2621 }
2622
Kevin Wolf453f9a12010-07-02 14:01:21 +02002623 /* Complete the dummy request */
2624 multiwrite_cb(mcb, 0);
2625
Kevin Wolf40b4f532009-09-09 17:53:37 +02002626 return 0;
2627
2628fail:
Kevin Wolf453f9a12010-07-02 14:01:21 +02002629 for (i = 0; i < mcb->num_callbacks; i++) {
2630 reqs[i].error = -EIO;
2631 }
Anthony Liguori7267c092011-08-20 22:09:37 -05002632 g_free(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002633 return -1;
2634}
2635
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002636BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
2637 BlockDriverCompletionFunc *cb, void *opaque)
2638{
2639 BlockDriver *drv = bs->drv;
2640
Stefan Hajnoczia13aac02011-03-07 07:58:04 +00002641 trace_bdrv_aio_flush(bs, opaque);
2642
Alexander Graf016f5cf2010-05-26 17:51:49 +02002643 if (bs->open_flags & BDRV_O_NO_FLUSH) {
2644 return bdrv_aio_noop_em(bs, cb, opaque);
2645 }
2646
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002647 if (!drv)
2648 return NULL;
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002649 return drv->bdrv_aio_flush(bs, cb, opaque);
2650}
2651
bellard83f64092006-08-01 16:21:11 +00002652void bdrv_aio_cancel(BlockDriverAIOCB *acb)
pbrookce1a14d2006-08-07 02:38:06 +00002653{
aliguori6bbff9a2009-03-20 18:25:59 +00002654 acb->pool->cancel(acb);
bellard83f64092006-08-01 16:21:11 +00002655}
2656
pbrookce1a14d2006-08-07 02:38:06 +00002657
bellard83f64092006-08-01 16:21:11 +00002658/**************************************************************/
2659/* async block device emulation */
2660
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002661typedef struct BlockDriverAIOCBSync {
2662 BlockDriverAIOCB common;
2663 QEMUBH *bh;
2664 int ret;
2665 /* vector translation state */
2666 QEMUIOVector *qiov;
2667 uint8_t *bounce;
2668 int is_write;
2669} BlockDriverAIOCBSync;
2670
2671static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
2672{
Kevin Wolfb666d232010-05-05 11:44:39 +02002673 BlockDriverAIOCBSync *acb =
2674 container_of(blockacb, BlockDriverAIOCBSync, common);
Dor Laor6a7ad292009-06-01 12:07:23 +03002675 qemu_bh_delete(acb->bh);
Avi Kivity36afc452009-06-23 16:20:36 +03002676 acb->bh = NULL;
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002677 qemu_aio_release(acb);
2678}
2679
2680static AIOPool bdrv_em_aio_pool = {
2681 .aiocb_size = sizeof(BlockDriverAIOCBSync),
2682 .cancel = bdrv_aio_cancel_em,
2683};
2684
bellard83f64092006-08-01 16:21:11 +00002685static void bdrv_aio_bh_cb(void *opaque)
bellardbeac80c2006-06-26 20:08:57 +00002686{
pbrookce1a14d2006-08-07 02:38:06 +00002687 BlockDriverAIOCBSync *acb = opaque;
aliguorif141eaf2009-04-07 18:43:24 +00002688
aliguorif141eaf2009-04-07 18:43:24 +00002689 if (!acb->is_write)
2690 qemu_iovec_from_buffer(acb->qiov, acb->bounce, acb->qiov->size);
aliguoriceb42de2009-04-07 18:43:28 +00002691 qemu_vfree(acb->bounce);
pbrookce1a14d2006-08-07 02:38:06 +00002692 acb->common.cb(acb->common.opaque, acb->ret);
Dor Laor6a7ad292009-06-01 12:07:23 +03002693 qemu_bh_delete(acb->bh);
Avi Kivity36afc452009-06-23 16:20:36 +03002694 acb->bh = NULL;
pbrookce1a14d2006-08-07 02:38:06 +00002695 qemu_aio_release(acb);
bellardbeac80c2006-06-26 20:08:57 +00002696}
bellardbeac80c2006-06-26 20:08:57 +00002697
aliguorif141eaf2009-04-07 18:43:24 +00002698static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
2699 int64_t sector_num,
2700 QEMUIOVector *qiov,
2701 int nb_sectors,
2702 BlockDriverCompletionFunc *cb,
2703 void *opaque,
2704 int is_write)
2705
bellardea2384d2004-08-01 21:59:26 +00002706{
pbrookce1a14d2006-08-07 02:38:06 +00002707 BlockDriverAIOCBSync *acb;
pbrookce1a14d2006-08-07 02:38:06 +00002708
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002709 acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
aliguorif141eaf2009-04-07 18:43:24 +00002710 acb->is_write = is_write;
2711 acb->qiov = qiov;
aliguorie268ca52009-04-22 20:20:00 +00002712 acb->bounce = qemu_blockalign(bs, qiov->size);
aliguorif141eaf2009-04-07 18:43:24 +00002713
pbrookce1a14d2006-08-07 02:38:06 +00002714 if (!acb->bh)
2715 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
aliguorif141eaf2009-04-07 18:43:24 +00002716
2717 if (is_write) {
2718 qemu_iovec_to_buffer(acb->qiov, acb->bounce);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002719 acb->ret = bs->drv->bdrv_write(bs, sector_num, acb->bounce, nb_sectors);
aliguorif141eaf2009-04-07 18:43:24 +00002720 } else {
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002721 acb->ret = bs->drv->bdrv_read(bs, sector_num, acb->bounce, nb_sectors);
aliguorif141eaf2009-04-07 18:43:24 +00002722 }
2723
pbrookce1a14d2006-08-07 02:38:06 +00002724 qemu_bh_schedule(acb->bh);
aliguorif141eaf2009-04-07 18:43:24 +00002725
pbrookce1a14d2006-08-07 02:38:06 +00002726 return &acb->common;
pbrook7a6cba62006-06-04 11:39:07 +00002727}
2728
aliguorif141eaf2009-04-07 18:43:24 +00002729static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
2730 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
pbrookce1a14d2006-08-07 02:38:06 +00002731 BlockDriverCompletionFunc *cb, void *opaque)
bellard83f64092006-08-01 16:21:11 +00002732{
aliguorif141eaf2009-04-07 18:43:24 +00002733 return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
bellard83f64092006-08-01 16:21:11 +00002734}
2735
aliguorif141eaf2009-04-07 18:43:24 +00002736static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
2737 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
2738 BlockDriverCompletionFunc *cb, void *opaque)
2739{
2740 return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
2741}
2742
Kevin Wolf68485422011-06-30 10:05:46 +02002743
2744typedef struct BlockDriverAIOCBCoroutine {
2745 BlockDriverAIOCB common;
2746 BlockRequest req;
2747 bool is_write;
2748 QEMUBH* bh;
2749} BlockDriverAIOCBCoroutine;
2750
2751static void bdrv_aio_co_cancel_em(BlockDriverAIOCB *blockacb)
2752{
2753 qemu_aio_flush();
2754}
2755
2756static AIOPool bdrv_em_co_aio_pool = {
2757 .aiocb_size = sizeof(BlockDriverAIOCBCoroutine),
2758 .cancel = bdrv_aio_co_cancel_em,
2759};
2760
2761static void bdrv_co_rw_bh(void *opaque)
2762{
2763 BlockDriverAIOCBCoroutine *acb = opaque;
2764
2765 acb->common.cb(acb->common.opaque, acb->req.error);
2766 qemu_bh_delete(acb->bh);
2767 qemu_aio_release(acb);
2768}
2769
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002770/* Invoke .bdrv_co_readv/.bdrv_co_writev */
Kevin Wolf68485422011-06-30 10:05:46 +02002771static void coroutine_fn bdrv_co_rw(void *opaque)
2772{
2773 BlockDriverAIOCBCoroutine *acb = opaque;
2774 BlockDriverState *bs = acb->common.bs;
2775
2776 if (!acb->is_write) {
2777 acb->req.error = bs->drv->bdrv_co_readv(bs, acb->req.sector,
2778 acb->req.nb_sectors, acb->req.qiov);
2779 } else {
2780 acb->req.error = bs->drv->bdrv_co_writev(bs, acb->req.sector,
2781 acb->req.nb_sectors, acb->req.qiov);
2782 }
2783
2784 acb->bh = qemu_bh_new(bdrv_co_rw_bh, acb);
2785 qemu_bh_schedule(acb->bh);
2786}
2787
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002788/* Invoke bdrv_co_do_readv/bdrv_co_do_writev */
2789static void coroutine_fn bdrv_co_do_rw(void *opaque)
2790{
2791 BlockDriverAIOCBCoroutine *acb = opaque;
2792 BlockDriverState *bs = acb->common.bs;
2793
2794 if (!acb->is_write) {
2795 acb->req.error = bdrv_co_do_readv(bs, acb->req.sector,
2796 acb->req.nb_sectors, acb->req.qiov);
2797 } else {
2798 acb->req.error = bdrv_co_do_writev(bs, acb->req.sector,
2799 acb->req.nb_sectors, acb->req.qiov);
2800 }
2801
2802 acb->bh = qemu_bh_new(bdrv_co_rw_bh, acb);
2803 qemu_bh_schedule(acb->bh);
2804}
2805
Kevin Wolf68485422011-06-30 10:05:46 +02002806static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
2807 int64_t sector_num,
2808 QEMUIOVector *qiov,
2809 int nb_sectors,
2810 BlockDriverCompletionFunc *cb,
2811 void *opaque,
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002812 bool is_write,
2813 CoroutineEntry *entry)
Kevin Wolf68485422011-06-30 10:05:46 +02002814{
2815 Coroutine *co;
2816 BlockDriverAIOCBCoroutine *acb;
2817
2818 acb = qemu_aio_get(&bdrv_em_co_aio_pool, bs, cb, opaque);
2819 acb->req.sector = sector_num;
2820 acb->req.nb_sectors = nb_sectors;
2821 acb->req.qiov = qiov;
2822 acb->is_write = is_write;
2823
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002824 co = qemu_coroutine_create(entry);
Kevin Wolf68485422011-06-30 10:05:46 +02002825 qemu_coroutine_enter(co, acb);
2826
2827 return &acb->common;
2828}
2829
2830static BlockDriverAIOCB *bdrv_co_aio_readv_em(BlockDriverState *bs,
2831 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
2832 BlockDriverCompletionFunc *cb, void *opaque)
2833{
2834 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque,
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002835 false, bdrv_co_rw);
Kevin Wolf68485422011-06-30 10:05:46 +02002836}
2837
2838static BlockDriverAIOCB *bdrv_co_aio_writev_em(BlockDriverState *bs,
2839 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
2840 BlockDriverCompletionFunc *cb, void *opaque)
2841{
2842 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque,
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002843 true, bdrv_co_rw);
Kevin Wolf68485422011-06-30 10:05:46 +02002844}
2845
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002846static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
2847 BlockDriverCompletionFunc *cb, void *opaque)
2848{
2849 BlockDriverAIOCBSync *acb;
2850
2851 acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
2852 acb->is_write = 1; /* don't bounce in the completion hadler */
2853 acb->qiov = NULL;
2854 acb->bounce = NULL;
2855 acb->ret = 0;
2856
2857 if (!acb->bh)
2858 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
2859
2860 bdrv_flush(bs);
2861 qemu_bh_schedule(acb->bh);
2862 return &acb->common;
2863}
2864
Alexander Graf016f5cf2010-05-26 17:51:49 +02002865static BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
2866 BlockDriverCompletionFunc *cb, void *opaque)
2867{
2868 BlockDriverAIOCBSync *acb;
2869
2870 acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
2871 acb->is_write = 1; /* don't bounce in the completion handler */
2872 acb->qiov = NULL;
2873 acb->bounce = NULL;
2874 acb->ret = 0;
2875
2876 if (!acb->bh) {
2877 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
2878 }
2879
2880 qemu_bh_schedule(acb->bh);
2881 return &acb->common;
2882}
2883
bellard83f64092006-08-01 16:21:11 +00002884/**************************************************************/
2885/* sync block device emulation */
2886
2887static void bdrv_rw_em_cb(void *opaque, int ret)
2888{
2889 *(int *)opaque = ret;
2890}
2891
ths5fafdf22007-09-16 21:08:06 +00002892static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
bellard83f64092006-08-01 16:21:11 +00002893 uint8_t *buf, int nb_sectors)
2894{
pbrookce1a14d2006-08-07 02:38:06 +00002895 int async_ret;
2896 BlockDriverAIOCB *acb;
aliguorif141eaf2009-04-07 18:43:24 +00002897 struct iovec iov;
2898 QEMUIOVector qiov;
bellard83f64092006-08-01 16:21:11 +00002899
bellard83f64092006-08-01 16:21:11 +00002900 async_ret = NOT_DONE;
blueswir13f4cb3d2009-04-13 16:31:01 +00002901 iov.iov_base = (void *)buf;
Jes Sorenseneb5a3162010-05-27 16:20:31 +02002902 iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
aliguorif141eaf2009-04-07 18:43:24 +00002903 qemu_iovec_init_external(&qiov, &iov, 1);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002904
2905 acb = bs->drv->bdrv_aio_readv(bs, sector_num, &qiov, nb_sectors,
2906 bdrv_rw_em_cb, &async_ret);
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002907 if (acb == NULL) {
2908 async_ret = -1;
2909 goto fail;
2910 }
aliguoribaf35cb2008-09-10 15:45:19 +00002911
bellard83f64092006-08-01 16:21:11 +00002912 while (async_ret == NOT_DONE) {
2913 qemu_aio_wait();
2914 }
aliguoribaf35cb2008-09-10 15:45:19 +00002915
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002916
2917fail:
bellard83f64092006-08-01 16:21:11 +00002918 return async_ret;
2919}
2920
2921static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
2922 const uint8_t *buf, int nb_sectors)
2923{
pbrookce1a14d2006-08-07 02:38:06 +00002924 int async_ret;
2925 BlockDriverAIOCB *acb;
aliguorif141eaf2009-04-07 18:43:24 +00002926 struct iovec iov;
2927 QEMUIOVector qiov;
bellard83f64092006-08-01 16:21:11 +00002928
bellard83f64092006-08-01 16:21:11 +00002929 async_ret = NOT_DONE;
aliguorif141eaf2009-04-07 18:43:24 +00002930 iov.iov_base = (void *)buf;
Jes Sorenseneb5a3162010-05-27 16:20:31 +02002931 iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
aliguorif141eaf2009-04-07 18:43:24 +00002932 qemu_iovec_init_external(&qiov, &iov, 1);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002933
2934 acb = bs->drv->bdrv_aio_writev(bs, sector_num, &qiov, nb_sectors,
2935 bdrv_rw_em_cb, &async_ret);
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002936 if (acb == NULL) {
2937 async_ret = -1;
2938 goto fail;
2939 }
bellard83f64092006-08-01 16:21:11 +00002940 while (async_ret == NOT_DONE) {
2941 qemu_aio_wait();
2942 }
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002943
2944fail:
bellard83f64092006-08-01 16:21:11 +00002945 return async_ret;
2946}
bellardea2384d2004-08-01 21:59:26 +00002947
2948void bdrv_init(void)
2949{
Anthony Liguori5efa9d52009-05-09 17:03:42 -05002950 module_call_init(MODULE_INIT_BLOCK);
bellardea2384d2004-08-01 21:59:26 +00002951}
pbrookce1a14d2006-08-07 02:38:06 +00002952
Markus Armbrustereb852012009-10-27 18:41:44 +01002953void bdrv_init_with_whitelist(void)
2954{
2955 use_bdrv_whitelist = 1;
2956 bdrv_init();
2957}
2958
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002959void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
2960 BlockDriverCompletionFunc *cb, void *opaque)
aliguori6bbff9a2009-03-20 18:25:59 +00002961{
pbrookce1a14d2006-08-07 02:38:06 +00002962 BlockDriverAIOCB *acb;
2963
aliguori6bbff9a2009-03-20 18:25:59 +00002964 if (pool->free_aiocb) {
2965 acb = pool->free_aiocb;
2966 pool->free_aiocb = acb->next;
pbrookce1a14d2006-08-07 02:38:06 +00002967 } else {
Anthony Liguori7267c092011-08-20 22:09:37 -05002968 acb = g_malloc0(pool->aiocb_size);
aliguori6bbff9a2009-03-20 18:25:59 +00002969 acb->pool = pool;
pbrookce1a14d2006-08-07 02:38:06 +00002970 }
2971 acb->bs = bs;
2972 acb->cb = cb;
2973 acb->opaque = opaque;
2974 return acb;
2975}
2976
2977void qemu_aio_release(void *p)
2978{
aliguori6bbff9a2009-03-20 18:25:59 +00002979 BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p;
2980 AIOPool *pool = acb->pool;
2981 acb->next = pool->free_aiocb;
2982 pool->free_aiocb = acb;
pbrookce1a14d2006-08-07 02:38:06 +00002983}
bellard19cb3732006-08-19 11:45:59 +00002984
2985/**************************************************************/
Kevin Wolff9f05dc2011-07-15 13:50:26 +02002986/* Coroutine block device emulation */
2987
2988typedef struct CoroutineIOCompletion {
2989 Coroutine *coroutine;
2990 int ret;
2991} CoroutineIOCompletion;
2992
2993static void bdrv_co_io_em_complete(void *opaque, int ret)
2994{
2995 CoroutineIOCompletion *co = opaque;
2996
2997 co->ret = ret;
2998 qemu_coroutine_enter(co->coroutine, NULL);
2999}
3000
3001static int coroutine_fn bdrv_co_io_em(BlockDriverState *bs, int64_t sector_num,
3002 int nb_sectors, QEMUIOVector *iov,
3003 bool is_write)
3004{
3005 CoroutineIOCompletion co = {
3006 .coroutine = qemu_coroutine_self(),
3007 };
3008 BlockDriverAIOCB *acb;
3009
3010 if (is_write) {
Stefan Hajnoczia652d162011-10-05 17:17:02 +01003011 acb = bs->drv->bdrv_aio_writev(bs, sector_num, iov, nb_sectors,
3012 bdrv_co_io_em_complete, &co);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003013 } else {
Stefan Hajnoczia652d162011-10-05 17:17:02 +01003014 acb = bs->drv->bdrv_aio_readv(bs, sector_num, iov, nb_sectors,
3015 bdrv_co_io_em_complete, &co);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003016 }
3017
Stefan Hajnoczi59370aa2011-09-30 17:34:58 +01003018 trace_bdrv_co_io_em(bs, sector_num, nb_sectors, is_write, acb);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003019 if (!acb) {
3020 return -EIO;
3021 }
3022 qemu_coroutine_yield();
3023
3024 return co.ret;
3025}
3026
3027static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
3028 int64_t sector_num, int nb_sectors,
3029 QEMUIOVector *iov)
3030{
3031 return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, false);
3032}
3033
3034static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
3035 int64_t sector_num, int nb_sectors,
3036 QEMUIOVector *iov)
3037{
3038 return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, true);
3039}
3040
Kevin Wolfe7a8a782011-07-15 16:05:00 +02003041static int coroutine_fn bdrv_co_flush_em(BlockDriverState *bs)
3042{
3043 CoroutineIOCompletion co = {
3044 .coroutine = qemu_coroutine_self(),
3045 };
3046 BlockDriverAIOCB *acb;
3047
3048 acb = bdrv_aio_flush(bs, bdrv_co_io_em_complete, &co);
3049 if (!acb) {
3050 return -EIO;
3051 }
3052 qemu_coroutine_yield();
3053 return co.ret;
3054}
3055
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003056/**************************************************************/
bellard19cb3732006-08-19 11:45:59 +00003057/* removable device support */
3058
3059/**
3060 * Return TRUE if the media is present
3061 */
3062int bdrv_is_inserted(BlockDriverState *bs)
3063{
3064 BlockDriver *drv = bs->drv;
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003065
bellard19cb3732006-08-19 11:45:59 +00003066 if (!drv)
3067 return 0;
3068 if (!drv->bdrv_is_inserted)
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003069 return 1;
3070 return drv->bdrv_is_inserted(bs);
bellard19cb3732006-08-19 11:45:59 +00003071}
3072
3073/**
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003074 * Return whether the media changed since the last call to this
3075 * function, or -ENOTSUP if we don't know. Most drivers don't know.
bellard19cb3732006-08-19 11:45:59 +00003076 */
3077int bdrv_media_changed(BlockDriverState *bs)
3078{
3079 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003080
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003081 if (drv && drv->bdrv_media_changed) {
3082 return drv->bdrv_media_changed(bs);
3083 }
3084 return -ENOTSUP;
bellard19cb3732006-08-19 11:45:59 +00003085}
3086
3087/**
3088 * If eject_flag is TRUE, eject the media. Otherwise, close the tray
3089 */
Markus Armbrusterfdec4402011-09-06 18:58:45 +02003090void bdrv_eject(BlockDriverState *bs, int eject_flag)
bellard19cb3732006-08-19 11:45:59 +00003091{
3092 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003093
Markus Armbruster822e1cd2011-07-20 18:23:42 +02003094 if (drv && drv->bdrv_eject) {
3095 drv->bdrv_eject(bs, eject_flag);
bellard19cb3732006-08-19 11:45:59 +00003096 }
bellard19cb3732006-08-19 11:45:59 +00003097}
3098
bellard19cb3732006-08-19 11:45:59 +00003099/**
3100 * Lock or unlock the media (if it is locked, the user won't be able
3101 * to eject it manually).
3102 */
Markus Armbruster025e8492011-09-06 18:58:47 +02003103void bdrv_lock_medium(BlockDriverState *bs, bool locked)
bellard19cb3732006-08-19 11:45:59 +00003104{
3105 BlockDriver *drv = bs->drv;
3106
Markus Armbruster025e8492011-09-06 18:58:47 +02003107 trace_bdrv_lock_medium(bs, locked);
Stefan Hajnoczib8c6d092011-03-29 20:04:40 +01003108
Markus Armbruster025e8492011-09-06 18:58:47 +02003109 if (drv && drv->bdrv_lock_medium) {
3110 drv->bdrv_lock_medium(bs, locked);
bellard19cb3732006-08-19 11:45:59 +00003111 }
3112}
ths985a03b2007-12-24 16:10:43 +00003113
3114/* needed for generic scsi interface */
3115
3116int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
3117{
3118 BlockDriver *drv = bs->drv;
3119
3120 if (drv && drv->bdrv_ioctl)
3121 return drv->bdrv_ioctl(bs, req, buf);
3122 return -ENOTSUP;
3123}
aliguori7d780662009-03-12 19:57:08 +00003124
aliguori221f7152009-03-28 17:28:41 +00003125BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
3126 unsigned long int req, void *buf,
3127 BlockDriverCompletionFunc *cb, void *opaque)
aliguori7d780662009-03-12 19:57:08 +00003128{
aliguori221f7152009-03-28 17:28:41 +00003129 BlockDriver *drv = bs->drv;
aliguori7d780662009-03-12 19:57:08 +00003130
aliguori221f7152009-03-28 17:28:41 +00003131 if (drv && drv->bdrv_aio_ioctl)
3132 return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
3133 return NULL;
aliguori7d780662009-03-12 19:57:08 +00003134}
aliguorie268ca52009-04-22 20:20:00 +00003135
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003136void bdrv_set_buffer_alignment(BlockDriverState *bs, int align)
3137{
3138 bs->buffer_alignment = align;
3139}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003140
aliguorie268ca52009-04-22 20:20:00 +00003141void *qemu_blockalign(BlockDriverState *bs, size_t size)
3142{
3143 return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
3144}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003145
3146void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable)
3147{
3148 int64_t bitmap_size;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003149
Liran Schouraaa0eb72010-01-26 10:31:48 +02003150 bs->dirty_count = 0;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003151 if (enable) {
Jan Kiszkac6d22832009-11-30 18:21:20 +01003152 if (!bs->dirty_bitmap) {
3153 bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) +
3154 BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1;
3155 bitmap_size /= BDRV_SECTORS_PER_DIRTY_CHUNK * 8;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003156
Anthony Liguori7267c092011-08-20 22:09:37 -05003157 bs->dirty_bitmap = g_malloc0(bitmap_size);
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003158 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003159 } else {
Jan Kiszkac6d22832009-11-30 18:21:20 +01003160 if (bs->dirty_bitmap) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003161 g_free(bs->dirty_bitmap);
Jan Kiszkac6d22832009-11-30 18:21:20 +01003162 bs->dirty_bitmap = NULL;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003163 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003164 }
3165}
3166
3167int bdrv_get_dirty(BlockDriverState *bs, int64_t sector)
3168{
Jan Kiszka6ea44302009-11-30 18:21:19 +01003169 int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003170
Jan Kiszkac6d22832009-11-30 18:21:20 +01003171 if (bs->dirty_bitmap &&
3172 (sector << BDRV_SECTOR_BITS) < bdrv_getlength(bs)) {
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02003173 return !!(bs->dirty_bitmap[chunk / (sizeof(unsigned long) * 8)] &
3174 (1UL << (chunk % (sizeof(unsigned long) * 8))));
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003175 } else {
3176 return 0;
3177 }
3178}
3179
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003180void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
3181 int nr_sectors)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003182{
3183 set_dirty_bitmap(bs, cur_sector, nr_sectors, 0);
3184}
Liran Schouraaa0eb72010-01-26 10:31:48 +02003185
3186int64_t bdrv_get_dirty_count(BlockDriverState *bs)
3187{
3188 return bs->dirty_count;
3189}
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003190
Marcelo Tosattidb593f22011-01-26 12:12:34 -02003191void bdrv_set_in_use(BlockDriverState *bs, int in_use)
3192{
3193 assert(bs->in_use != in_use);
3194 bs->in_use = in_use;
3195}
3196
3197int bdrv_in_use(BlockDriverState *bs)
3198{
3199 return bs->in_use;
3200}
3201
Luiz Capitulino28a72822011-09-26 17:43:50 -03003202void bdrv_iostatus_enable(BlockDriverState *bs)
3203{
3204 bs->iostatus = BDRV_IOS_OK;
3205}
3206
3207/* The I/O status is only enabled if the drive explicitly
3208 * enables it _and_ the VM is configured to stop on errors */
3209bool bdrv_iostatus_is_enabled(const BlockDriverState *bs)
3210{
3211 return (bs->iostatus != BDRV_IOS_INVAL &&
3212 (bs->on_write_error == BLOCK_ERR_STOP_ENOSPC ||
3213 bs->on_write_error == BLOCK_ERR_STOP_ANY ||
3214 bs->on_read_error == BLOCK_ERR_STOP_ANY));
3215}
3216
3217void bdrv_iostatus_disable(BlockDriverState *bs)
3218{
3219 bs->iostatus = BDRV_IOS_INVAL;
3220}
3221
3222void bdrv_iostatus_reset(BlockDriverState *bs)
3223{
3224 if (bdrv_iostatus_is_enabled(bs)) {
3225 bs->iostatus = BDRV_IOS_OK;
3226 }
3227}
3228
3229/* XXX: Today this is set by device models because it makes the implementation
3230 quite simple. However, the block layer knows about the error, so it's
3231 possible to implement this without device models being involved */
3232void bdrv_iostatus_set_err(BlockDriverState *bs, int error)
3233{
3234 if (bdrv_iostatus_is_enabled(bs) && bs->iostatus == BDRV_IOS_OK) {
3235 assert(error >= 0);
3236 bs->iostatus = error == ENOSPC ? BDRV_IOS_ENOSPC : BDRV_IOS_FAILED;
3237 }
3238}
3239
Christoph Hellwiga597e792011-08-25 08:26:01 +02003240void
3241bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, int64_t bytes,
3242 enum BlockAcctType type)
3243{
3244 assert(type < BDRV_MAX_IOTYPE);
3245
3246 cookie->bytes = bytes;
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02003247 cookie->start_time_ns = get_clock();
Christoph Hellwiga597e792011-08-25 08:26:01 +02003248 cookie->type = type;
3249}
3250
3251void
3252bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie)
3253{
3254 assert(cookie->type < BDRV_MAX_IOTYPE);
3255
3256 bs->nr_bytes[cookie->type] += cookie->bytes;
3257 bs->nr_ops[cookie->type]++;
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02003258 bs->total_time_ns[cookie->type] += get_clock() - cookie->start_time_ns;
Christoph Hellwiga597e792011-08-25 08:26:01 +02003259}
3260
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003261int bdrv_img_create(const char *filename, const char *fmt,
3262 const char *base_filename, const char *base_fmt,
3263 char *options, uint64_t img_size, int flags)
3264{
3265 QEMUOptionParameter *param = NULL, *create_options = NULL;
Kevin Wolfd2208942011-06-01 14:03:31 +02003266 QEMUOptionParameter *backing_fmt, *backing_file, *size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003267 BlockDriverState *bs = NULL;
3268 BlockDriver *drv, *proto_drv;
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003269 BlockDriver *backing_drv = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003270 int ret = 0;
3271
3272 /* Find driver and parse its options */
3273 drv = bdrv_find_format(fmt);
3274 if (!drv) {
3275 error_report("Unknown file format '%s'", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003276 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003277 goto out;
3278 }
3279
3280 proto_drv = bdrv_find_protocol(filename);
3281 if (!proto_drv) {
3282 error_report("Unknown protocol '%s'", filename);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003283 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003284 goto out;
3285 }
3286
3287 create_options = append_option_parameters(create_options,
3288 drv->create_options);
3289 create_options = append_option_parameters(create_options,
3290 proto_drv->create_options);
3291
3292 /* Create parameter list with default values */
3293 param = parse_option_parameters("", create_options, param);
3294
3295 set_option_parameter_int(param, BLOCK_OPT_SIZE, img_size);
3296
3297 /* Parse -o options */
3298 if (options) {
3299 param = parse_option_parameters(options, create_options, param);
3300 if (param == NULL) {
3301 error_report("Invalid options for file format '%s'.", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003302 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003303 goto out;
3304 }
3305 }
3306
3307 if (base_filename) {
3308 if (set_option_parameter(param, BLOCK_OPT_BACKING_FILE,
3309 base_filename)) {
3310 error_report("Backing file not supported for file format '%s'",
3311 fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003312 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003313 goto out;
3314 }
3315 }
3316
3317 if (base_fmt) {
3318 if (set_option_parameter(param, BLOCK_OPT_BACKING_FMT, base_fmt)) {
3319 error_report("Backing file format not supported for file "
3320 "format '%s'", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003321 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003322 goto out;
3323 }
3324 }
3325
Jes Sorensen792da932010-12-16 13:52:17 +01003326 backing_file = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
3327 if (backing_file && backing_file->value.s) {
3328 if (!strcmp(filename, backing_file->value.s)) {
3329 error_report("Error: Trying to create an image with the "
3330 "same filename as the backing file");
Jes Sorensen4f70f242010-12-16 13:52:18 +01003331 ret = -EINVAL;
Jes Sorensen792da932010-12-16 13:52:17 +01003332 goto out;
3333 }
3334 }
3335
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003336 backing_fmt = get_option_parameter(param, BLOCK_OPT_BACKING_FMT);
3337 if (backing_fmt && backing_fmt->value.s) {
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003338 backing_drv = bdrv_find_format(backing_fmt->value.s);
3339 if (!backing_drv) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003340 error_report("Unknown backing file format '%s'",
3341 backing_fmt->value.s);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003342 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003343 goto out;
3344 }
3345 }
3346
3347 // The size for the image must always be specified, with one exception:
3348 // If we are using a backing file, we can obtain the size from there
Kevin Wolfd2208942011-06-01 14:03:31 +02003349 size = get_option_parameter(param, BLOCK_OPT_SIZE);
3350 if (size && size->value.n == -1) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003351 if (backing_file && backing_file->value.s) {
3352 uint64_t size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003353 char buf[32];
3354
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003355 bs = bdrv_new("");
3356
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003357 ret = bdrv_open(bs, backing_file->value.s, flags, backing_drv);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003358 if (ret < 0) {
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003359 error_report("Could not open '%s'", backing_file->value.s);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003360 goto out;
3361 }
3362 bdrv_get_geometry(bs, &size);
3363 size *= 512;
3364
3365 snprintf(buf, sizeof(buf), "%" PRId64, size);
3366 set_option_parameter(param, BLOCK_OPT_SIZE, buf);
3367 } else {
3368 error_report("Image creation needs a size parameter");
Jes Sorensen4f70f242010-12-16 13:52:18 +01003369 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003370 goto out;
3371 }
3372 }
3373
3374 printf("Formatting '%s', fmt=%s ", filename, fmt);
3375 print_option_parameters(param);
3376 puts("");
3377
3378 ret = bdrv_create(drv, filename, param);
3379
3380 if (ret < 0) {
3381 if (ret == -ENOTSUP) {
3382 error_report("Formatting or formatting option not supported for "
3383 "file format '%s'", fmt);
3384 } else if (ret == -EFBIG) {
3385 error_report("The image size is too large for file format '%s'",
3386 fmt);
3387 } else {
3388 error_report("%s: error while creating %s: %s", filename, fmt,
3389 strerror(-ret));
3390 }
3391 }
3392
3393out:
3394 free_option_parameters(create_options);
3395 free_option_parameters(param);
3396
3397 if (bs) {
3398 bdrv_delete(bs);
3399 }
Jes Sorensen4f70f242010-12-16 13:52:18 +01003400
3401 return ret;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003402}