* [Qemu-devel] [PULL 00/12] Block patches @ 2011-06-08 13:48 Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 01/12] ide/core: Remove explicit setting of BM_STATUS_INT Kevin Wolf ` (12 more replies) 0 siblings, 13 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit a90d4690074526f54ad0851fce19fa6783f06803: Add an isa device for SGA (2011-06-07 13:52:30 -0500) are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony Alexander Graf (1): vmdk: fix endianness bugs Christoph Egger (2): block/raw-posix: use a character device if a block device is given block/raw-posix: get right partition size Christoph Hellwig (1): block: clarify the meaning of BDRV_O_NOCACHE Josh Durgin (4): rbd: use the higher level librbd instead of just librados rbd: allow configuration of rados from the rbd filename rbd: check return values when scheduling aio rbd: Add bdrv_truncate implementation Kevin Wolf (4): ide/core: Remove explicit setting of BM_STATUS_INT qcow2: Fix memory leaks in error cases bdrv_img_create: Fix segfault qemu-img create: Fix displayed default cluster size block.c | 13 +- block/qcow2-cluster.c | 2 +- block/qcow2-refcount.c | 9 +- block/qcow2.c | 7 +- block/qcow2.h | 2 + block/qed.c | 3 +- block/raw-posix.c | 77 ++++- block/raw-win32.c | 12 +- block/rbd.c | 896 ++++++++++++++++++------------------------------ block/rbd_types.h | 71 ---- block/vdi.c | 6 +- block/vmdk.c | 22 +- blockdev.c | 2 +- configure | 33 +-- hw/ide/core.c | 7 +- qemu-io.c | 4 +- qemu-nbd.c | 2 +- 17 files changed, 461 insertions(+), 707 deletions(-) delete mode 100644 block/rbd_types.h ^ permalink raw reply [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 01/12] ide/core: Remove explicit setting of BM_STATUS_INT 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 02/12] block: clarify the meaning of BDRV_O_NOCACHE Kevin Wolf ` (11 subsequent siblings) 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel BM_STATUS_INT is automatically set during ide_set_irq(), there's no reason to set it manually in addition. There is even one case where the interrupt status bit was set, but no IRQ was raised. This is when the PRD table was reached but there is more data to transfer. The correct behaviour for this case is not to set BM_STATUS_INT. Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- hw/ide/core.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index 45410e8..95beb17 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -430,7 +430,6 @@ void ide_dma_error(IDEState *s) s->error = ABRT_ERR; s->status = READY_STAT | ERR_STAT; ide_set_inactive(s); - s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT); ide_set_irq(s->bus); } @@ -500,8 +499,11 @@ handle_rw_error: n = s->nsector; s->io_buffer_index = 0; s->io_buffer_size = n * 512; - if (s->bus->dma->ops->prepare_buf(s->bus->dma, s->is_read) == 0) + if (s->bus->dma->ops->prepare_buf(s->bus->dma, s->is_read) == 0) { + /* The PRDs were too short. Reset the Active bit, but don't raise an + * interrupt. */ goto eot; + } #ifdef DEBUG_AIO printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, is_read=%d\n", @@ -523,7 +525,6 @@ handle_rw_error: return; eot: - s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT); ide_set_inactive(s); } -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 02/12] block: clarify the meaning of BDRV_O_NOCACHE 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 01/12] ide/core: Remove explicit setting of BM_STATUS_INT Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 03/12] vmdk: fix endianness bugs Kevin Wolf ` (10 subsequent siblings) 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Christoph Hellwig <hch@lst.de> Change BDRV_O_NOCACHE to only imply bypassing the host OS file cache, but no writeback semantics. All existing callers are changed to also specify BDRV_O_CACHE_WB to give them writeback semantics. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block.c | 8 +------- block/qcow2.c | 2 +- block/raw-posix.c | 2 +- block/raw-win32.c | 12 ++++++------ blockdev.c | 2 +- qemu-io.c | 4 ++-- qemu-nbd.c | 2 +- 7 files changed, 13 insertions(+), 19 deletions(-) diff --git a/block.c b/block.c index effa86f..3036a2d 100644 --- a/block.c +++ b/block.c @@ -439,13 +439,7 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename, bs->drv = drv; bs->opaque = qemu_mallocz(drv->instance_size); - /* - * Yes, BDRV_O_NOCACHE aka O_DIRECT means we have to present a - * write cache to the guest. We do need the fdatasync to flush - * out transactions for block allocations, and we maybe have a - * volatile write cache in our backing device to deal with. - */ - if (flags & (BDRV_O_CACHE_WB|BDRV_O_NOCACHE)) + if (flags & BDRV_O_CACHE_WB) bs->enable_write_cache = 1; /* diff --git a/block/qcow2.c b/block/qcow2.c index 75b8bec..db1931b 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -229,7 +229,7 @@ static int qcow2_open(BlockDriverState *bs, int flags) } /* alloc L2 table/refcount block cache */ - writethrough = ((flags & BDRV_O_CACHE_MASK) == 0); + writethrough = ((flags & BDRV_O_CACHE_WB) == 0); s->l2_table_cache = qcow2_cache_create(bs, L2_CACHE_SIZE, writethrough); s->refcount_block_cache = qcow2_cache_create(bs, REFCOUNT_CACHE_SIZE, writethrough); diff --git a/block/raw-posix.c b/block/raw-posix.c index 6b72470..50428fd 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -154,7 +154,7 @@ static int raw_open_common(BlockDriverState *bs, const char *filename, * and O_DIRECT for no caching. */ if ((bdrv_flags & BDRV_O_NOCACHE)) s->open_flags |= O_DIRECT; - else if (!(bdrv_flags & BDRV_O_CACHE_WB)) + if (!(bdrv_flags & BDRV_O_CACHE_WB)) s->open_flags |= O_DSYNC; s->fd = -1; diff --git a/block/raw-win32.c b/block/raw-win32.c index c204a80..56bd719 100644 --- a/block/raw-win32.c +++ b/block/raw-win32.c @@ -88,9 +88,9 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) } overlapped = FILE_ATTRIBUTE_NORMAL; - if ((flags & BDRV_O_NOCACHE)) - overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH; - else if (!(flags & BDRV_O_CACHE_WB)) + if (flags & BDRV_O_NOCACHE) + overlapped |= FILE_FLAG_NO_BUFFERING; + if (!(flags & BDRV_O_CACHE_WB)) overlapped |= FILE_FLAG_WRITE_THROUGH; s->hfile = CreateFile(filename, access_flags, FILE_SHARE_READ, NULL, @@ -349,9 +349,9 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) create_flags = OPEN_EXISTING; overlapped = FILE_ATTRIBUTE_NORMAL; - if ((flags & BDRV_O_NOCACHE)) - overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH; - else if (!(flags & BDRV_O_CACHE_WB)) + if (flags & BDRV_O_NOCACHE) + overlapped |= FILE_FLAG_NO_BUFFERING; + if (!(flags & BDRV_O_CACHE_WB)) overlapped |= FILE_FLAG_WRITE_THROUGH; s->hfile = CreateFile(filename, access_flags, FILE_SHARE_READ, NULL, diff --git a/blockdev.c b/blockdev.c index 6e0eb83..1502575 100644 --- a/blockdev.c +++ b/blockdev.c @@ -326,7 +326,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) if ((buf = qemu_opt_get(opts, "cache")) != NULL) { if (!strcmp(buf, "off") || !strcmp(buf, "none")) { - bdrv_flags |= BDRV_O_NOCACHE; + bdrv_flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB; } else if (!strcmp(buf, "writeback")) { bdrv_flags |= BDRV_O_CACHE_WB; } else if (!strcmp(buf, "unsafe")) { diff --git a/qemu-io.c b/qemu-io.c index 4470e49..dd4ebf5 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -1655,7 +1655,7 @@ open_f(int argc, char **argv) flags |= BDRV_O_SNAPSHOT; break; case 'n': - flags |= BDRV_O_NOCACHE; + flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB; break; case 'r': readonly = 1; @@ -1751,7 +1751,7 @@ int main(int argc, char **argv) flags |= BDRV_O_SNAPSHOT; break; case 'n': - flags |= BDRV_O_NOCACHE; + flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB; break; case 'c': add_user_command(optarg); diff --git a/qemu-nbd.c b/qemu-nbd.c index e858033..110d78e 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -238,7 +238,7 @@ int main(int argc, char **argv) flags |= BDRV_O_SNAPSHOT; break; case 'n': - flags |= BDRV_O_NOCACHE; + flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB; break; case 'b': bindto = optarg; -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 03/12] vmdk: fix endianness bugs 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 01/12] ide/core: Remove explicit setting of BM_STATUS_INT Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 02/12] block: clarify the meaning of BDRV_O_NOCACHE Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 04/12] block/raw-posix: use a character device if a block device is given Kevin Wolf ` (9 subsequent siblings) 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Alexander Graf <agraf@suse.de> The vmdk code is sloppy when handling the header descriptor during creation of an image. Fix all header accesses in the create path to either store native endianness or convert it when appropriate. Reported-by: Yury Tsarev <ytsarev@novell.com> Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/vmdk.c | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index 8fc9d67..922b23d 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -716,11 +716,11 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options) return -errno; magic = cpu_to_be32(VMDK4_MAGIC); memset(&header, 0, sizeof(header)); - header.version = cpu_to_le32(1); - header.flags = cpu_to_le32(3); /* ?? */ - header.capacity = cpu_to_le64(total_size); - header.granularity = cpu_to_le64(128); - header.num_gtes_per_gte = cpu_to_le32(512); + header.version = 1; + header.flags = 3; /* ?? */ + header.capacity = total_size; + header.granularity = 128; + header.num_gtes_per_gte = 512; grains = (total_size + header.granularity - 1) / header.granularity; gt_size = ((header.num_gtes_per_gte * sizeof(uint32_t)) + 511) >> 9; @@ -736,6 +736,12 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options) header.granularity - 1) / header.granularity) * header.granularity; + /* swap endianness for all header fields */ + header.version = cpu_to_le32(header.version); + header.flags = cpu_to_le32(header.flags); + header.capacity = cpu_to_le64(header.capacity); + header.granularity = cpu_to_le64(header.granularity); + header.num_gtes_per_gte = cpu_to_le32(header.num_gtes_per_gte); header.desc_offset = cpu_to_le64(header.desc_offset); header.desc_size = cpu_to_le64(header.desc_size); header.rgd_offset = cpu_to_le64(header.rgd_offset); @@ -759,7 +765,7 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options) goto exit; } - ret = ftruncate(fd, header.grain_offset << 9); + ret = ftruncate(fd, le64_to_cpu(header.grain_offset) << 9); if (ret < 0) { ret = -errno; goto exit; @@ -767,7 +773,7 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options) /* write grain directory */ lseek(fd, le64_to_cpu(header.rgd_offset) << 9, SEEK_SET); - for (i = 0, tmp = header.rgd_offset + gd_size; + for (i = 0, tmp = le64_to_cpu(header.rgd_offset) + gd_size; i < gt_count; i++, tmp += gt_size) { ret = qemu_write_full(fd, &tmp, sizeof(tmp)); if (ret != sizeof(tmp)) { @@ -778,7 +784,7 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options) /* write backup grain directory */ lseek(fd, le64_to_cpu(header.gd_offset) << 9, SEEK_SET); - for (i = 0, tmp = header.gd_offset + gd_size; + for (i = 0, tmp = le64_to_cpu(header.gd_offset) + gd_size; i < gt_count; i++, tmp += gt_size) { ret = qemu_write_full(fd, &tmp, sizeof(tmp)); if (ret != sizeof(tmp)) { -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 04/12] block/raw-posix: use a character device if a block device is given 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf ` (2 preceding siblings ...) 2011-06-08 13:48 ` [Qemu-devel] [PATCH 03/12] vmdk: fix endianness bugs Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 05/12] block/raw-posix: get right partition size Kevin Wolf ` (8 subsequent siblings) 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Christoph Egger <Christoph.Egger@amd.com> On NetBSD a userland process is better with the character device interface. In addition, a block device can't be opened twice; if a Xen backend opens it, qemu can't and vice-versa. Signed-off-by: Christoph Egger <Christoph.Egger@amd.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/raw-posix.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-) diff --git a/block/raw-posix.c b/block/raw-posix.c index 50428fd..00ed580 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -136,12 +136,55 @@ static int64_t raw_getlength(BlockDriverState *bs); static int cdrom_reopen(BlockDriverState *bs); #endif +#if defined(__NetBSD__) +static int raw_normalize_devicepath(const char **filename) +{ + static char namebuf[PATH_MAX]; + const char *dp, *fname; + struct stat sb; + + fname = *filename; + dp = strrchr(fname, '/'); + if (lstat(fname, &sb) < 0) { + fprintf(stderr, "%s: stat failed: %s\n", + fname, strerror(errno)); + return -errno; + } + + if (!S_ISBLK(sb.st_mode)) { + return 0; + } + + if (dp == NULL) { + snprintf(namebuf, PATH_MAX, "r%s", fname); + } else { + snprintf(namebuf, PATH_MAX, "%.*s/r%s", + (int)(dp - fname), fname, dp + 1); + } + fprintf(stderr, "%s is a block device", fname); + *filename = namebuf; + fprintf(stderr, ", using %s\n", *filename); + + return 0; +} +#else +static int raw_normalize_devicepath(const char **filename) +{ + return 0; +} +#endif + static int raw_open_common(BlockDriverState *bs, const char *filename, int bdrv_flags, int open_flags) { BDRVRawState *s = bs->opaque; int fd, ret; + ret = raw_normalize_devicepath(&filename); + if (ret != 0) { + return ret; + } + s->open_flags = open_flags | O_BINARY; s->open_flags &= ~O_ACCMODE; if (bdrv_flags & BDRV_O_RDWR) { -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 05/12] block/raw-posix: get right partition size 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf ` (3 preceding siblings ...) 2011-06-08 13:48 ` [Qemu-devel] [PATCH 04/12] block/raw-posix: use a character device if a block device is given Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 06/12] rbd: use the higher level librbd instead of just librados Kevin Wolf ` (7 subsequent siblings) 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Christoph Egger <Christoph.Egger@amd.com> use the correct way to get the size of a disk device or partition From: Adam Hamsik <haad@netbsd.org> Signed-off-by: Christoph Egger <Christoph.Egger@amd.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/raw-posix.c | 32 ++++++++++++++++++++++++++++++++ 1 files changed, 32 insertions(+), 0 deletions(-) diff --git a/block/raw-posix.c b/block/raw-posix.c index 00ed580..fd57b5b 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -64,6 +64,13 @@ #include <sys/dkio.h> #endif +#ifdef __NetBSD__ +#include <sys/ioctl.h> +#include <sys/disklabel.h> +#include <sys/dkio.h> +#include <sys/disk.h> +#endif + #ifdef __DragonFly__ #include <sys/ioctl.h> #include <sys/diskslice.h> @@ -665,6 +672,31 @@ static int64_t raw_getlength(BlockDriverState *bs) } else return st.st_size; } +#elif defined(__NetBSD__) +static int64_t raw_getlength(BlockDriverState *bs) +{ + BDRVRawState *s = bs->opaque; + int fd = s->fd; + struct stat st; + + if (fstat(fd, &st)) + return -1; + if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) { + struct dkwedge_info dkw; + + if (ioctl(fd, DIOCGWEDGEINFO, &dkw) != -1) { + return dkw.dkw_size * 512; + } else { + struct disklabel dl; + + if (ioctl(fd, DIOCGDINFO, &dl)) + return -1; + return (uint64_t)dl.d_secsize * + dl.d_partitions[DISKPART(st.st_rdev)].p_size; + } + } else + return st.st_size; +} #elif defined(__sun__) static int64_t raw_getlength(BlockDriverState *bs) { -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 06/12] rbd: use the higher level librbd instead of just librados 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf ` (4 preceding siblings ...) 2011-06-08 13:48 ` [Qemu-devel] [PATCH 05/12] block/raw-posix: get right partition size Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 07/12] rbd: allow configuration of rados from the rbd filename Kevin Wolf ` (6 subsequent siblings) 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Josh Durgin <josh.durgin@dreamhost.com> librbd stacks on top of librados to provide access to rbd images. Using librbd simplifies the qemu code, and allows qemu to use new versions of the rbd format with few (if any) changes. Reviewed-by: Christian Brunner <chb@muc.de> Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com> Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/rbd.c | 795 +++++++++++++++-------------------------------------- block/rbd_types.h | 71 ----- configure | 33 +-- 3 files changed, 226 insertions(+), 673 deletions(-) delete mode 100644 block/rbd_types.h diff --git a/block/rbd.c b/block/rbd.c index 249a590..2cee70d 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -1,20 +1,22 @@ /* * QEMU Block driver for RADOS (Ceph) * - * Copyright (C) 2010 Christian Brunner <chb@muc.de> + * Copyright (C) 2010-2011 Christian Brunner <chb@muc.de>, + * Josh Durgin <josh.durgin@dreamhost.com> * * This work is licensed under the terms of the GNU GPL, version 2. See * the COPYING file in the top-level directory. * */ +#include <inttypes.h> + #include "qemu-common.h" #include "qemu-error.h" -#include "rbd_types.h" #include "block_int.h" -#include <rados/librados.h> +#include <rbd/librbd.h> @@ -40,6 +42,13 @@ #define OBJ_MAX_SIZE (1UL << OBJ_DEFAULT_OBJ_ORDER) +#define RBD_MAX_CONF_NAME_SIZE 128 +#define RBD_MAX_CONF_VAL_SIZE 512 +#define RBD_MAX_CONF_SIZE 1024 +#define RBD_MAX_POOL_NAME_SIZE 128 +#define RBD_MAX_SNAP_NAME_SIZE 128 +#define RBD_MAX_SNAPS 100 + typedef struct RBDAIOCB { BlockDriverAIOCB common; QEMUBH *bh; @@ -48,7 +57,6 @@ typedef struct RBDAIOCB { char *bounce; int write; int64_t sector_num; - int aiocnt; int error; struct BDRVRBDState *s; int cancelled; @@ -59,7 +67,7 @@ typedef struct RADOSCB { RBDAIOCB *acb; struct BDRVRBDState *s; int done; - int64_t segsize; + int64_t size; char *buf; int ret; } RADOSCB; @@ -69,25 +77,22 @@ typedef struct RADOSCB { typedef struct BDRVRBDState { int fds[2]; - rados_pool_t pool; - rados_pool_t header_pool; - char name[RBD_MAX_OBJ_NAME_SIZE]; - char block_name[RBD_MAX_BLOCK_NAME_SIZE]; - uint64_t size; - uint64_t objsize; + rados_t cluster; + rados_ioctx_t io_ctx; + rbd_image_t image; + char name[RBD_MAX_IMAGE_NAME_SIZE]; int qemu_aio_count; + char *snap; int event_reader_pos; RADOSCB *event_rcb; } BDRVRBDState; -typedef struct rbd_obj_header_ondisk RbdHeader1; - static void rbd_aio_bh_cb(void *opaque); -static int rbd_next_tok(char *dst, int dst_len, - char *src, char delim, - const char *name, - char **p) +static int qemu_rbd_next_tok(char *dst, int dst_len, + char *src, char delim, + const char *name, + char **p) { int l; char *end; @@ -115,10 +120,10 @@ static int rbd_next_tok(char *dst, int dst_len, return 0; } -static int rbd_parsename(const char *filename, - char *pool, int pool_len, - char *snap, int snap_len, - char *name, int name_len) +static int qemu_rbd_parsename(const char *filename, + char *pool, int pool_len, + char *snap, int snap_len, + char *name, int name_len) { const char *start; char *p, *buf; @@ -131,12 +136,12 @@ static int rbd_parsename(const char *filename, buf = qemu_strdup(start); p = buf; - ret = rbd_next_tok(pool, pool_len, p, '/', "pool name", &p); + ret = qemu_rbd_next_tok(pool, pool_len, p, '/', "pool name", &p); if (ret < 0 || !p) { ret = -EINVAL; goto done; } - ret = rbd_next_tok(name, name_len, p, '@', "object name", &p); + ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p); if (ret < 0) { goto done; } @@ -145,123 +150,35 @@ static int rbd_parsename(const char *filename, goto done; } - ret = rbd_next_tok(snap, snap_len, p, '\0', "snap name", &p); + ret = qemu_rbd_next_tok(snap, snap_len, p, '\0', "snap name", &p); done: qemu_free(buf); return ret; } -static int create_tmap_op(uint8_t op, const char *name, char **tmap_desc) -{ - uint32_t len = strlen(name); - uint32_t len_le = cpu_to_le32(len); - /* total_len = encoding op + name + empty buffer */ - uint32_t total_len = 1 + (sizeof(uint32_t) + len) + sizeof(uint32_t); - uint8_t *desc = NULL; - - desc = qemu_malloc(total_len); - - *tmap_desc = (char *)desc; - - *desc = op; - desc++; - memcpy(desc, &len_le, sizeof(len_le)); - desc += sizeof(len_le); - memcpy(desc, name, len); - desc += len; - len = 0; /* no need for endian conversion for 0 */ - memcpy(desc, &len, sizeof(len)); - desc += sizeof(len); - - return (char *)desc - *tmap_desc; -} - -static void free_tmap_op(char *tmap_desc) -{ - qemu_free(tmap_desc); -} - -static int rbd_register_image(rados_pool_t pool, const char *name) -{ - char *tmap_desc; - const char *dir = RBD_DIRECTORY; - int ret; - - ret = create_tmap_op(CEPH_OSD_TMAP_SET, name, &tmap_desc); - if (ret < 0) { - return ret; - } - - ret = rados_tmap_update(pool, dir, tmap_desc, ret); - free_tmap_op(tmap_desc); - - return ret; -} - -static int touch_rbd_info(rados_pool_t pool, const char *info_oid) -{ - int r = rados_write(pool, info_oid, 0, NULL, 0); - if (r < 0) { - return r; - } - return 0; -} - -static int rbd_assign_bid(rados_pool_t pool, uint64_t *id) -{ - uint64_t out[1]; - const char *info_oid = RBD_INFO; - - *id = 0; - - int r = touch_rbd_info(pool, info_oid); - if (r < 0) { - return r; - } - - r = rados_exec(pool, info_oid, "rbd", "assign_bid", NULL, - 0, (char *)out, sizeof(out)); - if (r < 0) { - return r; - } - - le64_to_cpus(out); - *id = out[0]; - - return 0; -} - -static int rbd_create(const char *filename, QEMUOptionParameter *options) +static int qemu_rbd_create(const char *filename, QEMUOptionParameter *options) { int64_t bytes = 0; int64_t objsize; - uint64_t size; - time_t mtime; - uint8_t obj_order = RBD_DEFAULT_OBJ_ORDER; - char pool[RBD_MAX_SEG_NAME_SIZE]; - char n[RBD_MAX_SEG_NAME_SIZE]; - char name[RBD_MAX_OBJ_NAME_SIZE]; - char snap_buf[RBD_MAX_SEG_NAME_SIZE]; + int obj_order = 0; + char pool[RBD_MAX_POOL_NAME_SIZE]; + char name[RBD_MAX_IMAGE_NAME_SIZE]; + char snap_buf[RBD_MAX_SNAP_NAME_SIZE]; char *snap = NULL; - RbdHeader1 header; - rados_pool_t p; - uint64_t bid; - uint32_t hi, lo; + rados_t cluster; + rados_ioctx_t io_ctx; int ret; - if (rbd_parsename(filename, - pool, sizeof(pool), - snap_buf, sizeof(snap_buf), - name, sizeof(name)) < 0) { + if (qemu_rbd_parsename(filename, pool, sizeof(pool), + snap_buf, sizeof(snap_buf), + name, sizeof(name)) < 0) { return -EINVAL; } if (snap_buf[0] != '\0') { snap = snap_buf; } - snprintf(n, sizeof(n), "%s%s", name, RBD_SUFFIX); - /* Read out options */ while (options && options->name) { if (!strcmp(options->name, BLOCK_OPT_SIZE)) { @@ -277,82 +194,55 @@ static int rbd_create(const char *filename, QEMUOptionParameter *options) error_report("obj size too small"); return -EINVAL; } - obj_order = ffs(objsize) - 1; + obj_order = ffs(objsize) - 1; } } options++; } - memset(&header, 0, sizeof(header)); - pstrcpy(header.text, sizeof(header.text), RBD_HEADER_TEXT); - pstrcpy(header.signature, sizeof(header.signature), RBD_HEADER_SIGNATURE); - pstrcpy(header.version, sizeof(header.version), RBD_HEADER_VERSION); - header.image_size = cpu_to_le64(bytes); - header.options.order = obj_order; - header.options.crypt_type = RBD_CRYPT_NONE; - header.options.comp_type = RBD_COMP_NONE; - header.snap_seq = 0; - header.snap_count = 0; - - if (rados_initialize(0, NULL) < 0) { + if (rados_create(&cluster, NULL) < 0) { error_report("error initializing"); return -EIO; } - if (rados_open_pool(pool, &p)) { - error_report("error opening pool %s", pool); - rados_deinitialize(); + if (rados_conf_read_file(cluster, NULL) < 0) { + error_report("error reading config file"); + rados_shutdown(cluster); return -EIO; } - /* check for existing rbd header file */ - ret = rados_stat(p, n, &size, &mtime); - if (ret == 0) { - ret=-EEXIST; - goto done; - } - - ret = rbd_assign_bid(p, &bid); - if (ret < 0) { - error_report("failed assigning block id"); - rados_deinitialize(); + if (rados_connect(cluster) < 0) { + error_report("error connecting"); + rados_shutdown(cluster); return -EIO; } - hi = bid >> 32; - lo = bid & 0xFFFFFFFF; - snprintf(header.block_name, sizeof(header.block_name), "rb.%x.%x", hi, lo); - /* create header file */ - ret = rados_write(p, n, 0, (const char *)&header, sizeof(header)); - if (ret < 0) { - goto done; + if (rados_ioctx_create(cluster, pool, &io_ctx) < 0) { + error_report("error opening pool %s", pool); + rados_shutdown(cluster); + return -EIO; } - ret = rbd_register_image(p, name); -done: - rados_close_pool(p); - rados_deinitialize(); + ret = rbd_create(io_ctx, name, bytes, &obj_order); + rados_ioctx_destroy(io_ctx); + rados_shutdown(cluster); return ret; } /* - * This aio completion is being called from rbd_aio_event_reader() and - * runs in qemu context. It schedules a bh, but just in case the aio + * This aio completion is being called from qemu_rbd_aio_event_reader() + * and runs in qemu context. It schedules a bh, but just in case the aio * was not cancelled before. */ -static void rbd_complete_aio(RADOSCB *rcb) +static void qemu_rbd_complete_aio(RADOSCB *rcb) { RBDAIOCB *acb = rcb->acb; int64_t r; - acb->aiocnt--; - if (acb->cancelled) { - if (!acb->aiocnt) { - qemu_vfree(acb->bounce); - qemu_aio_release(acb); - } + qemu_vfree(acb->bounce); + qemu_aio_release(acb); goto done; } @@ -363,32 +253,25 @@ static void rbd_complete_aio(RADOSCB *rcb) acb->ret = r; acb->error = 1; } else if (!acb->error) { - acb->ret += rcb->segsize; + acb->ret = rcb->size; } } else { - if (r == -ENOENT) { - memset(rcb->buf, 0, rcb->segsize); - if (!acb->error) { - acb->ret += rcb->segsize; - } - } else if (r < 0) { - memset(rcb->buf, 0, rcb->segsize); + if (r < 0) { + memset(rcb->buf, 0, rcb->size); acb->ret = r; acb->error = 1; - } else if (r < rcb->segsize) { - memset(rcb->buf + r, 0, rcb->segsize - r); + } else if (r < rcb->size) { + memset(rcb->buf + r, 0, rcb->size - r); if (!acb->error) { - acb->ret += rcb->segsize; + acb->ret = rcb->size; } } else if (!acb->error) { - acb->ret += r; + acb->ret = r; } } /* Note that acb->bh can be NULL in case where the aio was cancelled */ - if (!acb->aiocnt) { - acb->bh = qemu_bh_new(rbd_aio_bh_cb, acb); - qemu_bh_schedule(acb->bh); - } + acb->bh = qemu_bh_new(rbd_aio_bh_cb, acb); + qemu_bh_schedule(acb->bh); done: qemu_free(rcb); } @@ -397,7 +280,7 @@ done: * aio fd read handler. It runs in the qemu context and calls the * completion handling of completed rados aio operations. */ -static void rbd_aio_event_reader(void *opaque) +static void qemu_rbd_aio_event_reader(void *opaque) { BDRVRBDState *s = opaque; @@ -413,176 +296,74 @@ static void rbd_aio_event_reader(void *opaque) s->event_reader_pos += ret; if (s->event_reader_pos == sizeof(s->event_rcb)) { s->event_reader_pos = 0; - rbd_complete_aio(s->event_rcb); - s->qemu_aio_count --; + qemu_rbd_complete_aio(s->event_rcb); + s->qemu_aio_count--; } } } } while (ret < 0 && errno == EINTR); } -static int rbd_aio_flush_cb(void *opaque) +static int qemu_rbd_aio_flush_cb(void *opaque) { BDRVRBDState *s = opaque; return (s->qemu_aio_count > 0); } - -static int rbd_set_snapc(rados_pool_t pool, const char *snap, RbdHeader1 *header) -{ - uint32_t snap_count = le32_to_cpu(header->snap_count); - rados_snap_t *snaps = NULL; - rados_snap_t seq; - uint32_t i; - uint64_t snap_names_len = le64_to_cpu(header->snap_names_len); - int r; - rados_snap_t snapid = 0; - - if (snap_count) { - const char *header_snap = (const char *)&header->snaps[snap_count]; - const char *end = header_snap + snap_names_len; - snaps = qemu_malloc(sizeof(rados_snap_t) * header->snap_count); - - for (i=0; i < snap_count; i++) { - snaps[i] = le64_to_cpu(header->snaps[i].id); - - if (snap && strcmp(snap, header_snap) == 0) { - snapid = snaps[i]; - } - - header_snap += strlen(header_snap) + 1; - if (header_snap > end) { - error_report("bad header, snapshot list broken"); - } - } - } - - if (snap && !snapid) { - error_report("snapshot not found"); - qemu_free(snaps); - return -ENOENT; - } - seq = le32_to_cpu(header->snap_seq); - - r = rados_set_snap_context(pool, seq, snaps, snap_count); - - rados_set_snap(pool, snapid); - - qemu_free(snaps); - - return r; -} - -#define BUF_READ_START_LEN 4096 - -static int rbd_read_header(BDRVRBDState *s, char **hbuf) -{ - char *buf = NULL; - char n[RBD_MAX_SEG_NAME_SIZE]; - uint64_t len = BUF_READ_START_LEN; - int r; - - snprintf(n, sizeof(n), "%s%s", s->name, RBD_SUFFIX); - - buf = qemu_malloc(len); - - r = rados_read(s->header_pool, n, 0, buf, len); - if (r < 0) { - goto failed; - } - - if (r < len) { - goto done; - } - - qemu_free(buf); - buf = qemu_malloc(len); - - r = rados_stat(s->header_pool, n, &len, NULL); - if (r < 0) { - goto failed; - } - - r = rados_read(s->header_pool, n, 0, buf, len); - if (r < 0) { - goto failed; - } - -done: - *hbuf = buf; - return 0; - -failed: - qemu_free(buf); - return r; -} - -static int rbd_open(BlockDriverState *bs, const char *filename, int flags) +static int qemu_rbd_open(BlockDriverState *bs, const char *filename, int flags) { BDRVRBDState *s = bs->opaque; - RbdHeader1 *header; - char pool[RBD_MAX_SEG_NAME_SIZE]; - char snap_buf[RBD_MAX_SEG_NAME_SIZE]; - char *snap = NULL; - char *hbuf = NULL; + char pool[RBD_MAX_POOL_NAME_SIZE]; + char snap_buf[RBD_MAX_SNAP_NAME_SIZE]; int r; - if (rbd_parsename(filename, pool, sizeof(pool), - snap_buf, sizeof(snap_buf), - s->name, sizeof(s->name)) < 0) { + if (qemu_rbd_parsename(filename, pool, sizeof(pool), + snap_buf, sizeof(snap_buf), + s->name, sizeof(s->name)) < 0) { return -EINVAL; } + s->snap = NULL; if (snap_buf[0] != '\0') { - snap = snap_buf; + s->snap = qemu_strdup(snap_buf); } - if ((r = rados_initialize(0, NULL)) < 0) { + r = rados_create(&s->cluster, NULL); + if (r < 0) { error_report("error initializing"); return r; } - if ((r = rados_open_pool(pool, &s->pool))) { - error_report("error opening pool %s", pool); - rados_deinitialize(); + r = rados_conf_read_file(s->cluster, NULL); + if (r < 0) { + error_report("error reading config file"); + rados_shutdown(s->cluster); return r; } - if ((r = rados_open_pool(pool, &s->header_pool))) { - error_report("error opening pool %s", pool); - rados_deinitialize(); + r = rados_connect(s->cluster); + if (r < 0) { + error_report("error connecting"); + rados_shutdown(s->cluster); return r; } - if ((r = rbd_read_header(s, &hbuf)) < 0) { - error_report("error reading header from %s", s->name); - goto failed; - } - - if (memcmp(hbuf + 64, RBD_HEADER_SIGNATURE, 4)) { - error_report("Invalid header signature"); - r = -EMEDIUMTYPE; - goto failed; - } - - if (memcmp(hbuf + 68, RBD_HEADER_VERSION, 8)) { - error_report("Unknown image version"); - r = -EMEDIUMTYPE; - goto failed; + r = rados_ioctx_create(s->cluster, pool, &s->io_ctx); + if (r < 0) { + error_report("error opening pool %s", pool); + rados_shutdown(s->cluster); + return r; } - header = (RbdHeader1 *) hbuf; - s->size = le64_to_cpu(header->image_size); - s->objsize = 1ULL << header->options.order; - memcpy(s->block_name, header->block_name, sizeof(header->block_name)); - - r = rbd_set_snapc(s->pool, snap, header); + r = rbd_open(s->io_ctx, s->name, &s->image, s->snap); if (r < 0) { - error_report("failed setting snap context: %s", strerror(-r)); - goto failed; + error_report("error reading header from %s", s->name); + rados_ioctx_destroy(s->io_ctx); + rados_shutdown(s->cluster); + return r; } - bs->read_only = (snap != NULL); + bs->read_only = (s->snap != NULL); s->event_reader_pos = 0; r = qemu_pipe(s->fds); @@ -592,23 +373,20 @@ static int rbd_open(BlockDriverState *bs, const char *filename, int flags) } fcntl(s->fds[0], F_SETFL, O_NONBLOCK); fcntl(s->fds[1], F_SETFL, O_NONBLOCK); - qemu_aio_set_fd_handler(s->fds[RBD_FD_READ], rbd_aio_event_reader, NULL, - rbd_aio_flush_cb, NULL, s); + qemu_aio_set_fd_handler(s->fds[RBD_FD_READ], qemu_rbd_aio_event_reader, + NULL, qemu_rbd_aio_flush_cb, NULL, s); - qemu_free(hbuf); return 0; failed: - qemu_free(hbuf); - - rados_close_pool(s->header_pool); - rados_close_pool(s->pool); - rados_deinitialize(); + rbd_close(s->image); + rados_ioctx_destroy(s->io_ctx); + rados_shutdown(s->cluster); return r; } -static void rbd_close(BlockDriverState *bs) +static void qemu_rbd_close(BlockDriverState *bs) { BDRVRBDState *s = bs->opaque; @@ -617,16 +395,17 @@ static void rbd_close(BlockDriverState *bs) qemu_aio_set_fd_handler(s->fds[RBD_FD_READ], NULL , NULL, NULL, NULL, NULL); - rados_close_pool(s->header_pool); - rados_close_pool(s->pool); - rados_deinitialize(); + rbd_close(s->image); + rados_ioctx_destroy(s->io_ctx); + qemu_free(s->snap); + rados_shutdown(s->cluster); } /* * Cancel aio. Since we don't reference acb in a non qemu threads, * it is safe to access it here. */ -static void rbd_aio_cancel(BlockDriverAIOCB *blockacb) +static void qemu_rbd_aio_cancel(BlockDriverAIOCB *blockacb) { RBDAIOCB *acb = (RBDAIOCB *) blockacb; acb->cancelled = 1; @@ -634,39 +413,28 @@ static void rbd_aio_cancel(BlockDriverAIOCB *blockacb) static AIOPool rbd_aio_pool = { .aiocb_size = sizeof(RBDAIOCB), - .cancel = rbd_aio_cancel, + .cancel = qemu_rbd_aio_cancel, }; -/* - * This is the callback function for rados_aio_read and _write - * - * Note: this function is being called from a non qemu thread so - * we need to be careful about what we do here. Generally we only - * write to the block notification pipe, and do the rest of the - * io completion handling from rbd_aio_event_reader() which - * runs in a qemu context. - */ -static void rbd_finish_aiocb(rados_completion_t c, RADOSCB *rcb) +static int qemu_rbd_send_pipe(BDRVRBDState *s, RADOSCB *rcb) { - int ret; - rcb->ret = rados_aio_get_return_value(c); - rados_aio_release(c); + int ret = 0; while (1) { fd_set wfd; - int fd = rcb->s->fds[RBD_FD_WRITE]; + int fd = s->fds[RBD_FD_WRITE]; - /* send the rcb pointer to the qemu thread that is responsible - for the aio completion. Must do it in a qemu thread context */ + /* send the op pointer to the qemu thread that is responsible + for the aio/op completion. Must do it in a qemu thread context */ ret = write(fd, (void *)&rcb, sizeof(rcb)); if (ret >= 0) { break; } if (errno == EINTR) { continue; - } + } if (errno != EAGAIN) { break; - } + } FD_ZERO(&wfd); FD_SET(fd, &wfd); @@ -675,13 +443,31 @@ static void rbd_finish_aiocb(rados_completion_t c, RADOSCB *rcb) } while (ret < 0 && errno == EINTR); } + return ret; +} + +/* + * This is the callback function for rbd_aio_read and _write + * + * Note: this function is being called from a non qemu thread so + * we need to be careful about what we do here. Generally we only + * write to the block notification pipe, and do the rest of the + * io completion handling from qemu_rbd_aio_event_reader() which + * runs in a qemu context. + */ +static void rbd_finish_aiocb(rbd_completion_t c, RADOSCB *rcb) +{ + int ret; + rcb->ret = rbd_aio_get_return_value(c); + rbd_aio_release(c); + ret = qemu_rbd_send_pipe(rcb->s, rcb); if (ret < 0) { - error_report("failed writing to acb->s->fds\n"); + error_report("failed writing to acb->s->fds"); qemu_free(rcb); } } -/* Callback when all queued rados_aio requests are complete */ +/* Callback when all queued rbd_aio requests are complete */ static void rbd_aio_bh_cb(void *opaque) { @@ -707,9 +493,7 @@ static BlockDriverAIOCB *rbd_aio_rw_vector(BlockDriverState *bs, { RBDAIOCB *acb; RADOSCB *rcb; - rados_completion_t c; - char n[RBD_MAX_SEG_NAME_SIZE]; - int64_t segnr, segoffs, segsize, last_segnr; + rbd_completion_t c; int64_t off, size; char *buf; @@ -719,7 +503,6 @@ static BlockDriverAIOCB *rbd_aio_rw_vector(BlockDriverState *bs, acb->write = write; acb->qiov = qiov; acb->bounce = qemu_blockalign(bs, qiov->size); - acb->aiocnt = 0; acb->ret = 0; acb->error = 0; acb->s = s; @@ -734,95 +517,81 @@ static BlockDriverAIOCB *rbd_aio_rw_vector(BlockDriverState *bs, off = sector_num * BDRV_SECTOR_SIZE; size = nb_sectors * BDRV_SECTOR_SIZE; - segnr = off / s->objsize; - segoffs = off % s->objsize; - segsize = s->objsize - segoffs; - - last_segnr = ((off + size - 1) / s->objsize); - acb->aiocnt = (last_segnr - segnr) + 1; - s->qemu_aio_count += acb->aiocnt; /* All the RADOSCB */ + s->qemu_aio_count++; /* All the RADOSCB */ - while (size > 0) { - if (size < segsize) { - segsize = size; - } - - snprintf(n, sizeof(n), "%s.%012" PRIx64, s->block_name, - segnr); - - rcb = qemu_malloc(sizeof(RADOSCB)); - rcb->done = 0; - rcb->acb = acb; - rcb->segsize = segsize; - rcb->buf = buf; - rcb->s = acb->s; - - if (write) { - rados_aio_create_completion(rcb, NULL, - (rados_callback_t) rbd_finish_aiocb, - &c); - rados_aio_write(s->pool, n, segoffs, buf, segsize, c); - } else { - rados_aio_create_completion(rcb, - (rados_callback_t) rbd_finish_aiocb, - NULL, &c); - rados_aio_read(s->pool, n, segoffs, buf, segsize, c); - } + rcb = qemu_malloc(sizeof(RADOSCB)); + rcb->done = 0; + rcb->acb = acb; + rcb->buf = buf; + rcb->s = acb->s; + rcb->size = size; - buf += segsize; - size -= segsize; - segoffs = 0; - segsize = s->objsize; - segnr++; + if (write) { + rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c); + rbd_aio_write(s->image, off, size, buf, c); + } else { + rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c); + rbd_aio_read(s->image, off, size, buf, c); } return &acb->common; } -static BlockDriverAIOCB *rbd_aio_readv(BlockDriverState * bs, - int64_t sector_num, QEMUIOVector * qiov, - int nb_sectors, - BlockDriverCompletionFunc * cb, - void *opaque) +static BlockDriverAIOCB *qemu_rbd_aio_readv(BlockDriverState *bs, + int64_t sector_num, + QEMUIOVector *qiov, + int nb_sectors, + BlockDriverCompletionFunc *cb, + void *opaque) { return rbd_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0); } -static BlockDriverAIOCB *rbd_aio_writev(BlockDriverState * bs, - int64_t sector_num, QEMUIOVector * qiov, - int nb_sectors, - BlockDriverCompletionFunc * cb, - void *opaque) +static BlockDriverAIOCB *qemu_rbd_aio_writev(BlockDriverState *bs, + int64_t sector_num, + QEMUIOVector *qiov, + int nb_sectors, + BlockDriverCompletionFunc *cb, + void *opaque) { return rbd_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1); } -static int rbd_getinfo(BlockDriverState * bs, BlockDriverInfo * bdi) +static int qemu_rbd_getinfo(BlockDriverState *bs, BlockDriverInfo *bdi) { BDRVRBDState *s = bs->opaque; - bdi->cluster_size = s->objsize; + rbd_image_info_t info; + int r; + + r = rbd_stat(s->image, &info, sizeof(info)); + if (r < 0) { + return r; + } + + bdi->cluster_size = info.obj_size; return 0; } -static int64_t rbd_getlength(BlockDriverState * bs) +static int64_t qemu_rbd_getlength(BlockDriverState *bs) { BDRVRBDState *s = bs->opaque; + rbd_image_info_t info; + int r; - return s->size; + r = rbd_stat(s->image, &info, sizeof(info)); + if (r < 0) { + return r; + } + + return info.size; } -static int rbd_snap_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info) +static int qemu_rbd_snap_create(BlockDriverState *bs, + QEMUSnapshotInfo *sn_info) { BDRVRBDState *s = bs->opaque; - char inbuf[512], outbuf[128]; - uint64_t snap_id; int r; - char *p = inbuf; - char *end = inbuf + sizeof(inbuf); - char n[RBD_MAX_SEG_NAME_SIZE]; - char *hbuf = NULL; - RbdHeader1 *header; if (sn_info->name[0] == '\0') { return -EINVAL; /* we need a name for rbd snapshots */ @@ -841,185 +610,57 @@ static int rbd_snap_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info) return -ERANGE; } - r = rados_selfmanaged_snap_create(s->header_pool, &snap_id); + r = rbd_snap_create(s->image, sn_info->name); if (r < 0) { - error_report("failed to create snap id: %s", strerror(-r)); + error_report("failed to create snap: %s", strerror(-r)); return r; } - *(uint32_t *)p = strlen(sn_info->name); - cpu_to_le32s((uint32_t *)p); - p += sizeof(uint32_t); - strncpy(p, sn_info->name, end - p); - p += strlen(p); - if (p + sizeof(snap_id) > end) { - error_report("invalid input parameter"); - return -EINVAL; - } - - *(uint64_t *)p = snap_id; - cpu_to_le64s((uint64_t *)p); - - snprintf(n, sizeof(n), "%s%s", s->name, RBD_SUFFIX); - - r = rados_exec(s->header_pool, n, "rbd", "snap_add", inbuf, - sizeof(inbuf), outbuf, sizeof(outbuf)); - if (r < 0) { - error_report("rbd.snap_add execution failed failed: %s", strerror(-r)); - return r; - } - - sprintf(sn_info->id_str, "%s", sn_info->name); - - r = rbd_read_header(s, &hbuf); - if (r < 0) { - error_report("failed reading header: %s", strerror(-r)); - return r; - } - - header = (RbdHeader1 *) hbuf; - r = rbd_set_snapc(s->pool, sn_info->name, header); - if (r < 0) { - error_report("failed setting snap context: %s", strerror(-r)); - goto failed; - } - - return 0; - -failed: - qemu_free(header); - return r; -} - -static int decode32(char **p, const char *end, uint32_t *v) -{ - if (*p + 4 > end) { - return -ERANGE; - } - - *v = *(uint32_t *)(*p); - le32_to_cpus(v); - *p += 4; return 0; } -static int decode64(char **p, const char *end, uint64_t *v) -{ - if (*p + 8 > end) { - return -ERANGE; - } - - *v = *(uint64_t *)(*p); - le64_to_cpus(v); - *p += 8; - return 0; -} - -static int decode_str(char **p, const char *end, char **s) -{ - uint32_t len; - int r; - - if ((r = decode32(p, end, &len)) < 0) { - return r; - } - - *s = qemu_malloc(len + 1); - memcpy(*s, *p, len); - *p += len; - (*s)[len] = '\0'; - - return len; -} - -static int rbd_snap_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab) +static int qemu_rbd_snap_list(BlockDriverState *bs, + QEMUSnapshotInfo **psn_tab) { BDRVRBDState *s = bs->opaque; - char n[RBD_MAX_SEG_NAME_SIZE]; QEMUSnapshotInfo *sn_info, *sn_tab = NULL; - RbdHeader1 *header; - char *hbuf = NULL; - char *outbuf = NULL, *end, *buf; - uint64_t len; - uint64_t snap_seq; - uint32_t snap_count; - int r, i; - - /* read header to estimate how much space we need to read the snap - * list */ - if ((r = rbd_read_header(s, &hbuf)) < 0) { - goto done_err; - } - header = (RbdHeader1 *)hbuf; - len = le64_to_cpu(header->snap_names_len); - len += 1024; /* should have already been enough, but new snapshots might - already been created since we read the header. just allocate - a bit more, so that in most cases it'll suffice anyway */ - qemu_free(hbuf); - - snprintf(n, sizeof(n), "%s%s", s->name, RBD_SUFFIX); - while (1) { - qemu_free(outbuf); - outbuf = qemu_malloc(len); + int i, snap_count; + rbd_snap_info_t *snaps; + int max_snaps = RBD_MAX_SNAPS; - r = rados_exec(s->header_pool, n, "rbd", "snap_list", NULL, 0, - outbuf, len); - if (r < 0) { - error_report("rbd.snap_list execution failed failed: %s", strerror(-r)); - goto done_err; + do { + snaps = qemu_malloc(sizeof(*snaps) * max_snaps); + snap_count = rbd_snap_list(s->image, snaps, &max_snaps); + if (snap_count < 0) { + qemu_free(snaps); } - if (r != len) { - break; - } + } while (snap_count == -ERANGE); - /* if we're here, we probably raced with some snaps creation */ - len *= 2; - } - buf = outbuf; - end = buf + len; - - if ((r = decode64(&buf, end, &snap_seq)) < 0) { - goto done_err; - } - if ((r = decode32(&buf, end, &snap_count)) < 0) { - goto done_err; + if (snap_count <= 0) { + return snap_count; } sn_tab = qemu_mallocz(snap_count * sizeof(QEMUSnapshotInfo)); - for (i = 0; i < snap_count; i++) { - uint64_t id, image_size; - char *snap_name; - if ((r = decode64(&buf, end, &id)) < 0) { - goto done_err; - } - if ((r = decode64(&buf, end, &image_size)) < 0) { - goto done_err; - } - if ((r = decode_str(&buf, end, &snap_name)) < 0) { - goto done_err; - } + for (i = 0; i < snap_count; i++) { + const char *snap_name = snaps[i].name; sn_info = sn_tab + i; pstrcpy(sn_info->id_str, sizeof(sn_info->id_str), snap_name); pstrcpy(sn_info->name, sizeof(sn_info->name), snap_name); - qemu_free(snap_name); - sn_info->vm_state_size = image_size; + sn_info->vm_state_size = snaps[i].size; sn_info->date_sec = 0; sn_info->date_nsec = 0; sn_info->vm_clock_nsec = 0; } + rbd_snap_list_end(snaps); + *psn_tab = sn_tab; - qemu_free(outbuf); return snap_count; -done_err: - qemu_free(sn_tab); - qemu_free(outbuf); - return r; } -static QEMUOptionParameter rbd_create_options[] = { +static QEMUOptionParameter qemu_rbd_create_options[] = { { .name = BLOCK_OPT_SIZE, .type = OPT_SIZE, @@ -1036,19 +677,19 @@ static QEMUOptionParameter rbd_create_options[] = { static BlockDriver bdrv_rbd = { .format_name = "rbd", .instance_size = sizeof(BDRVRBDState), - .bdrv_file_open = rbd_open, - .bdrv_close = rbd_close, - .bdrv_create = rbd_create, - .bdrv_get_info = rbd_getinfo, - .create_options = rbd_create_options, - .bdrv_getlength = rbd_getlength, + .bdrv_file_open = qemu_rbd_open, + .bdrv_close = qemu_rbd_close, + .bdrv_create = qemu_rbd_create, + .bdrv_get_info = qemu_rbd_getinfo, + .create_options = qemu_rbd_create_options, + .bdrv_getlength = qemu_rbd_getlength, .protocol_name = "rbd", - .bdrv_aio_readv = rbd_aio_readv, - .bdrv_aio_writev = rbd_aio_writev, + .bdrv_aio_readv = qemu_rbd_aio_readv, + .bdrv_aio_writev = qemu_rbd_aio_writev, - .bdrv_snapshot_create = rbd_snap_create, - .bdrv_snapshot_list = rbd_snap_list, + .bdrv_snapshot_create = qemu_rbd_snap_create, + .bdrv_snapshot_list = qemu_rbd_snap_list, }; static void bdrv_rbd_init(void) diff --git a/block/rbd_types.h b/block/rbd_types.h deleted file mode 100644 index f4cca99..0000000 --- a/block/rbd_types.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Ceph - scalable distributed file system - * - * Copyright (C) 2004-2010 Sage Weil <sage@newdream.net> - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1, as published by the Free Software - * Foundation. See file COPYING.LIB. - * - */ - -#ifndef CEPH_RBD_TYPES_H -#define CEPH_RBD_TYPES_H - - -/* - * rbd image 'foo' consists of objects - * foo.rbd - image metadata - * foo.00000000 - * foo.00000001 - * ... - data - */ - -#define RBD_SUFFIX ".rbd" -#define RBD_DIRECTORY "rbd_directory" -#define RBD_INFO "rbd_info" - -#define RBD_DEFAULT_OBJ_ORDER 22 /* 4MB */ - -#define RBD_MAX_OBJ_NAME_SIZE 96 -#define RBD_MAX_BLOCK_NAME_SIZE 24 -#define RBD_MAX_SEG_NAME_SIZE 128 - -#define RBD_COMP_NONE 0 -#define RBD_CRYPT_NONE 0 - -#define RBD_HEADER_TEXT "<<< Rados Block Device Image >>>\n" -#define RBD_HEADER_SIGNATURE "RBD" -#define RBD_HEADER_VERSION "001.005" - -struct rbd_info { - uint64_t max_id; -} __attribute__ ((packed)); - -struct rbd_obj_snap_ondisk { - uint64_t id; - uint64_t image_size; -} __attribute__((packed)); - -struct rbd_obj_header_ondisk { - char text[40]; - char block_name[RBD_MAX_BLOCK_NAME_SIZE]; - char signature[4]; - char version[8]; - struct { - uint8_t order; - uint8_t crypt_type; - uint8_t comp_type; - uint8_t unused; - } __attribute__((packed)) options; - uint64_t image_size; - uint64_t snap_seq; - uint32_t snap_count; - uint32_t reserved; - uint64_t snap_names_len; - struct rbd_obj_snap_ondisk snaps[0]; -} __attribute__((packed)); - - -#endif diff --git a/configure b/configure index d38b952..bdacb49 100755 --- a/configure +++ b/configure @@ -1917,41 +1917,24 @@ fi if test "$rbd" != "no" ; then cat > $TMPC <<EOF #include <stdio.h> -#include <rados/librados.h> -int main(void) { rados_initialize(0, NULL); return 0; } -EOF - rbd_libs="-lrados" - if compile_prog "" "$rbd_libs" ; then - librados_too_old=no - cat > $TMPC <<EOF -#include <stdio.h> -#include <rados/librados.h> -#ifndef CEPH_OSD_TMAP_SET -#error missing CEPH_OSD_TMAP_SET -#endif +#include <rbd/librbd.h> int main(void) { - int (*func)(const rados_pool_t pool, uint64_t *snapid) = rados_selfmanaged_snap_create; - rados_initialize(0, NULL); + rados_t cluster; + rados_create(&cluster, NULL); return 0; } EOF - if compile_prog "" "$rbd_libs" ; then - rbd=yes - libs_tools="$rbd_libs $libs_tools" - libs_softmmu="$rbd_libs $libs_softmmu" - else - rbd=no - librados_too_old=yes - fi + rbd_libs="-lrbd -lrados" + if compile_prog "" "$rbd_libs" ; then + rbd=yes + libs_tools="$rbd_libs $libs_tools" + libs_softmmu="$rbd_libs $libs_softmmu" else if test "$rbd" = "yes" ; then feature_not_found "rados block device" fi rbd=no fi - if test "$librados_too_old" = "yes" ; then - echo "-> Your librados version is too old - upgrade needed to have rbd support" - fi fi ########################################## -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 07/12] rbd: allow configuration of rados from the rbd filename 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf ` (5 preceding siblings ...) 2011-06-08 13:48 ` [Qemu-devel] [PATCH 06/12] rbd: use the higher level librbd instead of just librados Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 08/12] rbd: check return values when scheduling aio Kevin Wolf ` (5 subsequent siblings) 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Josh Durgin <josh.durgin@dreamhost.com> The new format is rbd:pool/image[@snapshot][:option1=value1[:option2=value2...]] Each option is used to configure rados, and may be any Ceph option, or "conf". The "conf" option specifies a Ceph configuration file to read. This allows rbd volumes from more than one Ceph cluster to be used by specifying different monitor addresses, as well as having different logging levels or locations for different volumes. Reviewed-by: Christian Brunner <chb@muc.de> Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/rbd.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 102 insertions(+), 17 deletions(-) diff --git a/block/rbd.c b/block/rbd.c index 2cee70d..edf1086 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -23,13 +23,17 @@ /* * When specifying the image filename use: * - * rbd:poolname/devicename + * rbd:poolname/devicename[@snapshotname][:option1=value1[:option2=value2...]] * * poolname must be the name of an existing rados pool * * devicename is the basename for all objects used to * emulate the raw device. * + * Each option given is used to configure rados, and may be + * any Ceph option, or "conf". The "conf" option specifies + * a Ceph configuration file to read. + * * Metadata information (image size, ...) is stored in an * object with the name "devicename.rbd". * @@ -123,7 +127,8 @@ static int qemu_rbd_next_tok(char *dst, int dst_len, static int qemu_rbd_parsename(const char *filename, char *pool, int pool_len, char *snap, int snap_len, - char *name, int name_len) + char *name, int name_len, + char *conf, int conf_len) { const char *start; char *p, *buf; @@ -135,28 +140,84 @@ static int qemu_rbd_parsename(const char *filename, buf = qemu_strdup(start); p = buf; + *snap = '\0'; + *conf = '\0'; ret = qemu_rbd_next_tok(pool, pool_len, p, '/', "pool name", &p); if (ret < 0 || !p) { ret = -EINVAL; goto done; } - ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p); - if (ret < 0) { - goto done; + + if (strchr(p, '@')) { + ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p); + if (ret < 0) { + goto done; + } + ret = qemu_rbd_next_tok(snap, snap_len, p, ':', "snap name", &p); + } else { + ret = qemu_rbd_next_tok(name, name_len, p, ':', "object name", &p); } - if (!p) { - *snap = '\0'; + if (ret < 0 || !p) { goto done; } - ret = qemu_rbd_next_tok(snap, snap_len, p, '\0', "snap name", &p); + ret = qemu_rbd_next_tok(conf, conf_len, p, '\0', "configuration", &p); done: qemu_free(buf); return ret; } +static int qemu_rbd_set_conf(rados_t cluster, const char *conf) +{ + char *p, *buf; + char name[RBD_MAX_CONF_NAME_SIZE]; + char value[RBD_MAX_CONF_VAL_SIZE]; + int ret = 0; + + buf = qemu_strdup(conf); + p = buf; + + while (p) { + ret = qemu_rbd_next_tok(name, sizeof(name), p, + '=', "conf option name", &p); + if (ret < 0) { + break; + } + + if (!p) { + error_report("conf option %s has no value", name); + ret = -EINVAL; + break; + } + + ret = qemu_rbd_next_tok(value, sizeof(value), p, + ':', "conf option value", &p); + if (ret < 0) { + break; + } + + if (strcmp(name, "conf")) { + ret = rados_conf_set(cluster, name, value); + if (ret < 0) { + error_report("invalid conf option %s", name); + ret = -EINVAL; + break; + } + } else { + ret = rados_conf_read_file(cluster, value); + if (ret < 0) { + error_report("error reading conf file %s", value); + break; + } + } + } + + qemu_free(buf); + return ret; +} + static int qemu_rbd_create(const char *filename, QEMUOptionParameter *options) { int64_t bytes = 0; @@ -165,6 +226,7 @@ static int qemu_rbd_create(const char *filename, QEMUOptionParameter *options) char pool[RBD_MAX_POOL_NAME_SIZE]; char name[RBD_MAX_IMAGE_NAME_SIZE]; char snap_buf[RBD_MAX_SNAP_NAME_SIZE]; + char conf[RBD_MAX_CONF_SIZE]; char *snap = NULL; rados_t cluster; rados_ioctx_t io_ctx; @@ -172,7 +234,8 @@ static int qemu_rbd_create(const char *filename, QEMUOptionParameter *options) if (qemu_rbd_parsename(filename, pool, sizeof(pool), snap_buf, sizeof(snap_buf), - name, sizeof(name)) < 0) { + name, sizeof(name), + conf, sizeof(conf)) < 0) { return -EINVAL; } if (snap_buf[0] != '\0') { @@ -205,8 +268,17 @@ static int qemu_rbd_create(const char *filename, QEMUOptionParameter *options) return -EIO; } - if (rados_conf_read_file(cluster, NULL) < 0) { - error_report("error reading config file"); + if (strstr(conf, "conf=") == NULL) { + if (rados_conf_read_file(cluster, NULL) < 0) { + error_report("error reading config file"); + rados_shutdown(cluster); + return -EIO; + } + } + + if (conf[0] != '\0' && + qemu_rbd_set_conf(cluster, conf) < 0) { + error_report("error setting config options"); rados_shutdown(cluster); return -EIO; } @@ -316,11 +388,13 @@ static int qemu_rbd_open(BlockDriverState *bs, const char *filename, int flags) BDRVRBDState *s = bs->opaque; char pool[RBD_MAX_POOL_NAME_SIZE]; char snap_buf[RBD_MAX_SNAP_NAME_SIZE]; + char conf[RBD_MAX_CONF_SIZE]; int r; if (qemu_rbd_parsename(filename, pool, sizeof(pool), snap_buf, sizeof(snap_buf), - s->name, sizeof(s->name)) < 0) { + s->name, sizeof(s->name), + conf, sizeof(conf)) < 0) { return -EINVAL; } s->snap = NULL; @@ -334,11 +408,22 @@ static int qemu_rbd_open(BlockDriverState *bs, const char *filename, int flags) return r; } - r = rados_conf_read_file(s->cluster, NULL); - if (r < 0) { - error_report("error reading config file"); - rados_shutdown(s->cluster); - return r; + if (strstr(conf, "conf=") == NULL) { + r = rados_conf_read_file(s->cluster, NULL); + if (r < 0) { + error_report("error reading config file"); + rados_shutdown(s->cluster); + return r; + } + } + + if (conf[0] != '\0') { + r = qemu_rbd_set_conf(s->cluster, conf); + if (r < 0) { + error_report("error setting config options"); + rados_shutdown(s->cluster); + return r; + } } r = rados_connect(s->cluster); -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 08/12] rbd: check return values when scheduling aio 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf ` (6 preceding siblings ...) 2011-06-08 13:48 ` [Qemu-devel] [PATCH 07/12] rbd: allow configuration of rados from the rbd filename Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 09/12] rbd: Add bdrv_truncate implementation Kevin Wolf ` (4 subsequent siblings) 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Josh Durgin <josh.durgin@dreamhost.com> If scheduling fails, the number of outstanding I/Os must be correct, or there will be a hang when waiting for everything to be flushed. Reviewed-by: Christian Brunner <chb@muc.de> Reported-by: Stefan Hajnoczi <stefanha@gmail.com> Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/rbd.c | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-) diff --git a/block/rbd.c b/block/rbd.c index edf1086..f4da6ab 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -581,10 +581,14 @@ static BlockDriverAIOCB *rbd_aio_rw_vector(BlockDriverState *bs, rbd_completion_t c; int64_t off, size; char *buf; + int r; BDRVRBDState *s = bs->opaque; acb = qemu_aio_get(&rbd_aio_pool, bs, cb, opaque); + if (!acb) { + return NULL; + } acb->write = write; acb->qiov = qiov; acb->bounce = qemu_blockalign(bs, qiov->size); @@ -611,16 +615,28 @@ static BlockDriverAIOCB *rbd_aio_rw_vector(BlockDriverState *bs, rcb->buf = buf; rcb->s = acb->s; rcb->size = size; + r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c); + if (r < 0) { + goto failed; + } if (write) { - rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c); - rbd_aio_write(s->image, off, size, buf, c); + r = rbd_aio_write(s->image, off, size, buf, c); } else { - rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c); - rbd_aio_read(s->image, off, size, buf, c); + r = rbd_aio_read(s->image, off, size, buf, c); + } + + if (r < 0) { + goto failed; } return &acb->common; + +failed: + qemu_free(rcb); + s->qemu_aio_count--; + qemu_aio_release(acb); + return NULL; } static BlockDriverAIOCB *qemu_rbd_aio_readv(BlockDriverState *bs, -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 09/12] rbd: Add bdrv_truncate implementation 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf ` (7 preceding siblings ...) 2011-06-08 13:48 ` [Qemu-devel] [PATCH 08/12] rbd: check return values when scheduling aio Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 10/12] qcow2: Fix memory leaks in error cases Kevin Wolf ` (3 subsequent siblings) 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Josh Durgin <josh.durgin@dreamhost.com> Reviewed-by: Christian Brunner <chb@muc.de> Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/rbd.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/block/rbd.c b/block/rbd.c index f4da6ab..bdc448a 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -688,6 +688,19 @@ static int64_t qemu_rbd_getlength(BlockDriverState *bs) return info.size; } +static int qemu_rbd_truncate(BlockDriverState *bs, int64_t offset) +{ + BDRVRBDState *s = bs->opaque; + int r; + + r = rbd_resize(s->image, offset); + if (r < 0) { + return r; + } + + return 0; +} + static int qemu_rbd_snap_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info) { @@ -784,6 +797,7 @@ static BlockDriver bdrv_rbd = { .bdrv_get_info = qemu_rbd_getinfo, .create_options = qemu_rbd_create_options, .bdrv_getlength = qemu_rbd_getlength, + .bdrv_truncate = qemu_rbd_truncate, .protocol_name = "rbd", .bdrv_aio_readv = qemu_rbd_aio_readv, -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 10/12] qcow2: Fix memory leaks in error cases 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf ` (8 preceding siblings ...) 2011-06-08 13:48 ` [Qemu-devel] [PATCH 09/12] rbd: Add bdrv_truncate implementation Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 11/12] bdrv_img_create: Fix segfault Kevin Wolf ` (2 subsequent siblings) 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel This fixes memory leaks that may be caused by I/O errors during L1 table growth (can happen during save_vm) and in qemu-img check. Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/qcow2-cluster.c | 2 +- block/qcow2-refcount.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 750abe3..c9e7bbd 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -70,7 +70,7 @@ int qcow2_grow_l1_table(BlockDriverState *bs, int min_size, bool exact_size) ret = qcow2_cache_flush(bs, s->refcount_block_cache); if (ret < 0) { - return ret; + goto fail; } BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_WRITE_TABLE); diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index d62dc1c..ac95b88 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -1086,7 +1086,7 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res) ret = check_refcounts_l1(bs, res, refcount_table, nb_clusters, s->l1_table_offset, s->l1_size, 1); if (ret < 0) { - return ret; + goto fail; } /* snapshots */ @@ -1095,7 +1095,7 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res) ret = check_refcounts_l1(bs, res, refcount_table, nb_clusters, sn->l1_table_offset, sn->l1_size, 0); if (ret < 0) { - return ret; + goto fail; } } inc_refcounts(bs, res, refcount_table, nb_clusters, @@ -1159,8 +1159,11 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res) } } + ret = 0; + +fail: qemu_free(refcount_table); - return 0; + return ret; } -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 11/12] bdrv_img_create: Fix segfault 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf ` (9 preceding siblings ...) 2011-06-08 13:48 ` [Qemu-devel] [PATCH 10/12] qcow2: Fix memory leaks in error cases Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 12/12] qemu-img create: Fix displayed default cluster size Kevin Wolf 2011-06-09 12:39 ` [Qemu-devel] [PULL 00/12] Block patches Anthony Liguori 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel Block drivers that don't support creating images don't have a size option. Fail gracefully instead of segfaulting when trying to access the option's value. Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/block.c b/block.c index 3036a2d..24a25d5 100644 --- a/block.c +++ b/block.c @@ -2881,7 +2881,7 @@ int bdrv_img_create(const char *filename, const char *fmt, char *options, uint64_t img_size, int flags) { QEMUOptionParameter *param = NULL, *create_options = NULL; - QEMUOptionParameter *backing_fmt, *backing_file; + QEMUOptionParameter *backing_fmt, *backing_file, *size; BlockDriverState *bs = NULL; BlockDriver *drv, *proto_drv; BlockDriver *backing_drv = NULL; @@ -2964,7 +2964,8 @@ int bdrv_img_create(const char *filename, const char *fmt, // The size for the image must always be specified, with one exception: // If we are using a backing file, we can obtain the size from there - if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == -1) { + size = get_option_parameter(param, BLOCK_OPT_SIZE); + if (size && size->value.n == -1) { if (backing_file && backing_file->value.s) { uint64_t size; char buf[32]; -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [Qemu-devel] [PATCH 12/12] qemu-img create: Fix displayed default cluster size 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf ` (10 preceding siblings ...) 2011-06-08 13:48 ` [Qemu-devel] [PATCH 11/12] bdrv_img_create: Fix segfault Kevin Wolf @ 2011-06-08 13:48 ` Kevin Wolf 2011-06-09 12:39 ` [Qemu-devel] [PULL 00/12] Block patches Anthony Liguori 12 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2011-06-08 13:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel When not specifying a cluster size on the command line, qemu-img printed a cluster size of 0: Formatting '/tmp/test.qcow2', fmt=qcow2 size=67108864 encryption=off cluster_size=0 This patch adds the default cluster size to the QEMUOptionParameter list, so that it displays the default value that is used. Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/qcow2.c | 5 +++-- block/qcow2.h | 2 ++ block/qed.c | 3 ++- block/vdi.c | 6 ++++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index db1931b..8451ded 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1036,7 +1036,7 @@ static int qcow2_create(const char *filename, QEMUOptionParameter *options) const char *backing_fmt = NULL; uint64_t sectors = 0; int flags = 0; - size_t cluster_size = 65536; + size_t cluster_size = DEFAULT_CLUSTER_SIZE; int prealloc = 0; /* Read out options */ @@ -1343,7 +1343,8 @@ static QEMUOptionParameter qcow2_create_options[] = { { .name = BLOCK_OPT_CLUSTER_SIZE, .type = OPT_SIZE, - .help = "qcow2 cluster size" + .help = "qcow2 cluster size", + .value = { .n = DEFAULT_CLUSTER_SIZE }, }, { .name = BLOCK_OPT_PREALLOC, diff --git a/block/qcow2.h b/block/qcow2.h index a019831..e1ae3e8 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -54,6 +54,8 @@ /* Must be at least 4 to cover all cases of refcount table growth */ #define REFCOUNT_CACHE_SIZE 4 +#define DEFAULT_CLUSTER_SIZE 65536 + typedef struct QCowHeader { uint32_t magic; uint32_t version; diff --git a/block/qed.c b/block/qed.c index da0bf31..3970379 100644 --- a/block/qed.c +++ b/block/qed.c @@ -1464,7 +1464,8 @@ static QEMUOptionParameter qed_create_options[] = { }, { .name = BLOCK_OPT_CLUSTER_SIZE, .type = OPT_SIZE, - .help = "Cluster size (in bytes)" + .help = "Cluster size (in bytes)", + .value = { .n = QED_DEFAULT_CLUSTER_SIZE }, }, { .name = BLOCK_OPT_TABLE_SIZE, .type = OPT_SIZE, diff --git a/block/vdi.c b/block/vdi.c index 701745b..4c9e201 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -87,6 +87,7 @@ void uuid_unparse(const uuid_t uu, char *out); #define MiB (KiB * KiB) #define SECTOR_SIZE 512 +#define DEFAULT_CLUSTER_SIZE (1 * MiB) #if defined(CONFIG_VDI_DEBUG) #define logout(fmt, ...) \ @@ -803,7 +804,7 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options) int result = 0; uint64_t bytes = 0; uint32_t blocks; - size_t block_size = 1 * MiB; + size_t block_size = DEFAULT_CLUSTER_SIZE; uint32_t image_type = VDI_TYPE_DYNAMIC; VdiHeader header; size_t i; @@ -921,7 +922,8 @@ static QEMUOptionParameter vdi_create_options[] = { { .name = BLOCK_OPT_CLUSTER_SIZE, .type = OPT_SIZE, - .help = "VDI cluster (block) size" + .help = "VDI cluster (block) size", + .value = { .n = DEFAULT_CLUSTER_SIZE }, }, #endif #if defined(CONFIG_VDI_STATIC_IMAGE) -- 1.7.5.2 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf ` (11 preceding siblings ...) 2011-06-08 13:48 ` [Qemu-devel] [PATCH 12/12] qemu-img create: Fix displayed default cluster size Kevin Wolf @ 2011-06-09 12:39 ` Anthony Liguori 12 siblings, 0 replies; 38+ messages in thread From: Anthony Liguori @ 2011-06-09 12:39 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel On 06/08/2011 08:48 AM, Kevin Wolf wrote: > The following changes since commit a90d4690074526f54ad0851fce19fa6783f06803: > > Add an isa device for SGA (2011-06-07 13:52:30 -0500) > > are available in the git repository at: > git://repo.or.cz/qemu/kevin.git for-anthony Pulled. Thanks. Regards, Anthony Liguori > > Alexander Graf (1): > vmdk: fix endianness bugs > > Christoph Egger (2): > block/raw-posix: use a character device if a block device is given > block/raw-posix: get right partition size > > Christoph Hellwig (1): > block: clarify the meaning of BDRV_O_NOCACHE > > Josh Durgin (4): > rbd: use the higher level librbd instead of just librados > rbd: allow configuration of rados from the rbd filename > rbd: check return values when scheduling aio > rbd: Add bdrv_truncate implementation > > Kevin Wolf (4): > ide/core: Remove explicit setting of BM_STATUS_INT > qcow2: Fix memory leaks in error cases > bdrv_img_create: Fix segfault > qemu-img create: Fix displayed default cluster size > > block.c | 13 +- > block/qcow2-cluster.c | 2 +- > block/qcow2-refcount.c | 9 +- > block/qcow2.c | 7 +- > block/qcow2.h | 2 + > block/qed.c | 3 +- > block/raw-posix.c | 77 ++++- > block/raw-win32.c | 12 +- > block/rbd.c | 896 ++++++++++++++++++------------------------------ > block/rbd_types.h | 71 ---- > block/vdi.c | 6 +- > block/vmdk.c | 22 +- > blockdev.c | 2 +- > configure | 33 +-- > hw/ide/core.c | 7 +- > qemu-io.c | 4 +- > qemu-nbd.c | 2 +- > 17 files changed, 461 insertions(+), 707 deletions(-) > delete mode 100644 block/rbd_types.h > > ^ permalink raw reply [flat|nested] 38+ messages in thread
* [Qemu-devel] [PULL 00/12] Block patches @ 2012-06-04 11:13 Kevin Wolf 2012-06-07 1:17 ` Anthony Liguori 0 siblings, 1 reply; 38+ messages in thread From: Kevin Wolf @ 2012-06-04 11:13 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit 8cc9b43f7c5f826b39af4b012ad89bb55faac29c: target-microblaze: lwx/swx: first implementation (2012-06-04 10:19:46 +0200) are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony Josh Durgin (1): rbd: hook up cache options Kevin Wolf (3): qemu-img check -r for repairing images qemu-img check: Print fixed clusters and recheck qcow2: Support for fixing refcount inconsistencies MORITA Kazutaka (1): sheepdog: add coroutine_fn markers to coroutine functions Markus Armbruster (1): Un-inline fdctrl_init_isa() Paolo Bonzini (4): block: implement is_allocated for raw stream: tweak usage of bdrv_co_is_allocated stream: move is_allocated_above to block.c stream: move rate limiting to a separate header file Zhi Yong Wu (2): qcow2: remove a line of unnecessary code qcow2: fix the byte endian convertion block.c | 53 +++++++++++++++++++++- block.h | 13 +++++- block/qcow2-cluster.c | 1 - block/qcow2-refcount.c | 33 ++++++++++++-- block/qcow2.c | 5 +- block/qcow2.h | 3 +- block/qed-check.c | 2 + block/qed.c | 5 +- block/raw-posix.c | 98 +++++++++++++++++++++++++++++++++++++++++ block/raw.c | 8 +++ block/rbd.c | 19 ++++++++ block/sheepdog.c | 9 ++-- block/stream.c | 109 +++++++--------------------------------------- block/vdi.c | 7 +++- block_int.h | 3 +- hw/fdc.c | 20 ++++++++ hw/fdc.h | 24 +--------- hw/ide/piix.c | 3 +- hw/isa.h | 2 - hw/pc_sysfw.c | 1 + include/qemu/ratelimit.h | 48 ++++++++++++++++++++ qemu-common.h | 1 + qemu-img-cmds.hx | 4 +- qemu-img.c | 35 +++++++++++++- qemu-img.texi | 7 +++- 25 files changed, 369 insertions(+), 144 deletions(-) create mode 100644 include/qemu/ratelimit.h ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2012-06-04 11:13 Kevin Wolf @ 2012-06-07 1:17 ` Anthony Liguori 2012-06-08 9:48 ` Kevin Wolf 0 siblings, 1 reply; 38+ messages in thread From: Anthony Liguori @ 2012-06-07 1:17 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel On 06/04/2012 07:13 PM, Kevin Wolf wrote: > The following changes since commit 8cc9b43f7c5f826b39af4b012ad89bb55faac29c: > > target-microblaze: lwx/swx: first implementation (2012-06-04 10:19:46 +0200) > > are available in the git repository at: > git://repo.or.cz/qemu/kevin.git for-anthony Pulled. Thanks. Regards, Anthony Liguori > > Josh Durgin (1): > rbd: hook up cache options > > Kevin Wolf (3): > qemu-img check -r for repairing images > qemu-img check: Print fixed clusters and recheck > qcow2: Support for fixing refcount inconsistencies > > MORITA Kazutaka (1): > sheepdog: add coroutine_fn markers to coroutine functions > > Markus Armbruster (1): > Un-inline fdctrl_init_isa() > > Paolo Bonzini (4): > block: implement is_allocated for raw > stream: tweak usage of bdrv_co_is_allocated > stream: move is_allocated_above to block.c > stream: move rate limiting to a separate header file > > Zhi Yong Wu (2): > qcow2: remove a line of unnecessary code > qcow2: fix the byte endian convertion > > block.c | 53 +++++++++++++++++++++- > block.h | 13 +++++- > block/qcow2-cluster.c | 1 - > block/qcow2-refcount.c | 33 ++++++++++++-- > block/qcow2.c | 5 +- > block/qcow2.h | 3 +- > block/qed-check.c | 2 + > block/qed.c | 5 +- > block/raw-posix.c | 98 +++++++++++++++++++++++++++++++++++++++++ > block/raw.c | 8 +++ > block/rbd.c | 19 ++++++++ > block/sheepdog.c | 9 ++-- > block/stream.c | 109 +++++++--------------------------------------- > block/vdi.c | 7 +++- > block_int.h | 3 +- > hw/fdc.c | 20 ++++++++ > hw/fdc.h | 24 +--------- > hw/ide/piix.c | 3 +- > hw/isa.h | 2 - > hw/pc_sysfw.c | 1 + > include/qemu/ratelimit.h | 48 ++++++++++++++++++++ > qemu-common.h | 1 + > qemu-img-cmds.hx | 4 +- > qemu-img.c | 35 +++++++++++++- > qemu-img.texi | 7 +++- > 25 files changed, 369 insertions(+), 144 deletions(-) > create mode 100644 include/qemu/ratelimit.h > > ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2012-06-07 1:17 ` Anthony Liguori @ 2012-06-08 9:48 ` Kevin Wolf 2012-06-08 14:07 ` Anthony Liguori 0 siblings, 1 reply; 38+ messages in thread From: Kevin Wolf @ 2012-06-08 9:48 UTC (permalink / raw) To: Anthony Liguori; +Cc: qemu-devel Am 07.06.2012 03:17, schrieb Anthony Liguori: > On 06/04/2012 07:13 PM, Kevin Wolf wrote: >> The following changes since commit 8cc9b43f7c5f826b39af4b012ad89bb55faac29c: >> >> target-microblaze: lwx/swx: first implementation (2012-06-04 10:19:46 +0200) >> >> are available in the git repository at: >> git://repo.or.cz/qemu/kevin.git for-anthony > > Pulled. Thanks. But not pushed? Kevin ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2012-06-08 9:48 ` Kevin Wolf @ 2012-06-08 14:07 ` Anthony Liguori 2012-06-08 14:57 ` Kevin Wolf 0 siblings, 1 reply; 38+ messages in thread From: Anthony Liguori @ 2012-06-08 14:07 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel On 06/08/2012 05:48 PM, Kevin Wolf wrote: > Am 07.06.2012 03:17, schrieb Anthony Liguori: >> On 06/04/2012 07:13 PM, Kevin Wolf wrote: >>> The following changes since commit 8cc9b43f7c5f826b39af4b012ad89bb55faac29c: >>> >>> target-microblaze: lwx/swx: first implementation (2012-06-04 10:19:46 +0200) >>> >>> are available in the git repository at: >>> git://repo.or.cz/qemu/kevin.git for-anthony >> >> Pulled. Thanks. > > But not pushed? I'm having a really hard time connecting to repo.or.cz here. Looks like I mistook a timeout for success and mistakenly merged nothing. I'm still having trouble getting to repo.or.cz. I'll be back in the States Saturday evening so will process this pull Sunday or Monday. Do you want to update the branch in the interim to fix the build issue? Regards, Anthony Liguori > > Kevin ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2012-06-08 14:07 ` Anthony Liguori @ 2012-06-08 14:57 ` Kevin Wolf 0 siblings, 0 replies; 38+ messages in thread From: Kevin Wolf @ 2012-06-08 14:57 UTC (permalink / raw) To: Anthony Liguori; +Cc: qemu-devel Am 08.06.2012 16:07, schrieb Anthony Liguori: > On 06/08/2012 05:48 PM, Kevin Wolf wrote: >> Am 07.06.2012 03:17, schrieb Anthony Liguori: >>> On 06/04/2012 07:13 PM, Kevin Wolf wrote: >>>> The following changes since commit 8cc9b43f7c5f826b39af4b012ad89bb55faac29c: >>>> >>>> target-microblaze: lwx/swx: first implementation (2012-06-04 10:19:46 +0200) >>>> >>>> are available in the git repository at: >>>> git://repo.or.cz/qemu/kevin.git for-anthony >>> >>> Pulled. Thanks. >> >> But not pushed? > > I'm having a really hard time connecting to repo.or.cz here. Looks like I > mistook a timeout for success and mistakenly merged nothing. > > I'm still having trouble getting to repo.or.cz. I'll be back in the States > Saturday evening so will process this pull Sunday or Monday. Hm, when repo.or.cz started behaving bad, I started to use things like 'while ! git fetch repo.or.cz; do sleep 1; done' (it would always succeed after a few attempts), but recently it never needed more than one attempt. > Do you want to update the branch in the interim to fix the build issue? Sure, updated it now. Kevin ^ permalink raw reply [flat|nested] 38+ messages in thread
* [Qemu-devel] [PULL 00/12] Block patches @ 2012-08-06 20:44 Kevin Wolf 2012-08-07 8:28 ` Paolo Bonzini 2012-08-07 15:36 ` Anthony Liguori 0 siblings, 2 replies; 38+ messages in thread From: Kevin Wolf @ 2012-08-06 20:44 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit 26b9b5fe17cc1b6be2e8bf8b9d16094f420bb8ad: virtio: fix vhost handling (2012-08-06 14:01:44 -0500) are available in the git repository at: http://repo.or.cz/r/qemu/kevin.git for-anthony Dong Xu Wang (1): qemu-img: use QemuOpts instead of QEMUOptionParameter in resize function Kevin Wolf (1): qemu-iotests: Be more flexible with image creation options Markus Armbruster (1): ide scsi: Mess with geometry only for hard disk devices Paolo Bonzini (1): qapi: generalize documentation of streaming commands Stefan Hajnoczi (8): qemu-iotests: add qed.py image manipulation utility docs: add dirty bit to qcow2 specification qcow2: introduce dirty bit docs: add lazy refcounts bit to qcow2 specification qemu-iotests: ignore qemu-img create lazy_refcounts output qcow2: implement lazy refcounts qemu-io: add "abort" command to simulate program crash qemu-iotests: add 039 qcow2 lazy refcounts test block/qcow2-cluster.c | 5 +- block/qcow2.c | 123 +++++++++++++++++++++-- block/qcow2.h | 21 ++++ block_int.h | 26 +++-- docs/specs/qcow2.txt | 14 ++- hmp-commands.hx | 2 +- hw/ide/qdev.c | 3 +- hw/scsi-disk.c | 3 +- qapi-schema.json | 17 ++-- qemu-img.c | 28 +++-- qemu-io.c | 12 ++ tests/qemu-iotests/031.out | 20 ++-- tests/qemu-iotests/036.out | 4 +- tests/qemu-iotests/039 | 136 ++++++++++++++++++++++++ tests/qemu-iotests/039.out | 53 ++++++++++ tests/qemu-iotests/common.rc | 7 +- tests/qemu-iotests/group | 1 + tests/qemu-iotests/qed.py | 235 ++++++++++++++++++++++++++++++++++++++++++ 18 files changed, 650 insertions(+), 60 deletions(-) create mode 100755 tests/qemu-iotests/039 create mode 100644 tests/qemu-iotests/039.out create mode 100755 tests/qemu-iotests/qed.py ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2012-08-06 20:44 Kevin Wolf @ 2012-08-07 8:28 ` Paolo Bonzini 2012-08-07 15:36 ` Anthony Liguori 1 sibling, 0 replies; 38+ messages in thread From: Paolo Bonzini @ 2012-08-07 8:28 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel, anthony Il 06/08/2012 22:44, Kevin Wolf ha scritto: > The following changes since commit 26b9b5fe17cc1b6be2e8bf8b9d16094f420bb8ad: > > virtio: fix vhost handling (2012-08-06 14:01:44 -0500) I see the virtio caching patches are not included, should I resubmit them together with the change of the default from writethrough to writeback? Paolo > are available in the git repository at: > http://repo.or.cz/r/qemu/kevin.git for-anthony > > Dong Xu Wang (1): > qemu-img: use QemuOpts instead of QEMUOptionParameter in resize function > > Kevin Wolf (1): > qemu-iotests: Be more flexible with image creation options > > Markus Armbruster (1): > ide scsi: Mess with geometry only for hard disk devices > > Paolo Bonzini (1): > qapi: generalize documentation of streaming commands > > Stefan Hajnoczi (8): > qemu-iotests: add qed.py image manipulation utility > docs: add dirty bit to qcow2 specification > qcow2: introduce dirty bit > docs: add lazy refcounts bit to qcow2 specification > qemu-iotests: ignore qemu-img create lazy_refcounts output > qcow2: implement lazy refcounts > qemu-io: add "abort" command to simulate program crash > qemu-iotests: add 039 qcow2 lazy refcounts test > > block/qcow2-cluster.c | 5 +- > block/qcow2.c | 123 +++++++++++++++++++++-- > block/qcow2.h | 21 ++++ > block_int.h | 26 +++-- > docs/specs/qcow2.txt | 14 ++- > hmp-commands.hx | 2 +- > hw/ide/qdev.c | 3 +- > hw/scsi-disk.c | 3 +- > qapi-schema.json | 17 ++-- > qemu-img.c | 28 +++-- > qemu-io.c | 12 ++ > tests/qemu-iotests/031.out | 20 ++-- > tests/qemu-iotests/036.out | 4 +- > tests/qemu-iotests/039 | 136 ++++++++++++++++++++++++ > tests/qemu-iotests/039.out | 53 ++++++++++ > tests/qemu-iotests/common.rc | 7 +- > tests/qemu-iotests/group | 1 + > tests/qemu-iotests/qed.py | 235 ++++++++++++++++++++++++++++++++++++++++++ > 18 files changed, 650 insertions(+), 60 deletions(-) > create mode 100755 tests/qemu-iotests/039 > create mode 100644 tests/qemu-iotests/039.out > create mode 100755 tests/qemu-iotests/qed.py > > ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2012-08-06 20:44 Kevin Wolf 2012-08-07 8:28 ` Paolo Bonzini @ 2012-08-07 15:36 ` Anthony Liguori 1 sibling, 0 replies; 38+ messages in thread From: Anthony Liguori @ 2012-08-07 15:36 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel Kevin Wolf <kwolf@redhat.com> writes: > The following changes since commit 26b9b5fe17cc1b6be2e8bf8b9d16094f420bb8ad: > > virtio: fix vhost handling (2012-08-06 14:01:44 -0500) > > are available in the git repository at: > http://repo.or.cz/r/qemu/kevin.git for-anthony Pulled. Thanks. Regards, Anthony Liguori > > Dong Xu Wang (1): > qemu-img: use QemuOpts instead of QEMUOptionParameter in resize function > > Kevin Wolf (1): > qemu-iotests: Be more flexible with image creation options > > Markus Armbruster (1): > ide scsi: Mess with geometry only for hard disk devices > > Paolo Bonzini (1): > qapi: generalize documentation of streaming commands > > Stefan Hajnoczi (8): > qemu-iotests: add qed.py image manipulation utility > docs: add dirty bit to qcow2 specification > qcow2: introduce dirty bit > docs: add lazy refcounts bit to qcow2 specification > qemu-iotests: ignore qemu-img create lazy_refcounts output > qcow2: implement lazy refcounts > qemu-io: add "abort" command to simulate program crash > qemu-iotests: add 039 qcow2 lazy refcounts test > > block/qcow2-cluster.c | 5 +- > block/qcow2.c | 123 +++++++++++++++++++++-- > block/qcow2.h | 21 ++++ > block_int.h | 26 +++-- > docs/specs/qcow2.txt | 14 ++- > hmp-commands.hx | 2 +- > hw/ide/qdev.c | 3 +- > hw/scsi-disk.c | 3 +- > qapi-schema.json | 17 ++-- > qemu-img.c | 28 +++-- > qemu-io.c | 12 ++ > tests/qemu-iotests/031.out | 20 ++-- > tests/qemu-iotests/036.out | 4 +- > tests/qemu-iotests/039 | 136 ++++++++++++++++++++++++ > tests/qemu-iotests/039.out | 53 ++++++++++ > tests/qemu-iotests/common.rc | 7 +- > tests/qemu-iotests/group | 1 + > tests/qemu-iotests/qed.py | 235 ++++++++++++++++++++++++++++++++++++++++++ > 18 files changed, 650 insertions(+), 60 deletions(-) > create mode 100755 tests/qemu-iotests/039 > create mode 100644 tests/qemu-iotests/039.out > create mode 100755 tests/qemu-iotests/qed.py ^ permalink raw reply [flat|nested] 38+ messages in thread
* [Qemu-devel] [PULL 00/12] Block patches @ 2015-01-23 18:20 Kevin Wolf 2015-01-26 10:16 ` Peter Maydell 0 siblings, 1 reply; 38+ messages in thread From: Kevin Wolf @ 2015-01-23 18:20 UTC (permalink / raw) To: qemu-devel; +Cc: kwolf The following changes since commit c6441452b50c44fdbb362b239ce623f77cf3cd51: Merge remote-tracking branch 'remotes/kraxel/tags/pull-audio-20150122-1' into staging (2015-01-22 18:57:36 +0000) are available in the git repository at: git://repo.or.cz/qemu/kevin.git tags/for-upstream for you to fetch changes up to bc63781ca350cad4c9eb142ce8f55bfaded4276e: Merge remote-tracking branch 'mreitz/block' into queue-block (2015-01-23 18:51:47 +0100) ---------------------------------------------------------------- Block patches for 2.3 ---------------------------------------------------------------- Fam Zheng (2): virtio-blk: Pass req to virtio_blk_handle_scsi_req virtio-blk: Use blk_aio_ioctl Jeff Cody (7): block: vmdk - make ret variable usage clear block: vmdk - move string allocations from stack to the heap block: qapi - move string allocation from stack to the heap block: remove unused variable in bdrv_commit block: mirror - change string allocation to 2-bytes block: update string sizes for filename,backing_file,exact_filename block: vhdx - force FileOffsetMB field to '0' for certain block states Kevin Wolf (1): Merge remote-tracking branch 'mreitz/block' into queue-block Max Reitz (3): qcow2: Add two more unalignment checks iotests: Add tests for more corruption cases iotests: Lower 064's memory usage block.c | 3 - block/mirror.c | 3 +- block/qapi.c | 7 ++- block/qcow.c | 2 +- block/qcow2-cluster.c | 21 +++++++ block/qcow2.c | 3 +- block/vhdx.c | 13 +++- block/vmdk.c | 51 +++++++++------- block/vvfat.c | 4 +- hw/block/virtio-blk.c | 134 ++++++++++++++++++++++++++--------------- include/block/block_int.h | 8 +-- include/hw/virtio/virtio-blk.h | 3 - qemu-img.c | 4 +- tests/qemu-iotests/060 | 15 +++++ tests/qemu-iotests/060.out | 13 ++++ tests/qemu-iotests/064 | 19 +++++- tests/qemu-iotests/064.out | 34 +++++++++-- 17 files changed, 239 insertions(+), 98 deletions(-) ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2015-01-23 18:20 Kevin Wolf @ 2015-01-26 10:16 ` Peter Maydell 0 siblings, 0 replies; 38+ messages in thread From: Peter Maydell @ 2015-01-26 10:16 UTC (permalink / raw) To: Kevin Wolf; +Cc: QEMU Developers On 23 January 2015 at 18:20, Kevin Wolf <kwolf@redhat.com> wrote: > The following changes since commit c6441452b50c44fdbb362b239ce623f77cf3cd51: > > Merge remote-tracking branch 'remotes/kraxel/tags/pull-audio-20150122-1' into staging (2015-01-22 18:57:36 +0000) > > are available in the git repository at: > > > git://repo.or.cz/qemu/kevin.git tags/for-upstream > > for you to fetch changes up to bc63781ca350cad4c9eb142ce8f55bfaded4276e: > > Merge remote-tracking branch 'mreitz/block' into queue-block (2015-01-23 18:51:47 +0100) > > ---------------------------------------------------------------- > > Block patches for 2.3 > > ---------------------------------------------------------------- Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 38+ messages in thread
* [Qemu-devel] [PULL 00/12] Block patches @ 2015-10-29 18:09 Stefan Hajnoczi 2015-10-30 9:40 ` Peter Maydell 0 siblings, 1 reply; 38+ messages in thread From: Stefan Hajnoczi @ 2015-10-29 18:09 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Stefan Hajnoczi The following changes since commit 7bc8e0c967a4ef77657174d28af775691e18b4ce: Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2015-10-29 09:49:52 +0000) are available in the git repository at: git://github.com/stefanha/qemu.git tags/block-pull-request for you to fetch changes up to 37a639a7fbc5c6b065c80e7e2de78d22af735496: block: Consider all child nodes in bdrv_requests_pending() (2015-10-29 17:59:27 +0000) ---------------------------------------------------------------- ---------------------------------------------------------------- Cornelia Huck (3): s390x: include HW_COMPAT_* props ppc/spapr: add 2.4 compat props virtio-blk: switch off scsi-passthrough by default Dr. David Alan Gilbert (1): gdb command: qemu handlers Kevin Wolf (1): block: Consider all child nodes in bdrv_requests_pending() Paolo Bonzini (3): qemu-gdb: allow using glibc_pointer_guard() on core dumps qemu-gdb: extract parts of "qemu coroutine" implementation qemu-gdb: add $qemu_coroutine_sp and $qemu_coroutine_pc Pavel Butsykin (1): virtio: sync the dataplane vring state to the virtqueue before virtio_save Sai Pavan Boddu (3): sd.h: Move sd.h to include/hw/sd/ sdhci: Split sdhci.h for public and internal device usage target-arm: xlnx-zynqmp: Add sdhci support. block/io.c | 13 +- hw/arm/xlnx-zynqmp.c | 28 ++++ hw/block/virtio-blk.c | 7 +- hw/ppc/spapr.c | 9 ++ hw/s390x/s390-virtio-ccw.c | 2 + hw/scsi/virtio-scsi.c | 5 + hw/sd/milkymist-memcard.c | 2 +- hw/sd/omap_mmc.c | 2 +- hw/sd/pl181.c | 2 +- hw/sd/pxa2xx_mmci.c | 2 +- hw/sd/sd.c | 2 +- hw/sd/sdhci-internal.h | 232 +++++++++++++++++++++++++++++++++ hw/sd/sdhci.c | 3 +- hw/sd/sdhci.h | 297 ------------------------------------------- hw/sd/ssi-sd.c | 2 +- include/hw/arm/xlnx-zynqmp.h | 3 + include/hw/compat.h | 6 +- include/hw/sd.h | 80 ------------ include/hw/sd/sd.h | 80 ++++++++++++ include/hw/sd/sdhci.h | 94 ++++++++++++++ scripts/qemu-gdb.py | 6 +- scripts/qemugdb/aio.py | 58 +++++++++ scripts/qemugdb/coroutine.py | 90 ++++++++----- 23 files changed, 601 insertions(+), 424 deletions(-) create mode 100644 hw/sd/sdhci-internal.h delete mode 100644 hw/sd/sdhci.h delete mode 100644 include/hw/sd.h create mode 100644 include/hw/sd/sd.h create mode 100644 include/hw/sd/sdhci.h create mode 100644 scripts/qemugdb/aio.py -- 2.4.3 ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2015-10-29 18:09 Stefan Hajnoczi @ 2015-10-30 9:40 ` Peter Maydell 2015-10-30 14:19 ` Markus Armbruster 0 siblings, 1 reply; 38+ messages in thread From: Peter Maydell @ 2015-10-30 9:40 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers On 29 October 2015 at 18:09, Stefan Hajnoczi <stefanha@redhat.com> wrote: > The following changes since commit 7bc8e0c967a4ef77657174d28af775691e18b4ce: > > Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2015-10-29 09:49:52 +0000) > > are available in the git repository at: > > git://github.com/stefanha/qemu.git tags/block-pull-request > > for you to fetch changes up to 37a639a7fbc5c6b065c80e7e2de78d22af735496: > > block: Consider all child nodes in bdrv_requests_pending() (2015-10-29 17:59:27 +0000) > > ---------------------------------------------------------------- > > ---------------------------------------------------------------- I get an error on 64-bit ARM running the ivshmem tests: TEST: tests/ivshmem-test... (pid=22948) /i386/ivshmem/single: OK /i386/ivshmem/pair: OK /i386/ivshmem/server: ** ERROR:/home/petmay01/qemu/tests/ivshmem-test.c:345:test_ivshmem_server: assertion failed (ret != 0): (0 != 0) FAIL GTester: last random seed: R02S51e68a84790014e86af5b8b7264d3e39 (pid=23709) /i386/ivshmem/hotplug: OK /i386/ivshmem/memdev: OK FAIL: tests/ivshmem-test Nothing obviously related in this patchset that would cause that, though... thanks -- PMM ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2015-10-30 9:40 ` Peter Maydell @ 2015-10-30 14:19 ` Markus Armbruster 2015-10-30 17:37 ` Peter Maydell 0 siblings, 1 reply; 38+ messages in thread From: Markus Armbruster @ 2015-10-30 14:19 UTC (permalink / raw) To: Peter Maydell; +Cc: QEMU Developers, Stefan Hajnoczi Peter Maydell <peter.maydell@linaro.org> writes: > On 29 October 2015 at 18:09, Stefan Hajnoczi <stefanha@redhat.com> wrote: >> The following changes since commit 7bc8e0c967a4ef77657174d28af775691e18b4ce: >> >> Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into >> staging (2015-10-29 09:49:52 +0000) >> >> are available in the git repository at: >> >> git://github.com/stefanha/qemu.git tags/block-pull-request >> >> for you to fetch changes up to 37a639a7fbc5c6b065c80e7e2de78d22af735496: >> >> block: Consider all child nodes in bdrv_requests_pending() >> (2015-10-29 17:59:27 +0000) >> >> ---------------------------------------------------------------- >> >> ---------------------------------------------------------------- > > I get an error on 64-bit ARM running the ivshmem tests: > > TEST: tests/ivshmem-test... (pid=22948) > /i386/ivshmem/single: OK > /i386/ivshmem/pair: OK > /i386/ivshmem/server: ** > ERROR:/home/petmay01/qemu/tests/ivshmem-test.c:345:test_ivshmem_server: > assertion failed (ret != 0): (0 != 0) > FAIL > GTester: last random seed: R02S51e68a84790014e86af5b8b7264d3e39 > (pid=23709) > /i386/ivshmem/hotplug: OK > /i386/ivshmem/memdev: OK > FAIL: tests/ivshmem-test > > Nothing obviously related in this patchset that would cause that, > though... I've seen this, too, but throwing away my build tree made it go away, so I blamed "make choking on stale build tree" syndrome. Perhaps it's an intermittent ivshmem bug instead. ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2015-10-30 14:19 ` Markus Armbruster @ 2015-10-30 17:37 ` Peter Maydell 2015-10-30 21:59 ` Peter Maydell 0 siblings, 1 reply; 38+ messages in thread From: Peter Maydell @ 2015-10-30 17:37 UTC (permalink / raw) To: Markus Armbruster; +Cc: QEMU Developers, Stefan Hajnoczi On 30 October 2015 at 14:19, Markus Armbruster <armbru@redhat.com> wrote: > Peter Maydell <peter.maydell@linaro.org> writes: >> I get an error on 64-bit ARM running the ivshmem tests: >> >> TEST: tests/ivshmem-test... (pid=22948) >> /i386/ivshmem/single: OK >> /i386/ivshmem/pair: OK >> /i386/ivshmem/server: ** >> ERROR:/home/petmay01/qemu/tests/ivshmem-test.c:345:test_ivshmem_server: >> assertion failed (ret != 0): (0 != 0) >> FAIL >> GTester: last random seed: R02S51e68a84790014e86af5b8b7264d3e39 >> (pid=23709) >> /i386/ivshmem/hotplug: OK >> /i386/ivshmem/memdev: OK >> FAIL: tests/ivshmem-test >> >> Nothing obviously related in this patchset that would cause that, >> though... > > I've seen this, too, but throwing away my build tree made it go away, so > I blamed "make choking on stale build tree" syndrome. Perhaps it's an > intermittent ivshmem bug instead. I didn't do a make clean before successfully applying other pulls, so I think my money is on "intermittent ivshmem issue". I'll have another go with this one once I've finished the rest of the queue... thanks -- PMM ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2015-10-30 17:37 ` Peter Maydell @ 2015-10-30 21:59 ` Peter Maydell 0 siblings, 0 replies; 38+ messages in thread From: Peter Maydell @ 2015-10-30 21:59 UTC (permalink / raw) To: Markus Armbruster; +Cc: QEMU Developers, Stefan Hajnoczi On 30 October 2015 at 17:37, Peter Maydell <peter.maydell@linaro.org> wrote: > On 30 October 2015 at 14:19, Markus Armbruster <armbru@redhat.com> wrote: >> Peter Maydell <peter.maydell@linaro.org> writes: >>> I get an error on 64-bit ARM running the ivshmem tests: >>> >>> TEST: tests/ivshmem-test... (pid=22948) >>> /i386/ivshmem/single: OK >>> /i386/ivshmem/pair: OK >>> /i386/ivshmem/server: ** >>> ERROR:/home/petmay01/qemu/tests/ivshmem-test.c:345:test_ivshmem_server: >>> assertion failed (ret != 0): (0 != 0) >>> FAIL >>> GTester: last random seed: R02S51e68a84790014e86af5b8b7264d3e39 >>> (pid=23709) >>> /i386/ivshmem/hotplug: OK >>> /i386/ivshmem/memdev: OK >>> FAIL: tests/ivshmem-test >>> >>> Nothing obviously related in this patchset that would cause that, >>> though... >> >> I've seen this, too, but throwing away my build tree made it go away, so >> I blamed "make choking on stale build tree" syndrome. Perhaps it's an >> intermittent ivshmem bug instead. > > I didn't do a make clean before successfully applying other pulls, > so I think my money is on "intermittent ivshmem issue". I'll have > another go with this one once I've finished the rest of the queue... Second try did indeed work fine, so I've applied it. thanks -- PMM ^ permalink raw reply [flat|nested] 38+ messages in thread
* [Qemu-devel] [PULL 00/12] Block patches @ 2016-02-29 20:08 Jeff Cody 2016-03-01 10:34 ` Peter Maydell 0 siblings, 1 reply; 38+ messages in thread From: Jeff Cody @ 2016-02-29 20:08 UTC (permalink / raw) To: qemu-block; +Cc: peter.maydell, jcody, famz, qemu-devel The following changes since commit 071608b519adf62bc29c914343a21c5407ab1ac9: Merge remote-tracking branch 'remotes/kraxel/tags/pull-usb-20160229-1' into staging (2016-02-29 12:24:26 +0000) are available in the git repository at: git@github.com:codyprime/qemu-kvm-jtc.git tags/block-pull-request for you to fetch changes up to cc199b16cf4cb9279aca73f5f5dce2cc337b9079: iotests/124: Add cluster_size mismatch test (2016-02-29 14:55:14 -0500) ---------------------------------------------------------------- Block patches ---------------------------------------------------------------- Daniel P. Berrange (3): rbd: add support for getting password from QCryptoSecret object curl: add support for HTTP authentication parameters iscsi: add support for getting CHAP password via QCryptoSecret API Fam Zheng (2): mirror: Rewrite mirror_iteration mirror: Add mirror_wait_for_io John Snow (3): block/backup: make backup cluster size configurable block/backup: avoid copying less than full target clusters iotests/124: Add cluster_size mismatch test Max Reitz (2): vhdx: DIV_ROUND_UP() in vhdx_calc_bat_entries() vhdx: Simplify vhdx_set_shift_bits() Peter Lieven (1): block/nfs: add support for setting debug level Vasiliy Tolstov (1): sheepdog: allow to delete snapshot block/backup.c | 87 +++++++---- block/curl.c | 66 +++++++++ block/iscsi.c | 24 ++- block/mirror.c | 353 +++++++++++++++++++++++++++------------------ block/nfs.c | 12 ++ block/rbd.c | 47 ++++++ block/sheepdog.c | 125 +++++++++++++++- block/vhdx.c | 18 +-- tests/qemu-iotests/109.out | 80 +++++----- tests/qemu-iotests/124 | 58 +++++++- tests/qemu-iotests/124.out | 4 +- trace-events | 1 - 12 files changed, 641 insertions(+), 234 deletions(-) -- 1.9.3 ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2016-02-29 20:08 Jeff Cody @ 2016-03-01 10:34 ` Peter Maydell 0 siblings, 0 replies; 38+ messages in thread From: Peter Maydell @ 2016-03-01 10:34 UTC (permalink / raw) To: Jeff Cody; +Cc: Fam Zheng, QEMU Developers, Qemu-block On 29 February 2016 at 20:08, Jeff Cody <jcody@redhat.com> wrote: > The following changes since commit 071608b519adf62bc29c914343a21c5407ab1ac9: > > Merge remote-tracking branch 'remotes/kraxel/tags/pull-usb-20160229-1' into staging (2016-02-29 12:24:26 +0000) > > are available in the git repository at: > > > git@github.com:codyprime/qemu-kvm-jtc.git tags/block-pull-request > > for you to fetch changes up to cc199b16cf4cb9279aca73f5f5dce2cc337b9079: > > iotests/124: Add cluster_size mismatch test (2016-02-29 14:55:14 -0500) > > ---------------------------------------------------------------- > Block patches > ---------------------------------------------------------------- > Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 38+ messages in thread
* [Qemu-devel] [PULL 00/12] Block patches @ 2016-06-07 14:26 Stefan Hajnoczi 2016-06-07 15:34 ` Peter Maydell 0 siblings, 1 reply; 38+ messages in thread From: Stefan Hajnoczi @ 2016-06-07 14:26 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Stefan Hajnoczi The following changes since commit 76462405809d29bab65a3699686998ba124ab942: Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20160606-1' into staging (2016-06-06 17:02:42 +0100) are available in the git repository at: git://github.com/stefanha/qemu.git tags/block-pull-request for you to fetch changes up to 8860eabdee32f78d9a34273a340b8f74476bc9a0: throttle: refuse iops-size without iops-total/read/write (2016-06-07 14:40:51 +0100) ---------------------------------------------------------------- ---------------------------------------------------------------- Changlong Xie (1): iostatus: fix comments for block_job_iostatus_reset Eric Blake (1): block: Move BlockRequest type to io.c Fam Zheng (5): blockdev-backup: Use bdrv_lookup_bs on target blockdev-backup: Don't move target AioContext if it's attached virtio-blk: Remove op blocker for dataplane virtio-scsi: Remove op blocker for dataplane block: Drop bdrv_ioctl_bh_cb Kevin Wolf (1): block/io: Remove unused bdrv_aio_write_zeroes() Peter Lieven (1): block/io: optimize bdrv_co_pwritev for small requests Stefan Hajnoczi (3): tests: avoid coroutine pool test crash virtio: drop duplicate virtio_queue_get_id() function throttle: refuse iops-size without iops-total/read/write block/io.c | 60 +++++++++++++++++++------------------- blockdev.c | 23 ++++++++------- hw/block/dataplane/virtio-blk.c | 63 ---------------------------------------- hw/scsi/virtio-scsi.c | 64 +---------------------------------------- hw/virtio/virtio.c | 7 ----- include/block/block.h | 24 ---------------- include/block/blockjob.h | 2 +- include/hw/virtio/virtio-scsi.h | 11 ------- include/hw/virtio/virtio.h | 1 - tests/qemu-iotests/077 | 12 +------- tests/qemu-iotests/077.out | 26 ----------------- tests/test-coroutine.c | 10 ++++++- tests/test-throttle.c | 10 +++++++ trace-events | 1 - util/throttle.c | 8 ++++++ 15 files changed, 74 insertions(+), 248 deletions(-) -- 2.5.5 ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2016-06-07 14:26 Stefan Hajnoczi @ 2016-06-07 15:34 ` Peter Maydell 0 siblings, 0 replies; 38+ messages in thread From: Peter Maydell @ 2016-06-07 15:34 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers On 7 June 2016 at 15:26, Stefan Hajnoczi <stefanha@redhat.com> wrote: > The following changes since commit 76462405809d29bab65a3699686998ba124ab942: > > Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20160606-1' into staging (2016-06-06 17:02:42 +0100) > > are available in the git repository at: > > git://github.com/stefanha/qemu.git tags/block-pull-request > > for you to fetch changes up to 8860eabdee32f78d9a34273a340b8f74476bc9a0: > > throttle: refuse iops-size without iops-total/read/write (2016-06-07 14:40:51 +0100) > > ---------------------------------------------------------------- > > ---------------------------------------------------------------- Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 38+ messages in thread
* [Qemu-devel] [PULL 00/12] Block patches @ 2017-04-21 13:46 Jeff Cody 2017-04-21 16:55 ` Peter Maydell 0 siblings, 1 reply; 38+ messages in thread From: Jeff Cody @ 2017-04-21 13:46 UTC (permalink / raw) To: qemu-block; +Cc: peter.maydell, jcody, qemu-devel The following changes since commit bfec359afba088aaacc7d316f43302f28c6e642a: Merge remote-tracking branch 'remotes/armbru/tags/pull-qdev-2017-04-21' into staging (2017-04-21 11:42:03 +0100) are available in the git repository at: git://github.com/codyprime/qemu-kvm-jtc.git tags/block-pull-request for you to fetch changes up to 1507631e438930bc07f776f303af127a9cdb4d41: qemu-iotests: _cleanup_qemu must be called on exit (2017-04-21 08:32:44 -0400) ---------------------------------------------------------------- Block patches for 2.10 ---------------------------------------------------------------- Ashish Mittal (2): block/vxhs.c: Add support for a new block device type called "vxhs" block/vxhs.c: Add qemu-iotests for new block device type "vxhs" Jeff Cody (10): qemu-iotests: exclude vxhs from image creation via protocol block: add bdrv_set_read_only() helper function block: do not set BDS read_only if copy_on_read enabled block: honor BDRV_O_ALLOW_RDWR when clearing bs->read_only block: code movement block: introduce bdrv_can_set_read_only() block: use bdrv_can_set_read_only() during reopen block/rbd - update variable names to more apt names block/rbd: Add support for reopen() qemu-iotests: _cleanup_qemu must be called on exit block.c | 56 +++- block/Makefile.objs | 2 + block/bochs.c | 5 +- block/cloop.c | 5 +- block/dmg.c | 6 +- block/rbd.c | 65 +++-- block/trace-events | 17 ++ block/vvfat.c | 19 +- block/vxhs.c | 575 +++++++++++++++++++++++++++++++++++++++ configure | 39 +++ include/block/block.h | 2 + qapi/block-core.json | 23 +- tests/qemu-iotests/017 | 1 + tests/qemu-iotests/020 | 1 + tests/qemu-iotests/028 | 1 + tests/qemu-iotests/029 | 1 + tests/qemu-iotests/073 | 1 + tests/qemu-iotests/094 | 11 +- tests/qemu-iotests/102 | 5 +- tests/qemu-iotests/109 | 1 + tests/qemu-iotests/114 | 1 + tests/qemu-iotests/117 | 1 + tests/qemu-iotests/130 | 2 + tests/qemu-iotests/134 | 1 + tests/qemu-iotests/140 | 1 + tests/qemu-iotests/141 | 1 + tests/qemu-iotests/143 | 1 + tests/qemu-iotests/156 | 2 + tests/qemu-iotests/158 | 1 + tests/qemu-iotests/common | 6 + tests/qemu-iotests/common.config | 13 + tests/qemu-iotests/common.filter | 1 + tests/qemu-iotests/common.rc | 19 ++ 33 files changed, 844 insertions(+), 42 deletions(-) create mode 100644 block/vxhs.c -- 2.9.3 ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2017-04-21 13:46 Jeff Cody @ 2017-04-21 16:55 ` Peter Maydell 0 siblings, 0 replies; 38+ messages in thread From: Peter Maydell @ 2017-04-21 16:55 UTC (permalink / raw) To: Jeff Cody; +Cc: Qemu-block, QEMU Developers On 21 April 2017 at 14:46, Jeff Cody <jcody@redhat.com> wrote: > The following changes since commit bfec359afba088aaacc7d316f43302f28c6e642a: > > Merge remote-tracking branch 'remotes/armbru/tags/pull-qdev-2017-04-21' into staging (2017-04-21 11:42:03 +0100) > > are available in the git repository at: > > git://github.com/codyprime/qemu-kvm-jtc.git tags/block-pull-request > > for you to fetch changes up to 1507631e438930bc07f776f303af127a9cdb4d41: > > qemu-iotests: _cleanup_qemu must be called on exit (2017-04-21 08:32:44 -0400) > > ---------------------------------------------------------------- > > Block patches for 2.10 > Hi, I'm afraid this runs into format string compile issues: In file included from block/trace.c:4: /Users/pm215/src/qemu-for-merges/build/all/block/trace.h:1465:42: error: format specifies type 'unsigned long' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Werror,-Wformat] , guid, iodir, size, off, acb, ret, err); ^~~~ /Users/pm215/src/qemu-for-merges/include/qemu/log.h:94:30: note: expanded from macro 'qemu_log_mask' qemu_log(FMT, ## __VA_ARGS__); \ ^ In file included from block/trace.c:4: /Users/pm215/src/qemu-for-merges/build/all/block/trace.h:1465:48: error: format specifies type 'unsigned long' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Werror,-Wformat] , guid, iodir, size, off, acb, ret, err); ^~~ /Users/pm215/src/qemu-for-merges/include/qemu/log.h:94:30: note: expanded from macro 'qemu_log_mask' qemu_log(FMT, ## __VA_ARGS__); \ ^ In file included from block/trace.c:4: /Users/pm215/src/qemu-for-merges/build/all/block/trace.h:1493:41: error: format specifies type 'unsigned long' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Werror,-Wformat] , vdisk_guid, vdisk_size); ^~~~~~~~~~ /Users/pm215/src/qemu-for-merges/include/qemu/log.h:94:30: note: expanded from macro 'qemu_log_mask' qemu_log(FMT, ## __VA_ARGS__); \ ^ In file included from block/trace.c:4: /Users/pm215/src/qemu-for-merges/build/all/block/trace.h:1507:34: error: format specifies type 'long' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Werror,-Wformat] , acb, ret); ^~~ /Users/pm215/src/qemu-for-merges/include/qemu/log.h:94:30: note: expanded from macro 'qemu_log_mask' qemu_log(FMT, ## __VA_ARGS__); \ ^ 4 errors generated. Those are the OSX errors, but the compile also fails for 32-bit hosts (including w32). thanks -- PMM ^ permalink raw reply [flat|nested] 38+ messages in thread
* [Qemu-devel] [PULL 00/12] Block patches @ 2017-05-26 19:23 Jeff Cody 0 siblings, 0 replies; 38+ messages in thread From: Jeff Cody @ 2017-05-26 19:23 UTC (permalink / raw) To: qemu-block; +Cc: peter.maydell, jcody, qemu-devel, stefanha The following changes since commit 9964e96dc9999cf7f7c936ee854a795415d19b60: Merge remote-tracking branch 'jasowang/tags/net-pull-request' into staging (2017-05-23 15:01:31 +0100) are available in the git repository at: git://github.com/codyprime/qemu-kvm-jtc.git tags/block-pull-request for you to fetch changes up to 223a23c198787328ae75bc65d84edf5fde33c0b6: block/gluster: glfs_lseek() workaround (2017-05-24 16:44:46 -0400) ---------------------------------------------------------------- Block patches ---------------------------------------------------------------- Jeff Cody (1): block/gluster: glfs_lseek() workaround Paolo Bonzini (11): blockjob: remove unnecessary check blockjob: remove iostatus_reset callback blockjob: introduce block_job_early_fail blockjob: introduce block_job_pause/resume_all blockjob: separate monitor and blockjob APIs blockjob: move iostatus reset inside block_job_user_resume blockjob: introduce block_job_cancel_async, check iostatus invariants blockjob: group BlockJob transaction functions together blockjob: strengthen a bit test-blockjob-txn blockjob: reorganize block_job_completed_txn_abort blockjob: use deferred_to_main_loop to indicate the coroutine has ended block/backup.c | 2 +- block/commit.c | 2 +- block/gluster.c | 18 +- block/io.c | 19 +- block/mirror.c | 2 +- blockdev.c | 1 - blockjob.c | 750 ++++++++++++++++++++++++------------------- include/block/blockjob.h | 16 - include/block/blockjob_int.h | 27 +- tests/test-blockjob-txn.c | 7 +- tests/test-blockjob.c | 10 +- 11 files changed, 463 insertions(+), 391 deletions(-) -- 2.9.3 ^ permalink raw reply [flat|nested] 38+ messages in thread
* [Qemu-devel] [PULL 00/12] Block patches @ 2019-08-27 20:16 Stefan Hajnoczi 2019-09-03 10:05 ` Peter Maydell 0 siblings, 1 reply; 38+ messages in thread From: Stefan Hajnoczi @ 2019-08-27 20:16 UTC (permalink / raw) To: qemu-devel Cc: Fam Zheng, Kevin Wolf, qemu-block, Peter Maydell, Max Reitz, Stefan Hajnoczi, John Snow The following changes since commit dac03af5d5482ec7ee9c23db467bb7230b33c0d9: Merge remote-tracking branch 'remotes/rth/tags/pull-axp-20190825' into staging (2019-08-27 10:00:51 +0100) are available in the Git repository at: https://github.com/stefanha/qemu.git tags/block-pull-request for you to fetch changes up to 5396234b96a2ac743f48644529771498e036e698: block/qcow2: implement .bdrv_co_pwritev(_compressed)_part (2019-08-27 14:58:42 +0100) ---------------------------------------------------------------- Pull request ---------------------------------------------------------------- Vladimir Sementsov-Ogievskiy (12): util/iov: introduce qemu_iovec_init_extended util/iov: improve qemu_iovec_is_zero block/io: refactor padding block: define .*_part io handlers in BlockDriver block/io: bdrv_co_do_copy_on_readv: use and support qiov_offset block/io: bdrv_co_do_copy_on_readv: lazy allocation block/io: bdrv_aligned_preadv: use and support qiov_offset block/io: bdrv_aligned_pwritev: use and support qiov_offset block/io: introduce bdrv_co_p{read, write}v_part block/qcow2: refactor qcow2_co_preadv to use buffer-based io block/qcow2: implement .bdrv_co_preadv_part block/qcow2: implement .bdrv_co_pwritev(_compressed)_part block/qcow2.h | 1 + include/block/block_int.h | 21 ++ include/qemu/iov.h | 10 +- block/backup.c | 2 +- block/io.c | 541 +++++++++++++++++++++++--------------- block/qcow2-cluster.c | 14 +- block/qcow2.c | 131 +++++---- qemu-img.c | 4 +- util/iov.c | 153 +++++++++-- 9 files changed, 568 insertions(+), 309 deletions(-) -- 2.21.0 ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [Qemu-devel] [PULL 00/12] Block patches 2019-08-27 20:16 Stefan Hajnoczi @ 2019-09-03 10:05 ` Peter Maydell 0 siblings, 0 replies; 38+ messages in thread From: Peter Maydell @ 2019-09-03 10:05 UTC (permalink / raw) To: Stefan Hajnoczi Cc: Fam Zheng, Kevin Wolf, Qemu-block, QEMU Developers, Max Reitz, John Snow On Tue, 27 Aug 2019 at 21:16, Stefan Hajnoczi <stefanha@redhat.com> wrote: > > The following changes since commit dac03af5d5482ec7ee9c23db467bb7230b33c0d9: > > Merge remote-tracking branch 'remotes/rth/tags/pull-axp-20190825' into staging (2019-08-27 10:00:51 +0100) > > are available in the Git repository at: > > https://github.com/stefanha/qemu.git tags/block-pull-request > > for you to fetch changes up to 5396234b96a2ac743f48644529771498e036e698: > > block/qcow2: implement .bdrv_co_pwritev(_compressed)_part (2019-08-27 14:58:42 +0100) > > ---------------------------------------------------------------- > Pull request Applied, thanks. Please update the changelog at https://wiki.qemu.org/ChangeLog/4.2 for any user-visible changes. -- PMM ^ permalink raw reply [flat|nested] 38+ messages in thread
end of thread, other threads:[~2019-09-03 10:07 UTC | newest] Thread overview: 38+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-06-08 13:48 [Qemu-devel] [PULL 00/12] Block patches Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 01/12] ide/core: Remove explicit setting of BM_STATUS_INT Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 02/12] block: clarify the meaning of BDRV_O_NOCACHE Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 03/12] vmdk: fix endianness bugs Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 04/12] block/raw-posix: use a character device if a block device is given Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 05/12] block/raw-posix: get right partition size Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 06/12] rbd: use the higher level librbd instead of just librados Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 07/12] rbd: allow configuration of rados from the rbd filename Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 08/12] rbd: check return values when scheduling aio Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 09/12] rbd: Add bdrv_truncate implementation Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 10/12] qcow2: Fix memory leaks in error cases Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 11/12] bdrv_img_create: Fix segfault Kevin Wolf 2011-06-08 13:48 ` [Qemu-devel] [PATCH 12/12] qemu-img create: Fix displayed default cluster size Kevin Wolf 2011-06-09 12:39 ` [Qemu-devel] [PULL 00/12] Block patches Anthony Liguori -- strict thread matches above, loose matches on Subject: below -- 2012-06-04 11:13 Kevin Wolf 2012-06-07 1:17 ` Anthony Liguori 2012-06-08 9:48 ` Kevin Wolf 2012-06-08 14:07 ` Anthony Liguori 2012-06-08 14:57 ` Kevin Wolf 2012-08-06 20:44 Kevin Wolf 2012-08-07 8:28 ` Paolo Bonzini 2012-08-07 15:36 ` Anthony Liguori 2015-01-23 18:20 Kevin Wolf 2015-01-26 10:16 ` Peter Maydell 2015-10-29 18:09 Stefan Hajnoczi 2015-10-30 9:40 ` Peter Maydell 2015-10-30 14:19 ` Markus Armbruster 2015-10-30 17:37 ` Peter Maydell 2015-10-30 21:59 ` Peter Maydell 2016-02-29 20:08 Jeff Cody 2016-03-01 10:34 ` Peter Maydell 2016-06-07 14:26 Stefan Hajnoczi 2016-06-07 15:34 ` Peter Maydell 2017-04-21 13:46 Jeff Cody 2017-04-21 16:55 ` Peter Maydell 2017-05-26 19:23 Jeff Cody 2019-08-27 20:16 Stefan Hajnoczi 2019-09-03 10:05 ` Peter Maydell
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).