* [Qemu-devel] [PATCH 2/2] qemu-io: fix segment fault when the image format is qed
[not found] <a>
@ 2012-02-19 14:24 ` zwu.kernel
2012-02-19 21:24 ` Christoph Hellwig
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 0/4] introduce max_transfer_length Peter Lieven
1 sibling, 1 reply; 8+ messages in thread
From: zwu.kernel @ 2012-02-19 14:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Zhi Yong Wu, stefanha
From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
[root@f15 qemu]# qemu-io -c info /home/zwu/work/misc/rh6.img
format name: qed
cluster size: 64 KiB
vm state offset: 0.000000 bytes
Segmentation fault (core dumped)
This reason is same as the former patch
Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
---
qemu-io.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/qemu-io.c b/qemu-io.c
index 0249be4..3189530 100644
--- a/qemu-io.c
+++ b/qemu-io.c
@@ -1856,6 +1856,8 @@ int main(int argc, char **argv)
bdrv_init();
+ qemu_init_main_loop();
+
/* initialize commands */
quit_init();
help_init();
--
1.7.6
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] qemu-io: fix segment fault when the image format is qed
2012-02-19 14:24 ` [Qemu-devel] [PATCH 2/2] qemu-io: fix segment fault when the image format is qed zwu.kernel
@ 2012-02-19 21:24 ` Christoph Hellwig
2012-02-20 6:22 ` Zhi Yong Wu
0 siblings, 1 reply; 8+ messages in thread
From: Christoph Hellwig @ 2012-02-19 21:24 UTC (permalink / raw)
To: zwu.kernel; +Cc: Zhi Yong Wu, qemu-devel, stefanha
On Sun, Feb 19, 2012 at 10:24:59PM +0800, zwu.kernel@gmail.com wrote:
> From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
>
> [root@f15 qemu]# qemu-io -c info /home/zwu/work/misc/rh6.img
> format name: qed
> cluster size: 64 KiB
> vm state offset: 0.000000 bytes
> Segmentation fault (core dumped)
>
> This reason is same as the former patch
Please add this as a testcase to qemu-iotests.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] qemu-io: fix segment fault when the image format is qed
2012-02-19 21:24 ` Christoph Hellwig
@ 2012-02-20 6:22 ` Zhi Yong Wu
0 siblings, 0 replies; 8+ messages in thread
From: Zhi Yong Wu @ 2012-02-20 6:22 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Zhi Yong Wu, qemu-devel, stefanha
On Mon, Feb 20, 2012 at 5:24 AM, Christoph Hellwig <hch@lst.de> wrote:
> On Sun, Feb 19, 2012 at 10:24:59PM +0800, zwu.kernel@gmail.com wrote:
>> From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
>>
>> [root@f15 qemu]# qemu-io -c info /home/zwu/work/misc/rh6.img
>> format name: qed
>> cluster size: 64 KiB
>> vm state offset: 0.000000 bytes
>> Segmentation fault (core dumped)
>>
>> This reason is same as the former patch
>
> Please add this as a testcase to qemu-iotests.
Sorry, i am not familar with qemu-iotests. Is it necessary?
>
--
Regards,
Zhi Yong Wu
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCHv2 0/4] introduce max_transfer_length
[not found] <a>
2012-02-19 14:24 ` [Qemu-devel] [PATCH 2/2] qemu-io: fix segment fault when the image format is qed zwu.kernel
@ 2014-09-12 11:21 ` Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 1/4] BlockLimits: " Peter Lieven
` (3 more replies)
1 sibling, 4 replies; 8+ messages in thread
From: Peter Lieven @ 2014-09-12 11:21 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, benoit.canet, stefanha, Peter Lieven, mreitz,
ronniesahlberg, pbonzini
This series adds the basics for introducing a maximum transfer length
to the block layer. Its main purpose is currently avoiding that
a multiwrite_merge exceeds the max_xfer_len of an attached iSCSI LUN.
This is a required bug fix.
Discussed reporting of this maximum in the SCSI Disk Inquiry Emulation
of the Block Limits VPD is currently not added as we do not import any
of the other limits there. This has to be addresses in a seperate series.
v1->v2: do not throw errors but generate trace events in Patch 2 [Paolo]
Peter Lieven (4):
BlockLimits: introduce max_transfer_length
block: immediately cancel oversized read/write requests
block/iscsi: set max_transfer_length
block: avoid creating oversized writes in multiwrite_merge
block.c | 23 +++++++++++++++++++++++
block/iscsi.c | 12 ++++++++++--
include/block/block_int.h | 3 +++
trace-events | 2 ++
4 files changed, 38 insertions(+), 2 deletions(-)
--
1.7.9.5
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCHv2 1/4] BlockLimits: introduce max_transfer_length
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 0/4] introduce max_transfer_length Peter Lieven
@ 2014-09-12 11:21 ` Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 2/4] block: immediately cancel oversized read/write requests Peter Lieven
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: Peter Lieven @ 2014-09-12 11:21 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, benoit.canet, stefanha, Peter Lieven, mreitz,
ronniesahlberg, pbonzini
Signed-off-by: Peter Lieven <pl@kamp.de>
Reviewed-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
---
block.c | 4 ++++
include/block/block_int.h | 3 +++
2 files changed, 7 insertions(+)
diff --git a/block.c b/block.c
index d06dd51..c87e9fd 100644
--- a/block.c
+++ b/block.c
@@ -529,6 +529,7 @@ void bdrv_refresh_limits(BlockDriverState *bs, Error **errp)
return;
}
bs->bl.opt_transfer_length = bs->file->bl.opt_transfer_length;
+ bs->bl.max_transfer_length = bs->file->bl.max_transfer_length;
bs->bl.opt_mem_alignment = bs->file->bl.opt_mem_alignment;
} else {
bs->bl.opt_mem_alignment = 512;
@@ -543,6 +544,9 @@ void bdrv_refresh_limits(BlockDriverState *bs, Error **errp)
bs->bl.opt_transfer_length =
MAX(bs->bl.opt_transfer_length,
bs->backing_hd->bl.opt_transfer_length);
+ bs->bl.max_transfer_length =
+ MIN(bs->bl.max_transfer_length,
+ bs->backing_hd->bl.max_transfer_length);
bs->bl.opt_mem_alignment =
MAX(bs->bl.opt_mem_alignment,
bs->backing_hd->bl.opt_mem_alignment);
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 8a61215..e178782 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -288,6 +288,9 @@ typedef struct BlockLimits {
/* optimal transfer length in sectors */
int opt_transfer_length;
+ /* maximal transfer length in sectors */
+ int max_transfer_length;
+
/* memory alignment so that no bounce buffer is needed */
size_t opt_mem_alignment;
} BlockLimits;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCHv2 2/4] block: immediately cancel oversized read/write requests
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 0/4] introduce max_transfer_length Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 1/4] BlockLimits: " Peter Lieven
@ 2014-09-12 11:21 ` Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 3/4] block/iscsi: set max_transfer_length Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 4/4] block: avoid creating oversized writes in multiwrite_merge Peter Lieven
3 siblings, 0 replies; 8+ messages in thread
From: Peter Lieven @ 2014-09-12 11:21 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, benoit.canet, stefanha, Peter Lieven, mreitz,
ronniesahlberg, pbonzini
Signed-off-by: Peter Lieven <pl@kamp.de>
---
block.c | 14 ++++++++++++++
trace-events | 2 ++
2 files changed, 16 insertions(+)
diff --git a/block.c b/block.c
index c87e9fd..965e9bc 100644
--- a/block.c
+++ b/block.c
@@ -3215,6 +3215,13 @@ static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
return -EINVAL;
}
+ if (bs->bl.max_transfer_length &&
+ nb_sectors > bs->bl.max_transfer_length) {
+ trace_bdrv_co_do_readv_toobig(bs, sector_num, nb_sectors,
+ bs->bl.max_transfer_length);
+ return -EINVAL;
+ }
+
return bdrv_co_do_preadv(bs, sector_num << BDRV_SECTOR_BITS,
nb_sectors << BDRV_SECTOR_BITS, qiov, flags);
}
@@ -3507,6 +3514,13 @@ static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
return -EINVAL;
}
+ if (bs->bl.max_transfer_length &&
+ nb_sectors > bs->bl.max_transfer_length) {
+ trace_bdrv_co_do_writev_toobig(bs, sector_num, nb_sectors,
+ bs->bl.max_transfer_length);
+ return -EINVAL;
+ }
+
return bdrv_co_do_pwritev(bs, sector_num << BDRV_SECTOR_BITS,
nb_sectors << BDRV_SECTOR_BITS, qiov, flags);
}
diff --git a/trace-events b/trace-events
index fb58963..fe2c5d8 100644
--- a/trace-events
+++ b/trace-events
@@ -68,8 +68,10 @@ bdrv_aio_writev(void *bs, int64_t sector_num, int nb_sectors, void *opaque) "bs
bdrv_aio_write_zeroes(void *bs, int64_t sector_num, int nb_sectors, int flags, void *opaque) "bs %p sector_num %"PRId64" nb_sectors %d flags %#x opaque %p"
bdrv_lock_medium(void *bs, bool locked) "bs %p locked %d"
bdrv_co_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
+bdrv_co_do_readv_toobig(void *bs, int64_t sector_num, int nb_sector, int max_transfer_length) "bs %p sector_num %"PRId64" nb_sectors %d bs->bl.max_transfer_length %d"
bdrv_co_copy_on_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
bdrv_co_writev(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
+bdrv_co_do_writev_toobig(void *bs, int64_t sector_num, int nb_sector, int max_transfer_length) "bs %p sector_num %"PRId64" nb_sectors %d bs->bl.max_transfer_length %d"
bdrv_co_write_zeroes(void *bs, int64_t sector_num, int nb_sector, int flags) "bs %p sector_num %"PRId64" nb_sectors %d flags %#x"
bdrv_co_io_em(void *bs, int64_t sector_num, int nb_sectors, int is_write, void *acb) "bs %p sector_num %"PRId64" nb_sectors %d is_write %d acb %p"
bdrv_co_do_copy_on_readv(void *bs, int64_t sector_num, int nb_sectors, int64_t cluster_sector_num, int cluster_nb_sectors) "bs %p sector_num %"PRId64" nb_sectors %d cluster_sector_num %"PRId64" cluster_nb_sectors %d"
--
1.7.9.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCHv2 3/4] block/iscsi: set max_transfer_length
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 0/4] introduce max_transfer_length Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 1/4] BlockLimits: " Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 2/4] block: immediately cancel oversized read/write requests Peter Lieven
@ 2014-09-12 11:21 ` Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 4/4] block: avoid creating oversized writes in multiwrite_merge Peter Lieven
3 siblings, 0 replies; 8+ messages in thread
From: Peter Lieven @ 2014-09-12 11:21 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, benoit.canet, stefanha, Peter Lieven, mreitz,
ronniesahlberg, pbonzini
the limit of 0xffffff for 16 byte CDBs is intentional to
avoid overflows on 32-bit architectures.
Signed-off-by: Peter Lieven <pl@kamp.de>
Reviewed-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
---
block/iscsi.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/block/iscsi.c b/block/iscsi.c
index 3e19202..a4b625c 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1455,10 +1455,18 @@ static void iscsi_close(BlockDriverState *bs)
static void iscsi_refresh_limits(BlockDriverState *bs, Error **errp)
{
- IscsiLun *iscsilun = bs->opaque;
-
/* We don't actually refresh here, but just return data queried in
* iscsi_open(): iscsi targets don't change their limits. */
+
+ IscsiLun *iscsilun = bs->opaque;
+ uint32_t max_xfer_len = iscsilun->use_16_for_rw ? 0xffffff : 0xffff;
+
+ if (iscsilun->bl.max_xfer_len) {
+ max_xfer_len = MIN(max_xfer_len, iscsilun->bl.max_xfer_len);
+ }
+
+ bs->bl.max_transfer_length = sector_lun2qemu(max_xfer_len, iscsilun);
+
if (iscsilun->lbp.lbpu) {
if (iscsilun->bl.max_unmap < 0xffffffff) {
bs->bl.max_discard = sector_lun2qemu(iscsilun->bl.max_unmap,
--
1.7.9.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCHv2 4/4] block: avoid creating oversized writes in multiwrite_merge
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 0/4] introduce max_transfer_length Peter Lieven
` (2 preceding siblings ...)
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 3/4] block/iscsi: set max_transfer_length Peter Lieven
@ 2014-09-12 11:21 ` Peter Lieven
3 siblings, 0 replies; 8+ messages in thread
From: Peter Lieven @ 2014-09-12 11:21 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, benoit.canet, stefanha, Peter Lieven, mreitz,
ronniesahlberg, pbonzini
Signed-off-by: Peter Lieven <pl@kamp.de>
Reviewed-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
---
block.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/block.c b/block.c
index 965e9bc..2b9be99 100644
--- a/block.c
+++ b/block.c
@@ -4554,6 +4554,11 @@ static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs,
merge = 0;
}
+ if (bs->bl.max_transfer_length && reqs[outidx].nb_sectors +
+ reqs[i].nb_sectors > bs->bl.max_transfer_length) {
+ merge = 0;
+ }
+
if (merge) {
size_t size;
QEMUIOVector *qiov = g_malloc0(sizeof(*qiov));
--
1.7.9.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2014-09-12 11:23 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <a>
2012-02-19 14:24 ` [Qemu-devel] [PATCH 2/2] qemu-io: fix segment fault when the image format is qed zwu.kernel
2012-02-19 21:24 ` Christoph Hellwig
2012-02-20 6:22 ` Zhi Yong Wu
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 0/4] introduce max_transfer_length Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 1/4] BlockLimits: " Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 2/4] block: immediately cancel oversized read/write requests Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 3/4] block/iscsi: set max_transfer_length Peter Lieven
2014-09-12 11:21 ` [Qemu-devel] [PATCHv2 4/4] block: avoid creating oversized writes in multiwrite_merge Peter Lieven
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).