34b321
From b3f427e4eb27091ca712f6c18e2e63a414dc4ce2 Mon Sep 17 00:00:00 2001
34b321
From: Fam Zheng <famz@redhat.com>
34b321
Date: Mon, 11 Jul 2016 05:33:37 +0200
34b321
Subject: [PATCH 4/7] scsi-generic: Merge block max xfer len in INQUIRY
34b321
 response
34b321
34b321
RH-Author: Fam Zheng <famz@redhat.com>
34b321
Message-id: <1468215219-30793-5-git-send-email-famz@redhat.com>
34b321
Patchwork-id: 71108
34b321
O-Subject: [RHEL-7.3 qemu-kvm PATCH 4/6] scsi-generic: Merge block max xfer len in INQUIRY response
34b321
Bugzilla: 1318199
34b321
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
34b321
RH-Acked-by: John Snow <jsnow@redhat.com>
34b321
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
34b321
34b321
The rationale is similar to the above mode sense response interception:
34b321
this is practically the only channel to communicate restraints from
34b321
elsewhere such as host and block driver.
34b321
34b321
The scsi bus we attach onto can have a larger max xfer len than what is
34b321
accepted by the host file system (guarding between the host scsi LUN and
34b321
QEMU), in which case the SG_IO we generate would get -EINVAL.
34b321
34b321
Signed-off-by: Fam Zheng <famz@redhat.com>
34b321
Message-Id: <1464243305-10661-3-git-send-email-famz@redhat.com>
34b321
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
34b321
(cherry picked from commit 063143d5b1fde0fdcbae30bc7d6d14e76fa607d2)
34b321
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
34b321
34b321
Conflicts:
34b321
	hw/scsi/scsi-generic.c
34b321
We don't have BlockBackend in downstream, use bdrv_get_max_transfer_length()
34b321
instead.
34b321
34b321
The context is different because we don't have fa0d653b0 (scsi-generic:
34b321
identify AIO callbacks more clearly).
34b321
34b321
Signed-off-by: Fam Zheng <famz@redhat.com>
34b321
---
34b321
 hw/scsi/scsi-generic.c | 11 +++++++++++
34b321
 1 file changed, 11 insertions(+)
34b321
34b321
diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
34b321
index 3733d2c..6b0c1fe 100644
34b321
--- a/hw/scsi/scsi-generic.c
34b321
+++ b/hw/scsi/scsi-generic.c
34b321
@@ -207,6 +207,17 @@ static void scsi_read_complete(void * opaque, int ret)
34b321
                    (r->req.cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
34b321
             s->blocksize = ldl_be_p(&r->buf[8]);
34b321
             s->max_lba = ldq_be_p(&r->buf[0]);
34b321
+        } else if (s->type == TYPE_DISK &&
34b321
+            r->req.cmd.buf[0] == INQUIRY &&
34b321
+            r->req.cmd.buf[2] == 0xb0) {
34b321
+            uint32_t max_xfer_len = bdrv_get_max_transfer_length(s->conf.bs);
34b321
+            if (max_xfer_len) {
34b321
+                stl_be_p(&r->buf[8], max_xfer_len);
34b321
+                /* Also take care of the opt xfer len. */
34b321
+                if (ldl_be_p(&r->buf[12]) > max_xfer_len) {
34b321
+                    stl_be_p(&r->buf[12], max_xfer_len);
34b321
+                }
34b321
+            }
34b321
         }
34b321
         bdrv_set_guest_block_size(s->conf.bs, s->blocksize);
34b321
 
34b321
-- 
34b321
1.8.3.1
34b321