READ10, WRITE10, WRITESAME10 only support requests up to 65536 blocks. This is 32MB for 512-Byte sectors. Change to READ16, WRITE16, WRITESAME16 just in case such a big request is issued.
Signed-off-by: Peter Lieven <p...@kamp.de> --- block/iscsi.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/block/iscsi.c b/block/iscsi.c index 2e56748..e93a02f 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -382,7 +382,7 @@ static int coroutine_fn iscsi_co_writev(BlockDriverState *bs, #endif iscsi_co_init_iscsitask(iscsilun, &iTask); retry: - if (iscsilun->use_16_for_rw) { + if (iscsilun->use_16_for_rw || num_sectors > 0xffff) { iTask.task = iscsi_write16_task(iscsilun->iscsi, iscsilun->lun, lba, data, num_sectors * iscsilun->block_size, iscsilun->block_size, 0, 0, 0, 0, 0, @@ -578,7 +578,7 @@ static int coroutine_fn iscsi_co_readv(BlockDriverState *bs, iscsi_co_init_iscsitask(iscsilun, &iTask); retry: - if (iscsilun->use_16_for_rw) { + if (iscsilun->use_16_for_rw || num_sectors > 0xffff) { iTask.task = iscsi_read16_task(iscsilun->iscsi, iscsilun->lun, lba, num_sectors * iscsilun->block_size, iscsilun->block_size, 0, 0, 0, 0, 0, @@ -924,9 +924,9 @@ coroutine_fn iscsi_co_write_zeroes(BlockDriverState *bs, int64_t sector_num, { IscsiLun *iscsilun = bs->opaque; struct IscsiTask iTask; - uint64_t lba; - uint32_t nb_blocks; - bool use_16_for_ws = iscsilun->use_16_for_rw; + uint64_t lba = sector_qemu2lun(sector_num, iscsilun); + uint32_t nb_blocks = sector_qemu2lun(nb_sectors, iscsilun); + bool use_16_for_ws = iscsilun->use_16_for_rw || nb_blocks > 0xffff; if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) { return -EINVAL; @@ -950,9 +950,6 @@ coroutine_fn iscsi_co_write_zeroes(BlockDriverState *bs, int64_t sector_num, return -ENOTSUP; } - lba = sector_qemu2lun(sector_num, iscsilun); - nb_blocks = sector_qemu2lun(nb_sectors, iscsilun); - if (iscsilun->zeroblock == NULL) { iscsilun->zeroblock = g_malloc0(iscsilun->block_size); } -- 1.7.9.5