block.c revision c27f813900a3c114562efbb8df1065e94766fc48
1/* 2 * QEMU System Emulator block driver 3 * 4 * Copyright (c) 2003 Fabrice Bellard 5 * 6 * 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 */ 24#include "qemu-common.h" 25#include "console.h" 26#include "block_int.h" 27 28#ifdef _BSD 29#include <sys/types.h> 30#include <sys/stat.h> 31#include <sys/ioctl.h> 32#include <sys/queue.h> 33#include <sys/disk.h> 34#endif 35 36#define SECTOR_BITS 9 37#define SECTOR_SIZE (1 << SECTOR_BITS) 38 39typedef struct BlockDriverAIOCBSync { 40 BlockDriverAIOCB common; 41 QEMUBH *bh; 42 int ret; 43} BlockDriverAIOCBSync; 44 45static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs, 46 int64_t sector_num, uint8_t *buf, int nb_sectors, 47 BlockDriverCompletionFunc *cb, void *opaque); 48static BlockDriverAIOCB *bdrv_aio_write_em(BlockDriverState *bs, 49 int64_t sector_num, const uint8_t *buf, int nb_sectors, 50 BlockDriverCompletionFunc *cb, void *opaque); 51static void bdrv_aio_cancel_em(BlockDriverAIOCB *acb); 52static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num, 53 uint8_t *buf, int nb_sectors); 54static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, 55 const uint8_t *buf, int nb_sectors); 56 57static BlockDriver *first_drv; 58 59int path_is_absolute(const char *path) 60{ 61 const char *p; 62#ifdef _WIN32 63 /* specific case for names like: "\\.\d:" */ 64 if (*path == '/' || *path == '\\') 65 return 1; 66#endif 67 p = strchr(path, ':'); 68 if (p) 69 p++; 70 else 71 p = path; 72#ifdef _WIN32 73 return (*p == '/' || *p == '\\'); 74#else 75 return (*p == '/'); 76#endif 77} 78 79/* if filename is absolute, just copy it to dest. Otherwise, build a 80 path to it by considering it is relative to base_path. URL are 81 supported. */ 82void path_combine(char *dest, int dest_size, 83 const char *base_path, 84 const char *filename) 85{ 86 const char *p, *p1; 87 int len; 88 89 if (dest_size <= 0) 90 return; 91 if (path_is_absolute(filename)) { 92 pstrcpy(dest, dest_size, filename); 93 } else { 94 p = strchr(base_path, ':'); 95 if (p) 96 p++; 97 else 98 p = base_path; 99 p1 = strrchr(base_path, '/'); 100#ifdef _WIN32 101 { 102 const char *p2; 103 p2 = strrchr(base_path, '\\'); 104 if (!p1 || p2 > p1) 105 p1 = p2; 106 } 107#endif 108 if (p1) 109 p1++; 110 else 111 p1 = base_path; 112 if (p1 > p) 113 p = p1; 114 len = p - base_path; 115 if (len > dest_size - 1) 116 len = dest_size - 1; 117 memcpy(dest, base_path, len); 118 dest[len] = '\0'; 119 pstrcat(dest, dest_size, filename); 120 } 121} 122 123 124static void bdrv_register(BlockDriver *bdrv) 125{ 126 if (!bdrv->bdrv_aio_read) { 127 /* add AIO emulation layer */ 128 bdrv->bdrv_aio_read = bdrv_aio_read_em; 129 bdrv->bdrv_aio_write = bdrv_aio_write_em; 130 bdrv->bdrv_aio_cancel = bdrv_aio_cancel_em; 131 bdrv->aiocb_size = sizeof(BlockDriverAIOCBSync); 132 } else if (!bdrv->bdrv_read && !bdrv->bdrv_pread) { 133 /* add synchronous IO emulation layer */ 134 bdrv->bdrv_read = bdrv_read_em; 135 bdrv->bdrv_write = bdrv_write_em; 136 } 137 bdrv->next = first_drv; 138 first_drv = bdrv; 139} 140 141/* create a new block device (by default it is empty) */ 142BlockDriverState *bdrv_new(const char *device_name) 143{ 144 BlockDriverState **pbs, *bs; 145 146 bs = qemu_mallocz(sizeof(BlockDriverState)); 147 if(!bs) 148 return NULL; 149 pstrcpy(bs->device_name, sizeof(bs->device_name), device_name); 150 if (device_name[0] != '\0') { 151 /* insert at the end */ 152 pbs = &bdrv_first; 153 while (*pbs != NULL) 154 pbs = &(*pbs)->next; 155 *pbs = bs; 156 } 157 return bs; 158} 159 160BlockDriver *bdrv_find_format(const char *format_name) 161{ 162 BlockDriver *drv1; 163 for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) { 164 if (!strcmp(drv1->format_name, format_name)) 165 return drv1; 166 } 167 return NULL; 168} 169 170int bdrv_create(BlockDriver *drv, 171 const char *filename, int64_t size_in_sectors, 172 const char *backing_file, int flags) 173{ 174 if (!drv->bdrv_create) 175 return -ENOTSUP; 176 return drv->bdrv_create(filename, size_in_sectors, backing_file, flags); 177} 178 179#ifdef _WIN32 180void get_tmp_filename(char *filename, int size) 181{ 182 char temp_dir[MAX_PATH]; 183 184 GetTempPath(MAX_PATH, temp_dir); 185 GetTempFileName(temp_dir, "qem", 0, filename); 186} 187#else 188void get_tmp_filename(char *filename, int size) 189{ 190 int fd; 191 const char *tmpdir; 192 /* XXX: race condition possible */ 193 tmpdir = getenv("TMPDIR"); 194 if (!tmpdir) 195 tmpdir = "/tmp"; 196 snprintf(filename, size, "%s/vl.XXXXXX", tmpdir); 197 fd = mkstemp(filename); 198 close(fd); 199} 200#endif 201 202#ifdef _WIN32 203static int is_windows_drive_prefix(const char *filename) 204{ 205 return (((filename[0] >= 'a' && filename[0] <= 'z') || 206 (filename[0] >= 'A' && filename[0] <= 'Z')) && 207 filename[1] == ':'); 208} 209 210static int is_windows_drive(const char *filename) 211{ 212 if (is_windows_drive_prefix(filename) && 213 filename[2] == '\0') 214 return 1; 215 if (strstart(filename, "\\\\.\\", NULL) || 216 strstart(filename, "//./", NULL)) 217 return 1; 218 return 0; 219} 220#endif 221 222static BlockDriver *find_protocol(const char *filename) 223{ 224 BlockDriver *drv1; 225 char protocol[128]; 226 int len; 227 const char *p; 228 229#ifdef _WIN32 230 if (is_windows_drive(filename) || 231 is_windows_drive_prefix(filename)) 232 return &bdrv_raw; 233#endif 234 p = strchr(filename, ':'); 235 if (!p) 236 return &bdrv_raw; 237 len = p - filename; 238 if (len > sizeof(protocol) - 1) 239 len = sizeof(protocol) - 1; 240 memcpy(protocol, filename, len); 241 protocol[len] = '\0'; 242 for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) { 243 if (drv1->protocol_name && 244 !strcmp(drv1->protocol_name, protocol)) 245 return drv1; 246 } 247 return NULL; 248} 249 250/* XXX: force raw format if block or character device ? It would 251 simplify the BSD case */ 252static BlockDriver *find_image_format(const char *filename) 253{ 254 int ret, score, score_max; 255 BlockDriver *drv1, *drv; 256 uint8_t buf[2048]; 257 BlockDriverState *bs; 258 259 /* detect host devices. By convention, /dev/cdrom[N] is always 260 recognized as a host CDROM */ 261 if (strstart(filename, "/dev/cdrom", NULL)) 262 return &bdrv_host_device; 263#ifdef _WIN32 264 if (is_windows_drive(filename)) 265 return &bdrv_host_device; 266#else 267 { 268 struct stat st; 269 if (stat(filename, &st) >= 0 && 270 (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) { 271 return &bdrv_host_device; 272 } 273 } 274#endif 275 276 drv = find_protocol(filename); 277 /* no need to test disk image formats for vvfat */ 278 if (drv == &bdrv_vvfat) 279 return drv; 280 281 ret = bdrv_file_open(&bs, filename, BDRV_O_RDONLY); 282 if (ret < 0) 283 return NULL; 284 ret = bdrv_pread(bs, 0, buf, sizeof(buf)); 285 bdrv_delete(bs); 286 if (ret < 0) { 287 return NULL; 288 } 289 290 score_max = 0; 291 for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) { 292 if (drv1->bdrv_probe) { 293 score = drv1->bdrv_probe(buf, ret, filename); 294 if (score > score_max) { 295 score_max = score; 296 drv = drv1; 297 } 298 } 299 } 300 return drv; 301} 302 303int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags) 304{ 305 BlockDriverState *bs; 306 int ret; 307 308 bs = bdrv_new(""); 309 if (!bs) 310 return -ENOMEM; 311 ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL); 312 if (ret < 0) { 313 bdrv_delete(bs); 314 return ret; 315 } 316 *pbs = bs; 317 return 0; 318} 319 320int bdrv_open(BlockDriverState *bs, const char *filename, int flags) 321{ 322 return bdrv_open2(bs, filename, flags, NULL); 323} 324 325int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, 326 BlockDriver *drv) 327{ 328 int ret, open_flags; 329 char tmp_filename[PATH_MAX]; 330 char backing_filename[PATH_MAX]; 331 332 bs->read_only = 0; 333 bs->is_temporary = 0; 334 bs->encrypted = 0; 335 336 if (flags & BDRV_O_SNAPSHOT) { 337 BlockDriverState *bs1; 338 int64_t total_size; 339 int is_protocol = 0; 340 341 /* if snapshot, we create a temporary backing file and open it 342 instead of opening 'filename' directly */ 343 344 /* if there is a backing file, use it */ 345 bs1 = bdrv_new(""); 346 if (!bs1) { 347 return -ENOMEM; 348 } 349 if (bdrv_open(bs1, filename, 0) < 0) { 350 bdrv_delete(bs1); 351 return -1; 352 } 353 total_size = bdrv_getlength(bs1) >> SECTOR_BITS; 354 355 if (bs1->drv && bs1->drv->protocol_name) 356 is_protocol = 1; 357 358 bdrv_delete(bs1); 359 360 get_tmp_filename(tmp_filename, sizeof(tmp_filename)); 361 362 /* Real path is meaningless for protocols */ 363 if (is_protocol) 364 snprintf(backing_filename, sizeof(backing_filename), 365 "%s", filename); 366 else 367 realpath(filename, backing_filename); 368 369 if (bdrv_create(&bdrv_qcow2, tmp_filename, 370 total_size, backing_filename, 0) < 0) { 371 return -1; 372 } 373 filename = tmp_filename; 374 bs->is_temporary = 1; 375 } 376 377 pstrcpy(bs->filename, sizeof(bs->filename), filename); 378 if (flags & BDRV_O_FILE) { 379 drv = find_protocol(filename); 380 if (!drv) 381 return -ENOENT; 382 } else { 383 if (!drv) { 384 drv = find_image_format(filename); 385 if (!drv) 386 return -1; 387 } 388 } 389 bs->drv = drv; 390 bs->opaque = qemu_mallocz(drv->instance_size); 391 if (bs->opaque == NULL && drv->instance_size > 0) 392 return -1; 393 /* Note: for compatibility, we open disk image files as RDWR, and 394 RDONLY as fallback */ 395 if (!(flags & BDRV_O_FILE)) 396 open_flags = BDRV_O_RDWR | (flags & BDRV_O_DIRECT); 397 else 398 open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT); 399 ret = drv->bdrv_open(bs, filename, open_flags); 400 if (ret == -EACCES && !(flags & BDRV_O_FILE)) { 401 ret = drv->bdrv_open(bs, filename, BDRV_O_RDONLY); 402 bs->read_only = 1; 403 } 404 if (ret < 0) { 405 qemu_free(bs->opaque); 406 bs->opaque = NULL; 407 bs->drv = NULL; 408 return ret; 409 } 410 if (drv->bdrv_getlength) { 411 bs->total_sectors = bdrv_getlength(bs) >> SECTOR_BITS; 412 } 413#ifndef _WIN32 414 if (bs->is_temporary) { 415 unlink(filename); 416 } 417#endif 418 if (bs->backing_file[0] != '\0') { 419 /* if there is a backing file, use it */ 420 bs->backing_hd = bdrv_new(""); 421 if (!bs->backing_hd) { 422 fail: 423 bdrv_close(bs); 424 return -ENOMEM; 425 } 426 path_combine(backing_filename, sizeof(backing_filename), 427 filename, bs->backing_file); 428 if (bdrv_open(bs->backing_hd, backing_filename, 0) < 0) 429 goto fail; 430 } 431 432 /* call the change callback */ 433 bs->media_changed = 1; 434 if (bs->change_cb) 435 bs->change_cb(bs->change_opaque); 436 437 return 0; 438} 439 440void bdrv_close(BlockDriverState *bs) 441{ 442 if (bs->drv) { 443 if (bs->backing_hd) 444 bdrv_delete(bs->backing_hd); 445 bs->drv->bdrv_close(bs); 446 qemu_free(bs->opaque); 447#ifdef _WIN32 448 if (bs->is_temporary) { 449 unlink(bs->filename); 450 } 451#endif 452 bs->opaque = NULL; 453 bs->drv = NULL; 454 455 /* call the change callback */ 456 bs->media_changed = 1; 457 if (bs->change_cb) 458 bs->change_cb(bs->change_opaque); 459 } 460} 461 462void bdrv_delete(BlockDriverState *bs) 463{ 464 BlockDriverState **pbs; 465 466 pbs = &bdrv_first; 467 while (*pbs != bs && *pbs != NULL) 468 pbs = &(*pbs)->next; 469 if (*pbs == bs) 470 *pbs = bs->next; 471 472 bdrv_close(bs); 473 qemu_free(bs); 474} 475 476/* commit COW file into the raw image */ 477int bdrv_commit(BlockDriverState *bs) 478{ 479 BlockDriver *drv = bs->drv; 480 int64_t i, total_sectors; 481 int n, j; 482 unsigned char sector[512]; 483 484 if (!drv) 485 return -ENOMEDIUM; 486 487 if (bs->read_only) { 488 return -EACCES; 489 } 490 491 if (!bs->backing_hd) { 492 return -ENOTSUP; 493 } 494 495 total_sectors = bdrv_getlength(bs) >> SECTOR_BITS; 496 for (i = 0; i < total_sectors;) { 497 if (drv->bdrv_is_allocated(bs, i, 65536, &n)) { 498 for(j = 0; j < n; j++) { 499 if (bdrv_read(bs, i, sector, 1) != 0) { 500 return -EIO; 501 } 502 503 if (bdrv_write(bs->backing_hd, i, sector, 1) != 0) { 504 return -EIO; 505 } 506 i++; 507 } 508 } else { 509 i += n; 510 } 511 } 512 513 if (drv->bdrv_make_empty) 514 return drv->bdrv_make_empty(bs); 515 516 return 0; 517} 518 519/* return < 0 if error. See bdrv_write() for the return codes */ 520int bdrv_read(BlockDriverState *bs, int64_t sector_num, 521 uint8_t *buf, int nb_sectors) 522{ 523 BlockDriver *drv = bs->drv; 524 525 if (!drv) 526 return -ENOMEDIUM; 527 528 if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) { 529 memcpy(buf, bs->boot_sector_data, 512); 530 sector_num++; 531 nb_sectors--; 532 buf += 512; 533 if (nb_sectors == 0) 534 return 0; 535 } 536 if (drv->bdrv_pread) { 537 int ret, len; 538 len = nb_sectors * 512; 539 ret = drv->bdrv_pread(bs, sector_num * 512, buf, len); 540 if (ret < 0) 541 return ret; 542 else if (ret != len) 543 return -EINVAL; 544 else { 545 bs->rd_bytes += (unsigned) len; 546 bs->rd_ops ++; 547 return 0; 548 } 549 } else { 550 return drv->bdrv_read(bs, sector_num, buf, nb_sectors); 551 } 552} 553 554/* Return < 0 if error. Important errors are: 555 -EIO generic I/O error (may happen for all errors) 556 -ENOMEDIUM No media inserted. 557 -EINVAL Invalid sector number or nb_sectors 558 -EACCES Trying to write a read-only device 559*/ 560int bdrv_write(BlockDriverState *bs, int64_t sector_num, 561 const uint8_t *buf, int nb_sectors) 562{ 563 BlockDriver *drv = bs->drv; 564 if (!bs->drv) 565 return -ENOMEDIUM; 566 if (bs->read_only) 567 return -EACCES; 568 if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) { 569 memcpy(bs->boot_sector_data, buf, 512); 570 } 571 if (drv->bdrv_pwrite) { 572 int ret, len; 573 len = nb_sectors * 512; 574 ret = drv->bdrv_pwrite(bs, sector_num * 512, buf, len); 575 if (ret < 0) 576 return ret; 577 else if (ret != len) 578 return -EIO; 579 else { 580 bs->wr_bytes += (unsigned) len; 581 bs->wr_ops ++; 582 return 0; 583 } 584 } else { 585 return drv->bdrv_write(bs, sector_num, buf, nb_sectors); 586 } 587} 588 589static int bdrv_pread_em(BlockDriverState *bs, int64_t offset, 590 uint8_t *buf, int count1) 591{ 592 uint8_t tmp_buf[SECTOR_SIZE]; 593 int len, nb_sectors, count; 594 int64_t sector_num; 595 596 count = count1; 597 /* first read to align to sector start */ 598 len = (SECTOR_SIZE - offset) & (SECTOR_SIZE - 1); 599 if (len > count) 600 len = count; 601 sector_num = offset >> SECTOR_BITS; 602 if (len > 0) { 603 if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0) 604 return -EIO; 605 memcpy(buf, tmp_buf + (offset & (SECTOR_SIZE - 1)), len); 606 count -= len; 607 if (count == 0) 608 return count1; 609 sector_num++; 610 buf += len; 611 } 612 613 /* read the sectors "in place" */ 614 nb_sectors = count >> SECTOR_BITS; 615 if (nb_sectors > 0) { 616 if (bdrv_read(bs, sector_num, buf, nb_sectors) < 0) 617 return -EIO; 618 sector_num += nb_sectors; 619 len = nb_sectors << SECTOR_BITS; 620 buf += len; 621 count -= len; 622 } 623 624 /* add data from the last sector */ 625 if (count > 0) { 626 if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0) 627 return -EIO; 628 memcpy(buf, tmp_buf, count); 629 } 630 return count1; 631} 632 633static int bdrv_pwrite_em(BlockDriverState *bs, int64_t offset, 634 const uint8_t *buf, int count1) 635{ 636 uint8_t tmp_buf[SECTOR_SIZE]; 637 int len, nb_sectors, count; 638 int64_t sector_num; 639 640 count = count1; 641 /* first write to align to sector start */ 642 len = (SECTOR_SIZE - offset) & (SECTOR_SIZE - 1); 643 if (len > count) 644 len = count; 645 sector_num = offset >> SECTOR_BITS; 646 if (len > 0) { 647 if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0) 648 return -EIO; 649 memcpy(tmp_buf + (offset & (SECTOR_SIZE - 1)), buf, len); 650 if (bdrv_write(bs, sector_num, tmp_buf, 1) < 0) 651 return -EIO; 652 count -= len; 653 if (count == 0) 654 return count1; 655 sector_num++; 656 buf += len; 657 } 658 659 /* write the sectors "in place" */ 660 nb_sectors = count >> SECTOR_BITS; 661 if (nb_sectors > 0) { 662 if (bdrv_write(bs, sector_num, buf, nb_sectors) < 0) 663 return -EIO; 664 sector_num += nb_sectors; 665 len = nb_sectors << SECTOR_BITS; 666 buf += len; 667 count -= len; 668 } 669 670 /* add data from the last sector */ 671 if (count > 0) { 672 if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0) 673 return -EIO; 674 memcpy(tmp_buf, buf, count); 675 if (bdrv_write(bs, sector_num, tmp_buf, 1) < 0) 676 return -EIO; 677 } 678 return count1; 679} 680 681/** 682 * Read with byte offsets (needed only for file protocols) 683 */ 684int bdrv_pread(BlockDriverState *bs, int64_t offset, 685 void *buf1, int count1) 686{ 687 BlockDriver *drv = bs->drv; 688 689 if (!drv) 690 return -ENOMEDIUM; 691 if (!drv->bdrv_pread) 692 return bdrv_pread_em(bs, offset, buf1, count1); 693 return drv->bdrv_pread(bs, offset, buf1, count1); 694} 695 696/** 697 * Write with byte offsets (needed only for file protocols) 698 */ 699int bdrv_pwrite(BlockDriverState *bs, int64_t offset, 700 const void *buf1, int count1) 701{ 702 BlockDriver *drv = bs->drv; 703 704 if (!drv) 705 return -ENOMEDIUM; 706 if (!drv->bdrv_pwrite) 707 return bdrv_pwrite_em(bs, offset, buf1, count1); 708 return drv->bdrv_pwrite(bs, offset, buf1, count1); 709} 710 711/** 712 * Truncate file to 'offset' bytes (needed only for file protocols) 713 */ 714int bdrv_truncate(BlockDriverState *bs, int64_t offset) 715{ 716 BlockDriver *drv = bs->drv; 717 if (!drv) 718 return -ENOMEDIUM; 719 if (!drv->bdrv_truncate) 720 return -ENOTSUP; 721 return drv->bdrv_truncate(bs, offset); 722} 723 724/** 725 * Length of a file in bytes. Return < 0 if error or unknown. 726 */ 727int64_t bdrv_getlength(BlockDriverState *bs) 728{ 729 BlockDriver *drv = bs->drv; 730 if (!drv) 731 return -ENOMEDIUM; 732 if (!drv->bdrv_getlength) { 733 /* legacy mode */ 734 return bs->total_sectors * SECTOR_SIZE; 735 } 736 return drv->bdrv_getlength(bs); 737} 738 739/* return 0 as number of sectors if no device present or error */ 740void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr) 741{ 742 int64_t length; 743 length = bdrv_getlength(bs); 744 if (length < 0) 745 length = 0; 746 else 747 length = length >> SECTOR_BITS; 748 *nb_sectors_ptr = length; 749} 750 751/* force a given boot sector. */ 752void bdrv_set_boot_sector(BlockDriverState *bs, const uint8_t *data, int size) 753{ 754 bs->boot_sector_enabled = 1; 755 if (size > 512) 756 size = 512; 757 memcpy(bs->boot_sector_data, data, size); 758 memset(bs->boot_sector_data + size, 0, 512 - size); 759} 760 761void bdrv_set_geometry_hint(BlockDriverState *bs, 762 int cyls, int heads, int secs) 763{ 764 bs->cyls = cyls; 765 bs->heads = heads; 766 bs->secs = secs; 767} 768 769void bdrv_set_type_hint(BlockDriverState *bs, int type) 770{ 771 bs->type = type; 772 bs->removable = ((type == BDRV_TYPE_CDROM || 773 type == BDRV_TYPE_FLOPPY)); 774} 775 776void bdrv_set_translation_hint(BlockDriverState *bs, int translation) 777{ 778 bs->translation = translation; 779} 780 781void bdrv_get_geometry_hint(BlockDriverState *bs, 782 int *pcyls, int *pheads, int *psecs) 783{ 784 *pcyls = bs->cyls; 785 *pheads = bs->heads; 786 *psecs = bs->secs; 787} 788 789int bdrv_get_type_hint(BlockDriverState *bs) 790{ 791 return bs->type; 792} 793 794int bdrv_get_translation_hint(BlockDriverState *bs) 795{ 796 return bs->translation; 797} 798 799int bdrv_is_removable(BlockDriverState *bs) 800{ 801 return bs->removable; 802} 803 804int bdrv_is_read_only(BlockDriverState *bs) 805{ 806 return bs->read_only; 807} 808 809int bdrv_is_sg(BlockDriverState *bs) 810{ 811 return bs->sg; 812} 813 814/* XXX: no longer used */ 815void bdrv_set_change_cb(BlockDriverState *bs, 816 void (*change_cb)(void *opaque), void *opaque) 817{ 818 bs->change_cb = change_cb; 819 bs->change_opaque = opaque; 820} 821 822int bdrv_is_encrypted(BlockDriverState *bs) 823{ 824 if (bs->backing_hd && bs->backing_hd->encrypted) 825 return 1; 826 return bs->encrypted; 827} 828 829int bdrv_set_key(BlockDriverState *bs, const char *key) 830{ 831 int ret; 832 if (bs->backing_hd && bs->backing_hd->encrypted) { 833 ret = bdrv_set_key(bs->backing_hd, key); 834 if (ret < 0) 835 return ret; 836 if (!bs->encrypted) 837 return 0; 838 } 839 if (!bs->encrypted || !bs->drv || !bs->drv->bdrv_set_key) 840 return -1; 841 return bs->drv->bdrv_set_key(bs, key); 842} 843 844void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size) 845{ 846 if (!bs->drv) { 847 buf[0] = '\0'; 848 } else { 849 pstrcpy(buf, buf_size, bs->drv->format_name); 850 } 851} 852 853void bdrv_iterate_format(void (*it)(void *opaque, const char *name), 854 void *opaque) 855{ 856 BlockDriver *drv; 857 858 for (drv = first_drv; drv != NULL; drv = drv->next) { 859 it(opaque, drv->format_name); 860 } 861} 862 863BlockDriverState *bdrv_find(const char *name) 864{ 865 BlockDriverState *bs; 866 867 for (bs = bdrv_first; bs != NULL; bs = bs->next) { 868 if (!strcmp(name, bs->device_name)) 869 return bs; 870 } 871 return NULL; 872} 873 874void bdrv_iterate(void (*it)(void *opaque, const char *name), void *opaque) 875{ 876 BlockDriverState *bs; 877 878 for (bs = bdrv_first; bs != NULL; bs = bs->next) { 879 it(opaque, bs->device_name); 880 } 881} 882 883const char *bdrv_get_device_name(BlockDriverState *bs) 884{ 885 return bs->device_name; 886} 887 888void bdrv_flush(BlockDriverState *bs) 889{ 890 if (bs->drv->bdrv_flush) 891 bs->drv->bdrv_flush(bs); 892 if (bs->backing_hd) 893 bdrv_flush(bs->backing_hd); 894} 895 896/* 897 * Returns true iff the specified sector is present in the disk image. Drivers 898 * not implementing the functionality are assumed to not support backing files, 899 * hence all their sectors are reported as allocated. 900 * 901 * 'pnum' is set to the number of sectors (including and immediately following 902 * the specified sector) that are known to be in the same 903 * allocated/unallocated state. 904 * 905 * 'nb_sectors' is the max value 'pnum' should be set to. 906 */ 907int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors, 908 int *pnum) 909{ 910 int64_t n; 911 if (!bs->drv->bdrv_is_allocated) { 912 if (sector_num >= bs->total_sectors) { 913 *pnum = 0; 914 return 0; 915 } 916 n = bs->total_sectors - sector_num; 917 *pnum = (n < nb_sectors) ? (n) : (nb_sectors); 918 return 1; 919 } 920 return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum); 921} 922 923void bdrv_info(void) 924{ 925 BlockDriverState *bs; 926 927 for (bs = bdrv_first; bs != NULL; bs = bs->next) { 928 term_printf("%s:", bs->device_name); 929 term_printf(" type="); 930 switch(bs->type) { 931 case BDRV_TYPE_HD: 932 term_printf("hd"); 933 break; 934 case BDRV_TYPE_CDROM: 935 term_printf("cdrom"); 936 break; 937 case BDRV_TYPE_FLOPPY: 938 term_printf("floppy"); 939 break; 940 } 941 term_printf(" removable=%d", bs->removable); 942 if (bs->removable) { 943 term_printf(" locked=%d", bs->locked); 944 } 945 if (bs->drv) { 946 term_printf(" file="); 947 term_print_filename(bs->filename); 948 if (bs->backing_file[0] != '\0') { 949 term_printf(" backing_file="); 950 term_print_filename(bs->backing_file); 951 } 952 term_printf(" ro=%d", bs->read_only); 953 term_printf(" drv=%s", bs->drv->format_name); 954 if (bs->encrypted) 955 term_printf(" encrypted"); 956 } else { 957 term_printf(" [not inserted]"); 958 } 959 term_printf("\n"); 960 } 961} 962 963/* The "info blockstats" command. */ 964void bdrv_info_stats (void) 965{ 966 BlockDriverState *bs; 967 968 for (bs = bdrv_first; bs != NULL; bs = bs->next) { 969 term_printf ("%s:" 970 " rd_bytes=%" PRIu64 971 " wr_bytes=%" PRIu64 972 " rd_operations=%" PRIu64 973 " wr_operations=%" PRIu64 974 "\n", 975 bs->device_name, 976 bs->rd_bytes, bs->wr_bytes, 977 bs->rd_ops, bs->wr_ops); 978 } 979} 980 981void bdrv_get_backing_filename(BlockDriverState *bs, 982 char *filename, int filename_size) 983{ 984 if (!bs->backing_hd) { 985 pstrcpy(filename, filename_size, ""); 986 } else { 987 pstrcpy(filename, filename_size, bs->backing_file); 988 } 989} 990 991int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num, 992 const uint8_t *buf, int nb_sectors) 993{ 994 BlockDriver *drv = bs->drv; 995 if (!drv) 996 return -ENOMEDIUM; 997 if (!drv->bdrv_write_compressed) 998 return -ENOTSUP; 999 return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors); 1000} 1001 1002int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) 1003{ 1004 BlockDriver *drv = bs->drv; 1005 if (!drv) 1006 return -ENOMEDIUM; 1007 if (!drv->bdrv_get_info) 1008 return -ENOTSUP; 1009 memset(bdi, 0, sizeof(*bdi)); 1010 return drv->bdrv_get_info(bs, bdi); 1011} 1012 1013/**************************************************************/ 1014/* handling of snapshots */ 1015 1016int bdrv_snapshot_create(BlockDriverState *bs, 1017 QEMUSnapshotInfo *sn_info) 1018{ 1019 BlockDriver *drv = bs->drv; 1020 if (!drv) 1021 return -ENOMEDIUM; 1022 if (!drv->bdrv_snapshot_create) 1023 return -ENOTSUP; 1024 return drv->bdrv_snapshot_create(bs, sn_info); 1025} 1026 1027int bdrv_snapshot_goto(BlockDriverState *bs, 1028 const char *snapshot_id) 1029{ 1030 BlockDriver *drv = bs->drv; 1031 if (!drv) 1032 return -ENOMEDIUM; 1033 if (!drv->bdrv_snapshot_goto) 1034 return -ENOTSUP; 1035 return drv->bdrv_snapshot_goto(bs, snapshot_id); 1036} 1037 1038int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id) 1039{ 1040 BlockDriver *drv = bs->drv; 1041 if (!drv) 1042 return -ENOMEDIUM; 1043 if (!drv->bdrv_snapshot_delete) 1044 return -ENOTSUP; 1045 return drv->bdrv_snapshot_delete(bs, snapshot_id); 1046} 1047 1048int bdrv_snapshot_list(BlockDriverState *bs, 1049 QEMUSnapshotInfo **psn_info) 1050{ 1051 BlockDriver *drv = bs->drv; 1052 if (!drv) 1053 return -ENOMEDIUM; 1054 if (!drv->bdrv_snapshot_list) 1055 return -ENOTSUP; 1056 return drv->bdrv_snapshot_list(bs, psn_info); 1057} 1058 1059#define NB_SUFFIXES 4 1060 1061char *get_human_readable_size(char *buf, int buf_size, int64_t size) 1062{ 1063 static const char suffixes[NB_SUFFIXES] = "KMGT"; 1064 int64_t base; 1065 int i; 1066 1067 if (size <= 999) { 1068 snprintf(buf, buf_size, "%" PRId64, size); 1069 } else { 1070 base = 1024; 1071 for(i = 0; i < NB_SUFFIXES; i++) { 1072 if (size < (10 * base)) { 1073 snprintf(buf, buf_size, "%0.1f%c", 1074 (double)size / base, 1075 suffixes[i]); 1076 break; 1077 } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) { 1078 snprintf(buf, buf_size, "%" PRId64 "%c", 1079 ((size + (base >> 1)) / base), 1080 suffixes[i]); 1081 break; 1082 } 1083 base = base * 1024; 1084 } 1085 } 1086 return buf; 1087} 1088 1089char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn) 1090{ 1091 char buf1[128], date_buf[128], clock_buf[128]; 1092#ifdef _WIN32 1093 struct tm *ptm; 1094#else 1095 struct tm tm; 1096#endif 1097 time_t ti; 1098 int64_t secs; 1099 1100 if (!sn) { 1101 snprintf(buf, buf_size, 1102 "%-10s%-20s%7s%20s%15s", 1103 "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK"); 1104 } else { 1105 ti = sn->date_sec; 1106#ifdef _WIN32 1107 ptm = localtime(&ti); 1108 strftime(date_buf, sizeof(date_buf), 1109 "%Y-%m-%d %H:%M:%S", ptm); 1110#else 1111 localtime_r(&ti, &tm); 1112 strftime(date_buf, sizeof(date_buf), 1113 "%Y-%m-%d %H:%M:%S", &tm); 1114#endif 1115 secs = sn->vm_clock_nsec / 1000000000; 1116 snprintf(clock_buf, sizeof(clock_buf), 1117 "%02d:%02d:%02d.%03d", 1118 (int)(secs / 3600), 1119 (int)((secs / 60) % 60), 1120 (int)(secs % 60), 1121 (int)((sn->vm_clock_nsec / 1000000) % 1000)); 1122 snprintf(buf, buf_size, 1123 "%-10s%-20s%7s%20s%15s", 1124 sn->id_str, sn->name, 1125 get_human_readable_size(buf1, sizeof(buf1), sn->vm_state_size), 1126 date_buf, 1127 clock_buf); 1128 } 1129 return buf; 1130} 1131 1132 1133/**************************************************************/ 1134/* async I/Os */ 1135 1136BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num, 1137 uint8_t *buf, int nb_sectors, 1138 BlockDriverCompletionFunc *cb, void *opaque) 1139{ 1140 BlockDriver *drv = bs->drv; 1141 BlockDriverAIOCB *ret; 1142 1143 if (!drv) 1144 return NULL; 1145 1146 /* XXX: we assume that nb_sectors == 0 is suppored by the async read */ 1147 if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) { 1148 memcpy(buf, bs->boot_sector_data, 512); 1149 sector_num++; 1150 nb_sectors--; 1151 buf += 512; 1152 } 1153 1154 ret = drv->bdrv_aio_read(bs, sector_num, buf, nb_sectors, cb, opaque); 1155 1156 if (ret) { 1157 /* Update stats even though technically transfer has not happened. */ 1158 bs->rd_bytes += (unsigned) nb_sectors * SECTOR_SIZE; 1159 bs->rd_ops ++; 1160 } 1161 1162 return ret; 1163} 1164 1165BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num, 1166 const uint8_t *buf, int nb_sectors, 1167 BlockDriverCompletionFunc *cb, void *opaque) 1168{ 1169 BlockDriver *drv = bs->drv; 1170 BlockDriverAIOCB *ret; 1171 1172 if (!drv) 1173 return NULL; 1174 if (bs->read_only) 1175 return NULL; 1176 if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) { 1177 memcpy(bs->boot_sector_data, buf, 512); 1178 } 1179 1180 ret = drv->bdrv_aio_write(bs, sector_num, buf, nb_sectors, cb, opaque); 1181 1182 if (ret) { 1183 /* Update stats even though technically transfer has not happened. */ 1184 bs->wr_bytes += (unsigned) nb_sectors * SECTOR_SIZE; 1185 bs->wr_ops ++; 1186 } 1187 1188 return ret; 1189} 1190 1191void bdrv_aio_cancel(BlockDriverAIOCB *acb) 1192{ 1193 BlockDriver *drv = acb->bs->drv; 1194 1195 drv->bdrv_aio_cancel(acb); 1196} 1197 1198 1199/**************************************************************/ 1200/* async block device emulation */ 1201 1202static void bdrv_aio_bh_cb(void *opaque) 1203{ 1204 BlockDriverAIOCBSync *acb = opaque; 1205 acb->common.cb(acb->common.opaque, acb->ret); 1206 qemu_aio_release(acb); 1207} 1208 1209static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs, 1210 int64_t sector_num, uint8_t *buf, int nb_sectors, 1211 BlockDriverCompletionFunc *cb, void *opaque) 1212{ 1213 BlockDriverAIOCBSync *acb; 1214 int ret; 1215 1216 acb = qemu_aio_get(bs, cb, opaque); 1217 if (!acb->bh) 1218 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb); 1219 ret = bdrv_read(bs, sector_num, buf, nb_sectors); 1220 acb->ret = ret; 1221 qemu_bh_schedule(acb->bh); 1222 return &acb->common; 1223} 1224 1225static BlockDriverAIOCB *bdrv_aio_write_em(BlockDriverState *bs, 1226 int64_t sector_num, const uint8_t *buf, int nb_sectors, 1227 BlockDriverCompletionFunc *cb, void *opaque) 1228{ 1229 BlockDriverAIOCBSync *acb; 1230 int ret; 1231 1232 acb = qemu_aio_get(bs, cb, opaque); 1233 if (!acb->bh) 1234 acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb); 1235 ret = bdrv_write(bs, sector_num, buf, nb_sectors); 1236 acb->ret = ret; 1237 qemu_bh_schedule(acb->bh); 1238 return &acb->common; 1239} 1240 1241static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb) 1242{ 1243 BlockDriverAIOCBSync *acb = (BlockDriverAIOCBSync *)blockacb; 1244 qemu_bh_cancel(acb->bh); 1245 qemu_aio_release(acb); 1246} 1247 1248/**************************************************************/ 1249/* sync block device emulation */ 1250 1251static void bdrv_rw_em_cb(void *opaque, int ret) 1252{ 1253 *(int *)opaque = ret; 1254} 1255 1256#define NOT_DONE 0x7fffffff 1257 1258static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num, 1259 uint8_t *buf, int nb_sectors) 1260{ 1261 int async_ret; 1262 BlockDriverAIOCB *acb; 1263 1264 async_ret = NOT_DONE; 1265 acb = bdrv_aio_read(bs, sector_num, buf, nb_sectors, 1266 bdrv_rw_em_cb, &async_ret); 1267 if (acb == NULL) 1268 return -1; 1269 1270 while (async_ret == NOT_DONE) { 1271 qemu_aio_wait(); 1272 } 1273 1274 return async_ret; 1275} 1276 1277static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, 1278 const uint8_t *buf, int nb_sectors) 1279{ 1280 int async_ret; 1281 BlockDriverAIOCB *acb; 1282 1283 async_ret = NOT_DONE; 1284 acb = bdrv_aio_write(bs, sector_num, buf, nb_sectors, 1285 bdrv_rw_em_cb, &async_ret); 1286 if (acb == NULL) 1287 return -1; 1288 while (async_ret == NOT_DONE) { 1289 qemu_aio_wait(); 1290 } 1291 return async_ret; 1292} 1293 1294void bdrv_init(void) 1295{ 1296 bdrv_register(&bdrv_raw); 1297 bdrv_register(&bdrv_host_device); 1298#ifndef _WIN32 1299 bdrv_register(&bdrv_cow); 1300#endif 1301 bdrv_register(&bdrv_qcow); 1302#if 0 1303 bdrv_register(&bdrv_vmdk); 1304#endif 1305 bdrv_register(&bdrv_cloop); 1306 bdrv_register(&bdrv_dmg); 1307#if 0 1308 bdrv_register(&bdrv_bochs); 1309 bdrv_register(&bdrv_vpc); 1310#endif 1311 bdrv_register(&bdrv_vvfat); 1312#if 0 1313 bdrv_register(&bdrv_qcow2); 1314 bdrv_register(&bdrv_parallels); 1315 bdrv_register(&bdrv_nbd); 1316#endif 1317 qemu_aio_init(); 1318} 1319 1320void *qemu_aio_get(BlockDriverState *bs, BlockDriverCompletionFunc *cb, 1321 void *opaque) 1322{ 1323 BlockDriver *drv; 1324 BlockDriverAIOCB *acb; 1325 1326 drv = bs->drv; 1327 if (drv->free_aiocb) { 1328 acb = drv->free_aiocb; 1329 drv->free_aiocb = acb->next; 1330 } else { 1331 acb = qemu_mallocz(drv->aiocb_size); 1332 if (!acb) 1333 return NULL; 1334 } 1335 acb->bs = bs; 1336 acb->cb = cb; 1337 acb->opaque = opaque; 1338 return acb; 1339} 1340 1341void qemu_aio_release(void *p) 1342{ 1343 BlockDriverAIOCB *acb = p; 1344 BlockDriver *drv = acb->bs->drv; 1345 acb->next = drv->free_aiocb; 1346 drv->free_aiocb = acb; 1347} 1348 1349/**************************************************************/ 1350/* removable device support */ 1351 1352/** 1353 * Return TRUE if the media is present 1354 */ 1355int bdrv_is_inserted(BlockDriverState *bs) 1356{ 1357 BlockDriver *drv = bs->drv; 1358 int ret; 1359 if (!drv) 1360 return 0; 1361 if (!drv->bdrv_is_inserted) 1362 return 1; 1363 ret = drv->bdrv_is_inserted(bs); 1364 return ret; 1365} 1366 1367/** 1368 * Return TRUE if the media changed since the last call to this 1369 * function. It is currently only used for floppy disks 1370 */ 1371int bdrv_media_changed(BlockDriverState *bs) 1372{ 1373 BlockDriver *drv = bs->drv; 1374 int ret; 1375 1376 if (!drv || !drv->bdrv_media_changed) 1377 ret = -ENOTSUP; 1378 else 1379 ret = drv->bdrv_media_changed(bs); 1380 if (ret == -ENOTSUP) 1381 ret = bs->media_changed; 1382 bs->media_changed = 0; 1383 return ret; 1384} 1385 1386/** 1387 * If eject_flag is TRUE, eject the media. Otherwise, close the tray 1388 */ 1389void bdrv_eject(BlockDriverState *bs, int eject_flag) 1390{ 1391 BlockDriver *drv = bs->drv; 1392 int ret; 1393 1394 if (!drv || !drv->bdrv_eject) { 1395 ret = -ENOTSUP; 1396 } else { 1397 ret = drv->bdrv_eject(bs, eject_flag); 1398 } 1399 if (ret == -ENOTSUP) { 1400 if (eject_flag) 1401 bdrv_close(bs); 1402 } 1403} 1404 1405int bdrv_is_locked(BlockDriverState *bs) 1406{ 1407 return bs->locked; 1408} 1409 1410/** 1411 * Lock or unlock the media (if it is locked, the user won't be able 1412 * to eject it manually). 1413 */ 1414void bdrv_set_locked(BlockDriverState *bs, int locked) 1415{ 1416 BlockDriver *drv = bs->drv; 1417 1418 bs->locked = locked; 1419 if (drv && drv->bdrv_set_locked) { 1420 drv->bdrv_set_locked(bs, locked); 1421 } 1422} 1423 1424/* needed for generic scsi interface */ 1425 1426int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf) 1427{ 1428 BlockDriver *drv = bs->drv; 1429 1430 if (drv && drv->bdrv_ioctl) 1431 return drv->bdrv_ioctl(bs, req, buf); 1432 return -ENOTSUP; 1433} 1434