* [Qemu-devel] [PULL 0/6] Block patches @ 2013-01-14 10:01 Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 1/6] block: do not probe zero-sized disks Kevin Wolf ` (6 more replies) 0 siblings, 7 replies; 18+ messages in thread From: Kevin Wolf @ 2013-01-14 10:01 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit 63fb2590839162afdf14d7c0ee02d460766c0956: Merge branch 'target-arm.next' of git://git.linaro.org/people/pmaydell/qemu-arm (2013-01-12 12:47:07 +0000) are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony Liu Yuan (1): sheepdog: implement direct write semantics Paolo Bonzini (2): block: do not probe zero-sized disks raw-posix: fix bdrv_aio_ioctl Stefan Hajnoczi (3): block: make qiov_is_aligned() public dataplane: extract virtio-blk read/write processing into do_rdwr_cmd() dataplane: handle misaligned virtio-blk requests block.c | 18 +++++++++++- block/raw-posix.c | 28 +---------------- block/sheepdog.c | 70 +++++++++++++++++++++++++------------------- hw/dataplane/virtio-blk.c | 71 ++++++++++++++++++++++++++++++++++++++------- include/block/block.h | 1 + 5 files changed, 120 insertions(+), 68 deletions(-) ^ permalink raw reply [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH 1/6] block: do not probe zero-sized disks 2013-01-14 10:01 [Qemu-devel] [PULL 0/6] Block patches Kevin Wolf @ 2013-01-14 10:01 ` Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 2/6] sheepdog: implement direct write semantics Kevin Wolf ` (5 subsequent siblings) 6 siblings, 0 replies; 18+ messages in thread From: Kevin Wolf @ 2013-01-14 10:01 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Paolo Bonzini <pbonzini@redhat.com> A blank CD or DVD is visible as a zero-sized disks. Probing such disks will lead to an EIO and a failure to start the VM. Treating them as raw is a better solution. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/block.c b/block.c index 60873ea..14f8202 100644 --- a/block.c +++ b/block.c @@ -527,7 +527,7 @@ static int find_image_format(BlockDriverState *bs, const char *filename, int ret = 0; /* Return the raw BlockDriver * to scsi-generic devices or empty drives */ - if (bs->sg || !bdrv_is_inserted(bs)) { + if (bs->sg || !bdrv_is_inserted(bs) || bdrv_getlength(bs) == 0) { drv = bdrv_find_format("raw"); if (!drv) { ret = -ENOENT; -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH 2/6] sheepdog: implement direct write semantics 2013-01-14 10:01 [Qemu-devel] [PULL 0/6] Block patches Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 1/6] block: do not probe zero-sized disks Kevin Wolf @ 2013-01-14 10:01 ` Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 3/6] raw-posix: fix bdrv_aio_ioctl Kevin Wolf ` (4 subsequent siblings) 6 siblings, 0 replies; 18+ messages in thread From: Kevin Wolf @ 2013-01-14 10:01 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Liu Yuan <tailai.ly@taobao.com> Sheepdog supports both writeback/writethrough write but has not yet supported DIRECTIO semantics which bypass the cache completely even if Sheepdog daemon is set up with cache enabled. Suppose cache is enabled on Sheepdog daemon size, the new cache control is cache=writeback # enable the writeback semantics for write cache=writethrough # enable the emulated writethrough semantics for write cache=directsync # disable cache competely Guest WCE toggling on the run time to toggle writeback/writethrough is also supported. Cc: MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp> Cc: Kevin Wolf <kwolf@redhat.com> Cc: Stefan Hajnoczi <stefanha@gmail.com> Signed-off-by: Liu Yuan <tailai.ly@taobao.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/sheepdog.c | 70 ++++++++++++++++++++++++++++++----------------------- 1 files changed, 40 insertions(+), 30 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index e821746..462c4b2 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -36,7 +36,8 @@ #define SD_FLAG_CMD_WRITE 0x01 #define SD_FLAG_CMD_COW 0x02 -#define SD_FLAG_CMD_CACHE 0x04 +#define SD_FLAG_CMD_CACHE 0x04 /* Writeback mode for cache */ +#define SD_FLAG_CMD_DIRECT 0x08 /* Don't use cache */ #define SD_RES_SUCCESS 0x00 /* Success */ #define SD_RES_UNKNOWN 0x01 /* Unknown error */ @@ -293,7 +294,7 @@ typedef struct BDRVSheepdogState { char name[SD_MAX_VDI_LEN]; bool is_snapshot; - bool cache_enabled; + uint32_t cache_flags; char *addr; char *port; @@ -977,8 +978,8 @@ static int coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req, hdr.flags = SD_FLAG_CMD_WRITE | flags; } - if (s->cache_enabled) { - hdr.flags |= SD_FLAG_CMD_CACHE; + if (s->cache_flags) { + hdr.flags |= s->cache_flags; } hdr.oid = oid; @@ -1023,7 +1024,7 @@ static int coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req, static int read_write_object(int fd, char *buf, uint64_t oid, int copies, unsigned int datalen, uint64_t offset, - bool write, bool create, bool cache) + bool write, bool create, uint32_t cache_flags) { SheepdogObjReq hdr; SheepdogObjRsp *rsp = (SheepdogObjRsp *)&hdr; @@ -1047,9 +1048,7 @@ static int read_write_object(int fd, char *buf, uint64_t oid, int copies, hdr.opcode = SD_OP_READ_OBJ; } - if (cache) { - hdr.flags |= SD_FLAG_CMD_CACHE; - } + hdr.flags |= cache_flags; hdr.oid = oid; hdr.data_length = datalen; @@ -1072,18 +1071,19 @@ static int read_write_object(int fd, char *buf, uint64_t oid, int copies, } static int read_object(int fd, char *buf, uint64_t oid, int copies, - unsigned int datalen, uint64_t offset, bool cache) + unsigned int datalen, uint64_t offset, + uint32_t cache_flags) { return read_write_object(fd, buf, oid, copies, datalen, offset, false, - false, cache); + false, cache_flags); } static int write_object(int fd, char *buf, uint64_t oid, int copies, unsigned int datalen, uint64_t offset, bool create, - bool cache) + uint32_t cache_flags) { return read_write_object(fd, buf, oid, copies, datalen, offset, true, - create, cache); + create, cache_flags); } static int sd_open(BlockDriverState *bs, const char *filename, int flags) @@ -1118,12 +1118,22 @@ static int sd_open(BlockDriverState *bs, const char *filename, int flags) goto out; } - s->cache_enabled = true; - s->flush_fd = connect_to_sdog(s->addr, s->port); - if (s->flush_fd < 0) { - error_report("failed to connect"); - ret = s->flush_fd; - goto out; + /* + * QEMU block layer emulates writethrough cache as 'writeback + flush', so + * we always set SD_FLAG_CMD_CACHE (writeback cache) as default. + */ + s->cache_flags = SD_FLAG_CMD_CACHE; + if (flags & BDRV_O_NOCACHE) { + s->cache_flags = SD_FLAG_CMD_DIRECT; + } + + if (s->cache_flags == SD_FLAG_CMD_CACHE) { + s->flush_fd = connect_to_sdog(s->addr, s->port); + if (s->flush_fd < 0) { + error_report("failed to connect"); + ret = s->flush_fd; + goto out; + } } if (snapid || tag[0] != '\0') { @@ -1140,7 +1150,7 @@ static int sd_open(BlockDriverState *bs, const char *filename, int flags) buf = g_malloc(SD_INODE_SIZE); ret = read_object(fd, buf, vid_to_vdi_oid(vid), 0, SD_INODE_SIZE, 0, - s->cache_enabled); + s->cache_flags); closesocket(fd); @@ -1387,7 +1397,7 @@ static void sd_close(BlockDriverState *bs) qemu_aio_set_fd_handler(s->fd, NULL, NULL, NULL, NULL); closesocket(s->fd); - if (s->cache_enabled) { + if (s->cache_flags) { closesocket(s->flush_fd); } g_free(s->addr); @@ -1423,7 +1433,7 @@ static int sd_truncate(BlockDriverState *bs, int64_t offset) datalen = SD_INODE_SIZE - sizeof(s->inode.data_vdi_id); s->inode.vdi_size = offset; ret = write_object(fd, (char *)&s->inode, vid_to_vdi_oid(s->inode.vdi_id), - s->inode.nr_copies, datalen, 0, false, s->cache_enabled); + s->inode.nr_copies, datalen, 0, false, s->cache_flags); close(fd); if (ret < 0) { @@ -1506,7 +1516,7 @@ static int sd_create_branch(BDRVSheepdogState *s) } ret = read_object(fd, buf, vid_to_vdi_oid(vid), s->inode.nr_copies, - SD_INODE_SIZE, 0, s->cache_enabled); + SD_INODE_SIZE, 0, s->cache_flags); closesocket(fd); @@ -1707,7 +1717,7 @@ static int coroutine_fn sd_co_flush_to_disk(BlockDriverState *bs) int ret; unsigned int wlen = 0, rlen = 0; - if (!s->cache_enabled) { + if (s->cache_flags != SD_FLAG_CMD_CACHE) { return 0; } @@ -1723,7 +1733,7 @@ static int coroutine_fn sd_co_flush_to_disk(BlockDriverState *bs) if (rsp->result == SD_RES_INVALID_PARMS) { dprintf("disable write cache since the server doesn't support it\n"); - s->cache_enabled = false; + s->cache_flags = SD_FLAG_CMD_DIRECT; closesocket(s->flush_fd); return 0; } @@ -1774,7 +1784,7 @@ static int sd_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info) } ret = write_object(fd, (char *)&s->inode, vid_to_vdi_oid(s->inode.vdi_id), - s->inode.nr_copies, datalen, 0, false, s->cache_enabled); + s->inode.nr_copies, datalen, 0, false, s->cache_flags); if (ret < 0) { error_report("failed to write snapshot's inode."); goto cleanup; @@ -1791,7 +1801,7 @@ static int sd_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info) inode = (SheepdogInode *)g_malloc(datalen); ret = read_object(fd, (char *)inode, vid_to_vdi_oid(new_vid), - s->inode.nr_copies, datalen, 0, s->cache_enabled); + s->inode.nr_copies, datalen, 0, s->cache_flags); if (ret < 0) { error_report("failed to read new inode info. %s", strerror(errno)); @@ -1845,7 +1855,7 @@ static int sd_snapshot_goto(BlockDriverState *bs, const char *snapshot_id) buf = g_malloc(SD_INODE_SIZE); ret = read_object(fd, buf, vid_to_vdi_oid(vid), s->inode.nr_copies, - SD_INODE_SIZE, 0, s->cache_enabled); + SD_INODE_SIZE, 0, s->cache_flags); closesocket(fd); @@ -1942,7 +1952,7 @@ static int sd_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab) /* we don't need to read entire object */ ret = read_object(fd, (char *)&inode, vid_to_vdi_oid(vid), 0, SD_INODE_SIZE - sizeof(inode.data_vdi_id), 0, - s->cache_enabled); + s->cache_flags); if (ret) { continue; @@ -2003,11 +2013,11 @@ static int do_load_save_vmstate(BDRVSheepdogState *s, uint8_t *data, if (load) { ret = read_object(fd, (char *)data, vmstate_oid, s->inode.nr_copies, data_len, offset, - s->cache_enabled); + s->cache_flags); } else { ret = write_object(fd, (char *)data, vmstate_oid, s->inode.nr_copies, data_len, offset, create, - s->cache_enabled); + s->cache_flags); } if (ret < 0) { -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH 3/6] raw-posix: fix bdrv_aio_ioctl 2013-01-14 10:01 [Qemu-devel] [PULL 0/6] Block patches Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 1/6] block: do not probe zero-sized disks Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 2/6] sheepdog: implement direct write semantics Kevin Wolf @ 2013-01-14 10:01 ` Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 4/6] block: make qiov_is_aligned() public Kevin Wolf ` (3 subsequent siblings) 6 siblings, 0 replies; 18+ messages in thread From: Kevin Wolf @ 2013-01-14 10:01 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Paolo Bonzini <pbonzini@redhat.com> When the raw-posix aio=thread code was moved from posix-aio-compat.c to block/raw-posix.c, there was an unintended change to the ioctl code. The code used to return the ioctl command, which posix_aio_read() would later morph into a zero. This hack is not necessary anymore, and in fact breaks scsi-generic (which expects a zero return code). Remove it. Cc: qemu-stable@nongnu.org Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/raw-posix.c | 10 +--------- 1 files changed, 1 insertions(+), 9 deletions(-) diff --git a/block/raw-posix.c b/block/raw-posix.c index 87d888e..0e705ba 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -455,15 +455,7 @@ static ssize_t handle_aiocb_ioctl(RawPosixAIOData *aiocb) return -errno; } - /* - * This looks weird, but the aio code only considers a request - * successful if it has written the full number of bytes. - * - * Now we overload aio_nbytes as aio_ioctl_cmd for the ioctl command, - * so in fact we return the ioctl command here to make posix_aio_read() - * happy.. - */ - return aiocb->aio_nbytes; + return 0; } static ssize_t handle_aiocb_flush(RawPosixAIOData *aiocb) -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH 4/6] block: make qiov_is_aligned() public 2013-01-14 10:01 [Qemu-devel] [PULL 0/6] Block patches Kevin Wolf ` (2 preceding siblings ...) 2013-01-14 10:01 ` [Qemu-devel] [PATCH 3/6] raw-posix: fix bdrv_aio_ioctl Kevin Wolf @ 2013-01-14 10:01 ` Kevin Wolf 2013-01-14 10:02 ` [Qemu-devel] [PATCH 5/6] dataplane: extract virtio-blk read/write processing into do_rdwr_cmd() Kevin Wolf ` (2 subsequent siblings) 6 siblings, 0 replies; 18+ messages in thread From: Kevin Wolf @ 2013-01-14 10:01 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Stefan Hajnoczi <stefanha@redhat.com> The qiov_is_aligned() function checks whether a QEMUIOVector meets a BlockDriverState's alignment requirements. This is needed by virtio-blk-data-plane so: 1. Move the function from block/raw-posix.c to block/block.c. 2. Make it public in block/block.h. 3. Rename to bdrv_qiov_is_aligned(). 4. Change return type from int to bool. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block.c | 16 ++++++++++++++++ block/raw-posix.c | 18 +----------------- include/block/block.h | 1 + 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/block.c b/block.c index 14f8202..b5e64ec 100644 --- a/block.c +++ b/block.c @@ -4313,6 +4313,22 @@ void *qemu_blockalign(BlockDriverState *bs, size_t size) return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size); } +/* + * Check if all memory in this vector is sector aligned. + */ +bool bdrv_qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov) +{ + int i; + + for (i = 0; i < qiov->niov; i++) { + if ((uintptr_t) qiov->iov[i].iov_base % bs->buffer_alignment) { + return false; + } + } + + return true; +} + void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable) { int64_t bitmap_size; diff --git a/block/raw-posix.c b/block/raw-posix.c index 0e705ba..c3d7fda 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -430,22 +430,6 @@ static void raw_reopen_abort(BDRVReopenState *state) #endif */ -/* - * Check if all memory in this vector is sector aligned. - */ -static int qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov) -{ - int i; - - for (i = 0; i < qiov->niov; i++) { - if ((uintptr_t) qiov->iov[i].iov_base % bs->buffer_alignment) { - return 0; - } - } - - return 1; -} - static ssize_t handle_aiocb_ioctl(RawPosixAIOData *aiocb) { int ret; @@ -714,7 +698,7 @@ static BlockDriverAIOCB *raw_aio_submit(BlockDriverState *bs, * driver that it needs to copy the buffer. */ if ((bs->open_flags & BDRV_O_NOCACHE)) { - if (!qiov_is_aligned(bs, qiov)) { + if (!bdrv_qiov_is_aligned(bs, qiov)) { type |= QEMU_AIO_MISALIGNED; #ifdef CONFIG_LINUX_AIO } else if (s->use_aio) { diff --git a/include/block/block.h b/include/block/block.h index 0719339..ffd1936 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -349,6 +349,7 @@ void bdrv_img_create(const char *filename, const char *fmt, void bdrv_set_buffer_alignment(BlockDriverState *bs, int align); void *qemu_blockalign(BlockDriverState *bs, size_t size); +bool bdrv_qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov); #define BDRV_SECTORS_PER_DIRTY_CHUNK 2048 -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH 5/6] dataplane: extract virtio-blk read/write processing into do_rdwr_cmd() 2013-01-14 10:01 [Qemu-devel] [PULL 0/6] Block patches Kevin Wolf ` (3 preceding siblings ...) 2013-01-14 10:01 ` [Qemu-devel] [PATCH 4/6] block: make qiov_is_aligned() public Kevin Wolf @ 2013-01-14 10:02 ` Kevin Wolf 2013-01-14 10:02 ` [Qemu-devel] [PATCH 6/6] dataplane: handle misaligned virtio-blk requests Kevin Wolf 2013-01-20 14:47 ` [Qemu-devel] [PULL 0/6] Block patches Anthony Liguori 6 siblings, 0 replies; 18+ messages in thread From: Kevin Wolf @ 2013-01-14 10:02 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Stefan Hajnoczi <stefanha@redhat.com> Extract code for read/write command processing into do_rdwr_cmd(). This brings together pieces that are spread across process_request(). The real motivation is to set the stage for handling misaligned requests, which the next patch tackles. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- hw/dataplane/virtio-blk.c | 31 ++++++++++++++++++++----------- 1 files changed, 20 insertions(+), 11 deletions(-) diff --git a/hw/dataplane/virtio-blk.c b/hw/dataplane/virtio-blk.c index 4c4ad84..a6696b8 100644 --- a/hw/dataplane/virtio-blk.c +++ b/hw/dataplane/virtio-blk.c @@ -130,6 +130,22 @@ static void do_get_id_cmd(VirtIOBlockDataPlane *s, complete_request_early(s, head, inhdr, VIRTIO_BLK_S_OK); } +static int do_rdwr_cmd(VirtIOBlockDataPlane *s, bool read, + struct iovec *iov, unsigned int iov_cnt, + long long offset, unsigned int head, + QEMUIOVector *inhdr) +{ + struct iocb *iocb; + + iocb = ioq_rdwr(&s->ioqueue, read, iov, iov_cnt, offset); + + /* Fill in virtio block metadata needed for completion */ + VirtIOBlockRequest *req = container_of(iocb, VirtIOBlockRequest, iocb); + req->head = head; + req->inhdr = inhdr; + return 0; +} + static int process_request(IOQueue *ioq, struct iovec iov[], unsigned int out_num, unsigned int in_num, unsigned int head) @@ -139,7 +155,6 @@ static int process_request(IOQueue *ioq, struct iovec iov[], struct virtio_blk_outhdr outhdr; QEMUIOVector *inhdr; size_t in_size; - struct iocb *iocb; /* Copy in outhdr */ if (unlikely(iov_to_buf(iov, out_num, 0, &outhdr, @@ -167,12 +182,12 @@ static int process_request(IOQueue *ioq, struct iovec iov[], switch (outhdr.type) { case VIRTIO_BLK_T_IN: - iocb = ioq_rdwr(ioq, true, in_iov, in_num, outhdr.sector * 512); - break; + do_rdwr_cmd(s, true, in_iov, in_num, outhdr.sector * 512, head, inhdr); + return 0; case VIRTIO_BLK_T_OUT: - iocb = ioq_rdwr(ioq, false, iov, out_num, outhdr.sector * 512); - break; + do_rdwr_cmd(s, false, iov, out_num, outhdr.sector * 512, head, inhdr); + return 0; case VIRTIO_BLK_T_SCSI_CMD: /* TODO support SCSI commands */ @@ -198,12 +213,6 @@ static int process_request(IOQueue *ioq, struct iovec iov[], g_slice_free(QEMUIOVector, inhdr); return -EFAULT; } - - /* Fill in virtio block metadata needed for completion */ - VirtIOBlockRequest *req = container_of(iocb, VirtIOBlockRequest, iocb); - req->head = head; - req->inhdr = inhdr; - return 0; } static void handle_notify(EventHandler *handler) -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH 6/6] dataplane: handle misaligned virtio-blk requests 2013-01-14 10:01 [Qemu-devel] [PULL 0/6] Block patches Kevin Wolf ` (4 preceding siblings ...) 2013-01-14 10:02 ` [Qemu-devel] [PATCH 5/6] dataplane: extract virtio-blk read/write processing into do_rdwr_cmd() Kevin Wolf @ 2013-01-14 10:02 ` Kevin Wolf 2013-01-20 14:47 ` [Qemu-devel] [PULL 0/6] Block patches Anthony Liguori 6 siblings, 0 replies; 18+ messages in thread From: Kevin Wolf @ 2013-01-14 10:02 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Stefan Hajnoczi <stefanha@redhat.com> O_DIRECT on Linux has alignment requirements on I/O buffers and misaligned requests result in -EINVAL. The Linux virtio_blk guest driver usually submits aligned requests so I forgot to handle misaligned requests. It turns out that virtio-win guest drivers submit misaligned requests. Handle them using a bounce buffer that meets alignment requirements. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- hw/dataplane/virtio-blk.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) diff --git a/hw/dataplane/virtio-blk.c b/hw/dataplane/virtio-blk.c index a6696b8..1f7346e 100644 --- a/hw/dataplane/virtio-blk.c +++ b/hw/dataplane/virtio-blk.c @@ -34,6 +34,8 @@ typedef struct { struct iocb iocb; /* Linux AIO control block */ QEMUIOVector *inhdr; /* iovecs for virtio_blk_inhdr */ unsigned int head; /* vring descriptor index */ + struct iovec *bounce_iov; /* used if guest buffers are unaligned */ + QEMUIOVector *read_qiov; /* for read completion /w bounce buffer */ } VirtIOBlockRequest; struct VirtIOBlockDataPlane { @@ -89,6 +91,18 @@ static void complete_request(struct iocb *iocb, ssize_t ret, void *opaque) trace_virtio_blk_data_plane_complete_request(s, req->head, ret); + if (req->read_qiov) { + assert(req->bounce_iov); + qemu_iovec_from_buf(req->read_qiov, 0, req->bounce_iov->iov_base, len); + qemu_iovec_destroy(req->read_qiov); + g_slice_free(QEMUIOVector, req->read_qiov); + } + + if (req->bounce_iov) { + qemu_vfree(req->bounce_iov->iov_base); + g_slice_free(struct iovec, req->bounce_iov); + } + qemu_iovec_from_buf(req->inhdr, 0, &hdr, sizeof(hdr)); qemu_iovec_destroy(req->inhdr); g_slice_free(QEMUIOVector, req->inhdr); @@ -136,6 +150,30 @@ static int do_rdwr_cmd(VirtIOBlockDataPlane *s, bool read, QEMUIOVector *inhdr) { struct iocb *iocb; + QEMUIOVector qiov; + struct iovec *bounce_iov = NULL; + QEMUIOVector *read_qiov = NULL; + + qemu_iovec_init_external(&qiov, iov, iov_cnt); + if (!bdrv_qiov_is_aligned(s->blk->conf.bs, &qiov)) { + void *bounce_buffer = qemu_blockalign(s->blk->conf.bs, qiov.size); + + if (read) { + /* Need to copy back from bounce buffer on completion */ + read_qiov = g_slice_new(QEMUIOVector); + qemu_iovec_init(read_qiov, iov_cnt); + qemu_iovec_concat_iov(read_qiov, iov, iov_cnt, 0, qiov.size); + } else { + qemu_iovec_to_buf(&qiov, 0, bounce_buffer, qiov.size); + } + + /* Redirect I/O to aligned bounce buffer */ + bounce_iov = g_slice_new(struct iovec); + bounce_iov->iov_base = bounce_buffer; + bounce_iov->iov_len = qiov.size; + iov = bounce_iov; + iov_cnt = 1; + } iocb = ioq_rdwr(&s->ioqueue, read, iov, iov_cnt, offset); @@ -143,6 +181,8 @@ static int do_rdwr_cmd(VirtIOBlockDataPlane *s, bool read, VirtIOBlockRequest *req = container_of(iocb, VirtIOBlockRequest, iocb); req->head = head; req->inhdr = inhdr; + req->bounce_iov = bounce_iov; + req->read_qiov = read_qiov; return 0; } -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PULL 0/6] Block patches 2013-01-14 10:01 [Qemu-devel] [PULL 0/6] Block patches Kevin Wolf ` (5 preceding siblings ...) 2013-01-14 10:02 ` [Qemu-devel] [PATCH 6/6] dataplane: handle misaligned virtio-blk requests Kevin Wolf @ 2013-01-20 14:47 ` Anthony Liguori 6 siblings, 0 replies; 18+ messages in thread From: Anthony Liguori @ 2013-01-20 14:47 UTC (permalink / raw) To: Kevin Wolf, anthony; +Cc: qemu-devel Pulled. Thanks. Regards, Anthony Liguori ^ permalink raw reply [flat|nested] 18+ messages in thread
* [Qemu-devel] [PULL 0/6] Block patches @ 2018-03-05 9:40 Stefan Hajnoczi 2018-03-05 9:52 ` no-reply 2018-03-05 18:55 ` Peter Maydell 0 siblings, 2 replies; 18+ messages in thread From: Stefan Hajnoczi @ 2018-03-05 9:40 UTC (permalink / raw) To: qemu-devel; +Cc: qemu-block, Peter Maydell, Stefan Hajnoczi The following changes since commit 136c67e07869227b21b3f627316e03679ce7b738: Merge remote-tracking branch 'remotes/bkoppelmann/tags/pull-tricore-2018-03-02' into staging (2018-03-02 16:56:20 +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 23500c6a9409efc80d696aede0629bfbe7556a90: README: Document 'git-publish' workflow (2018-03-05 09:03:17 +0000) ---------------------------------------------------------------- Pull request Mostly patches that are only indirectly related to the block layer, but I've reviewed them and there is no maintainer. ---------------------------------------------------------------- Fam Zheng (2): Add a git-publish configuration file README: Document 'git-publish' workflow Su Hang (3): util/uri.c: Coding style check, Only whitespace involved util/uri.c: remove brackets that wrap `return` statement's content. util/uri.c: wrap single statement blocks with braces {} Thomas Huth (1): tests/libqos: Check for valid dev pointer when looking for PCI devices tests/libqos/virtio-pci.c | 4 +- util/uri.c | 1733 ++++++++++++++++++++++++--------------------- .gitpublish | 51 ++ README | 31 +- 4 files changed, 1014 insertions(+), 805 deletions(-) create mode 100644 .gitpublish -- 2.14.3 ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PULL 0/6] Block patches 2018-03-05 9:40 Stefan Hajnoczi @ 2018-03-05 9:52 ` no-reply 2018-03-05 18:55 ` Peter Maydell 1 sibling, 0 replies; 18+ messages in thread From: no-reply @ 2018-03-05 9:52 UTC (permalink / raw) To: stefanha; +Cc: famz, qemu-devel, peter.maydell, qemu-block Hi, This series seems to have some coding style problems. See output below for more information: Type: series Message-id: 20180305094006.21446-1-stefanha@redhat.com Subject: [Qemu-devel] [PULL 0/6] Block patches === TEST SCRIPT BEGIN === #!/bin/bash BASE=base n=1 total=$(git log --oneline $BASE.. | wc -l) failed=0 git config --local diff.renamelimit 0 git config --local diff.renames True git config --local diff.algorithm histogram commits="$(git log --format=%H --reverse $BASE..)" for c in $commits; do echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..." if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then failed=1 echo fi n=$((n+1)) done exit $failed === TEST SCRIPT END === Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384 From https://github.com/patchew-project/qemu 136c67e078..4f51e1d386 master -> master * [new tag] patchew/1520243276-30197-1-git-send-email-thuth@redhat.com -> patchew/1520243276-30197-1-git-send-email-thuth@redhat.com * [new tag] patchew/20180305094006.21446-1-stefanha@redhat.com -> patchew/20180305094006.21446-1-stefanha@redhat.com Switched to a new branch 'test' 20eeab9795 README: Document 'git-publish' workflow 333283c56b Add a git-publish configuration file 3a9752c776 tests/libqos: Check for valid dev pointer when looking for PCI devices 6863406cb9 util/uri.c: wrap single statement blocks with braces {} 906ebc14e5 util/uri.c: remove brackets that wrap `return` statement's content. d0e12d0916 util/uri.c: Coding style check, Only whitespace involved === OUTPUT BEGIN === Checking PATCH 1/6: util/uri.c: Coding style check, Only whitespace involved... ERROR: return is not a function, parentheses are not required #171: FILE: util/uri.c:215: + return (-1); ERROR: return is not a function, parentheses are not required #176: FILE: util/uri.c:219: + return (2); ERROR: return is not a function, parentheses are not required #190: FILE: util/uri.c:229: + return (0); ERROR: braces {} are necessary for all arms of this statement #212: FILE: util/uri.c:262: + if (uri->cleanup & 2) [...] + else [...] ERROR: braces {} are necessary for all arms of this statement #276: FILE: util/uri.c:359: + if (uri->cleanup & 2) [...] + else [...] ERROR: return is not a function, parentheses are not required #282: FILE: util/uri.c:365: + return (0); ERROR: return is not a function, parentheses are not required #285: FILE: util/uri.c:367: + return (1); ERROR: return is not a function, parentheses are not required #305: FILE: util/uri.c:389: + return (1); ERROR: braces {} are necessary for all arms of this statement #306: FILE: util/uri.c:390: + if (!ISA_DIGIT(cur + 1)) [...] + else if ((*cur != '0') && (ISA_DIGIT(cur + 1)) && (!ISA_DIGIT(cur + 2))) [...] else if ((*cur == '1') && (ISA_DIGIT(cur + 1)) && (ISA_DIGIT(cur + 2))) [...] - else if ((*cur == '2') && (*(cur + 1) >= '0') && [...] - else if ((*cur == '2') && (*(cur + 1) == '5') && [...] + cur += 3; [...] ERROR: braces {} are necessary for all arms of this statement #308: FILE: util/uri.c:392: + else if ((*cur != '0') && (ISA_DIGIT(cur + 1)) && (!ISA_DIGIT(cur + 2))) [...] else if ((*cur == '1') && (ISA_DIGIT(cur + 1)) && (ISA_DIGIT(cur + 2))) [...] - else if ((*cur == '2') && (*(cur + 1) >= '0') && [...] - else if ((*cur == '2') && (*(cur + 1) == '5') && [...] + cur += 3; [...] ERROR: braces {} are necessary for all arms of this statement #319: FILE: util/uri.c:396: + else if ((*cur == '2') && (*(cur + 1) >= '0') && (*(cur + 1) <= '4') && [...] + else if ((*cur == '2') && (*(cur + 1) == '5') && (*(cur + 2) >= '0') && [...] else [...] ERROR: braces {} are necessary for all arms of this statement #322: FILE: util/uri.c:399: + else if ((*cur == '2') && (*(cur + 1) == '5') && (*(cur + 2) >= '0') && [...] else [...] ERROR: return is not a function, parentheses are not required #327: FILE: util/uri.c:403: + return (1); ERROR: return is not a function, parentheses are not required #330: FILE: util/uri.c:405: + return (0); ERROR: braces {} are necessary even for single statement blocks #354: FILE: util/uri.c:433: + while ((*cur != ']') && (*cur != 0)) + cur++; ERROR: braces {} are necessary for all arms of this statement #356: FILE: util/uri.c:435: + if (*cur != ']') [...] ERROR: return is not a function, parentheses are not required #357: FILE: util/uri.c:436: + return (1); ERROR: braces {} are necessary for all arms of this statement #371: FILE: util/uri.c:446: + if (*cur != '.') [...] ERROR: braces {} are necessary for all arms of this statement #379: FILE: util/uri.c:451: + if (*cur != '.') [...] ERROR: braces {} are necessary for all arms of this statement #386: FILE: util/uri.c:455: + if (*cur != '.') [...] ERROR: braces {} are necessary for all arms of this statement #412: FILE: util/uri.c:473: + if (cur != host) { [...] + } else [...] ERROR: braces {} are necessary for all arms of this statement #413: FILE: util/uri.c:474: + if (uri->cleanup & 2) [...] + else [...] ERROR: return is not a function, parentheses are not required #422: FILE: util/uri.c:482: + return (0); ERROR: braces {} are necessary for all arms of this statement #441: FILE: util/uri.c:512: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #442: FILE: util/uri.c:513: + return (ret); ERROR: braces {} are necessary for all arms of this statement #447: FILE: util/uri.c:517: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #448: FILE: util/uri.c:518: + return (ret); ERROR: return is not a function, parentheses are not required #452: FILE: util/uri.c:521: + return (0); ERROR: return is not a function, parentheses are not required #471: FILE: util/uri.c:547: + return (0); ERROR: return is not a function, parentheses are not required #472: FILE: util/uri.c:548: + return (1); ERROR: return is not a function, parentheses are not required #494: FILE: util/uri.c:579: + return (ret); ERROR: return is not a function, parentheses are not required #513: FILE: util/uri.c:616: + return (1); ERROR: return is not a function, parentheses are not required #526: FILE: util/uri.c:624: + return (ret); ERROR: braces {} are necessary for all arms of this statement #546: FILE: util/uri.c:662: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #547: FILE: util/uri.c:663: + return (ret); ERROR: return is not a function, parentheses are not required #554: FILE: util/uri.c:668: + return (ret); ERROR: braces {} are necessary for all arms of this statement #573: FILE: util/uri.c:705: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #574: FILE: util/uri.c:706: + return (ret); ERROR: return is not a function, parentheses are not required #581: FILE: util/uri.c:711: + return (ret); ERROR: braces {} are necessary for all arms of this statement #606: FILE: util/uri.c:753: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #607: FILE: util/uri.c:754: + return (ret); ERROR: braces {} are necessary for all arms of this statement #609: FILE: util/uri.c:756: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #610: FILE: util/uri.c:757: + return (ret); ERROR: return is not a function, parentheses are not required #612: FILE: util/uri.c:759: + return (0); ERROR: braces {} are necessary for all arms of this statement #616: FILE: util/uri.c:762: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #617: FILE: util/uri.c:763: + return (ret); ERROR: braces {} are necessary for all arms of this statement #621: FILE: util/uri.c:766: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #622: FILE: util/uri.c:767: + return (ret); ERROR: braces {} are necessary for all arms of this statement #653: FILE: util/uri.c:802: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #654: FILE: util/uri.c:803: + return (ret); ERROR: braces {} are necessary for all arms of this statement #656: FILE: util/uri.c:805: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #657: FILE: util/uri.c:806: + return (ret); ERROR: braces {} are necessary for all arms of this statement #662: FILE: util/uri.c:809: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #663: FILE: util/uri.c:810: + return (ret); ERROR: braces {} are necessary for all arms of this statement #667: FILE: util/uri.c:813: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #668: FILE: util/uri.c:814: + return (ret); ERROR: braces {} are necessary for all arms of this statement #687: FILE: util/uri.c:826: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #688: FILE: util/uri.c:827: + return (ret); ERROR: braces {} are necessary for all arms of this statement #696: FILE: util/uri.c:832: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #697: FILE: util/uri.c:833: + return (ret); ERROR: return is not a function, parentheses are not required #703: FILE: util/uri.c:837: + return (1); ERROR: return is not a function, parentheses are not required #706: FILE: util/uri.c:839: + return (0); ERROR: braces {} are necessary for all arms of this statement #725: FILE: util/uri.c:859: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #726: FILE: util/uri.c:860: + return (ret); ERROR: return is not a function, parentheses are not required #729: FILE: util/uri.c:862: + return (1); ERROR: braces {} are necessary for all arms of this statement #734: FILE: util/uri.c:866: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #735: FILE: util/uri.c:867: + return (ret); ERROR: braces {} are necessary for all arms of this statement #742: FILE: util/uri.c:871: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #743: FILE: util/uri.c:872: + return (ret); ERROR: braces {} are necessary for all arms of this statement #751: FILE: util/uri.c:877: + if (ret != 0) [...] ERROR: return is not a function, parentheses are not required #752: FILE: util/uri.c:878: + return (ret); ERROR: return is not a function, parentheses are not required #758: FILE: util/uri.c:882: + return (1); ERROR: return is not a function, parentheses are not required #761: FILE: util/uri.c:884: + return (0); ERROR: return is not a function, parentheses are not required #777: FILE: util/uri.c:904: + return (-1); ERROR: return is not a function, parentheses are not required #794: FILE: util/uri.c:917: + return (ret); ERROR: return is not a function, parentheses are not required #798: FILE: util/uri.c:920: + return (0); ERROR: return is not a function, parentheses are not required #815: FILE: util/uri.c:939: + return (NULL); ERROR: return is not a function, parentheses are not required #821: FILE: util/uri.c:944: + return (NULL); ERROR: return is not a function, parentheses are not required #824: FILE: util/uri.c:946: + return (uri); ERROR: return is not a function, parentheses are not required #837: FILE: util/uri.c:963: + return (rfc3986_parse_uri_reference(uri, str)); ERROR: return is not a function, parentheses are not required #854: FILE: util/uri.c:983: + return (NULL); ERROR: return is not a function, parentheses are not required #863: FILE: util/uri.c:991: + return (NULL); ERROR: return is not a function, parentheses are not required #866: FILE: util/uri.c:993: + return (uri); ERROR: return is not a function, parentheses are not required #891: FILE: util/uri.c:1014: + return (ret); ERROR: return is not a function, parentheses are not required #910: FILE: util/uri.c:1031: + return (temp); ERROR: braces {} are necessary for all arms of this statement #930: FILE: util/uri.c:1050: + if (uri == NULL) [...] ERROR: return is not a function, parentheses are not required #931: FILE: util/uri.c:1051: + return (NULL); ERROR: braces {} are necessary for all arms of this statement #983: FILE: util/uri.c:1079: + if (IS_RESERVED(*(p)) || IS_UNRESERVED(*(p))) [...] + else { [...] ERROR: braces {} are necessary for all arms of this statement #1033: FILE: util/uri.c:1104: + if ((IS_UNRESERVED(*(p))) || ((*(p) == ';')) || [...] + else { [...] ERROR: braces {} are necessary for all arms of this statement #1117: FILE: util/uri.c:1150: + if ((IS_UNRESERVED(*(p))) || ((*(p) == '$')) || [...] + else { [...] ERROR: braces {} are necessary for all arms of this statement #1187: FILE: util/uri.c:1194: + if ((IS_UNRESERVED(*(p))) || ((*(p) == '/')) || [...] - else { [...] ERROR: braces {} are necessary for all arms of this statement #1269: FILE: util/uri.c:1236: + if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) [...] + else { [...] ERROR: return is not a function, parentheses are not required #1286: FILE: util/uri.c:1252: + return (ret); ERROR: braces {} are necessary for all arms of this statement #1299: FILE: util/uri.c:1263: + if (uri == NULL) [...] ERROR: return is not a function, parentheses are not required #1338: FILE: util/uri.c:1318: + return (-1); ERROR: return is not a function, parentheses are not required #1349: FILE: util/uri.c:1327: + return (0); ERROR: braces {} are necessary even for single statement blocks #1375: FILE: util/uri.c:1343: + while (cur[0] == '/') + cur++; ERROR: braces {} are necessary for all arms of this statement #1390: FILE: util/uri.c:1352: + if ((cur[0] == '.') && (cur[1] == '\0')) [...] ERROR: braces {} are necessary even for single statement blocks #1408: FILE: util/uri.c:1362: + while ((cur[0] == '/') && (cur[1] == '/')) + cur++; ERROR: return is not a function, parentheses are not required #1424: FILE: util/uri.c:1375: + return (0); ERROR: braces {} are necessary even for single statement blocks #1517: FILE: util/uri.c:1482: + while (cur[0] != '\0') + (out++)[0] = (cur++)[0]; ERROR: return is not a function, parentheses are not required #1524: FILE: util/uri.c:1488: + return (0); ERROR: braces {} are necessary for all arms of this statement #1532: FILE: util/uri.c:1493: + if (((c >= '0') && (c <= '9')) || ((c >= 'a') && (c <= 'f')) || [...] ERROR: return is not a function, parentheses are not required #1536: FILE: util/uri.c:1495: + return (1); ERROR: return is not a function, parentheses are not required #1537: FILE: util/uri.c:1496: + return (0); ERROR: return is not a function, parentheses are not required #1559: FILE: util/uri.c:1519: + return (NULL); ERROR: braces {} are necessary for all arms of this statement #1560: FILE: util/uri.c:1520: + if (len <= 0) [...] ERROR: braces {} are necessary for all arms of this statement #1562: FILE: util/uri.c:1522: + if (len < 0) [...] ERROR: return is not a function, parentheses are not required #1563: FILE: util/uri.c:1523: + return (NULL); ERROR: braces {} are necessary for all arms of this statement #1599: FILE: util/uri.c:1534: + if ((*in >= '0') && (*in <= '9')) [...] + else if ((*in >= 'a') && (*in <= 'f')) [...] + else if ((*in >= 'A') && (*in <= 'F')) [...] ERROR: braces {} are necessary for all arms of this statement #1601: FILE: util/uri.c:1536: + else if ((*in >= 'a') && (*in <= 'f')) [...] + else if ((*in >= 'A') && (*in <= 'F')) [...] ERROR: braces {} are necessary for all arms of this statement #1603: FILE: util/uri.c:1538: + else if ((*in >= 'A') && (*in <= 'F')) [...] ERROR: braces {} are necessary for all arms of this statement #1606: FILE: util/uri.c:1541: + if ((*in >= '0') && (*in <= '9')) [...] + else if ((*in >= 'a') && (*in <= 'f')) [...] + else if ((*in >= 'A') && (*in <= 'F')) [...] ERROR: braces {} are necessary for all arms of this statement #1608: FILE: util/uri.c:1543: + else if ((*in >= 'a') && (*in <= 'f')) [...] + else if ((*in >= 'A') && (*in <= 'F')) [...] ERROR: braces {} are necessary for all arms of this statement #1610: FILE: util/uri.c:1545: + else if ((*in >= 'A') && (*in <= 'F')) [...] ERROR: return is not a function, parentheses are not required #1622: FILE: util/uri.c:1556: + return (ret); ERROR: return is not a function, parentheses are not required #1641: FILE: util/uri.c:1577: + return (NULL); ERROR: return is not a function, parentheses are not required #1644: FILE: util/uri.c:1579: + return (g_strdup(str)); ERROR: braces {} are necessary for all arms of this statement #1647: FILE: util/uri.c:1581: + if (!(len > 0)) [...] ERROR: return is not a function, parentheses are not required #1648: FILE: util/uri.c:1582: + return (NULL); ERROR: braces {} are necessary for all arms of this statement #1689: FILE: util/uri.c:1600: + if (val <= 9) [...] + else [...] ERROR: braces {} are necessary for all arms of this statement #1694: FILE: util/uri.c:1605: + if (val <= 9) [...] + else [...] ERROR: return is not a function, parentheses are not required #1705: FILE: util/uri.c:1615: + return (ret); ERROR: braces {} are necessary for all arms of this statement #1742: FILE: util/uri.c:1658: + if (*uri) { [...] + } else [...] ERROR: braces {} are necessary for all arms of this statement #1776: FILE: util/uri.c:1680: + if (ref) [...] ERROR: braces {} are necessary for all arms of this statement #1806: FILE: util/uri.c:1710: + if (bas->authority != NULL) [...] + else if (bas->server != NULL) { [...] ERROR: braces {} are necessary for all arms of this statement #1846: FILE: util/uri.c:1750: + if (ref->authority != NULL) [...] + else { [...] ERROR: braces {} are necessary even for single statement blocks #1905: FILE: util/uri.c:1802: + while ((bas->path[cur] != 0) && (bas->path[cur] != '/')) + cur++; ERROR: braces {} are necessary for all arms of this statement #1907: FILE: util/uri.c:1804: + if (bas->path[cur] == 0) [...] ERROR: braces {} are necessary for all arms of this statement #1942: FILE: util/uri.c:1825: + if ((out == 0) && (bas->server != NULL)) [...] ERROR: return is not a function, parentheses are not required #1963: FILE: util/uri.c:1854: + return (val); ERROR: braces {} are necessary for all arms of this statement #1995: FILE: util/uri.c:1912: + if (ret != 0) [...] ERROR: braces {} are necessary for all arms of this statement #2017: FILE: util/uri.c:1927: + if (ret != 0) [...] ERROR: braces {} are necessary for all arms of this statement #2073: FILE: util/uri.c:1965: + if (*uptr == '/') [...] ERROR: braces {} are necessary for all arms of this statement #2089: FILE: util/uri.c:1975: + if (bptr[ix] == '/') [...] ERROR: braces {} are necessary for all arms of this statement #2102: FILE: util/uri.c:1984: + if ((ref->path[pos] == '.') && (ref->path[pos + 1] == '/')) [...] ERROR: braces {} are necessary for all arms of this statement #2105: FILE: util/uri.c:1986: + if ((*bptr == '.') && (bptr[1] == '/')) [...] - else if ((*bptr == '/') && (ref->path[pos] != '/')) [...] ERROR: braces {} are necessary for all arms of this statement #2111: FILE: util/uri.c:1988: + else if ((*bptr == '/') && (ref->path[pos] != '/')) [...] ERROR: braces {} are necessary even for single statement blocks #2113: FILE: util/uri.c:1990: + while ((bptr[pos] == ref->path[pos]) && (bptr[pos] != 0)) + pos++; ERROR: braces {} are necessary for all arms of this statement #2149: FILE: util/uri.c:2003: + if ((ref->path[ix] == '/') && (ix > 0)) [...] + else if ((ref->path[ix] == 0) && (ix > 1) && (ref->path[ix - 1] == '/')) [...] ERROR: braces {} are necessary for all arms of this statement #2151: FILE: util/uri.c:2005: + else if ((ref->path[ix] == 0) && (ix > 1) && (ref->path[ix - 1] == '/')) [...] ERROR: braces {} are necessary for all arms of this statement #2154: FILE: util/uri.c:2008: + if (ref->path[ix] == '/') [...] ERROR: braces {} are necessary for all arms of this statement #2179: FILE: util/uri.c:2023: + if (bptr[ix] == '/') [...] ERROR: braces {} are necessary for all arms of this statement #2191: FILE: util/uri.c:2031: + if (uptr != NULL) [...] ERROR: braces {} are necessary for all arms of this statement #2272: FILE: util/uri.c:2096: + if (init_alloc <= 0) [...] ERROR: braces {} are necessary for all arms of this statement #2341: FILE: util/uri.c:2159: + if (eq && eq >= end) [...] ERROR: braces {} are necessary for all arms of this statement #2383: FILE: util/uri.c:2199: + if (*query) [...] total: 147 errors, 0 warnings, 2299 lines checked Your patch has style problems, please review. If any of these errors are false positives report them to the maintainer, see CHECKPATCH in MAINTAINERS. Checking PATCH 2/6: util/uri.c: remove brackets that wrap `return` statement's content.... Checking PATCH 3/6: util/uri.c: wrap single statement blocks with braces {}... Checking PATCH 4/6: tests/libqos: Check for valid dev pointer when looking for PCI devices... Checking PATCH 5/6: Add a git-publish configuration file... Checking PATCH 6/6: README: Document 'git-publish' workflow... === OUTPUT END === Test command exited with code: 1 --- Email generated automatically by Patchew [http://patchew.org/]. Please send your feedback to patchew-devel@freelists.org ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PULL 0/6] Block patches 2018-03-05 9:40 Stefan Hajnoczi 2018-03-05 9:52 ` no-reply @ 2018-03-05 18:55 ` Peter Maydell 1 sibling, 0 replies; 18+ messages in thread From: Peter Maydell @ 2018-03-05 18:55 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers, Qemu-block On 5 March 2018 at 09:40, Stefan Hajnoczi <stefanha@redhat.com> wrote: > The following changes since commit 136c67e07869227b21b3f627316e03679ce7b738: > > Merge remote-tracking branch 'remotes/bkoppelmann/tags/pull-tricore-2018-03-02' into staging (2018-03-02 16:56:20 +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 23500c6a9409efc80d696aede0629bfbe7556a90: > > README: Document 'git-publish' workflow (2018-03-05 09:03:17 +0000) > > ---------------------------------------------------------------- > Pull request > > Mostly patches that are only indirectly related to the block layer, but I've > reviewed them and there is no maintainer. > > ---------------------------------------------------------------- > > Fam Zheng (2): > Add a git-publish configuration file > README: Document 'git-publish' workflow > > Su Hang (3): > util/uri.c: Coding style check, Only whitespace involved > util/uri.c: remove brackets that wrap `return` statement's content. > util/uri.c: wrap single statement blocks with braces {} > > Thomas Huth (1): > tests/libqos: Check for valid dev pointer when looking for PCI devices > > tests/libqos/virtio-pci.c | 4 +- > util/uri.c | 1733 ++++++++++++++++++++++++--------------------- > .gitpublish | 51 ++ > README | 31 +- > 4 files changed, 1014 insertions(+), 805 deletions(-) > create mode 100644 .gitpublish Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 18+ messages in thread
* [Qemu-devel] [PULL 0/6] Block patches @ 2014-06-23 9:31 Stefan Hajnoczi 2014-06-23 12:18 ` Peter Maydell 0 siblings, 1 reply; 18+ messages in thread From: Stefan Hajnoczi @ 2014-06-23 9:31 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Stefan Hajnoczi The following changes since commit 427e1750a0b98a72cad424327604f51e993dcc5f: gt64xxx_pci: Add VMStateDescription (2014-06-20 23:40:16 +0200) are available in the git repository at: git://github.com/stefanha/qemu.git tags/block-pull-request for you to fetch changes up to 2bd3bce8efebe86b031beab5c0e3b9bbaec0b502: block: asynchronously stop the VM on I/O errors (2014-06-23 16:36:13 +0800) ---------------------------------------------------------------- Block pull request ---------------------------------------------------------------- Chunyan Liu (1): QemuOpts: check NULL opts in qemu_opt_get functions Liu Yuan (1): sheepdog: fix NULL dereference in sd_create Paolo Bonzini (2): vl: allow other threads to do qemu_system_vmstop_request block: asynchronously stop the VM on I/O errors Peter Crosthwaite (2): block: m25p80: sync_page(): Deindent function body. block: m25p80: Support read only bdrvs. block.c | 21 ++++++++++-- block/sheepdog.c | 1 + cpus.c | 1 + docs/qmp/qmp-events.txt | 2 +- hw/block/m25p80.c | 30 ++++++++--------- include/sysemu/sysemu.h | 1 + stubs/vm-stop.c | 7 +++- target-lm32/op_helper.c | 2 +- util/qemu-option.c | 28 +++++++++++++--- vl.c | 85 +++++++++++++++++++++++++++++++------------------ 10 files changed, 122 insertions(+), 56 deletions(-) -- 1.9.3 ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PULL 0/6] Block patches 2014-06-23 9:31 Stefan Hajnoczi @ 2014-06-23 12:18 ` Peter Maydell 0 siblings, 0 replies; 18+ messages in thread From: Peter Maydell @ 2014-06-23 12:18 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers On 23 June 2014 10:31, Stefan Hajnoczi <stefanha@redhat.com> wrote: > The following changes since commit 427e1750a0b98a72cad424327604f51e993dcc5f: > > gt64xxx_pci: Add VMStateDescription (2014-06-20 23:40:16 +0200) > > are available in the git repository at: > > git://github.com/stefanha/qemu.git tags/block-pull-request > > for you to fetch changes up to 2bd3bce8efebe86b031beab5c0e3b9bbaec0b502: > > block: asynchronously stop the VM on I/O errors (2014-06-23 16:36:13 +0800) > > ---------------------------------------------------------------- > Block pull request Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 18+ messages in thread
* [Qemu-devel] [PULL 0/6] Block patches @ 2013-12-13 17:48 Kevin Wolf 0 siblings, 0 replies; 18+ messages in thread From: Kevin Wolf @ 2013-12-13 17:48 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit 47acdd63a33a5966bf4fc94a6ac835d72a70c555: target-microblaze: Use the new qemu_ld/st opcodes (2013-12-13 10:00:42 +1000) are available in the git repository at: git://repo.or.cz/qemu/kevin.git tags/for-anthony for you to fetch changes up to c547e5640d5b0993cdfb252331065c1a1d813bd8: blkdebug: Use QLIST_FOREACH_SAFE to resume IO (2013-12-13 17:11:19 +0100) ---------------------------------------------------------------- Block patches ---------------------------------------------------------------- Fam Zheng (1): blkdebug: Use QLIST_FOREACH_SAFE to resume IO Kevin Wolf (1): qapi-schema.json: Change 1.8 reference to 2.0 Liu Yuan (1): sheepdog: check if '-o redundancy' is passed from user Peter Lieven (2): block: expect get_block_status errors in bdrv_make_zero qemu-img: make progress output more accurate during convert Stefan Weil (1): block/vvfat: Fix compiler warnings for OpenBSD block.c | 5 +++++ block/blkdebug.c | 8 ++++---- block/sheepdog.c | 8 +++++--- block/vvfat.c | 43 ++++++++++++++++++++++--------------------- qapi-schema.json | 2 +- qemu-img.c | 26 +++++++++++++++++++++----- 6 files changed, 58 insertions(+), 34 deletions(-) ^ permalink raw reply [flat|nested] 18+ messages in thread
* [Qemu-devel] [PULL 0/6] Block patches @ 2011-05-03 11:08 Kevin Wolf 2011-05-03 12:44 ` Anthony Liguori 0 siblings, 1 reply; 18+ messages in thread From: Kevin Wolf @ 2011-05-03 11:08 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit 57aa265d462a64a06268be26d49020729cff56c1: lm32: add Milkymist Minimac2 support (2011-05-03 10:48:40 +0200) are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony Alon Levy (1): ide/atapi: fix set but unused Amit Shah (2): atapi: Move comment to proper place atapi: Explain why we need a 'media not present' state Jes Sorensen (1): qemu-progress.c: printf isn't signal safe Kevin Wolf (1): qemu-img resize: Fix option parsing Nick Thomas (1): NBD: Avoid leaking a couple of strings when the NBD device is closed block/nbd.c | 4 ++++ hw/ide/atapi.c | 14 +++++++++----- qemu-img.c | 13 +++++++++++-- qemu-progress.c | 7 ++++++- 4 files changed, 30 insertions(+), 8 deletions(-) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PULL 0/6] Block patches 2011-05-03 11:08 Kevin Wolf @ 2011-05-03 12:44 ` Anthony Liguori 0 siblings, 0 replies; 18+ messages in thread From: Anthony Liguori @ 2011-05-03 12:44 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel On 05/03/2011 06:08 AM, Kevin Wolf wrote: > The following changes since commit 57aa265d462a64a06268be26d49020729cff56c1: > > lm32: add Milkymist Minimac2 support (2011-05-03 10:48:40 +0200) > > are available in the git repository at: > git://repo.or.cz/qemu/kevin.git for-anthony Pulled. Thanks. Regards, Anthony Liguori > Alon Levy (1): > ide/atapi: fix set but unused > > Amit Shah (2): > atapi: Move comment to proper place > atapi: Explain why we need a 'media not present' state > > Jes Sorensen (1): > qemu-progress.c: printf isn't signal safe > > Kevin Wolf (1): > qemu-img resize: Fix option parsing > > Nick Thomas (1): > NBD: Avoid leaking a couple of strings when the NBD device is closed > > block/nbd.c | 4 ++++ > hw/ide/atapi.c | 14 +++++++++----- > qemu-img.c | 13 +++++++++++-- > qemu-progress.c | 7 ++++++- > 4 files changed, 30 insertions(+), 8 deletions(-) ^ permalink raw reply [flat|nested] 18+ messages in thread
* [Qemu-devel] [PULL 0/6] Block patches @ 2010-08-03 14:44 Kevin Wolf 2010-08-09 13:41 ` Anthony Liguori 0 siblings, 1 reply; 18+ messages in thread From: Kevin Wolf @ 2010-08-03 14:44 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit 5933e8a96ab9c59cb6b6c80c9db385364a68c959: fix last cpu timer initialization (2010-08-02 18:49:13 +0000) are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony Andrea Arcangeli (1): ide: Avoid canceling IDE DMA Kevin Wolf (2): block: Change bdrv_commit to handle multiple sectors at once block: Fix bdrv_has_zero_init Markus Armbruster (1): block: Change bdrv_eject() not to drop the image Miguel Di Ciurcio Filho (1): loadvm: improve tests before bdrv_snapshot_goto() Yoshiaki Tamura (1): block migration: replace tabs by spaces. block-migration.c | 12 ++++---- block.c | 50 ++++++++++++++++++------------------ block/raw-posix.c | 13 ++++++--- block/raw-win32.c | 6 ++++ block/raw.c | 6 ++++ block_int.h | 8 ++++- hw/ide/pci.c | 23 +++++++++++++++- monitor.c | 3 +- savevm.c | 71 +++++++++++++++++++++++++--------------------------- 9 files changed, 115 insertions(+), 77 deletions(-) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PULL 0/6] Block patches 2010-08-03 14:44 Kevin Wolf @ 2010-08-09 13:41 ` Anthony Liguori 0 siblings, 0 replies; 18+ messages in thread From: Anthony Liguori @ 2010-08-09 13:41 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel On 08/03/2010 09:44 AM, Kevin Wolf wrote: > The following changes since commit 5933e8a96ab9c59cb6b6c80c9db385364a68c959: > > fix last cpu timer initialization (2010-08-02 18:49:13 +0000) > Pulled, thanks. Regards, Anthony Liguori > are available in the git repository at: > git://repo.or.cz/qemu/kevin.git for-anthony > > Andrea Arcangeli (1): > ide: Avoid canceling IDE DMA > > Kevin Wolf (2): > block: Change bdrv_commit to handle multiple sectors at once > block: Fix bdrv_has_zero_init > > Markus Armbruster (1): > block: Change bdrv_eject() not to drop the image > > Miguel Di Ciurcio Filho (1): > loadvm: improve tests before bdrv_snapshot_goto() > > Yoshiaki Tamura (1): > block migration: replace tabs by spaces. > > block-migration.c | 12 ++++---- > block.c | 50 ++++++++++++++++++------------------ > block/raw-posix.c | 13 ++++++--- > block/raw-win32.c | 6 ++++ > block/raw.c | 6 ++++ > block_int.h | 8 ++++- > hw/ide/pci.c | 23 +++++++++++++++- > monitor.c | 3 +- > savevm.c | 71 +++++++++++++++++++++++++--------------------------- > 9 files changed, 115 insertions(+), 77 deletions(-) > > > ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2018-03-05 18:55 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-01-14 10:01 [Qemu-devel] [PULL 0/6] Block patches Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 1/6] block: do not probe zero-sized disks Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 2/6] sheepdog: implement direct write semantics Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 3/6] raw-posix: fix bdrv_aio_ioctl Kevin Wolf 2013-01-14 10:01 ` [Qemu-devel] [PATCH 4/6] block: make qiov_is_aligned() public Kevin Wolf 2013-01-14 10:02 ` [Qemu-devel] [PATCH 5/6] dataplane: extract virtio-blk read/write processing into do_rdwr_cmd() Kevin Wolf 2013-01-14 10:02 ` [Qemu-devel] [PATCH 6/6] dataplane: handle misaligned virtio-blk requests Kevin Wolf 2013-01-20 14:47 ` [Qemu-devel] [PULL 0/6] Block patches Anthony Liguori -- strict thread matches above, loose matches on Subject: below -- 2018-03-05 9:40 Stefan Hajnoczi 2018-03-05 9:52 ` no-reply 2018-03-05 18:55 ` Peter Maydell 2014-06-23 9:31 Stefan Hajnoczi 2014-06-23 12:18 ` Peter Maydell 2013-12-13 17:48 Kevin Wolf 2011-05-03 11:08 Kevin Wolf 2011-05-03 12:44 ` Anthony Liguori 2010-08-03 14:44 Kevin Wolf 2010-08-09 13:41 ` Anthony Liguori
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).