qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] block/iscsi: use 16 byte CDBs also for big requests


From: Peter Lieven
Subject: [Qemu-devel] [PATCH] block/iscsi: use 16 byte CDBs also for big requests
Date: Tue, 17 Jun 2014 07:57:03 +0200

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 <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]