@@ -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);
}
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 <pl@kamp.de> --- block/iscsi.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)