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 ---