mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-17 06:48:07 +00:00
ebbeb55561
Also add script used to generate patches and SRC_URI Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
63 lines
2.2 KiB
Diff
63 lines
2.2 KiB
Diff
From e5fda224c4241fbbf09ef46396e4688d09bd03d6 Mon Sep 17 00:00:00 2001
|
|
From: Nicholas Bellinger <nab@linux-iscsi.org>
|
|
Date: Fri, 13 Jan 2012 12:01:34 -0800
|
|
Subject: [PATCH 70/87] target: Add workaround for zero-length control CDB
|
|
handling
|
|
|
|
commit 91ec1d3535b2acf12c599045cc19ad9be3c6a47b upstream.
|
|
|
|
This patch adds a work-around for handling zero allocation length
|
|
control CDBs (type SCF_SCSI_CONTROL_SG_IO_CDB) that was causing an
|
|
OOPs with the following raw calls:
|
|
|
|
# sg_raw -v /dev/sdd 3 0 0 0 0 0
|
|
# sg_raw -v /dev/sdd 0x1a 0 1 0 0 0
|
|
|
|
This patch will follow existing zero-length handling for data I/O
|
|
and silently return with GOOD status. This addresses the zero length
|
|
issue, but the proper long-term resolution for handling arbitary
|
|
allocation lengths will be to refactor out data-phase handling in
|
|
individual CDB emulation logic within target_core_cdb.c
|
|
|
|
Reported-by: Roland Dreier <roland@purestorage.com>
|
|
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/target/target_core_transport.c | 13 +++++++++++++
|
|
1 file changed, 13 insertions(+)
|
|
|
|
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
|
|
index 4f99d4c..861628e 100644
|
|
--- a/drivers/target/target_core_transport.c
|
|
+++ b/drivers/target/target_core_transport.c
|
|
@@ -3701,6 +3701,11 @@ transport_allocate_control_task(struct se_cmd *cmd)
|
|
struct se_task *task;
|
|
unsigned long flags;
|
|
|
|
+ /* Workaround for handling zero-length control CDBs */
|
|
+ if ((cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB) &&
|
|
+ !cmd->data_length)
|
|
+ return 0;
|
|
+
|
|
task = transport_generic_get_task(cmd, cmd->data_direction);
|
|
if (!task)
|
|
return -ENOMEM;
|
|
@@ -3772,6 +3777,14 @@ int transport_generic_new_cmd(struct se_cmd *cmd)
|
|
else if (!task_cdbs && (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB)) {
|
|
cmd->t_state = TRANSPORT_COMPLETE;
|
|
atomic_set(&cmd->t_transport_active, 1);
|
|
+
|
|
+ if (cmd->t_task_cdb[0] == REQUEST_SENSE) {
|
|
+ u8 ua_asc = 0, ua_ascq = 0;
|
|
+
|
|
+ core_scsi3_ua_clear_for_request_sense(cmd,
|
|
+ &ua_asc, &ua_ascq);
|
|
+ }
|
|
+
|
|
INIT_WORK(&cmd->work, target_complete_ok_work);
|
|
queue_work(target_completion_wq, &cmd->work);
|
|
return 0;
|
|
--
|
|
1.7.9.4
|
|
|