On Tue 21 Aug 2012 04:53:59 PM CST, Stefan Hajnoczi wrote:
On Tue, Aug 21, 2012 at 9:26 AM, Cong Meng <mc@xxxxxxxxxxxxxxxxxx> wrote:
Each virtio scsi HBA has global request queue limits. But the passthrough
LUNs (scsi-generic) come from different host HBAs may have different request
queue limits. If the guest sends commands that exceed the host limits, the
commands will be rejected by host HAB.
This patch addresses this issue by getting the per-LUN queue limits via the the
newly added virtio control request, then setting them properly.
Signed-off-by: Cong Meng <mc@xxxxxxxxxxxxxxxxxx>
---
drivers/scsi/virtio_scsi.c | 113 +++++++++++++++++++++++++++++++++++++------
include/linux/virtio_scsi.h | 18 +++++++
2 files changed, 116 insertions(+), 15 deletions(-)
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 173cb39..ec5066f 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -35,12 +35,14 @@ struct virtio_scsi_cmd {
struct virtio_scsi_cmd_req cmd;
struct virtio_scsi_ctrl_tmf_req tmf;
struct virtio_scsi_ctrl_an_req an;
+ struct virtio_scsi_ctrl_lq_req lq;
} req;
union {
struct virtio_scsi_cmd_resp cmd;
struct virtio_scsi_ctrl_tmf_resp tmf;
struct virtio_scsi_ctrl_an_resp an;
struct virtio_scsi_event evt;
+ struct virtio_scsi_ctrl_lq_resp lq;
} resp;
} ____cacheline_aligned_in_smp;
@@ -469,6 +471,46 @@ out:
return ret;
}
+static u32 virtscsi_lun_query(struct scsi_device *sdev, u32 *value, u32 subtype)
+{
+ struct Scsi_Host *shost = sdev->host;
+ struct virtio_scsi *vscsi = shost_priv(shost);
+ DECLARE_COMPLETION_ONSTACK(comp);
+ struct virtio_scsi_cmd *cmd;
+ struct virtio_scsi_target_state *tgt = vscsi->tgt[sdev->id];
+ unsigned int ret = VIRTIO_SCSI_S_FAILURE;
+
+ cmd = mempool_alloc(virtscsi_cmd_pool, GFP_ATOMIC);
+ if (!cmd)
+ goto out;
+
+ memset(cmd, 0, sizeof(*cmd));
+ cmd->comp = ∁
+ cmd->req.lq = (struct virtio_scsi_ctrl_lq_req){
+ .type = VIRTIO_SCSI_T_LUN_QUERY,
+ .subtype = subtype,
+ .lun[0] = 1,
+ .lun[1] = sdev->id,
+ .lun[2] = (sdev->lun >> 8) | 0x40,
+ .lun[3] = sdev->lun & 0xff,
The LUN addressing code has been duplicated several times now. How
about replacing it with something like
sure. I will include it.
Thnaks.
Cong.
static void virtio_scsi_set_lun(u8 *lun, struct scsi_device *sdev)
{
lun[0] = 1;
lun[1] = sdev->id;
lun[2] = (sdev->lun >> 8) | 0x40;
lun[3] = sdev->lun & 0xff;
lun[4] = lun[5] = lun[6] = lun[7] = 0;
}
_______________________________________________
Virtualization mailing list
Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linuxfoundation.org/mailman/listinfo/virtualization