Block layer patches:
- enhance handling of size-related BlockConf properties - nvme: small fixes, refactoring and cleanups - virtio-blk: On restart, process queued requests in the proper context - icount: make dma reads deterministic - iotests: Some fixes for rarely run cases - .gitignore: Ignore storage-daemon files - Minor code cleanups -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEE3D3rFZqa+V09dFb+fwmycsiPL9YFAl7qLPcRHGt3b2xmQHJl ZGhhdC5jb20ACgkQfwmycsiPL9a5jQ/7By4cVEDfHQbi1sRB9q6n+dkhWOzK0Y/5 Ac92au4cb4sHKrVkQO4SI87U39X06oyqPPpaVphevLkZIVsN3TM/B1oatqpeNztf n2iUryxCVw3t2UuB6bTtjYiG6CTxmX+kAwe/iuFzOnxSS6e6hEvVHms2Q9R/7bsz 0LGG7UhuXap6ilQbvOrp62CZLIJaqxEBXPB40h0deG25cBar0j0kNM2hruqw2j88 MbA3H1PSOZiWvsUXdxlzwYImQjyzwrzJSYmSjOkonJVbwb2rjinkHleueuJbAEa+ JG6vBEgkr034K/I1YpQrgvheyt3daqgToXgz2BlKcq0Q/bb+ZEWaK/lA7Nf4+04d ozkA0FBBty1bX1sdP+/7OWW+MhcEulRpMPEu0v/pE+ZW4quFFu5aH4rpNKYoJtuV vpNQOItZ90MlW0tZ6V07p7MNVCfJyrarU5DLATt9tHxEA9uzJK0XXmtMgHrAREuT r92zFWTZPThps3INRixQMaritQlt+Y/I8/tmaJ6EG6yNR2MffqMdj832dTxtvFQm By8EkES+aBGjoBsklA+4PVj4IXyHF5YUyv9Q4tvTYtbwqATQ/Ihx/5qXG01u+cKx LfUHZoCC99dIJKyD/VHn2oOuLVGNL3IGCltvlE1TQVWX9mfAim2PHirX8YFrOTo6 ABwL1zPE3s8= =fyFP -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging Block layer patches: - enhance handling of size-related BlockConf properties - nvme: small fixes, refactoring and cleanups - virtio-blk: On restart, process queued requests in the proper context - icount: make dma reads deterministic - iotests: Some fixes for rarely run cases - .gitignore: Ignore storage-daemon files - Minor code cleanups # gpg: Signature made Wed 17 Jun 2020 15:47:19 BST # gpg: using RSA key DC3DEB159A9AF95D3D7456FE7F09B272C88F2FD6 # gpg: issuer "kwolf@redhat.com" # gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>" [full] # Primary key fingerprint: DC3D EB15 9A9A F95D 3D74 56FE 7F09 B272 C88F 2FD6 * remotes/kevin/tags/for-upstream: (43 commits) iotests: Add copyright line in qcow2.py iotests/{190,291}: compat=0.10 is unsupported iotests/229: data_file is unsupported iotests/292: data_file is unsupported iotests/041: Skip test_small_target for qed iotests.py: Add skip_for_formats() decorator block: lift blocksize property limit to 2 MiB qdev-properties: add getter for size32 and blocksize block: make BlockConf size props 32bit and accept size suffixes qdev-properties: make blocksize accept size suffixes qdev-properties: add size32 property type qdev-properties: blocksize: use same limits in code and description block: consolidate blocksize properties consistency checks virtio-blk: store opt_io_size with correct size .gitignore: Ignore storage-daemon files hw/block/nvme: verify msix_init_exclusive_bar() return value hw/block/nvme: add msix_qsize parameter hw/block/nvme: Verify msix_vector_use() returned value hw/block/nvme: factor out controller identify setup hw/block/nvme: do cmb/pmr init as part of pci init ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
3b268766ec
17
.gitignore
vendored
17
.gitignore
vendored
|
@ -34,18 +34,18 @@
|
|||
/qapi/qapi-builtin-types.[ch]
|
||||
/qapi/qapi-builtin-visit.[ch]
|
||||
/qapi/qapi-commands-*.[ch]
|
||||
/qapi/qapi-commands.[ch]
|
||||
/qapi/qapi-emit-events.[ch]
|
||||
**/qapi/qapi-commands.[ch]
|
||||
**/qapi/qapi-emit-events.[ch]
|
||||
/qapi/qapi-events-*.[ch]
|
||||
/qapi/qapi-events.[ch]
|
||||
/qapi/qapi-init-commands.[ch]
|
||||
/qapi/qapi-introspect.[ch]
|
||||
**/qapi/qapi-events.[ch]
|
||||
**/qapi/qapi-init-commands.[ch]
|
||||
**/qapi/qapi-introspect.[ch]
|
||||
/qapi/qapi-types-*.[ch]
|
||||
/qapi/qapi-types.[ch]
|
||||
**/qapi/qapi-types.[ch]
|
||||
/qapi/qapi-visit-*.[ch]
|
||||
!/qapi/qapi-visit-core.c
|
||||
/qapi/qapi-visit.[ch]
|
||||
/qapi/qapi-doc.texi
|
||||
**/qapi/qapi-visit.[ch]
|
||||
**/qapi/qapi-doc.texi
|
||||
/qemu-edid
|
||||
/qemu-img
|
||||
/qemu-nbd
|
||||
|
@ -59,6 +59,7 @@
|
|||
/qemu-keymap
|
||||
/qemu-monitor.texi
|
||||
/qemu-monitor-info.texi
|
||||
/qemu-storage-daemon
|
||||
/qemu-version.h
|
||||
/qemu-version.h.tmp
|
||||
/module_block.h
|
||||
|
|
|
@ -13,7 +13,7 @@ chardev-obj-y = chardev/
|
|||
|
||||
authz-obj-y = authz/
|
||||
|
||||
block-obj-y = block/ block/monitor/ nbd/ scsi/
|
||||
block-obj-y = block/ nbd/ scsi/
|
||||
block-obj-y += block.o blockjob.o job.o
|
||||
block-obj-y += qemu-io-cmds.o
|
||||
block-obj-$(CONFIG_REPLICATION) += replication.o
|
||||
|
|
|
@ -46,6 +46,7 @@ block-obj-y += aio_task.o
|
|||
block-obj-y += backup-top.o
|
||||
block-obj-y += filter-compress.o
|
||||
common-obj-y += monitor/
|
||||
block-obj-y += monitor/
|
||||
|
||||
block-obj-y += stream.o
|
||||
|
||||
|
|
|
@ -1757,19 +1757,20 @@ bool qcow2_supports_persistent_dirty_bitmap(BlockDriverState *bs)
|
|||
}
|
||||
|
||||
/*
|
||||
* Compute the space required for bitmaps in @bs.
|
||||
* Compute the space required to copy bitmaps from @in_bs.
|
||||
*
|
||||
* The computation is based as if copying to a new image with the
|
||||
* given @cluster_size, which may differ from the cluster size in @bs.
|
||||
* given @cluster_size, which may differ from the cluster size in
|
||||
* @in_bs; in fact, @in_bs might be something other than qcow2.
|
||||
*/
|
||||
uint64_t qcow2_get_persistent_dirty_bitmap_size(BlockDriverState *bs,
|
||||
uint64_t qcow2_get_persistent_dirty_bitmap_size(BlockDriverState *in_bs,
|
||||
uint32_t cluster_size)
|
||||
{
|
||||
uint64_t bitmaps_size = 0;
|
||||
BdrvDirtyBitmap *bm;
|
||||
size_t bitmap_dir_size = 0;
|
||||
|
||||
FOR_EACH_DIRTY_BITMAP(bs, bm) {
|
||||
FOR_EACH_DIRTY_BITMAP(in_bs, bm) {
|
||||
if (bdrv_dirty_bitmap_get_persistence(bm)) {
|
||||
const char *name = bdrv_dirty_bitmap_name(bm);
|
||||
uint32_t granularity = bdrv_dirty_bitmap_granularity(bm);
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
#include "trace-root.h"
|
||||
#include "qemu/thread.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "qemu/range.h"
|
||||
|
||||
/* #define DEBUG_IOMMU */
|
||||
|
||||
|
@ -142,6 +144,26 @@ static void dma_blk_cb(void *opaque, int ret)
|
|||
cur_addr = dbs->sg->sg[dbs->sg_cur_index].base + dbs->sg_cur_byte;
|
||||
cur_len = dbs->sg->sg[dbs->sg_cur_index].len - dbs->sg_cur_byte;
|
||||
mem = dma_memory_map(dbs->sg->as, cur_addr, &cur_len, dbs->dir);
|
||||
/*
|
||||
* Make reads deterministic in icount mode. Windows sometimes issues
|
||||
* disk read requests with overlapping SGs. It leads
|
||||
* to non-determinism, because resulting buffer contents may be mixed
|
||||
* from several sectors. This code splits all SGs into several
|
||||
* groups. SGs in every group do not overlap.
|
||||
*/
|
||||
if (mem && use_icount && dbs->dir == DMA_DIRECTION_FROM_DEVICE) {
|
||||
int i;
|
||||
for (i = 0 ; i < dbs->iov.niov ; ++i) {
|
||||
if (ranges_overlap((intptr_t)dbs->iov.iov[i].iov_base,
|
||||
dbs->iov.iov[i].iov_len, (intptr_t)mem,
|
||||
cur_len)) {
|
||||
dma_memory_unmap(dbs->sg->as, mem, cur_len,
|
||||
dbs->dir, cur_len);
|
||||
mem = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!mem)
|
||||
break;
|
||||
qemu_iovec_add(&dbs->iov, mem, cur_len);
|
||||
|
|
|
@ -61,7 +61,7 @@ bool blk_check_size_and_read_all(BlockBackend *blk, void *buf, hwaddr size,
|
|||
return true;
|
||||
}
|
||||
|
||||
void blkconf_blocksizes(BlockConf *conf)
|
||||
bool blkconf_blocksizes(BlockConf *conf, Error **errp)
|
||||
{
|
||||
BlockBackend *blk = conf->blk;
|
||||
BlockSizes blocksizes;
|
||||
|
@ -83,6 +83,44 @@ void blkconf_blocksizes(BlockConf *conf)
|
|||
conf->logical_block_size = BDRV_SECTOR_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
if (conf->logical_block_size > conf->physical_block_size) {
|
||||
error_setg(errp,
|
||||
"logical_block_size > physical_block_size not supported");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!QEMU_IS_ALIGNED(conf->min_io_size, conf->logical_block_size)) {
|
||||
error_setg(errp,
|
||||
"min_io_size must be a multiple of logical_block_size");
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* all devices which support min_io_size (scsi and virtio-blk) expose it to
|
||||
* the guest as a uint16_t in units of logical blocks
|
||||
*/
|
||||
if (conf->min_io_size / conf->logical_block_size > UINT16_MAX) {
|
||||
error_setg(errp, "min_io_size must not exceed %u logical blocks",
|
||||
UINT16_MAX);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!QEMU_IS_ALIGNED(conf->opt_io_size, conf->logical_block_size)) {
|
||||
error_setg(errp,
|
||||
"opt_io_size must be a multiple of logical_block_size");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (conf->discard_granularity != -1 &&
|
||||
!QEMU_IS_ALIGNED(conf->discard_granularity,
|
||||
conf->logical_block_size)) {
|
||||
error_setg(errp, "discard_granularity must be "
|
||||
"a multiple of logical_block_size");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool blkconf_apply_backend_options(BlockConf *conf, bool readonly,
|
||||
|
|
|
@ -220,6 +220,9 @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
|
|||
goto fail_guest_notifiers;
|
||||
}
|
||||
|
||||
/* Process queued requests before the ones in vring */
|
||||
virtio_blk_process_queued_requests(vblk, false);
|
||||
|
||||
/* Kick right away to begin processing requests already in vring */
|
||||
for (i = 0; i < nvqs; i++) {
|
||||
VirtQueue *vq = virtio_get_queue(s->vdev, i);
|
||||
|
@ -239,6 +242,11 @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
|
|||
return 0;
|
||||
|
||||
fail_guest_notifiers:
|
||||
/*
|
||||
* If we failed to set up the guest notifiers queued requests will be
|
||||
* processed on the main context.
|
||||
*/
|
||||
virtio_blk_process_queued_requests(vblk, false);
|
||||
vblk->dataplane_disabled = true;
|
||||
s->starting = false;
|
||||
vblk->dataplane_started = true;
|
||||
|
|
|
@ -554,7 +554,10 @@ static void floppy_drive_realize(DeviceState *qdev, Error **errp)
|
|||
read_only = !blk_bs(dev->conf.blk) || blk_is_read_only(dev->conf.blk);
|
||||
}
|
||||
|
||||
blkconf_blocksizes(&dev->conf);
|
||||
if (!blkconf_blocksizes(&dev->conf, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (dev->conf.logical_block_size != 512 ||
|
||||
dev->conf.physical_block_size != 512)
|
||||
{
|
||||
|
|
580
hw/block/nvme.c
580
hw/block/nvme.c
File diff suppressed because it is too large
Load diff
|
@ -1,7 +1,16 @@
|
|||
#ifndef HW_NVME_H
|
||||
#define HW_NVME_H
|
||||
|
||||
#include "block/nvme.h"
|
||||
|
||||
typedef struct NvmeParams {
|
||||
char *serial;
|
||||
uint32_t num_queues; /* deprecated since 5.1 */
|
||||
uint32_t max_ioqpairs;
|
||||
uint16_t msix_qsize;
|
||||
uint32_t cmb_size_mb;
|
||||
} NvmeParams;
|
||||
|
||||
typedef struct NvmeAsyncEvent {
|
||||
QSIMPLEQ_ENTRY(NvmeAsyncEvent) entry;
|
||||
NvmeAerResult result;
|
||||
|
@ -53,6 +62,17 @@ typedef struct NvmeNamespace {
|
|||
NvmeIdNs id_ns;
|
||||
} NvmeNamespace;
|
||||
|
||||
static inline NvmeLBAF *nvme_ns_lbaf(NvmeNamespace *ns)
|
||||
{
|
||||
NvmeIdNs *id_ns = &ns->id_ns;
|
||||
return &id_ns->lbaf[NVME_ID_NS_FLBAS_INDEX(id_ns->flbas)];
|
||||
}
|
||||
|
||||
static inline uint8_t nvme_ns_lbads(NvmeNamespace *ns)
|
||||
{
|
||||
return nvme_ns_lbaf(ns)->ds;
|
||||
}
|
||||
|
||||
#define TYPE_NVME "nvme"
|
||||
#define NVME(obj) \
|
||||
OBJECT_CHECK(NvmeCtrl, (obj), TYPE_NVME)
|
||||
|
@ -63,6 +83,7 @@ typedef struct NvmeCtrl {
|
|||
MemoryRegion ctrl_mem;
|
||||
NvmeBar bar;
|
||||
BlockConf conf;
|
||||
NvmeParams params;
|
||||
|
||||
uint32_t page_size;
|
||||
uint16_t page_bits;
|
||||
|
@ -71,18 +92,13 @@ typedef struct NvmeCtrl {
|
|||
uint16_t sqe_size;
|
||||
uint32_t reg_size;
|
||||
uint32_t num_namespaces;
|
||||
uint32_t num_queues;
|
||||
uint32_t max_q_ents;
|
||||
uint64_t ns_size;
|
||||
uint32_t cmb_size_mb;
|
||||
uint32_t cmbsz;
|
||||
uint32_t cmbloc;
|
||||
uint8_t *cmbuf;
|
||||
uint64_t irq_status;
|
||||
uint32_t irq_status;
|
||||
uint64_t host_timestamp; /* Timestamp sent by the host */
|
||||
uint64_t timestamp_set_qemu_clock_ms; /* QEMU clock time */
|
||||
|
||||
char *serial;
|
||||
HostMemoryBackend *pmrdev;
|
||||
|
||||
NvmeNamespace *namespaces;
|
||||
|
@ -93,4 +109,10 @@ typedef struct NvmeCtrl {
|
|||
NvmeIdCtrl id_ctrl;
|
||||
} NvmeCtrl;
|
||||
|
||||
/* calculate the number of LBAs that the namespace can accomodate */
|
||||
static inline uint64_t nvme_ns_nlbas(NvmeCtrl *n, NvmeNamespace *ns)
|
||||
{
|
||||
return n->ns_size >> nvme_ns_lbads(ns);
|
||||
}
|
||||
|
||||
#endif /* HW_NVME_H */
|
||||
|
|
|
@ -189,7 +189,10 @@ static void swim_drive_realize(DeviceState *qdev, Error **errp)
|
|||
assert(ret == 0);
|
||||
}
|
||||
|
||||
blkconf_blocksizes(&dev->conf);
|
||||
if (!blkconf_blocksizes(&dev->conf, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (dev->conf.logical_block_size != 512 ||
|
||||
dev->conf.physical_block_size != 512)
|
||||
{
|
||||
|
|
|
@ -29,100 +29,100 @@ hd_geometry_guess(void *blk, uint32_t cyls, uint32_t heads, uint32_t secs, int t
|
|||
|
||||
# nvme.c
|
||||
# nvme traces for successful events
|
||||
nvme_irq_msix(uint32_t vector) "raising MSI-X IRQ vector %u"
|
||||
nvme_irq_pin(void) "pulsing IRQ pin"
|
||||
nvme_irq_masked(void) "IRQ is masked"
|
||||
nvme_dma_read(uint64_t prp1, uint64_t prp2) "DMA read, prp1=0x%"PRIx64" prp2=0x%"PRIx64""
|
||||
nvme_rw(const char *verb, uint32_t blk_count, uint64_t byte_count, uint64_t lba) "%s %"PRIu32" blocks (%"PRIu64" bytes) from LBA %"PRIu64""
|
||||
nvme_create_sq(uint64_t addr, uint16_t sqid, uint16_t cqid, uint16_t qsize, uint16_t qflags) "create submission queue, addr=0x%"PRIx64", sqid=%"PRIu16", cqid=%"PRIu16", qsize=%"PRIu16", qflags=%"PRIu16""
|
||||
nvme_create_cq(uint64_t addr, uint16_t cqid, uint16_t vector, uint16_t size, uint16_t qflags, int ien) "create completion queue, addr=0x%"PRIx64", cqid=%"PRIu16", vector=%"PRIu16", qsize=%"PRIu16", qflags=%"PRIu16", ien=%d"
|
||||
nvme_del_sq(uint16_t qid) "deleting submission queue sqid=%"PRIu16""
|
||||
nvme_del_cq(uint16_t cqid) "deleted completion queue, cqid=%"PRIu16""
|
||||
nvme_identify_ctrl(void) "identify controller"
|
||||
nvme_identify_ns(uint16_t ns) "identify namespace, nsid=%"PRIu16""
|
||||
nvme_identify_nslist(uint16_t ns) "identify namespace list, nsid=%"PRIu16""
|
||||
nvme_getfeat_vwcache(const char* result) "get feature volatile write cache, result=%s"
|
||||
nvme_getfeat_numq(int result) "get feature number of queues, result=%d"
|
||||
nvme_setfeat_numq(int reqcq, int reqsq, int gotcq, int gotsq) "requested cq_count=%d sq_count=%d, responding with cq_count=%d sq_count=%d"
|
||||
nvme_setfeat_timestamp(uint64_t ts) "set feature timestamp = 0x%"PRIx64""
|
||||
nvme_getfeat_timestamp(uint64_t ts) "get feature timestamp = 0x%"PRIx64""
|
||||
nvme_mmio_intm_set(uint64_t data, uint64_t new_mask) "wrote MMIO, interrupt mask set, data=0x%"PRIx64", new_mask=0x%"PRIx64""
|
||||
nvme_mmio_intm_clr(uint64_t data, uint64_t new_mask) "wrote MMIO, interrupt mask clr, data=0x%"PRIx64", new_mask=0x%"PRIx64""
|
||||
nvme_mmio_cfg(uint64_t data) "wrote MMIO, config controller config=0x%"PRIx64""
|
||||
nvme_mmio_aqattr(uint64_t data) "wrote MMIO, admin queue attributes=0x%"PRIx64""
|
||||
nvme_mmio_asqaddr(uint64_t data) "wrote MMIO, admin submission queue address=0x%"PRIx64""
|
||||
nvme_mmio_acqaddr(uint64_t data) "wrote MMIO, admin completion queue address=0x%"PRIx64""
|
||||
nvme_mmio_asqaddr_hi(uint64_t data, uint64_t new_addr) "wrote MMIO, admin submission queue high half=0x%"PRIx64", new_address=0x%"PRIx64""
|
||||
nvme_mmio_acqaddr_hi(uint64_t data, uint64_t new_addr) "wrote MMIO, admin completion queue high half=0x%"PRIx64", new_address=0x%"PRIx64""
|
||||
nvme_mmio_start_success(void) "setting controller enable bit succeeded"
|
||||
nvme_mmio_stopped(void) "cleared controller enable bit"
|
||||
nvme_mmio_shutdown_set(void) "shutdown bit set"
|
||||
nvme_mmio_shutdown_cleared(void) "shutdown bit cleared"
|
||||
pci_nvme_irq_msix(uint32_t vector) "raising MSI-X IRQ vector %u"
|
||||
pci_nvme_irq_pin(void) "pulsing IRQ pin"
|
||||
pci_nvme_irq_masked(void) "IRQ is masked"
|
||||
pci_nvme_dma_read(uint64_t prp1, uint64_t prp2) "DMA read, prp1=0x%"PRIx64" prp2=0x%"PRIx64""
|
||||
pci_nvme_rw(const char *verb, uint32_t blk_count, uint64_t byte_count, uint64_t lba) "%s %"PRIu32" blocks (%"PRIu64" bytes) from LBA %"PRIu64""
|
||||
pci_nvme_create_sq(uint64_t addr, uint16_t sqid, uint16_t cqid, uint16_t qsize, uint16_t qflags) "create submission queue, addr=0x%"PRIx64", sqid=%"PRIu16", cqid=%"PRIu16", qsize=%"PRIu16", qflags=%"PRIu16""
|
||||
pci_nvme_create_cq(uint64_t addr, uint16_t cqid, uint16_t vector, uint16_t size, uint16_t qflags, int ien) "create completion queue, addr=0x%"PRIx64", cqid=%"PRIu16", vector=%"PRIu16", qsize=%"PRIu16", qflags=%"PRIu16", ien=%d"
|
||||
pci_nvme_del_sq(uint16_t qid) "deleting submission queue sqid=%"PRIu16""
|
||||
pci_nvme_del_cq(uint16_t cqid) "deleted completion queue, cqid=%"PRIu16""
|
||||
pci_nvme_identify_ctrl(void) "identify controller"
|
||||
pci_nvme_identify_ns(uint16_t ns) "identify namespace, nsid=%"PRIu16""
|
||||
pci_nvme_identify_nslist(uint16_t ns) "identify namespace list, nsid=%"PRIu16""
|
||||
pci_nvme_getfeat_vwcache(const char* result) "get feature volatile write cache, result=%s"
|
||||
pci_nvme_getfeat_numq(int result) "get feature number of queues, result=%d"
|
||||
pci_nvme_setfeat_numq(int reqcq, int reqsq, int gotcq, int gotsq) "requested cq_count=%d sq_count=%d, responding with cq_count=%d sq_count=%d"
|
||||
pci_nvme_setfeat_timestamp(uint64_t ts) "set feature timestamp = 0x%"PRIx64""
|
||||
pci_nvme_getfeat_timestamp(uint64_t ts) "get feature timestamp = 0x%"PRIx64""
|
||||
pci_nvme_mmio_intm_set(uint64_t data, uint64_t new_mask) "wrote MMIO, interrupt mask set, data=0x%"PRIx64", new_mask=0x%"PRIx64""
|
||||
pci_nvme_mmio_intm_clr(uint64_t data, uint64_t new_mask) "wrote MMIO, interrupt mask clr, data=0x%"PRIx64", new_mask=0x%"PRIx64""
|
||||
pci_nvme_mmio_cfg(uint64_t data) "wrote MMIO, config controller config=0x%"PRIx64""
|
||||
pci_nvme_mmio_aqattr(uint64_t data) "wrote MMIO, admin queue attributes=0x%"PRIx64""
|
||||
pci_nvme_mmio_asqaddr(uint64_t data) "wrote MMIO, admin submission queue address=0x%"PRIx64""
|
||||
pci_nvme_mmio_acqaddr(uint64_t data) "wrote MMIO, admin completion queue address=0x%"PRIx64""
|
||||
pci_nvme_mmio_asqaddr_hi(uint64_t data, uint64_t new_addr) "wrote MMIO, admin submission queue high half=0x%"PRIx64", new_address=0x%"PRIx64""
|
||||
pci_nvme_mmio_acqaddr_hi(uint64_t data, uint64_t new_addr) "wrote MMIO, admin completion queue high half=0x%"PRIx64", new_address=0x%"PRIx64""
|
||||
pci_nvme_mmio_start_success(void) "setting controller enable bit succeeded"
|
||||
pci_nvme_mmio_stopped(void) "cleared controller enable bit"
|
||||
pci_nvme_mmio_shutdown_set(void) "shutdown bit set"
|
||||
pci_nvme_mmio_shutdown_cleared(void) "shutdown bit cleared"
|
||||
|
||||
# nvme traces for error conditions
|
||||
nvme_err_invalid_dma(void) "PRP/SGL is too small for transfer size"
|
||||
nvme_err_invalid_prplist_ent(uint64_t prplist) "PRP list entry is null or not page aligned: 0x%"PRIx64""
|
||||
nvme_err_invalid_prp2_align(uint64_t prp2) "PRP2 is not page aligned: 0x%"PRIx64""
|
||||
nvme_err_invalid_prp2_missing(void) "PRP2 is null and more data to be transferred"
|
||||
nvme_err_invalid_prp(void) "invalid PRP"
|
||||
nvme_err_invalid_ns(uint32_t ns, uint32_t limit) "invalid namespace %u not within 1-%u"
|
||||
nvme_err_invalid_opc(uint8_t opc) "invalid opcode 0x%"PRIx8""
|
||||
nvme_err_invalid_admin_opc(uint8_t opc) "invalid admin opcode 0x%"PRIx8""
|
||||
nvme_err_invalid_lba_range(uint64_t start, uint64_t len, uint64_t limit) "Invalid LBA start=%"PRIu64" len=%"PRIu64" limit=%"PRIu64""
|
||||
nvme_err_invalid_del_sq(uint16_t qid) "invalid submission queue deletion, sid=%"PRIu16""
|
||||
nvme_err_invalid_create_sq_cqid(uint16_t cqid) "failed creating submission queue, invalid cqid=%"PRIu16""
|
||||
nvme_err_invalid_create_sq_sqid(uint16_t sqid) "failed creating submission queue, invalid sqid=%"PRIu16""
|
||||
nvme_err_invalid_create_sq_size(uint16_t qsize) "failed creating submission queue, invalid qsize=%"PRIu16""
|
||||
nvme_err_invalid_create_sq_addr(uint64_t addr) "failed creating submission queue, addr=0x%"PRIx64""
|
||||
nvme_err_invalid_create_sq_qflags(uint16_t qflags) "failed creating submission queue, qflags=%"PRIu16""
|
||||
nvme_err_invalid_del_cq_cqid(uint16_t cqid) "failed deleting completion queue, cqid=%"PRIu16""
|
||||
nvme_err_invalid_del_cq_notempty(uint16_t cqid) "failed deleting completion queue, it is not empty, cqid=%"PRIu16""
|
||||
nvme_err_invalid_create_cq_cqid(uint16_t cqid) "failed creating completion queue, cqid=%"PRIu16""
|
||||
nvme_err_invalid_create_cq_size(uint16_t size) "failed creating completion queue, size=%"PRIu16""
|
||||
nvme_err_invalid_create_cq_addr(uint64_t addr) "failed creating completion queue, addr=0x%"PRIx64""
|
||||
nvme_err_invalid_create_cq_vector(uint16_t vector) "failed creating completion queue, vector=%"PRIu16""
|
||||
nvme_err_invalid_create_cq_qflags(uint16_t qflags) "failed creating completion queue, qflags=%"PRIu16""
|
||||
nvme_err_invalid_identify_cns(uint16_t cns) "identify, invalid cns=0x%"PRIx16""
|
||||
nvme_err_invalid_getfeat(int dw10) "invalid get features, dw10=0x%"PRIx32""
|
||||
nvme_err_invalid_setfeat(uint32_t dw10) "invalid set features, dw10=0x%"PRIx32""
|
||||
nvme_err_startfail_cq(void) "nvme_start_ctrl failed because there are non-admin completion queues"
|
||||
nvme_err_startfail_sq(void) "nvme_start_ctrl failed because there are non-admin submission queues"
|
||||
nvme_err_startfail_nbarasq(void) "nvme_start_ctrl failed because the admin submission queue address is null"
|
||||
nvme_err_startfail_nbaracq(void) "nvme_start_ctrl failed because the admin completion queue address is null"
|
||||
nvme_err_startfail_asq_misaligned(uint64_t addr) "nvme_start_ctrl failed because the admin submission queue address is misaligned: 0x%"PRIx64""
|
||||
nvme_err_startfail_acq_misaligned(uint64_t addr) "nvme_start_ctrl failed because the admin completion queue address is misaligned: 0x%"PRIx64""
|
||||
nvme_err_startfail_page_too_small(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the page size is too small: log2size=%u, min=%u"
|
||||
nvme_err_startfail_page_too_large(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the page size is too large: log2size=%u, max=%u"
|
||||
nvme_err_startfail_cqent_too_small(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the completion queue entry size is too small: log2size=%u, min=%u"
|
||||
nvme_err_startfail_cqent_too_large(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the completion queue entry size is too large: log2size=%u, max=%u"
|
||||
nvme_err_startfail_sqent_too_small(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the submission queue entry size is too small: log2size=%u, min=%u"
|
||||
nvme_err_startfail_sqent_too_large(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the submission queue entry size is too large: log2size=%u, max=%u"
|
||||
nvme_err_startfail_asqent_sz_zero(void) "nvme_start_ctrl failed because the admin submission queue size is zero"
|
||||
nvme_err_startfail_acqent_sz_zero(void) "nvme_start_ctrl failed because the admin completion queue size is zero"
|
||||
nvme_err_startfail(void) "setting controller enable bit failed"
|
||||
pci_nvme_err_invalid_dma(void) "PRP/SGL is too small for transfer size"
|
||||
pci_nvme_err_invalid_prplist_ent(uint64_t prplist) "PRP list entry is null or not page aligned: 0x%"PRIx64""
|
||||
pci_nvme_err_invalid_prp2_align(uint64_t prp2) "PRP2 is not page aligned: 0x%"PRIx64""
|
||||
pci_nvme_err_invalid_prp2_missing(void) "PRP2 is null and more data to be transferred"
|
||||
pci_nvme_err_invalid_prp(void) "invalid PRP"
|
||||
pci_nvme_err_invalid_ns(uint32_t ns, uint32_t limit) "invalid namespace %u not within 1-%u"
|
||||
pci_nvme_err_invalid_opc(uint8_t opc) "invalid opcode 0x%"PRIx8""
|
||||
pci_nvme_err_invalid_admin_opc(uint8_t opc) "invalid admin opcode 0x%"PRIx8""
|
||||
pci_nvme_err_invalid_lba_range(uint64_t start, uint64_t len, uint64_t limit) "Invalid LBA start=%"PRIu64" len=%"PRIu64" limit=%"PRIu64""
|
||||
pci_nvme_err_invalid_del_sq(uint16_t qid) "invalid submission queue deletion, sid=%"PRIu16""
|
||||
pci_nvme_err_invalid_create_sq_cqid(uint16_t cqid) "failed creating submission queue, invalid cqid=%"PRIu16""
|
||||
pci_nvme_err_invalid_create_sq_sqid(uint16_t sqid) "failed creating submission queue, invalid sqid=%"PRIu16""
|
||||
pci_nvme_err_invalid_create_sq_size(uint16_t qsize) "failed creating submission queue, invalid qsize=%"PRIu16""
|
||||
pci_nvme_err_invalid_create_sq_addr(uint64_t addr) "failed creating submission queue, addr=0x%"PRIx64""
|
||||
pci_nvme_err_invalid_create_sq_qflags(uint16_t qflags) "failed creating submission queue, qflags=%"PRIu16""
|
||||
pci_nvme_err_invalid_del_cq_cqid(uint16_t cqid) "failed deleting completion queue, cqid=%"PRIu16""
|
||||
pci_nvme_err_invalid_del_cq_notempty(uint16_t cqid) "failed deleting completion queue, it is not empty, cqid=%"PRIu16""
|
||||
pci_nvme_err_invalid_create_cq_cqid(uint16_t cqid) "failed creating completion queue, cqid=%"PRIu16""
|
||||
pci_nvme_err_invalid_create_cq_size(uint16_t size) "failed creating completion queue, size=%"PRIu16""
|
||||
pci_nvme_err_invalid_create_cq_addr(uint64_t addr) "failed creating completion queue, addr=0x%"PRIx64""
|
||||
pci_nvme_err_invalid_create_cq_vector(uint16_t vector) "failed creating completion queue, vector=%"PRIu16""
|
||||
pci_nvme_err_invalid_create_cq_qflags(uint16_t qflags) "failed creating completion queue, qflags=%"PRIu16""
|
||||
pci_nvme_err_invalid_identify_cns(uint16_t cns) "identify, invalid cns=0x%"PRIx16""
|
||||
pci_nvme_err_invalid_getfeat(int dw10) "invalid get features, dw10=0x%"PRIx32""
|
||||
pci_nvme_err_invalid_setfeat(uint32_t dw10) "invalid set features, dw10=0x%"PRIx32""
|
||||
pci_nvme_err_startfail_cq(void) "nvme_start_ctrl failed because there are non-admin completion queues"
|
||||
pci_nvme_err_startfail_sq(void) "nvme_start_ctrl failed because there are non-admin submission queues"
|
||||
pci_nvme_err_startfail_nbarasq(void) "nvme_start_ctrl failed because the admin submission queue address is null"
|
||||
pci_nvme_err_startfail_nbaracq(void) "nvme_start_ctrl failed because the admin completion queue address is null"
|
||||
pci_nvme_err_startfail_asq_misaligned(uint64_t addr) "nvme_start_ctrl failed because the admin submission queue address is misaligned: 0x%"PRIx64""
|
||||
pci_nvme_err_startfail_acq_misaligned(uint64_t addr) "nvme_start_ctrl failed because the admin completion queue address is misaligned: 0x%"PRIx64""
|
||||
pci_nvme_err_startfail_page_too_small(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the page size is too small: log2size=%u, min=%u"
|
||||
pci_nvme_err_startfail_page_too_large(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the page size is too large: log2size=%u, max=%u"
|
||||
pci_nvme_err_startfail_cqent_too_small(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the completion queue entry size is too small: log2size=%u, min=%u"
|
||||
pci_nvme_err_startfail_cqent_too_large(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the completion queue entry size is too large: log2size=%u, max=%u"
|
||||
pci_nvme_err_startfail_sqent_too_small(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the submission queue entry size is too small: log2size=%u, min=%u"
|
||||
pci_nvme_err_startfail_sqent_too_large(uint8_t log2ps, uint8_t maxlog2ps) "nvme_start_ctrl failed because the submission queue entry size is too large: log2size=%u, max=%u"
|
||||
pci_nvme_err_startfail_asqent_sz_zero(void) "nvme_start_ctrl failed because the admin submission queue size is zero"
|
||||
pci_nvme_err_startfail_acqent_sz_zero(void) "nvme_start_ctrl failed because the admin completion queue size is zero"
|
||||
pci_nvme_err_startfail(void) "setting controller enable bit failed"
|
||||
|
||||
# Traces for undefined behavior
|
||||
nvme_ub_mmiowr_misaligned32(uint64_t offset) "MMIO write not 32-bit aligned, offset=0x%"PRIx64""
|
||||
nvme_ub_mmiowr_toosmall(uint64_t offset, unsigned size) "MMIO write smaller than 32 bits, offset=0x%"PRIx64", size=%u"
|
||||
nvme_ub_mmiowr_intmask_with_msix(void) "undefined access to interrupt mask set when MSI-X is enabled"
|
||||
nvme_ub_mmiowr_ro_csts(void) "attempted to set a read only bit of controller status"
|
||||
nvme_ub_mmiowr_ssreset_w1c_unsupported(void) "attempted to W1C CSTS.NSSRO but CAP.NSSRS is zero (not supported)"
|
||||
nvme_ub_mmiowr_ssreset_unsupported(void) "attempted NVM subsystem reset but CAP.NSSRS is zero (not supported)"
|
||||
nvme_ub_mmiowr_cmbloc_reserved(void) "invalid write to reserved CMBLOC when CMBSZ is zero, ignored"
|
||||
nvme_ub_mmiowr_cmbsz_readonly(void) "invalid write to read only CMBSZ, ignored"
|
||||
nvme_ub_mmiowr_pmrcap_readonly(void) "invalid write to read only PMRCAP, ignored"
|
||||
nvme_ub_mmiowr_pmrsts_readonly(void) "invalid write to read only PMRSTS, ignored"
|
||||
nvme_ub_mmiowr_pmrebs_readonly(void) "invalid write to read only PMREBS, ignored"
|
||||
nvme_ub_mmiowr_pmrswtp_readonly(void) "invalid write to read only PMRSWTP, ignored"
|
||||
nvme_ub_mmiowr_invalid(uint64_t offset, uint64_t data) "invalid MMIO write, offset=0x%"PRIx64", data=0x%"PRIx64""
|
||||
nvme_ub_mmiord_misaligned32(uint64_t offset) "MMIO read not 32-bit aligned, offset=0x%"PRIx64""
|
||||
nvme_ub_mmiord_toosmall(uint64_t offset) "MMIO read smaller than 32-bits, offset=0x%"PRIx64""
|
||||
nvme_ub_mmiord_invalid_ofs(uint64_t offset) "MMIO read beyond last register, offset=0x%"PRIx64", returning 0"
|
||||
nvme_ub_db_wr_misaligned(uint64_t offset) "doorbell write not 32-bit aligned, offset=0x%"PRIx64", ignoring"
|
||||
nvme_ub_db_wr_invalid_cq(uint32_t qid) "completion queue doorbell write for nonexistent queue, cqid=%"PRIu32", ignoring"
|
||||
nvme_ub_db_wr_invalid_cqhead(uint32_t qid, uint16_t new_head) "completion queue doorbell write value beyond queue size, cqid=%"PRIu32", new_head=%"PRIu16", ignoring"
|
||||
nvme_ub_db_wr_invalid_sq(uint32_t qid) "submission queue doorbell write for nonexistent queue, sqid=%"PRIu32", ignoring"
|
||||
nvme_ub_db_wr_invalid_sqtail(uint32_t qid, uint16_t new_tail) "submission queue doorbell write value beyond queue size, sqid=%"PRIu32", new_head=%"PRIu16", ignoring"
|
||||
pci_nvme_ub_mmiowr_misaligned32(uint64_t offset) "MMIO write not 32-bit aligned, offset=0x%"PRIx64""
|
||||
pci_nvme_ub_mmiowr_toosmall(uint64_t offset, unsigned size) "MMIO write smaller than 32 bits, offset=0x%"PRIx64", size=%u"
|
||||
pci_nvme_ub_mmiowr_intmask_with_msix(void) "undefined access to interrupt mask set when MSI-X is enabled"
|
||||
pci_nvme_ub_mmiowr_ro_csts(void) "attempted to set a read only bit of controller status"
|
||||
pci_nvme_ub_mmiowr_ssreset_w1c_unsupported(void) "attempted to W1C CSTS.NSSRO but CAP.NSSRS is zero (not supported)"
|
||||
pci_nvme_ub_mmiowr_ssreset_unsupported(void) "attempted NVM subsystem reset but CAP.NSSRS is zero (not supported)"
|
||||
pci_nvme_ub_mmiowr_cmbloc_reserved(void) "invalid write to reserved CMBLOC when CMBSZ is zero, ignored"
|
||||
pci_nvme_ub_mmiowr_cmbsz_readonly(void) "invalid write to read only CMBSZ, ignored"
|
||||
pci_nvme_ub_mmiowr_pmrcap_readonly(void) "invalid write to read only PMRCAP, ignored"
|
||||
pci_nvme_ub_mmiowr_pmrsts_readonly(void) "invalid write to read only PMRSTS, ignored"
|
||||
pci_nvme_ub_mmiowr_pmrebs_readonly(void) "invalid write to read only PMREBS, ignored"
|
||||
pci_nvme_ub_mmiowr_pmrswtp_readonly(void) "invalid write to read only PMRSWTP, ignored"
|
||||
pci_nvme_ub_mmiowr_invalid(uint64_t offset, uint64_t data) "invalid MMIO write, offset=0x%"PRIx64", data=0x%"PRIx64""
|
||||
pci_nvme_ub_mmiord_misaligned32(uint64_t offset) "MMIO read not 32-bit aligned, offset=0x%"PRIx64""
|
||||
pci_nvme_ub_mmiord_toosmall(uint64_t offset) "MMIO read smaller than 32-bits, offset=0x%"PRIx64""
|
||||
pci_nvme_ub_mmiord_invalid_ofs(uint64_t offset) "MMIO read beyond last register, offset=0x%"PRIx64", returning 0"
|
||||
pci_nvme_ub_db_wr_misaligned(uint64_t offset) "doorbell write not 32-bit aligned, offset=0x%"PRIx64", ignoring"
|
||||
pci_nvme_ub_db_wr_invalid_cq(uint32_t qid) "completion queue doorbell write for nonexistent queue, cqid=%"PRIu32", ignoring"
|
||||
pci_nvme_ub_db_wr_invalid_cqhead(uint32_t qid, uint16_t new_head) "completion queue doorbell write value beyond queue size, cqid=%"PRIu32", new_head=%"PRIu16", ignoring"
|
||||
pci_nvme_ub_db_wr_invalid_sq(uint32_t qid) "submission queue doorbell write for nonexistent queue, sqid=%"PRIu32", ignoring"
|
||||
pci_nvme_ub_db_wr_invalid_sqtail(uint32_t qid, uint16_t new_tail) "submission queue doorbell write value beyond queue size, sqid=%"PRIu32", new_head=%"PRIu16", ignoring"
|
||||
|
||||
# xen-block.c
|
||||
xen_block_realize(const char *type, uint32_t disk, uint32_t partition) "%s d%up%u"
|
||||
|
|
|
@ -819,15 +819,11 @@ static void virtio_blk_handle_output(VirtIODevice *vdev, VirtQueue *vq)
|
|||
virtio_blk_handle_output_do(s, vq);
|
||||
}
|
||||
|
||||
static void virtio_blk_dma_restart_bh(void *opaque)
|
||||
void virtio_blk_process_queued_requests(VirtIOBlock *s, bool is_bh)
|
||||
{
|
||||
VirtIOBlock *s = opaque;
|
||||
VirtIOBlockReq *req = s->rq;
|
||||
MultiReqBuffer mrb = {};
|
||||
|
||||
qemu_bh_delete(s->bh);
|
||||
s->bh = NULL;
|
||||
|
||||
s->rq = NULL;
|
||||
|
||||
aio_context_acquire(blk_get_aio_context(s->conf.conf.blk));
|
||||
|
@ -851,22 +847,38 @@ static void virtio_blk_dma_restart_bh(void *opaque)
|
|||
if (mrb.num_reqs) {
|
||||
virtio_blk_submit_multireq(s->blk, &mrb);
|
||||
}
|
||||
blk_dec_in_flight(s->conf.conf.blk);
|
||||
if (is_bh) {
|
||||
blk_dec_in_flight(s->conf.conf.blk);
|
||||
}
|
||||
aio_context_release(blk_get_aio_context(s->conf.conf.blk));
|
||||
}
|
||||
|
||||
static void virtio_blk_dma_restart_bh(void *opaque)
|
||||
{
|
||||
VirtIOBlock *s = opaque;
|
||||
|
||||
qemu_bh_delete(s->bh);
|
||||
s->bh = NULL;
|
||||
|
||||
virtio_blk_process_queued_requests(s, true);
|
||||
}
|
||||
|
||||
static void virtio_blk_dma_restart_cb(void *opaque, int running,
|
||||
RunState state)
|
||||
{
|
||||
VirtIOBlock *s = opaque;
|
||||
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(s)));
|
||||
VirtioBusState *bus = VIRTIO_BUS(qbus);
|
||||
|
||||
if (!running) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!s->bh) {
|
||||
/* FIXME The data plane is not started yet, so these requests are
|
||||
* processed in the main thread. */
|
||||
/*
|
||||
* If ioeventfd is enabled, don't schedule the BH here as queued
|
||||
* requests will be processed while starting the data plane.
|
||||
*/
|
||||
if (!s->bh && !virtio_bus_ioeventfd_enabled(bus)) {
|
||||
s->bh = aio_bh_new(blk_get_aio_context(s->conf.conf.blk),
|
||||
virtio_blk_dma_restart_bh, s);
|
||||
blk_inc_in_flight(s->conf.conf.blk);
|
||||
|
@ -918,7 +930,7 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
|
|||
virtio_stw_p(vdev, &blkcfg.geometry.cylinders, conf->cyls);
|
||||
virtio_stl_p(vdev, &blkcfg.blk_size, blk_size);
|
||||
virtio_stw_p(vdev, &blkcfg.min_io_size, conf->min_io_size / blk_size);
|
||||
virtio_stw_p(vdev, &blkcfg.opt_io_size, conf->opt_io_size / blk_size);
|
||||
virtio_stl_p(vdev, &blkcfg.opt_io_size, conf->opt_io_size / blk_size);
|
||||
blkcfg.geometry.heads = conf->heads;
|
||||
/*
|
||||
* We must ensure that the block device capacity is a multiple of
|
||||
|
@ -1162,12 +1174,7 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
|
|||
return;
|
||||
}
|
||||
|
||||
blkconf_blocksizes(&conf->conf);
|
||||
|
||||
if (conf->conf.logical_block_size >
|
||||
conf->conf.physical_block_size) {
|
||||
error_setg(errp,
|
||||
"logical_block_size > physical_block_size not supported");
|
||||
if (!blkconf_blocksizes(&conf->conf, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -239,11 +239,7 @@ static void xen_block_realize(XenDevice *xendev, Error **errp)
|
|||
return;
|
||||
}
|
||||
|
||||
blkconf_blocksizes(conf);
|
||||
|
||||
if (conf->logical_block_size > conf->physical_block_size) {
|
||||
error_setg(
|
||||
errp, "logical_block_size > physical_block_size not supported");
|
||||
if (!blkconf_blocksizes(conf, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "qapi/visitor.h"
|
||||
#include "chardev/char.h"
|
||||
#include "qemu/uuid.h"
|
||||
#include "qemu/units.h"
|
||||
|
||||
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
|
||||
Error **errp)
|
||||
|
@ -727,32 +728,95 @@ const PropertyInfo qdev_prop_pci_devfn = {
|
|||
.set_default_value = set_default_value_int,
|
||||
};
|
||||
|
||||
/* --- blocksize --- */
|
||||
/* --- 32bit unsigned int 'size' type --- */
|
||||
|
||||
static void set_blocksize(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
static void get_size32(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint16_t value, *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint64_t value = *ptr;
|
||||
|
||||
visit_type_size(v, name, &value, errp);
|
||||
}
|
||||
|
||||
static void set_size32(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint64_t value;
|
||||
Error *local_err = NULL;
|
||||
const int64_t min = 512;
|
||||
const int64_t max = 32768;
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
return;
|
||||
}
|
||||
|
||||
visit_type_uint16(v, name, &value, &local_err);
|
||||
visit_type_size(v, name, &value, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value > UINT32_MAX) {
|
||||
error_setg(errp,
|
||||
"Property %s.%s doesn't take value %" PRIu64
|
||||
" (maximum: %u)",
|
||||
dev->id ? : "", name, value, UINT32_MAX);
|
||||
return;
|
||||
}
|
||||
|
||||
*ptr = value;
|
||||
}
|
||||
|
||||
const PropertyInfo qdev_prop_size32 = {
|
||||
.name = "size",
|
||||
.get = get_size32,
|
||||
.set = set_size32,
|
||||
.set_default_value = set_default_value_uint,
|
||||
};
|
||||
|
||||
/* --- blocksize --- */
|
||||
|
||||
/* lower limit is sector size */
|
||||
#define MIN_BLOCK_SIZE 512
|
||||
#define MIN_BLOCK_SIZE_STR "512 B"
|
||||
/*
|
||||
* upper limit is arbitrary, 2 MiB looks sufficient for all sensible uses, and
|
||||
* matches qcow2 cluster size limit
|
||||
*/
|
||||
#define MAX_BLOCK_SIZE (2 * MiB)
|
||||
#define MAX_BLOCK_SIZE_STR "2 MiB"
|
||||
|
||||
static void set_blocksize(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint64_t value;
|
||||
Error *local_err = NULL;
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
return;
|
||||
}
|
||||
|
||||
visit_type_size(v, name, &value, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
/* value of 0 means "unset" */
|
||||
if (value && (value < min || value > max)) {
|
||||
error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE,
|
||||
dev->id ? : "", name, (int64_t)value, min, max);
|
||||
if (value && (value < MIN_BLOCK_SIZE || value > MAX_BLOCK_SIZE)) {
|
||||
error_setg(errp,
|
||||
"Property %s.%s doesn't take value %" PRIu64
|
||||
" (minimum: " MIN_BLOCK_SIZE_STR
|
||||
", maximum: " MAX_BLOCK_SIZE_STR ")",
|
||||
dev->id ? : "", name, value);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -768,9 +832,10 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
|
|||
}
|
||||
|
||||
const PropertyInfo qdev_prop_blocksize = {
|
||||
.name = "uint16",
|
||||
.description = "A power of two between 512 and 32768",
|
||||
.get = get_uint16,
|
||||
.name = "size",
|
||||
.description = "A power of two between " MIN_BLOCK_SIZE_STR
|
||||
" and " MAX_BLOCK_SIZE_STR,
|
||||
.get = get_size32,
|
||||
.set = set_blocksize,
|
||||
.set_default_value = set_default_value_uint,
|
||||
};
|
||||
|
|
|
@ -44,7 +44,7 @@ static int handle_cmd(AHCIState *s, int port, uint8_t slot);
|
|||
static void ahci_reset_port(AHCIState *s, int port);
|
||||
static bool ahci_write_fis_d2h(AHCIDevice *ad);
|
||||
static void ahci_init_d2h(AHCIDevice *ad);
|
||||
static int ahci_dma_prepare_buf(IDEDMA *dma, int32_t limit);
|
||||
static int ahci_dma_prepare_buf(const IDEDMA *dma, int32_t limit);
|
||||
static bool ahci_map_clb_address(AHCIDevice *ad);
|
||||
static bool ahci_map_fis_address(AHCIDevice *ad);
|
||||
static void ahci_unmap_clb_address(AHCIDevice *ad);
|
||||
|
@ -1338,7 +1338,7 @@ out:
|
|||
}
|
||||
|
||||
/* Transfer PIO data between RAM and device */
|
||||
static void ahci_pio_transfer(IDEDMA *dma)
|
||||
static void ahci_pio_transfer(const IDEDMA *dma)
|
||||
{
|
||||
AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
|
||||
IDEState *s = &ad->port.ifs[0];
|
||||
|
@ -1397,7 +1397,7 @@ out:
|
|||
}
|
||||
}
|
||||
|
||||
static void ahci_start_dma(IDEDMA *dma, IDEState *s,
|
||||
static void ahci_start_dma(const IDEDMA *dma, IDEState *s,
|
||||
BlockCompletionFunc *dma_cb)
|
||||
{
|
||||
AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
|
||||
|
@ -1406,7 +1406,7 @@ static void ahci_start_dma(IDEDMA *dma, IDEState *s,
|
|||
dma_cb(s, 0);
|
||||
}
|
||||
|
||||
static void ahci_restart_dma(IDEDMA *dma)
|
||||
static void ahci_restart_dma(const IDEDMA *dma)
|
||||
{
|
||||
/* Nothing to do, ahci_start_dma already resets s->io_buffer_offset. */
|
||||
}
|
||||
|
@ -1415,7 +1415,7 @@ static void ahci_restart_dma(IDEDMA *dma)
|
|||
* IDE/PIO restarts are handled by the core layer, but NCQ commands
|
||||
* need an extra kick from the AHCI HBA.
|
||||
*/
|
||||
static void ahci_restart(IDEDMA *dma)
|
||||
static void ahci_restart(const IDEDMA *dma)
|
||||
{
|
||||
AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
|
||||
int i;
|
||||
|
@ -1432,7 +1432,7 @@ static void ahci_restart(IDEDMA *dma)
|
|||
* Called in DMA and PIO R/W chains to read the PRDT.
|
||||
* Not shared with NCQ pathways.
|
||||
*/
|
||||
static int32_t ahci_dma_prepare_buf(IDEDMA *dma, int32_t limit)
|
||||
static int32_t ahci_dma_prepare_buf(const IDEDMA *dma, int32_t limit)
|
||||
{
|
||||
AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
|
||||
IDEState *s = &ad->port.ifs[0];
|
||||
|
@ -1453,7 +1453,7 @@ static int32_t ahci_dma_prepare_buf(IDEDMA *dma, int32_t limit)
|
|||
* Called via dma_buf_commit, for both DMA and PIO paths.
|
||||
* sglist destruction is handled within dma_buf_commit.
|
||||
*/
|
||||
static void ahci_commit_buf(IDEDMA *dma, uint32_t tx_bytes)
|
||||
static void ahci_commit_buf(const IDEDMA *dma, uint32_t tx_bytes)
|
||||
{
|
||||
AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
|
||||
|
||||
|
@ -1461,7 +1461,7 @@ static void ahci_commit_buf(IDEDMA *dma, uint32_t tx_bytes)
|
|||
ad->cur_cmd->status = cpu_to_le32(tx_bytes);
|
||||
}
|
||||
|
||||
static int ahci_dma_rw_buf(IDEDMA *dma, bool is_write)
|
||||
static int ahci_dma_rw_buf(const IDEDMA *dma, bool is_write)
|
||||
{
|
||||
AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
|
||||
IDEState *s = &ad->port.ifs[0];
|
||||
|
@ -1486,7 +1486,7 @@ static int ahci_dma_rw_buf(IDEDMA *dma, bool is_write)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static void ahci_cmd_done(IDEDMA *dma)
|
||||
static void ahci_cmd_done(const IDEDMA *dma)
|
||||
{
|
||||
AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
|
||||
|
||||
|
|
|
@ -2570,16 +2570,16 @@ static void ide_init1(IDEBus *bus, int unit)
|
|||
ide_sector_write_timer_cb, s);
|
||||
}
|
||||
|
||||
static int ide_nop_int(IDEDMA *dma, bool is_write)
|
||||
static int ide_nop_int(const IDEDMA *dma, bool is_write)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ide_nop(IDEDMA *dma)
|
||||
static void ide_nop(const IDEDMA *dma)
|
||||
{
|
||||
}
|
||||
|
||||
static int32_t ide_nop_int32(IDEDMA *dma, int32_t l)
|
||||
static int32_t ide_nop_int32(const IDEDMA *dma, int32_t l)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -376,17 +376,17 @@ static void macio_ide_reset(DeviceState *dev)
|
|||
ide_bus_reset(&d->bus);
|
||||
}
|
||||
|
||||
static int ide_nop_int(IDEDMA *dma, bool is_write)
|
||||
static int ide_nop_int(const IDEDMA *dma, bool is_write)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32_t ide_nop_int32(IDEDMA *dma, int32_t l)
|
||||
static int32_t ide_nop_int32(const IDEDMA *dma, int32_t l)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ide_dbdma_start(IDEDMA *dma, IDEState *s,
|
||||
static void ide_dbdma_start(const IDEDMA *dma, IDEState *s,
|
||||
BlockCompletionFunc *cb)
|
||||
{
|
||||
MACIOIDEState *m = container_of(dma, MACIOIDEState, dma);
|
||||
|
|
12
hw/ide/pci.c
12
hw/ide/pci.c
|
@ -103,7 +103,7 @@ const MemoryRegionOps pci_ide_data_le_ops = {
|
|||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static void bmdma_start_dma(IDEDMA *dma, IDEState *s,
|
||||
static void bmdma_start_dma(const IDEDMA *dma, IDEState *s,
|
||||
BlockCompletionFunc *dma_cb)
|
||||
{
|
||||
BMDMAState *bm = DO_UPCAST(BMDMAState, dma, dma);
|
||||
|
@ -126,7 +126,7 @@ static void bmdma_start_dma(IDEDMA *dma, IDEState *s,
|
|||
* IDEState.io_buffer_size will contain the number of bytes described
|
||||
* by the PRDs, whether or not we added them to the sglist.
|
||||
*/
|
||||
static int32_t bmdma_prepare_buf(IDEDMA *dma, int32_t limit)
|
||||
static int32_t bmdma_prepare_buf(const IDEDMA *dma, int32_t limit)
|
||||
{
|
||||
BMDMAState *bm = DO_UPCAST(BMDMAState, dma, dma);
|
||||
IDEState *s = bmdma_active_if(bm);
|
||||
|
@ -181,7 +181,7 @@ static int32_t bmdma_prepare_buf(IDEDMA *dma, int32_t limit)
|
|||
}
|
||||
|
||||
/* return 0 if buffer completed */
|
||||
static int bmdma_rw_buf(IDEDMA *dma, bool is_write)
|
||||
static int bmdma_rw_buf(const IDEDMA *dma, bool is_write)
|
||||
{
|
||||
BMDMAState *bm = DO_UPCAST(BMDMAState, dma, dma);
|
||||
IDEState *s = bmdma_active_if(bm);
|
||||
|
@ -230,7 +230,7 @@ static int bmdma_rw_buf(IDEDMA *dma, bool is_write)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static void bmdma_set_inactive(IDEDMA *dma, bool more)
|
||||
static void bmdma_set_inactive(const IDEDMA *dma, bool more)
|
||||
{
|
||||
BMDMAState *bm = DO_UPCAST(BMDMAState, dma, dma);
|
||||
|
||||
|
@ -242,7 +242,7 @@ static void bmdma_set_inactive(IDEDMA *dma, bool more)
|
|||
}
|
||||
}
|
||||
|
||||
static void bmdma_restart_dma(IDEDMA *dma)
|
||||
static void bmdma_restart_dma(const IDEDMA *dma)
|
||||
{
|
||||
BMDMAState *bm = DO_UPCAST(BMDMAState, dma, dma);
|
||||
|
||||
|
@ -257,7 +257,7 @@ static void bmdma_cancel(BMDMAState *bm)
|
|||
}
|
||||
}
|
||||
|
||||
static void bmdma_reset(IDEDMA *dma)
|
||||
static void bmdma_reset(const IDEDMA *dma)
|
||||
{
|
||||
BMDMAState *bm = DO_UPCAST(BMDMAState, dma, dma);
|
||||
|
||||
|
|
|
@ -187,7 +187,10 @@ static void ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind, Error **errp)
|
|||
return;
|
||||
}
|
||||
|
||||
blkconf_blocksizes(&dev->conf);
|
||||
if (!blkconf_blocksizes(&dev->conf, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (dev->conf.logical_block_size != 512) {
|
||||
error_setg(errp, "logical_block_size must be 512 for IDE");
|
||||
return;
|
||||
|
|
|
@ -2346,12 +2346,7 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
|
|||
return;
|
||||
}
|
||||
|
||||
blkconf_blocksizes(&s->qdev.conf);
|
||||
|
||||
if (s->qdev.conf.logical_block_size >
|
||||
s->qdev.conf.physical_block_size) {
|
||||
error_setg(errp,
|
||||
"logical_block_size > physical_block_size not supported");
|
||||
if (!blkconf_blocksizes(&s->qdev.conf, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2436,7 +2431,9 @@ static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
|
|||
if (s->qdev.conf.blk) {
|
||||
ctx = blk_get_aio_context(s->qdev.conf.blk);
|
||||
aio_context_acquire(ctx);
|
||||
blkconf_blocksizes(&s->qdev.conf);
|
||||
if (!blkconf_blocksizes(&s->qdev.conf, errp)) {
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
s->qdev.blocksize = s->qdev.conf.logical_block_size;
|
||||
s->qdev.type = TYPE_DISK;
|
||||
|
@ -2444,6 +2441,7 @@ static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
|
|||
s->product = g_strdup("QEMU HARDDISK");
|
||||
}
|
||||
scsi_realize(&s->qdev, errp);
|
||||
out:
|
||||
if (ctx) {
|
||||
aio_context_release(ctx);
|
||||
}
|
||||
|
|
|
@ -612,7 +612,10 @@ static void usb_msd_storage_realize(USBDevice *dev, Error **errp)
|
|||
return;
|
||||
}
|
||||
|
||||
blkconf_blocksizes(&s->conf);
|
||||
if (!blkconf_blocksizes(&s->conf, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!blkconf_apply_backend_options(&s->conf, blk_is_read_only(blk), true,
|
||||
errp)) {
|
||||
return;
|
||||
|
|
|
@ -705,6 +705,14 @@ typedef struct NvmePSD {
|
|||
uint8_t resv[16];
|
||||
} NvmePSD;
|
||||
|
||||
#define NVME_IDENTIFY_DATA_SIZE 4096
|
||||
|
||||
enum {
|
||||
NVME_ID_CNS_NS = 0x0,
|
||||
NVME_ID_CNS_CTRL = 0x1,
|
||||
NVME_ID_CNS_NS_ACTIVE_LIST = 0x2,
|
||||
};
|
||||
|
||||
typedef struct NvmeIdCtrl {
|
||||
uint16_t vid;
|
||||
uint16_t ssvid;
|
||||
|
|
|
@ -18,9 +18,9 @@
|
|||
|
||||
typedef struct BlockConf {
|
||||
BlockBackend *blk;
|
||||
uint16_t physical_block_size;
|
||||
uint16_t logical_block_size;
|
||||
uint16_t min_io_size;
|
||||
uint32_t physical_block_size;
|
||||
uint32_t logical_block_size;
|
||||
uint32_t min_io_size;
|
||||
uint32_t opt_io_size;
|
||||
int32_t bootindex;
|
||||
uint32_t discard_granularity;
|
||||
|
@ -51,9 +51,9 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
|
|||
_conf.logical_block_size), \
|
||||
DEFINE_PROP_BLOCKSIZE("physical_block_size", _state, \
|
||||
_conf.physical_block_size), \
|
||||
DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0), \
|
||||
DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0), \
|
||||
DEFINE_PROP_UINT32("discard_granularity", _state, \
|
||||
DEFINE_PROP_SIZE32("min_io_size", _state, _conf.min_io_size, 0), \
|
||||
DEFINE_PROP_SIZE32("opt_io_size", _state, _conf.opt_io_size, 0), \
|
||||
DEFINE_PROP_SIZE32("discard_granularity", _state, \
|
||||
_conf.discard_granularity, -1), \
|
||||
DEFINE_PROP_ON_OFF_AUTO("write-cache", _state, _conf.wce, \
|
||||
ON_OFF_AUTO_AUTO), \
|
||||
|
@ -87,7 +87,7 @@ bool blk_check_size_and_read_all(BlockBackend *blk, void *buf, hwaddr size,
|
|||
bool blkconf_geometry(BlockConf *conf, int *trans,
|
||||
unsigned cyls_max, unsigned heads_max, unsigned secs_max,
|
||||
Error **errp);
|
||||
void blkconf_blocksizes(BlockConf *conf);
|
||||
bool blkconf_blocksizes(BlockConf *conf, Error **errp);
|
||||
bool blkconf_apply_backend_options(BlockConf *conf, bool readonly,
|
||||
bool resizable, Error **errp);
|
||||
|
||||
|
|
|
@ -322,12 +322,12 @@ typedef enum { IDE_HD, IDE_CD, IDE_CFATA } IDEDriveKind;
|
|||
|
||||
typedef void EndTransferFunc(IDEState *);
|
||||
|
||||
typedef void DMAStartFunc(IDEDMA *, IDEState *, BlockCompletionFunc *);
|
||||
typedef void DMAVoidFunc(IDEDMA *);
|
||||
typedef int DMAIntFunc(IDEDMA *, bool);
|
||||
typedef int32_t DMAInt32Func(IDEDMA *, int32_t len);
|
||||
typedef void DMAu32Func(IDEDMA *, uint32_t);
|
||||
typedef void DMAStopFunc(IDEDMA *, bool);
|
||||
typedef void DMAStartFunc(const IDEDMA *, IDEState *, BlockCompletionFunc *);
|
||||
typedef void DMAVoidFunc(const IDEDMA *);
|
||||
typedef int DMAIntFunc(const IDEDMA *, bool);
|
||||
typedef int32_t DMAInt32Func(const IDEDMA *, int32_t len);
|
||||
typedef void DMAu32Func(const IDEDMA *, uint32_t);
|
||||
typedef void DMAStopFunc(const IDEDMA *, bool);
|
||||
|
||||
struct unreported_events {
|
||||
bool eject_request;
|
||||
|
|
|
@ -29,6 +29,7 @@ extern const PropertyInfo qdev_prop_drive;
|
|||
extern const PropertyInfo qdev_prop_drive_iothread;
|
||||
extern const PropertyInfo qdev_prop_netdev;
|
||||
extern const PropertyInfo qdev_prop_pci_devfn;
|
||||
extern const PropertyInfo qdev_prop_size32;
|
||||
extern const PropertyInfo qdev_prop_blocksize;
|
||||
extern const PropertyInfo qdev_prop_pci_host_devaddr;
|
||||
extern const PropertyInfo qdev_prop_uuid;
|
||||
|
@ -196,8 +197,10 @@ extern const PropertyInfo qdev_prop_pcie_link_width;
|
|||
BlockdevOnError)
|
||||
#define DEFINE_PROP_BIOS_CHS_TRANS(_n, _s, _f, _d) \
|
||||
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_bios_chs_trans, int)
|
||||
#define DEFINE_PROP_SIZE32(_n, _s, _f, _d) \
|
||||
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size32, uint32_t)
|
||||
#define DEFINE_PROP_BLOCKSIZE(_n, _s, _f) \
|
||||
DEFINE_PROP_UNSIGNED(_n, _s, _f, 0, qdev_prop_blocksize, uint16_t)
|
||||
DEFINE_PROP_UNSIGNED(_n, _s, _f, 0, qdev_prop_blocksize, uint32_t)
|
||||
#define DEFINE_PROP_PCI_HOST_DEVADDR(_n, _s, _f) \
|
||||
DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress)
|
||||
#define DEFINE_PROP_OFF_AUTO_PCIBAR(_n, _s, _f, _d) \
|
||||
|
|
|
@ -86,5 +86,6 @@ typedef struct MultiReqBuffer {
|
|||
} MultiReqBuffer;
|
||||
|
||||
bool virtio_blk_handle_vq(VirtIOBlock *s, VirtQueue *vq);
|
||||
void virtio_blk_process_queued_requests(VirtIOBlock *s, bool is_bh);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -277,6 +277,8 @@ class TestSingleBlockdev(TestSingleDrive):
|
|||
result = self.vm.run_job('job0')
|
||||
self.assertEqual(result, 'Source and target image have different sizes')
|
||||
|
||||
# qed does not support shrinking
|
||||
@iotests.skip_for_formats(('qed'))
|
||||
def test_small_target(self):
|
||||
self.do_test_target_size(self.image_len // 2)
|
||||
|
||||
|
|
|
@ -683,11 +683,10 @@ class TestBlockJobsAfterCycle(ChangeBaseClass):
|
|||
except OSError:
|
||||
pass
|
||||
|
||||
# We need backing file support
|
||||
@iotests.skip_for_formats(('vpc', 'parallels', 'qcow', 'vdi', 'vmdk', 'raw',
|
||||
'vhdx'))
|
||||
def test_snapshot_and_commit(self):
|
||||
# We need backing file support
|
||||
if iotests.imgfmt != 'qcow2' and iotests.imgfmt != 'qed':
|
||||
return
|
||||
|
||||
result = self.vm.qmp('blockdev-snapshot-sync', device='drive0',
|
||||
snapshot_file=new_img,
|
||||
format=iotests.imgfmt)
|
||||
|
|
|
@ -24,11 +24,11 @@ Testing:
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "288"
|
||||
|
@ -54,11 +54,11 @@ Testing: -fda TEST_DIR/t.qcow2
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -81,22 +81,22 @@ Testing: -fdb TEST_DIR/t.qcow2
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "floppy1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "288"
|
||||
|
@ -119,22 +119,22 @@ Testing: -fda TEST_DIR/t.qcow2 -fdb TEST_DIR/t.qcow2.2
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "floppy1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -160,11 +160,11 @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -187,22 +187,22 @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2,index=1
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "floppy1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "288"
|
||||
|
@ -225,22 +225,22 @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=floppy,file=TEST_DIR/t
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "floppy1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -266,11 +266,11 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -global isa-fdc.driveA=none0
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -293,11 +293,11 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -global isa-fdc.driveB=none0
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -320,22 +320,22 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qco
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -361,11 +361,11 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -388,11 +388,11 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,unit=1
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -415,22 +415,22 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qco
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -456,22 +456,22 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -global is
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -494,22 +494,22 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -global is
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "floppy1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -532,11 +532,11 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -global is
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -559,11 +559,11 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -global is
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "floppy1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -589,22 +589,22 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -627,22 +627,22 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -665,22 +665,22 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "floppy1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -703,22 +703,22 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "floppy1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -750,22 +750,22 @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.q
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -788,22 +788,22 @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.q
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "floppy0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -832,22 +832,22 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qco
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -870,22 +870,22 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qco
|
|||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -908,22 +908,22 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qco
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -946,22 +946,22 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qco
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none1"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
dev: floppy, id ""
|
||||
unit = 1 (0x1)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -999,11 +999,11 @@ Testing: -device floppy
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = ""
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "288"
|
||||
|
@ -1026,11 +1026,11 @@ Testing: -device floppy,drive-type=120
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = ""
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "120"
|
||||
|
@ -1053,11 +1053,11 @@ Testing: -device floppy,drive-type=144
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = ""
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -1080,11 +1080,11 @@ Testing: -device floppy,drive-type=288
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = ""
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "288"
|
||||
|
@ -1110,11 +1110,11 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,drive-t
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "120"
|
||||
|
@ -1137,11 +1137,11 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,drive-t
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "288"
|
||||
|
@ -1167,11 +1167,11 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,logical
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
@ -1194,17 +1194,17 @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,physica
|
|||
dev: floppy, id ""
|
||||
unit = 0 (0x0)
|
||||
drive = "none0"
|
||||
logical_block_size = 512 (0x200)
|
||||
physical_block_size = 512 (0x200)
|
||||
min_io_size = 0 (0x0)
|
||||
opt_io_size = 0 (0x0)
|
||||
discard_granularity = 4294967295 (0xffffffff)
|
||||
logical_block_size = 512 (512 B)
|
||||
physical_block_size = 512 (512 B)
|
||||
min_io_size = 0 (0 B)
|
||||
opt_io_size = 0 (0 B)
|
||||
discard_granularity = 4294967295 (4 GiB)
|
||||
write-cache = "auto"
|
||||
share-rw = false
|
||||
drive-type = "144"
|
||||
|
||||
Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,logical_block_size=4096
|
||||
QEMU_PROG: -device floppy,drive=none0,logical_block_size=4096: Physical and logical block size must be 512 for floppy
|
||||
QEMU_PROG: -device floppy,drive=none0,logical_block_size=4096: logical_block_size > physical_block_size not supported
|
||||
|
||||
Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,physical_block_size=1024
|
||||
QEMU_PROG: -device floppy,drive=none0,physical_block_size=1024: Physical and logical block size must be 512 for floppy
|
||||
|
|
|
@ -41,6 +41,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
|||
# See 178 for more extensive tests across more formats
|
||||
_supported_fmt qcow2
|
||||
_supported_proto file
|
||||
# compat=0.10 does not support bitmaps
|
||||
_unsupported_imgopts 'compat=0.10'
|
||||
|
||||
echo "== Huge file without bitmaps =="
|
||||
echo
|
||||
|
|
|
@ -46,6 +46,9 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
|||
_supported_fmt qcow2 qed
|
||||
_supported_proto file
|
||||
_supported_os Linux
|
||||
# blkdebug can only inject errors on bs->file, so external data files
|
||||
# do not work with this test
|
||||
_unsupported_imgopts data_file
|
||||
|
||||
|
||||
DEST_IMG="$TEST_DIR/d.$IMGFMT"
|
||||
|
|
|
@ -39,6 +39,8 @@ _supported_fmt qcow2
|
|||
_supported_proto file
|
||||
_supported_os Linux
|
||||
_require_command QEMU_NBD
|
||||
# compat=0.10 does not support bitmaps
|
||||
_unsupported_imgopts 'compat=0.10'
|
||||
|
||||
echo
|
||||
echo "=== Initial image setup ==="
|
||||
|
|
|
@ -40,6 +40,11 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
|||
_supported_fmt qcow2
|
||||
_supported_proto file
|
||||
_supported_os Linux
|
||||
# We need qemu-img map to show the file where the data is allocated,
|
||||
# but with an external data file, it will show that instead of the
|
||||
# file we want to check. So just skip this test for external data
|
||||
# files.
|
||||
_unsupported_imgopts data_file
|
||||
|
||||
echo '### Create the backing image'
|
||||
BACKING_IMG="$TEST_IMG.base"
|
||||
|
|
|
@ -1103,6 +1103,22 @@ def skip_if_unsupported(required_formats=(), read_only=False):
|
|||
return func_wrapper
|
||||
return skip_test_decorator
|
||||
|
||||
def skip_for_formats(formats: Sequence[str] = ()) \
|
||||
-> Callable[[Callable[[QMPTestCase, List[Any], Dict[str, Any]], None]],
|
||||
Callable[[QMPTestCase, List[Any], Dict[str, Any]], None]]:
|
||||
'''Skip Test Decorator
|
||||
Skips the test for the given formats'''
|
||||
def skip_test_decorator(func):
|
||||
def func_wrapper(test_case: QMPTestCase, *args: List[Any],
|
||||
**kwargs: Dict[str, Any]) -> None:
|
||||
if imgfmt in formats:
|
||||
msg = f'{test_case}: Skipped for format {imgfmt}'
|
||||
test_case.case_skip(msg)
|
||||
else:
|
||||
func(test_case, *args, **kwargs)
|
||||
return func_wrapper
|
||||
return skip_test_decorator
|
||||
|
||||
def skip_if_user_is_root(func):
|
||||
'''Skip Test Decorator
|
||||
Runs the test only without root permissions'''
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
#
|
||||
# Manipulations with qcow2 image
|
||||
#
|
||||
# Copyright (C) 2012 Red Hat, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# Library for manipulations with qcow2 image
|
||||
#
|
||||
# Copyright (c) 2020 Virtuozzo International GmbH.
|
||||
# Copyright (C) 2012 Red Hat, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
|
Loading…
Reference in a new issue