qed.c (83d0521a1e35989b0cb7235aef48455fedda3ca4) | qed.c (7ab74849a5724452b35982a6e7d658c25839f5e5) |
---|---|
1/* 2 * QEMU Enhanced Disk Format 3 * 4 * Copyright IBM, Corp. 2010 5 * 6 * Authors: 7 * Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> 8 * Anthony Liguori <aliguori@us.ibm.com> --- 627 unchanged lines hidden (view full) --- 636 637 ret = 0; /* success */ 638out: 639 g_free(l1_table); 640 bdrv_unref(bs); 641 return ret; 642} 643 | 1/* 2 * QEMU Enhanced Disk Format 3 * 4 * Copyright IBM, Corp. 2010 5 * 6 * Authors: 7 * Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> 8 * Anthony Liguori <aliguori@us.ibm.com> --- 627 unchanged lines hidden (view full) --- 636 637 ret = 0; /* success */ 638out: 639 g_free(l1_table); 640 bdrv_unref(bs); 641 return ret; 642} 643 |
644static int bdrv_qed_create(const char *filename, QEMUOptionParameter *options, 645 Error **errp) | 644static int bdrv_qed_create(const char *filename, QemuOpts *opts, Error **errp) |
646{ 647 uint64_t image_size = 0; 648 uint32_t cluster_size = QED_DEFAULT_CLUSTER_SIZE; 649 uint32_t table_size = QED_DEFAULT_TABLE_SIZE; | 645{ 646 uint64_t image_size = 0; 647 uint32_t cluster_size = QED_DEFAULT_CLUSTER_SIZE; 648 uint32_t table_size = QED_DEFAULT_TABLE_SIZE; |
650 const char *backing_file = NULL; 651 const char *backing_fmt = NULL; | 649 char *backing_file = NULL; 650 char *backing_fmt = NULL; 651 int ret; |
652 | 652 |
653 while (options && options->name) { 654 if (!strcmp(options->name, BLOCK_OPT_SIZE)) { 655 image_size = options->value.n; 656 } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) { 657 backing_file = options->value.s; 658 } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FMT)) { 659 backing_fmt = options->value.s; 660 } else if (!strcmp(options->name, BLOCK_OPT_CLUSTER_SIZE)) { 661 if (options->value.n) { 662 cluster_size = options->value.n; 663 } 664 } else if (!strcmp(options->name, BLOCK_OPT_TABLE_SIZE)) { 665 if (options->value.n) { 666 table_size = options->value.n; 667 } 668 } 669 options++; 670 } | 653 image_size = qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0); 654 backing_file = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FILE); 655 backing_fmt = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FMT); 656 cluster_size = qemu_opt_get_size_del(opts, 657 BLOCK_OPT_CLUSTER_SIZE, 658 QED_DEFAULT_CLUSTER_SIZE); 659 table_size = qemu_opt_get_size_del(opts, BLOCK_OPT_TABLE_SIZE, 660 QED_DEFAULT_TABLE_SIZE); |
671 672 if (!qed_is_cluster_size_valid(cluster_size)) { 673 error_setg(errp, "QED cluster size must be within range [%u, %u] " 674 "and power of 2", 675 QED_MIN_CLUSTER_SIZE, QED_MAX_CLUSTER_SIZE); | 661 662 if (!qed_is_cluster_size_valid(cluster_size)) { 663 error_setg(errp, "QED cluster size must be within range [%u, %u] " 664 "and power of 2", 665 QED_MIN_CLUSTER_SIZE, QED_MAX_CLUSTER_SIZE); |
676 return -EINVAL; | 666 ret = -EINVAL; 667 goto finish; |
677 } 678 if (!qed_is_table_size_valid(table_size)) { 679 error_setg(errp, "QED table size must be within range [%u, %u] " 680 "and power of 2", 681 QED_MIN_TABLE_SIZE, QED_MAX_TABLE_SIZE); | 668 } 669 if (!qed_is_table_size_valid(table_size)) { 670 error_setg(errp, "QED table size must be within range [%u, %u] " 671 "and power of 2", 672 QED_MIN_TABLE_SIZE, QED_MAX_TABLE_SIZE); |
682 return -EINVAL; | 673 ret = -EINVAL; 674 goto finish; |
683 } 684 if (!qed_is_image_size_valid(image_size, cluster_size, table_size)) { 685 error_setg(errp, "QED image size must be a non-zero multiple of " 686 "cluster size and less than %" PRIu64 " bytes", 687 qed_max_image_size(cluster_size, table_size)); | 675 } 676 if (!qed_is_image_size_valid(image_size, cluster_size, table_size)) { 677 error_setg(errp, "QED image size must be a non-zero multiple of " 678 "cluster size and less than %" PRIu64 " bytes", 679 qed_max_image_size(cluster_size, table_size)); |
688 return -EINVAL; | 680 ret = -EINVAL; 681 goto finish; |
689 } 690 | 682 } 683 |
691 return qed_create(filename, cluster_size, image_size, table_size, 692 backing_file, backing_fmt, errp); | 684 ret = qed_create(filename, cluster_size, image_size, table_size, 685 backing_file, backing_fmt, errp); 686 687finish: 688 g_free(backing_file); 689 g_free(backing_fmt); 690 return ret; |
693} 694 695typedef struct { 696 BlockDriverState *bs; 697 Coroutine *co; 698 uint64_t pos; 699 int64_t status; 700 int *pnum; --- 910 unchanged lines hidden (view full) --- 1611static int bdrv_qed_check(BlockDriverState *bs, BdrvCheckResult *result, 1612 BdrvCheckMode fix) 1613{ 1614 BDRVQEDState *s = bs->opaque; 1615 1616 return qed_check(s, result, !!fix); 1617} 1618 | 691} 692 693typedef struct { 694 BlockDriverState *bs; 695 Coroutine *co; 696 uint64_t pos; 697 int64_t status; 698 int *pnum; --- 910 unchanged lines hidden (view full) --- 1609static int bdrv_qed_check(BlockDriverState *bs, BdrvCheckResult *result, 1610 BdrvCheckMode fix) 1611{ 1612 BDRVQEDState *s = bs->opaque; 1613 1614 return qed_check(s, result, !!fix); 1615} 1616 |
1619static QEMUOptionParameter qed_create_options[] = { 1620 { 1621 .name = BLOCK_OPT_SIZE, 1622 .type = OPT_SIZE, 1623 .help = "Virtual disk size (in bytes)" 1624 }, { 1625 .name = BLOCK_OPT_BACKING_FILE, 1626 .type = OPT_STRING, 1627 .help = "File name of a base image" 1628 }, { 1629 .name = BLOCK_OPT_BACKING_FMT, 1630 .type = OPT_STRING, 1631 .help = "Image format of the base image" 1632 }, { 1633 .name = BLOCK_OPT_CLUSTER_SIZE, 1634 .type = OPT_SIZE, 1635 .help = "Cluster size (in bytes)", 1636 .value = { .n = QED_DEFAULT_CLUSTER_SIZE }, 1637 }, { 1638 .name = BLOCK_OPT_TABLE_SIZE, 1639 .type = OPT_SIZE, 1640 .help = "L1/L2 table size (in clusters)" 1641 }, 1642 { /* end of list */ } | 1617static QemuOptsList qed_create_opts = { 1618 .name = "qed-create-opts", 1619 .head = QTAILQ_HEAD_INITIALIZER(qed_create_opts.head), 1620 .desc = { 1621 { 1622 .name = BLOCK_OPT_SIZE, 1623 .type = QEMU_OPT_SIZE, 1624 .help = "Virtual disk size" 1625 }, 1626 { 1627 .name = BLOCK_OPT_BACKING_FILE, 1628 .type = QEMU_OPT_STRING, 1629 .help = "File name of a base image" 1630 }, 1631 { 1632 .name = BLOCK_OPT_BACKING_FMT, 1633 .type = QEMU_OPT_STRING, 1634 .help = "Image format of the base image" 1635 }, 1636 { 1637 .name = BLOCK_OPT_CLUSTER_SIZE, 1638 .type = QEMU_OPT_SIZE, 1639 .help = "Cluster size (in bytes)", 1640 .def_value_str = stringify(QED_DEFAULT_CLUSTER_SIZE) 1641 }, 1642 { 1643 .name = BLOCK_OPT_TABLE_SIZE, 1644 .type = QEMU_OPT_SIZE, 1645 .help = "L1/L2 table size (in clusters)" 1646 }, 1647 { /* end of list */ } 1648 } |
1643}; 1644 1645static BlockDriver bdrv_qed = { 1646 .format_name = "qed", 1647 .instance_size = sizeof(BDRVQEDState), | 1649}; 1650 1651static BlockDriver bdrv_qed = { 1652 .format_name = "qed", 1653 .instance_size = sizeof(BDRVQEDState), |
1648 .create_options = qed_create_options, | 1654 .create_opts = &qed_create_opts, |
1649 1650 .bdrv_probe = bdrv_qed_probe, 1651 .bdrv_rebind = bdrv_qed_rebind, 1652 .bdrv_open = bdrv_qed_open, 1653 .bdrv_close = bdrv_qed_close, 1654 .bdrv_reopen_prepare = bdrv_qed_reopen_prepare, | 1655 1656 .bdrv_probe = bdrv_qed_probe, 1657 .bdrv_rebind = bdrv_qed_rebind, 1658 .bdrv_open = bdrv_qed_open, 1659 .bdrv_close = bdrv_qed_close, 1660 .bdrv_reopen_prepare = bdrv_qed_reopen_prepare, |
1655 .bdrv_create = bdrv_qed_create, | 1661 .bdrv_create2 = bdrv_qed_create, |
1656 .bdrv_has_zero_init = bdrv_has_zero_init_1, 1657 .bdrv_co_get_block_status = bdrv_qed_co_get_block_status, 1658 .bdrv_aio_readv = bdrv_qed_aio_readv, 1659 .bdrv_aio_writev = bdrv_qed_aio_writev, 1660 .bdrv_co_write_zeroes = bdrv_qed_co_write_zeroes, 1661 .bdrv_truncate = bdrv_qed_truncate, 1662 .bdrv_getlength = bdrv_qed_getlength, 1663 .bdrv_get_info = bdrv_qed_get_info, --- 14 unchanged lines hidden --- | 1662 .bdrv_has_zero_init = bdrv_has_zero_init_1, 1663 .bdrv_co_get_block_status = bdrv_qed_co_get_block_status, 1664 .bdrv_aio_readv = bdrv_qed_aio_readv, 1665 .bdrv_aio_writev = bdrv_qed_aio_writev, 1666 .bdrv_co_write_zeroes = bdrv_qed_co_write_zeroes, 1667 .bdrv_truncate = bdrv_qed_truncate, 1668 .bdrv_getlength = bdrv_qed_getlength, 1669 .bdrv_get_info = bdrv_qed_get_info, --- 14 unchanged lines hidden --- |