blob: 02e15caee62df8346a98e3ddf27167f946757045 [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
Marcelo Tosatti4dcafbb2010-11-08 17:02:55 -02002388typedef struct BlockCompleteData {
2389 BlockDriverCompletionFunc *cb;
2390 void *opaque;
2391 BlockDriverState *bs;
2392 int64_t sector_num;
2393 int nb_sectors;
2394} BlockCompleteData;
2395
2396static void block_complete_cb(void *opaque, int ret)
2397{
2398 BlockCompleteData *b = opaque;
2399
2400 if (b->bs->dirty_bitmap) {
2401 set_dirty_bitmap(b->bs, b->sector_num, b->nb_sectors, 1);
2402 }
2403 b->cb(b->opaque, ret);
Anthony Liguori7267c092011-08-20 22:09:37 -05002404 g_free(b);
Marcelo Tosatti4dcafbb2010-11-08 17:02:55 -02002405}
2406
2407static BlockCompleteData *blk_dirty_cb_alloc(BlockDriverState *bs,
2408 int64_t sector_num,
2409 int nb_sectors,
2410 BlockDriverCompletionFunc *cb,
2411 void *opaque)
2412{
Anthony Liguori7267c092011-08-20 22:09:37 -05002413 BlockCompleteData *blkdata = g_malloc0(sizeof(BlockCompleteData));
Marcelo Tosatti4dcafbb2010-11-08 17:02:55 -02002414
2415 blkdata->bs = bs;
2416 blkdata->cb = cb;
2417 blkdata->opaque = opaque;
2418 blkdata->sector_num = sector_num;
2419 blkdata->nb_sectors = nb_sectors;
2420
2421 return blkdata;
2422}
2423
aliguorif141eaf2009-04-07 18:43:24 +00002424BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
2425 QEMUIOVector *qiov, int nb_sectors,
2426 BlockDriverCompletionFunc *cb, void *opaque)
bellard83f64092006-08-01 16:21:11 +00002427{
bellard83f64092006-08-01 16:21:11 +00002428 BlockDriver *drv = bs->drv;
thsa36e69d2007-12-02 05:18:19 +00002429 BlockDriverAIOCB *ret;
Marcelo Tosatti4dcafbb2010-11-08 17:02:55 -02002430 BlockCompleteData *blk_cb_data;
bellard83f64092006-08-01 16:21:11 +00002431
Stefan Hajnoczibbf0a442010-10-05 14:28:53 +01002432 trace_bdrv_aio_writev(bs, sector_num, nb_sectors, opaque);
2433
bellard19cb3732006-08-19 11:45:59 +00002434 if (!drv)
pbrookce1a14d2006-08-07 02:38:06 +00002435 return NULL;
bellard83f64092006-08-01 16:21:11 +00002436 if (bs->read_only)
pbrookce1a14d2006-08-07 02:38:06 +00002437 return NULL;
aliguori71d07702009-03-03 17:37:16 +00002438 if (bdrv_check_request(bs, sector_num, nb_sectors))
2439 return NULL;
bellard83f64092006-08-01 16:21:11 +00002440
Jan Kiszkac6d22832009-11-30 18:21:20 +01002441 if (bs->dirty_bitmap) {
Marcelo Tosatti4dcafbb2010-11-08 17:02:55 -02002442 blk_cb_data = blk_dirty_cb_alloc(bs, sector_num, nb_sectors, cb,
2443 opaque);
2444 cb = &block_complete_cb;
2445 opaque = blk_cb_data;
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02002446 }
Jan Kiszkaa55eb922009-11-30 18:21:19 +01002447
aliguorif141eaf2009-04-07 18:43:24 +00002448 ret = drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors,
2449 cb, opaque);
thsa36e69d2007-12-02 05:18:19 +00002450
2451 if (ret) {
Kevin Wolf294cc352010-04-28 14:34:01 +02002452 if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
2453 bs->wr_highest_sector = sector_num + nb_sectors - 1;
2454 }
thsa36e69d2007-12-02 05:18:19 +00002455 }
2456
2457 return ret;
bellard83f64092006-08-01 16:21:11 +00002458}
2459
Kevin Wolf40b4f532009-09-09 17:53:37 +02002460
2461typedef struct MultiwriteCB {
2462 int error;
2463 int num_requests;
2464 int num_callbacks;
2465 struct {
2466 BlockDriverCompletionFunc *cb;
2467 void *opaque;
2468 QEMUIOVector *free_qiov;
2469 void *free_buf;
2470 } callbacks[];
2471} MultiwriteCB;
2472
2473static void multiwrite_user_cb(MultiwriteCB *mcb)
2474{
2475 int i;
2476
2477 for (i = 0; i < mcb->num_callbacks; i++) {
2478 mcb->callbacks[i].cb(mcb->callbacks[i].opaque, mcb->error);
Stefan Hajnoczi1e1ea482010-04-21 20:35:45 +01002479 if (mcb->callbacks[i].free_qiov) {
2480 qemu_iovec_destroy(mcb->callbacks[i].free_qiov);
2481 }
Anthony Liguori7267c092011-08-20 22:09:37 -05002482 g_free(mcb->callbacks[i].free_qiov);
Herve Poussineauf8a83242010-01-24 21:23:56 +00002483 qemu_vfree(mcb->callbacks[i].free_buf);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002484 }
2485}
2486
2487static void multiwrite_cb(void *opaque, int ret)
2488{
2489 MultiwriteCB *mcb = opaque;
2490
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002491 trace_multiwrite_cb(mcb, ret);
2492
Kevin Wolfcb6d3ca2010-04-01 22:48:44 +02002493 if (ret < 0 && !mcb->error) {
Kevin Wolf40b4f532009-09-09 17:53:37 +02002494 mcb->error = ret;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002495 }
2496
2497 mcb->num_requests--;
2498 if (mcb->num_requests == 0) {
Kevin Wolfde189a12010-07-01 16:08:51 +02002499 multiwrite_user_cb(mcb);
Anthony Liguori7267c092011-08-20 22:09:37 -05002500 g_free(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002501 }
2502}
2503
2504static int multiwrite_req_compare(const void *a, const void *b)
2505{
Christoph Hellwig77be4362010-05-19 20:53:10 +02002506 const BlockRequest *req1 = a, *req2 = b;
2507
2508 /*
2509 * Note that we can't simply subtract req2->sector from req1->sector
2510 * here as that could overflow the return value.
2511 */
2512 if (req1->sector > req2->sector) {
2513 return 1;
2514 } else if (req1->sector < req2->sector) {
2515 return -1;
2516 } else {
2517 return 0;
2518 }
Kevin Wolf40b4f532009-09-09 17:53:37 +02002519}
2520
2521/*
2522 * Takes a bunch of requests and tries to merge them. Returns the number of
2523 * requests that remain after merging.
2524 */
2525static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs,
2526 int num_reqs, MultiwriteCB *mcb)
2527{
2528 int i, outidx;
2529
2530 // Sort requests by start sector
2531 qsort(reqs, num_reqs, sizeof(*reqs), &multiwrite_req_compare);
2532
2533 // Check if adjacent requests touch the same clusters. If so, combine them,
2534 // filling up gaps with zero sectors.
2535 outidx = 0;
2536 for (i = 1; i < num_reqs; i++) {
2537 int merge = 0;
2538 int64_t oldreq_last = reqs[outidx].sector + reqs[outidx].nb_sectors;
2539
2540 // This handles the cases that are valid for all block drivers, namely
2541 // exactly sequential writes and overlapping writes.
2542 if (reqs[i].sector <= oldreq_last) {
2543 merge = 1;
2544 }
2545
2546 // The block driver may decide that it makes sense to combine requests
2547 // even if there is a gap of some sectors between them. In this case,
2548 // the gap is filled with zeros (therefore only applicable for yet
2549 // unused space in format like qcow2).
2550 if (!merge && bs->drv->bdrv_merge_requests) {
2551 merge = bs->drv->bdrv_merge_requests(bs, &reqs[outidx], &reqs[i]);
2552 }
2553
Christoph Hellwige2a305f2010-01-26 14:49:08 +01002554 if (reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1 > IOV_MAX) {
2555 merge = 0;
2556 }
2557
Kevin Wolf40b4f532009-09-09 17:53:37 +02002558 if (merge) {
2559 size_t size;
Anthony Liguori7267c092011-08-20 22:09:37 -05002560 QEMUIOVector *qiov = g_malloc0(sizeof(*qiov));
Kevin Wolf40b4f532009-09-09 17:53:37 +02002561 qemu_iovec_init(qiov,
2562 reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1);
2563
2564 // Add the first request to the merged one. If the requests are
2565 // overlapping, drop the last sectors of the first request.
2566 size = (reqs[i].sector - reqs[outidx].sector) << 9;
2567 qemu_iovec_concat(qiov, reqs[outidx].qiov, size);
2568
2569 // We might need to add some zeros between the two requests
2570 if (reqs[i].sector > oldreq_last) {
2571 size_t zero_bytes = (reqs[i].sector - oldreq_last) << 9;
2572 uint8_t *buf = qemu_blockalign(bs, zero_bytes);
2573 memset(buf, 0, zero_bytes);
2574 qemu_iovec_add(qiov, buf, zero_bytes);
2575 mcb->callbacks[i].free_buf = buf;
2576 }
2577
2578 // Add the second request
2579 qemu_iovec_concat(qiov, reqs[i].qiov, reqs[i].qiov->size);
2580
Kevin Wolfcbf1dff2010-05-21 11:09:42 +02002581 reqs[outidx].nb_sectors = qiov->size >> 9;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002582 reqs[outidx].qiov = qiov;
2583
2584 mcb->callbacks[i].free_qiov = reqs[outidx].qiov;
2585 } else {
2586 outidx++;
2587 reqs[outidx].sector = reqs[i].sector;
2588 reqs[outidx].nb_sectors = reqs[i].nb_sectors;
2589 reqs[outidx].qiov = reqs[i].qiov;
2590 }
2591 }
2592
2593 return outidx + 1;
2594}
2595
2596/*
2597 * Submit multiple AIO write requests at once.
2598 *
2599 * On success, the function returns 0 and all requests in the reqs array have
2600 * been submitted. In error case this function returns -1, and any of the
2601 * requests may or may not be submitted yet. In particular, this means that the
2602 * callback will be called for some of the requests, for others it won't. The
2603 * caller must check the error field of the BlockRequest to wait for the right
2604 * callbacks (if error != 0, no callback will be called).
2605 *
2606 * The implementation may modify the contents of the reqs array, e.g. to merge
2607 * requests. However, the fields opaque and error are left unmodified as they
2608 * are used to signal failure for a single request to the caller.
2609 */
2610int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs)
2611{
2612 BlockDriverAIOCB *acb;
2613 MultiwriteCB *mcb;
2614 int i;
2615
Ryan Harper301db7c2011-03-07 10:01:04 -06002616 /* don't submit writes if we don't have a medium */
2617 if (bs->drv == NULL) {
2618 for (i = 0; i < num_reqs; i++) {
2619 reqs[i].error = -ENOMEDIUM;
2620 }
2621 return -1;
2622 }
2623
Kevin Wolf40b4f532009-09-09 17:53:37 +02002624 if (num_reqs == 0) {
2625 return 0;
2626 }
2627
2628 // Create MultiwriteCB structure
Anthony Liguori7267c092011-08-20 22:09:37 -05002629 mcb = g_malloc0(sizeof(*mcb) + num_reqs * sizeof(*mcb->callbacks));
Kevin Wolf40b4f532009-09-09 17:53:37 +02002630 mcb->num_requests = 0;
2631 mcb->num_callbacks = num_reqs;
2632
2633 for (i = 0; i < num_reqs; i++) {
2634 mcb->callbacks[i].cb = reqs[i].cb;
2635 mcb->callbacks[i].opaque = reqs[i].opaque;
2636 }
2637
2638 // Check for mergable requests
2639 num_reqs = multiwrite_merge(bs, reqs, num_reqs, mcb);
2640
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002641 trace_bdrv_aio_multiwrite(mcb, mcb->num_callbacks, num_reqs);
2642
Kevin Wolf453f9a12010-07-02 14:01:21 +02002643 /*
2644 * Run the aio requests. As soon as one request can't be submitted
2645 * successfully, fail all requests that are not yet submitted (we must
2646 * return failure for all requests anyway)
2647 *
2648 * num_requests cannot be set to the right value immediately: If
2649 * bdrv_aio_writev fails for some request, num_requests would be too high
2650 * and therefore multiwrite_cb() would never recognize the multiwrite
2651 * request as completed. We also cannot use the loop variable i to set it
2652 * when the first request fails because the callback may already have been
2653 * called for previously submitted requests. Thus, num_requests must be
2654 * incremented for each request that is submitted.
2655 *
2656 * The problem that callbacks may be called early also means that we need
2657 * to take care that num_requests doesn't become 0 before all requests are
2658 * submitted - multiwrite_cb() would consider the multiwrite request
2659 * completed. A dummy request that is "completed" by a manual call to
2660 * multiwrite_cb() takes care of this.
2661 */
2662 mcb->num_requests = 1;
2663
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002664 // Run the aio requests
Kevin Wolf40b4f532009-09-09 17:53:37 +02002665 for (i = 0; i < num_reqs; i++) {
Kevin Wolf453f9a12010-07-02 14:01:21 +02002666 mcb->num_requests++;
Kevin Wolf40b4f532009-09-09 17:53:37 +02002667 acb = bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov,
2668 reqs[i].nb_sectors, multiwrite_cb, mcb);
2669
2670 if (acb == NULL) {
2671 // We can only fail the whole thing if no request has been
2672 // submitted yet. Otherwise we'll wait for the submitted AIOs to
2673 // complete and report the error in the callback.
Kevin Wolf453f9a12010-07-02 14:01:21 +02002674 if (i == 0) {
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002675 trace_bdrv_aio_multiwrite_earlyfail(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002676 goto fail;
2677 } else {
Stefan Hajnoczi6d519a52010-05-22 18:15:08 +01002678 trace_bdrv_aio_multiwrite_latefail(mcb, i);
Kevin Wolf7eb58a62010-04-06 18:24:07 +02002679 multiwrite_cb(mcb, -EIO);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002680 break;
2681 }
Kevin Wolf40b4f532009-09-09 17:53:37 +02002682 }
2683 }
2684
Kevin Wolf453f9a12010-07-02 14:01:21 +02002685 /* Complete the dummy request */
2686 multiwrite_cb(mcb, 0);
2687
Kevin Wolf40b4f532009-09-09 17:53:37 +02002688 return 0;
2689
2690fail:
Kevin Wolf453f9a12010-07-02 14:01:21 +02002691 for (i = 0; i < mcb->num_callbacks; i++) {
2692 reqs[i].error = -EIO;
2693 }
Anthony Liguori7267c092011-08-20 22:09:37 -05002694 g_free(mcb);
Kevin Wolf40b4f532009-09-09 17:53:37 +02002695 return -1;
2696}
2697
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002698BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
2699 BlockDriverCompletionFunc *cb, void *opaque)
2700{
2701 BlockDriver *drv = bs->drv;
2702
Stefan Hajnoczia13aac02011-03-07 07:58:04 +00002703 trace_bdrv_aio_flush(bs, opaque);
2704
Alexander Graf016f5cf2010-05-26 17:51:49 +02002705 if (bs->open_flags & BDRV_O_NO_FLUSH) {
2706 return bdrv_aio_noop_em(bs, cb, opaque);
2707 }
2708
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002709 if (!drv)
2710 return NULL;
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002711 return drv->bdrv_aio_flush(bs, cb, opaque);
2712}
2713
bellard83f64092006-08-01 16:21:11 +00002714void bdrv_aio_cancel(BlockDriverAIOCB *acb)
pbrookce1a14d2006-08-07 02:38:06 +00002715{
aliguori6bbff9a2009-03-20 18:25:59 +00002716 acb->pool->cancel(acb);
bellard83f64092006-08-01 16:21:11 +00002717}
2718
pbrookce1a14d2006-08-07 02:38:06 +00002719
bellard83f64092006-08-01 16:21:11 +00002720/**************************************************************/
2721/* async block device emulation */
2722
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002723typedef struct BlockDriverAIOCBSync {
2724 BlockDriverAIOCB common;
2725 QEMUBH *bh;
2726 int ret;
2727 /* vector translation state */
2728 QEMUIOVector *qiov;
2729 uint8_t *bounce;
2730 int is_write;
2731} BlockDriverAIOCBSync;
2732
2733static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
2734{
Kevin Wolfb666d232010-05-05 11:44:39 +02002735 BlockDriverAIOCBSync *acb =
2736 container_of(blockacb, BlockDriverAIOCBSync, common);
Dor Laor6a7ad292009-06-01 12:07:23 +03002737 qemu_bh_delete(acb->bh);
Avi Kivity36afc452009-06-23 16:20:36 +03002738 acb->bh = NULL;
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002739 qemu_aio_release(acb);
2740}
2741
2742static AIOPool bdrv_em_aio_pool = {
2743 .aiocb_size = sizeof(BlockDriverAIOCBSync),
2744 .cancel = bdrv_aio_cancel_em,
2745};
2746
bellard83f64092006-08-01 16:21:11 +00002747static void bdrv_aio_bh_cb(void *opaque)
bellardbeac80c2006-06-26 20:08:57 +00002748{
pbrookce1a14d2006-08-07 02:38:06 +00002749 BlockDriverAIOCBSync *acb = opaque;
aliguorif141eaf2009-04-07 18:43:24 +00002750
aliguorif141eaf2009-04-07 18:43:24 +00002751 if (!acb->is_write)
2752 qemu_iovec_from_buffer(acb->qiov, acb->bounce, acb->qiov->size);
aliguoriceb42de2009-04-07 18:43:28 +00002753 qemu_vfree(acb->bounce);
pbrookce1a14d2006-08-07 02:38:06 +00002754 acb->common.cb(acb->common.opaque, acb->ret);
Dor Laor6a7ad292009-06-01 12:07:23 +03002755 qemu_bh_delete(acb->bh);
Avi Kivity36afc452009-06-23 16:20:36 +03002756 acb->bh = NULL;
pbrookce1a14d2006-08-07 02:38:06 +00002757 qemu_aio_release(acb);
bellardbeac80c2006-06-26 20:08:57 +00002758}
bellardbeac80c2006-06-26 20:08:57 +00002759
aliguorif141eaf2009-04-07 18:43:24 +00002760static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
2761 int64_t sector_num,
2762 QEMUIOVector *qiov,
2763 int nb_sectors,
2764 BlockDriverCompletionFunc *cb,
2765 void *opaque,
2766 int is_write)
2767
bellardea2384d2004-08-01 21:59:26 +00002768{
pbrookce1a14d2006-08-07 02:38:06 +00002769 BlockDriverAIOCBSync *acb;
pbrookce1a14d2006-08-07 02:38:06 +00002770
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02002771 acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
aliguorif141eaf2009-04-07 18:43:24 +00002772 acb->is_write = is_write;
2773 acb->qiov = qiov;
aliguorie268ca52009-04-22 20:20:00 +00002774 acb->bounce = qemu_blockalign(bs, qiov->size);
aliguorif141eaf2009-04-07 18:43:24 +00002775
pbrookce1a14d2006-08-07 02:38:06 +00002776 if (!acb->bh)
2777 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
aliguorif141eaf2009-04-07 18:43:24 +00002778
2779 if (is_write) {
2780 qemu_iovec_to_buffer(acb->qiov, acb->bounce);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002781 acb->ret = bs->drv->bdrv_write(bs, sector_num, acb->bounce, nb_sectors);
aliguorif141eaf2009-04-07 18:43:24 +00002782 } else {
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002783 acb->ret = bs->drv->bdrv_read(bs, sector_num, acb->bounce, nb_sectors);
aliguorif141eaf2009-04-07 18:43:24 +00002784 }
2785
pbrookce1a14d2006-08-07 02:38:06 +00002786 qemu_bh_schedule(acb->bh);
aliguorif141eaf2009-04-07 18:43:24 +00002787
pbrookce1a14d2006-08-07 02:38:06 +00002788 return &acb->common;
pbrook7a6cba62006-06-04 11:39:07 +00002789}
2790
aliguorif141eaf2009-04-07 18:43:24 +00002791static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
2792 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
pbrookce1a14d2006-08-07 02:38:06 +00002793 BlockDriverCompletionFunc *cb, void *opaque)
bellard83f64092006-08-01 16:21:11 +00002794{
aliguorif141eaf2009-04-07 18:43:24 +00002795 return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
bellard83f64092006-08-01 16:21:11 +00002796}
2797
aliguorif141eaf2009-04-07 18:43:24 +00002798static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
2799 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
2800 BlockDriverCompletionFunc *cb, void *opaque)
2801{
2802 return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
2803}
2804
Kevin Wolf68485422011-06-30 10:05:46 +02002805
2806typedef struct BlockDriverAIOCBCoroutine {
2807 BlockDriverAIOCB common;
2808 BlockRequest req;
2809 bool is_write;
2810 QEMUBH* bh;
2811} BlockDriverAIOCBCoroutine;
2812
2813static void bdrv_aio_co_cancel_em(BlockDriverAIOCB *blockacb)
2814{
2815 qemu_aio_flush();
2816}
2817
2818static AIOPool bdrv_em_co_aio_pool = {
2819 .aiocb_size = sizeof(BlockDriverAIOCBCoroutine),
2820 .cancel = bdrv_aio_co_cancel_em,
2821};
2822
2823static void bdrv_co_rw_bh(void *opaque)
2824{
2825 BlockDriverAIOCBCoroutine *acb = opaque;
2826
2827 acb->common.cb(acb->common.opaque, acb->req.error);
2828 qemu_bh_delete(acb->bh);
2829 qemu_aio_release(acb);
2830}
2831
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002832/* Invoke .bdrv_co_readv/.bdrv_co_writev */
Kevin Wolf68485422011-06-30 10:05:46 +02002833static void coroutine_fn bdrv_co_rw(void *opaque)
2834{
2835 BlockDriverAIOCBCoroutine *acb = opaque;
2836 BlockDriverState *bs = acb->common.bs;
2837
2838 if (!acb->is_write) {
2839 acb->req.error = bs->drv->bdrv_co_readv(bs, acb->req.sector,
2840 acb->req.nb_sectors, acb->req.qiov);
2841 } else {
2842 acb->req.error = bs->drv->bdrv_co_writev(bs, acb->req.sector,
2843 acb->req.nb_sectors, acb->req.qiov);
2844 }
2845
2846 acb->bh = qemu_bh_new(bdrv_co_rw_bh, acb);
2847 qemu_bh_schedule(acb->bh);
2848}
2849
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002850/* Invoke bdrv_co_do_readv/bdrv_co_do_writev */
2851static void coroutine_fn bdrv_co_do_rw(void *opaque)
2852{
2853 BlockDriverAIOCBCoroutine *acb = opaque;
2854 BlockDriverState *bs = acb->common.bs;
2855
2856 if (!acb->is_write) {
2857 acb->req.error = bdrv_co_do_readv(bs, acb->req.sector,
2858 acb->req.nb_sectors, acb->req.qiov);
2859 } else {
2860 acb->req.error = bdrv_co_do_writev(bs, acb->req.sector,
2861 acb->req.nb_sectors, acb->req.qiov);
2862 }
2863
2864 acb->bh = qemu_bh_new(bdrv_co_rw_bh, acb);
2865 qemu_bh_schedule(acb->bh);
2866}
2867
Kevin Wolf68485422011-06-30 10:05:46 +02002868static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
2869 int64_t sector_num,
2870 QEMUIOVector *qiov,
2871 int nb_sectors,
2872 BlockDriverCompletionFunc *cb,
2873 void *opaque,
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002874 bool is_write,
2875 CoroutineEntry *entry)
Kevin Wolf68485422011-06-30 10:05:46 +02002876{
2877 Coroutine *co;
2878 BlockDriverAIOCBCoroutine *acb;
2879
2880 acb = qemu_aio_get(&bdrv_em_co_aio_pool, bs, cb, opaque);
2881 acb->req.sector = sector_num;
2882 acb->req.nb_sectors = nb_sectors;
2883 acb->req.qiov = qiov;
2884 acb->is_write = is_write;
2885
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002886 co = qemu_coroutine_create(entry);
Kevin Wolf68485422011-06-30 10:05:46 +02002887 qemu_coroutine_enter(co, acb);
2888
2889 return &acb->common;
2890}
2891
2892static BlockDriverAIOCB *bdrv_co_aio_readv_em(BlockDriverState *bs,
2893 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
2894 BlockDriverCompletionFunc *cb, void *opaque)
2895{
2896 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque,
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002897 false, bdrv_co_rw);
Kevin Wolf68485422011-06-30 10:05:46 +02002898}
2899
2900static BlockDriverAIOCB *bdrv_co_aio_writev_em(BlockDriverState *bs,
2901 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
2902 BlockDriverCompletionFunc *cb, void *opaque)
2903{
2904 return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque,
Stefan Hajnoczib2a61372011-10-13 13:08:23 +01002905 true, bdrv_co_rw);
Kevin Wolf68485422011-06-30 10:05:46 +02002906}
2907
Christoph Hellwigb2e12bc2009-09-04 19:01:49 +02002908static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
2909 BlockDriverCompletionFunc *cb, void *opaque)
2910{
2911 BlockDriverAIOCBSync *acb;
2912
2913 acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
2914 acb->is_write = 1; /* don't bounce in the completion hadler */
2915 acb->qiov = NULL;
2916 acb->bounce = NULL;
2917 acb->ret = 0;
2918
2919 if (!acb->bh)
2920 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
2921
2922 bdrv_flush(bs);
2923 qemu_bh_schedule(acb->bh);
2924 return &acb->common;
2925}
2926
Alexander Graf016f5cf2010-05-26 17:51:49 +02002927static BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
2928 BlockDriverCompletionFunc *cb, void *opaque)
2929{
2930 BlockDriverAIOCBSync *acb;
2931
2932 acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
2933 acb->is_write = 1; /* don't bounce in the completion handler */
2934 acb->qiov = NULL;
2935 acb->bounce = NULL;
2936 acb->ret = 0;
2937
2938 if (!acb->bh) {
2939 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
2940 }
2941
2942 qemu_bh_schedule(acb->bh);
2943 return &acb->common;
2944}
2945
bellard83f64092006-08-01 16:21:11 +00002946/**************************************************************/
2947/* sync block device emulation */
2948
2949static void bdrv_rw_em_cb(void *opaque, int ret)
2950{
2951 *(int *)opaque = ret;
2952}
2953
ths5fafdf22007-09-16 21:08:06 +00002954static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
bellard83f64092006-08-01 16:21:11 +00002955 uint8_t *buf, int nb_sectors)
2956{
pbrookce1a14d2006-08-07 02:38:06 +00002957 int async_ret;
2958 BlockDriverAIOCB *acb;
aliguorif141eaf2009-04-07 18:43:24 +00002959 struct iovec iov;
2960 QEMUIOVector qiov;
bellard83f64092006-08-01 16:21:11 +00002961
bellard83f64092006-08-01 16:21:11 +00002962 async_ret = NOT_DONE;
blueswir13f4cb3d2009-04-13 16:31:01 +00002963 iov.iov_base = (void *)buf;
Jes Sorenseneb5a3162010-05-27 16:20:31 +02002964 iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
aliguorif141eaf2009-04-07 18:43:24 +00002965 qemu_iovec_init_external(&qiov, &iov, 1);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002966
2967 acb = bs->drv->bdrv_aio_readv(bs, sector_num, &qiov, nb_sectors,
2968 bdrv_rw_em_cb, &async_ret);
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002969 if (acb == NULL) {
2970 async_ret = -1;
2971 goto fail;
2972 }
aliguoribaf35cb2008-09-10 15:45:19 +00002973
bellard83f64092006-08-01 16:21:11 +00002974 while (async_ret == NOT_DONE) {
2975 qemu_aio_wait();
2976 }
aliguoribaf35cb2008-09-10 15:45:19 +00002977
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002978
2979fail:
bellard83f64092006-08-01 16:21:11 +00002980 return async_ret;
2981}
2982
2983static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
2984 const uint8_t *buf, int nb_sectors)
2985{
pbrookce1a14d2006-08-07 02:38:06 +00002986 int async_ret;
2987 BlockDriverAIOCB *acb;
aliguorif141eaf2009-04-07 18:43:24 +00002988 struct iovec iov;
2989 QEMUIOVector qiov;
bellard83f64092006-08-01 16:21:11 +00002990
bellard83f64092006-08-01 16:21:11 +00002991 async_ret = NOT_DONE;
aliguorif141eaf2009-04-07 18:43:24 +00002992 iov.iov_base = (void *)buf;
Jes Sorenseneb5a3162010-05-27 16:20:31 +02002993 iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
aliguorif141eaf2009-04-07 18:43:24 +00002994 qemu_iovec_init_external(&qiov, &iov, 1);
Stefan Hajnoczi1ed20ac2011-10-13 13:08:21 +01002995
2996 acb = bs->drv->bdrv_aio_writev(bs, sector_num, &qiov, nb_sectors,
2997 bdrv_rw_em_cb, &async_ret);
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02002998 if (acb == NULL) {
2999 async_ret = -1;
3000 goto fail;
3001 }
bellard83f64092006-08-01 16:21:11 +00003002 while (async_ret == NOT_DONE) {
3003 qemu_aio_wait();
3004 }
Kevin Wolf65d6b3d2009-10-22 17:54:39 +02003005
3006fail:
bellard83f64092006-08-01 16:21:11 +00003007 return async_ret;
3008}
bellardea2384d2004-08-01 21:59:26 +00003009
3010void bdrv_init(void)
3011{
Anthony Liguori5efa9d52009-05-09 17:03:42 -05003012 module_call_init(MODULE_INIT_BLOCK);
bellardea2384d2004-08-01 21:59:26 +00003013}
pbrookce1a14d2006-08-07 02:38:06 +00003014
Markus Armbrustereb852012009-10-27 18:41:44 +01003015void bdrv_init_with_whitelist(void)
3016{
3017 use_bdrv_whitelist = 1;
3018 bdrv_init();
3019}
3020
Christoph Hellwigc16b5a22009-05-25 12:37:32 +02003021void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
3022 BlockDriverCompletionFunc *cb, void *opaque)
aliguori6bbff9a2009-03-20 18:25:59 +00003023{
pbrookce1a14d2006-08-07 02:38:06 +00003024 BlockDriverAIOCB *acb;
3025
aliguori6bbff9a2009-03-20 18:25:59 +00003026 if (pool->free_aiocb) {
3027 acb = pool->free_aiocb;
3028 pool->free_aiocb = acb->next;
pbrookce1a14d2006-08-07 02:38:06 +00003029 } else {
Anthony Liguori7267c092011-08-20 22:09:37 -05003030 acb = g_malloc0(pool->aiocb_size);
aliguori6bbff9a2009-03-20 18:25:59 +00003031 acb->pool = pool;
pbrookce1a14d2006-08-07 02:38:06 +00003032 }
3033 acb->bs = bs;
3034 acb->cb = cb;
3035 acb->opaque = opaque;
3036 return acb;
3037}
3038
3039void qemu_aio_release(void *p)
3040{
aliguori6bbff9a2009-03-20 18:25:59 +00003041 BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p;
3042 AIOPool *pool = acb->pool;
3043 acb->next = pool->free_aiocb;
3044 pool->free_aiocb = acb;
pbrookce1a14d2006-08-07 02:38:06 +00003045}
bellard19cb3732006-08-19 11:45:59 +00003046
3047/**************************************************************/
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003048/* Coroutine block device emulation */
3049
3050typedef struct CoroutineIOCompletion {
3051 Coroutine *coroutine;
3052 int ret;
3053} CoroutineIOCompletion;
3054
3055static void bdrv_co_io_em_complete(void *opaque, int ret)
3056{
3057 CoroutineIOCompletion *co = opaque;
3058
3059 co->ret = ret;
3060 qemu_coroutine_enter(co->coroutine, NULL);
3061}
3062
3063static int coroutine_fn bdrv_co_io_em(BlockDriverState *bs, int64_t sector_num,
3064 int nb_sectors, QEMUIOVector *iov,
3065 bool is_write)
3066{
3067 CoroutineIOCompletion co = {
3068 .coroutine = qemu_coroutine_self(),
3069 };
3070 BlockDriverAIOCB *acb;
3071
3072 if (is_write) {
Stefan Hajnoczia652d162011-10-05 17:17:02 +01003073 acb = bs->drv->bdrv_aio_writev(bs, sector_num, iov, nb_sectors,
3074 bdrv_co_io_em_complete, &co);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003075 } else {
Stefan Hajnoczia652d162011-10-05 17:17:02 +01003076 acb = bs->drv->bdrv_aio_readv(bs, sector_num, iov, nb_sectors,
3077 bdrv_co_io_em_complete, &co);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003078 }
3079
Stefan Hajnoczi59370aa2011-09-30 17:34:58 +01003080 trace_bdrv_co_io_em(bs, sector_num, nb_sectors, is_write, acb);
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003081 if (!acb) {
3082 return -EIO;
3083 }
3084 qemu_coroutine_yield();
3085
3086 return co.ret;
3087}
3088
3089static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
3090 int64_t sector_num, int nb_sectors,
3091 QEMUIOVector *iov)
3092{
3093 return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, false);
3094}
3095
3096static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
3097 int64_t sector_num, int nb_sectors,
3098 QEMUIOVector *iov)
3099{
3100 return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, true);
3101}
3102
Kevin Wolfe7a8a782011-07-15 16:05:00 +02003103static int coroutine_fn bdrv_co_flush_em(BlockDriverState *bs)
3104{
3105 CoroutineIOCompletion co = {
3106 .coroutine = qemu_coroutine_self(),
3107 };
3108 BlockDriverAIOCB *acb;
3109
3110 acb = bdrv_aio_flush(bs, bdrv_co_io_em_complete, &co);
3111 if (!acb) {
3112 return -EIO;
3113 }
3114 qemu_coroutine_yield();
3115 return co.ret;
3116}
3117
Kevin Wolff9f05dc2011-07-15 13:50:26 +02003118/**************************************************************/
bellard19cb3732006-08-19 11:45:59 +00003119/* removable device support */
3120
3121/**
3122 * Return TRUE if the media is present
3123 */
3124int bdrv_is_inserted(BlockDriverState *bs)
3125{
3126 BlockDriver *drv = bs->drv;
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003127
bellard19cb3732006-08-19 11:45:59 +00003128 if (!drv)
3129 return 0;
3130 if (!drv->bdrv_is_inserted)
Markus Armbrustera1aff5b2011-09-06 18:58:41 +02003131 return 1;
3132 return drv->bdrv_is_inserted(bs);
bellard19cb3732006-08-19 11:45:59 +00003133}
3134
3135/**
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003136 * Return whether the media changed since the last call to this
3137 * function, or -ENOTSUP if we don't know. Most drivers don't know.
bellard19cb3732006-08-19 11:45:59 +00003138 */
3139int bdrv_media_changed(BlockDriverState *bs)
3140{
3141 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003142
Markus Armbruster8e49ca42011-08-03 15:08:08 +02003143 if (drv && drv->bdrv_media_changed) {
3144 return drv->bdrv_media_changed(bs);
3145 }
3146 return -ENOTSUP;
bellard19cb3732006-08-19 11:45:59 +00003147}
3148
3149/**
3150 * If eject_flag is TRUE, eject the media. Otherwise, close the tray
3151 */
Markus Armbrusterfdec4402011-09-06 18:58:45 +02003152void bdrv_eject(BlockDriverState *bs, int eject_flag)
bellard19cb3732006-08-19 11:45:59 +00003153{
3154 BlockDriver *drv = bs->drv;
bellard19cb3732006-08-19 11:45:59 +00003155
Markus Armbruster822e1cd2011-07-20 18:23:42 +02003156 if (drv && drv->bdrv_eject) {
3157 drv->bdrv_eject(bs, eject_flag);
bellard19cb3732006-08-19 11:45:59 +00003158 }
bellard19cb3732006-08-19 11:45:59 +00003159}
3160
bellard19cb3732006-08-19 11:45:59 +00003161/**
3162 * Lock or unlock the media (if it is locked, the user won't be able
3163 * to eject it manually).
3164 */
Markus Armbruster025e8492011-09-06 18:58:47 +02003165void bdrv_lock_medium(BlockDriverState *bs, bool locked)
bellard19cb3732006-08-19 11:45:59 +00003166{
3167 BlockDriver *drv = bs->drv;
3168
Markus Armbruster025e8492011-09-06 18:58:47 +02003169 trace_bdrv_lock_medium(bs, locked);
Stefan Hajnoczib8c6d092011-03-29 20:04:40 +01003170
Markus Armbruster025e8492011-09-06 18:58:47 +02003171 if (drv && drv->bdrv_lock_medium) {
3172 drv->bdrv_lock_medium(bs, locked);
bellard19cb3732006-08-19 11:45:59 +00003173 }
3174}
ths985a03b2007-12-24 16:10:43 +00003175
3176/* needed for generic scsi interface */
3177
3178int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
3179{
3180 BlockDriver *drv = bs->drv;
3181
3182 if (drv && drv->bdrv_ioctl)
3183 return drv->bdrv_ioctl(bs, req, buf);
3184 return -ENOTSUP;
3185}
aliguori7d780662009-03-12 19:57:08 +00003186
aliguori221f7152009-03-28 17:28:41 +00003187BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
3188 unsigned long int req, void *buf,
3189 BlockDriverCompletionFunc *cb, void *opaque)
aliguori7d780662009-03-12 19:57:08 +00003190{
aliguori221f7152009-03-28 17:28:41 +00003191 BlockDriver *drv = bs->drv;
aliguori7d780662009-03-12 19:57:08 +00003192
aliguori221f7152009-03-28 17:28:41 +00003193 if (drv && drv->bdrv_aio_ioctl)
3194 return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
3195 return NULL;
aliguori7d780662009-03-12 19:57:08 +00003196}
aliguorie268ca52009-04-22 20:20:00 +00003197
Markus Armbruster7b6f9302011-09-06 18:58:56 +02003198void bdrv_set_buffer_alignment(BlockDriverState *bs, int align)
3199{
3200 bs->buffer_alignment = align;
3201}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003202
aliguorie268ca52009-04-22 20:20:00 +00003203void *qemu_blockalign(BlockDriverState *bs, size_t size)
3204{
3205 return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
3206}
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003207
3208void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable)
3209{
3210 int64_t bitmap_size;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003211
Liran Schouraaa0eb72010-01-26 10:31:48 +02003212 bs->dirty_count = 0;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003213 if (enable) {
Jan Kiszkac6d22832009-11-30 18:21:20 +01003214 if (!bs->dirty_bitmap) {
3215 bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) +
3216 BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1;
3217 bitmap_size /= BDRV_SECTORS_PER_DIRTY_CHUNK * 8;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003218
Anthony Liguori7267c092011-08-20 22:09:37 -05003219 bs->dirty_bitmap = g_malloc0(bitmap_size);
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003220 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003221 } else {
Jan Kiszkac6d22832009-11-30 18:21:20 +01003222 if (bs->dirty_bitmap) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003223 g_free(bs->dirty_bitmap);
Jan Kiszkac6d22832009-11-30 18:21:20 +01003224 bs->dirty_bitmap = NULL;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003225 }
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003226 }
3227}
3228
3229int bdrv_get_dirty(BlockDriverState *bs, int64_t sector)
3230{
Jan Kiszka6ea44302009-11-30 18:21:19 +01003231 int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK;
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003232
Jan Kiszkac6d22832009-11-30 18:21:20 +01003233 if (bs->dirty_bitmap &&
3234 (sector << BDRV_SECTOR_BITS) < bdrv_getlength(bs)) {
Marcelo Tosatti6d59fec2010-11-08 17:02:54 -02003235 return !!(bs->dirty_bitmap[chunk / (sizeof(unsigned long) * 8)] &
3236 (1UL << (chunk % (sizeof(unsigned long) * 8))));
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003237 } else {
3238 return 0;
3239 }
3240}
3241
Jan Kiszkaa55eb922009-11-30 18:21:19 +01003242void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
3243 int nr_sectors)
lirans@il.ibm.com7cd1e322009-11-02 15:40:41 +02003244{
3245 set_dirty_bitmap(bs, cur_sector, nr_sectors, 0);
3246}
Liran Schouraaa0eb72010-01-26 10:31:48 +02003247
3248int64_t bdrv_get_dirty_count(BlockDriverState *bs)
3249{
3250 return bs->dirty_count;
3251}
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003252
Marcelo Tosattidb593f22011-01-26 12:12:34 -02003253void bdrv_set_in_use(BlockDriverState *bs, int in_use)
3254{
3255 assert(bs->in_use != in_use);
3256 bs->in_use = in_use;
3257}
3258
3259int bdrv_in_use(BlockDriverState *bs)
3260{
3261 return bs->in_use;
3262}
3263
Luiz Capitulino28a72822011-09-26 17:43:50 -03003264void bdrv_iostatus_enable(BlockDriverState *bs)
3265{
3266 bs->iostatus = BDRV_IOS_OK;
3267}
3268
3269/* The I/O status is only enabled if the drive explicitly
3270 * enables it _and_ the VM is configured to stop on errors */
3271bool bdrv_iostatus_is_enabled(const BlockDriverState *bs)
3272{
3273 return (bs->iostatus != BDRV_IOS_INVAL &&
3274 (bs->on_write_error == BLOCK_ERR_STOP_ENOSPC ||
3275 bs->on_write_error == BLOCK_ERR_STOP_ANY ||
3276 bs->on_read_error == BLOCK_ERR_STOP_ANY));
3277}
3278
3279void bdrv_iostatus_disable(BlockDriverState *bs)
3280{
3281 bs->iostatus = BDRV_IOS_INVAL;
3282}
3283
3284void bdrv_iostatus_reset(BlockDriverState *bs)
3285{
3286 if (bdrv_iostatus_is_enabled(bs)) {
3287 bs->iostatus = BDRV_IOS_OK;
3288 }
3289}
3290
3291/* XXX: Today this is set by device models because it makes the implementation
3292 quite simple. However, the block layer knows about the error, so it's
3293 possible to implement this without device models being involved */
3294void bdrv_iostatus_set_err(BlockDriverState *bs, int error)
3295{
3296 if (bdrv_iostatus_is_enabled(bs) && bs->iostatus == BDRV_IOS_OK) {
3297 assert(error >= 0);
3298 bs->iostatus = error == ENOSPC ? BDRV_IOS_ENOSPC : BDRV_IOS_FAILED;
3299 }
3300}
3301
Christoph Hellwiga597e792011-08-25 08:26:01 +02003302void
3303bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, int64_t bytes,
3304 enum BlockAcctType type)
3305{
3306 assert(type < BDRV_MAX_IOTYPE);
3307
3308 cookie->bytes = bytes;
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02003309 cookie->start_time_ns = get_clock();
Christoph Hellwiga597e792011-08-25 08:26:01 +02003310 cookie->type = type;
3311}
3312
3313void
3314bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie)
3315{
3316 assert(cookie->type < BDRV_MAX_IOTYPE);
3317
3318 bs->nr_bytes[cookie->type] += cookie->bytes;
3319 bs->nr_ops[cookie->type]++;
Christoph Hellwigc488c7f2011-08-25 08:26:10 +02003320 bs->total_time_ns[cookie->type] += get_clock() - cookie->start_time_ns;
Christoph Hellwiga597e792011-08-25 08:26:01 +02003321}
3322
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003323int bdrv_img_create(const char *filename, const char *fmt,
3324 const char *base_filename, const char *base_fmt,
3325 char *options, uint64_t img_size, int flags)
3326{
3327 QEMUOptionParameter *param = NULL, *create_options = NULL;
Kevin Wolfd2208942011-06-01 14:03:31 +02003328 QEMUOptionParameter *backing_fmt, *backing_file, *size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003329 BlockDriverState *bs = NULL;
3330 BlockDriver *drv, *proto_drv;
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003331 BlockDriver *backing_drv = NULL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003332 int ret = 0;
3333
3334 /* Find driver and parse its options */
3335 drv = bdrv_find_format(fmt);
3336 if (!drv) {
3337 error_report("Unknown file format '%s'", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003338 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003339 goto out;
3340 }
3341
3342 proto_drv = bdrv_find_protocol(filename);
3343 if (!proto_drv) {
3344 error_report("Unknown protocol '%s'", filename);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003345 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003346 goto out;
3347 }
3348
3349 create_options = append_option_parameters(create_options,
3350 drv->create_options);
3351 create_options = append_option_parameters(create_options,
3352 proto_drv->create_options);
3353
3354 /* Create parameter list with default values */
3355 param = parse_option_parameters("", create_options, param);
3356
3357 set_option_parameter_int(param, BLOCK_OPT_SIZE, img_size);
3358
3359 /* Parse -o options */
3360 if (options) {
3361 param = parse_option_parameters(options, create_options, param);
3362 if (param == NULL) {
3363 error_report("Invalid options for file format '%s'.", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003364 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003365 goto out;
3366 }
3367 }
3368
3369 if (base_filename) {
3370 if (set_option_parameter(param, BLOCK_OPT_BACKING_FILE,
3371 base_filename)) {
3372 error_report("Backing file not supported for file format '%s'",
3373 fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003374 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003375 goto out;
3376 }
3377 }
3378
3379 if (base_fmt) {
3380 if (set_option_parameter(param, BLOCK_OPT_BACKING_FMT, base_fmt)) {
3381 error_report("Backing file format not supported for file "
3382 "format '%s'", fmt);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003383 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003384 goto out;
3385 }
3386 }
3387
Jes Sorensen792da932010-12-16 13:52:17 +01003388 backing_file = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
3389 if (backing_file && backing_file->value.s) {
3390 if (!strcmp(filename, backing_file->value.s)) {
3391 error_report("Error: Trying to create an image with the "
3392 "same filename as the backing file");
Jes Sorensen4f70f242010-12-16 13:52:18 +01003393 ret = -EINVAL;
Jes Sorensen792da932010-12-16 13:52:17 +01003394 goto out;
3395 }
3396 }
3397
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003398 backing_fmt = get_option_parameter(param, BLOCK_OPT_BACKING_FMT);
3399 if (backing_fmt && backing_fmt->value.s) {
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003400 backing_drv = bdrv_find_format(backing_fmt->value.s);
3401 if (!backing_drv) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003402 error_report("Unknown backing file format '%s'",
3403 backing_fmt->value.s);
Jes Sorensen4f70f242010-12-16 13:52:18 +01003404 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003405 goto out;
3406 }
3407 }
3408
3409 // The size for the image must always be specified, with one exception:
3410 // If we are using a backing file, we can obtain the size from there
Kevin Wolfd2208942011-06-01 14:03:31 +02003411 size = get_option_parameter(param, BLOCK_OPT_SIZE);
3412 if (size && size->value.n == -1) {
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003413 if (backing_file && backing_file->value.s) {
3414 uint64_t size;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003415 char buf[32];
3416
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003417 bs = bdrv_new("");
3418
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003419 ret = bdrv_open(bs, backing_file->value.s, flags, backing_drv);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003420 if (ret < 0) {
Stefan Hajnoczi96df67d2011-01-24 09:32:20 +00003421 error_report("Could not open '%s'", backing_file->value.s);
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003422 goto out;
3423 }
3424 bdrv_get_geometry(bs, &size);
3425 size *= 512;
3426
3427 snprintf(buf, sizeof(buf), "%" PRId64, size);
3428 set_option_parameter(param, BLOCK_OPT_SIZE, buf);
3429 } else {
3430 error_report("Image creation needs a size parameter");
Jes Sorensen4f70f242010-12-16 13:52:18 +01003431 ret = -EINVAL;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003432 goto out;
3433 }
3434 }
3435
3436 printf("Formatting '%s', fmt=%s ", filename, fmt);
3437 print_option_parameters(param);
3438 puts("");
3439
3440 ret = bdrv_create(drv, filename, param);
3441
3442 if (ret < 0) {
3443 if (ret == -ENOTSUP) {
3444 error_report("Formatting or formatting option not supported for "
3445 "file format '%s'", fmt);
3446 } else if (ret == -EFBIG) {
3447 error_report("The image size is too large for file format '%s'",
3448 fmt);
3449 } else {
3450 error_report("%s: error while creating %s: %s", filename, fmt,
3451 strerror(-ret));
3452 }
3453 }
3454
3455out:
3456 free_option_parameters(create_options);
3457 free_option_parameters(param);
3458
3459 if (bs) {
3460 bdrv_delete(bs);
3461 }
Jes Sorensen4f70f242010-12-16 13:52:18 +01003462
3463 return ret;
Jes Sorensenf88e1a42010-12-16 13:52:15 +01003464}