aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2012-05-30 17:09:10 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2012-07-16 20:28:40 -0400
commiteba2ca450526c1aaf2bfd363dffd63b024e80ea7 (patch)
treed532bfe908962dcf3fa9c28ad1ff6709e22943cd
parent3d6d72014f16967ca92765040be30f022c5952e6 (diff)
target: Move MAINTENANCE_[IN,OUT] from pscsi_parse_cdb -> spc_parse_cdb
The MAINTENANCE_[IN,OUT] CDB parsing required for generic ALUA emulation needs to be in spc_parse_cdb() to function for virtual TYPE_DISK exports, instead of in backend pscsi_parse_cdb() code used only for passthrough ops. Cc: Christoph Hellwig <hch@lst.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/target/target_core_spc.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c
index 96dcb57089f7..4c861de538c9 100644
--- a/drivers/target/target_core_spc.c
+++ b/drivers/target/target_core_spc.c
@@ -35,6 +35,7 @@
35#include <target/target_core_fabric.h> 35#include <target/target_core_fabric.h>
36 36
37#include "target_core_internal.h" 37#include "target_core_internal.h"
38#include "target_core_alua.h"
38#include "target_core_pr.h" 39#include "target_core_pr.h"
39#include "target_core_ua.h" 40#include "target_core_ua.h"
40 41
@@ -940,7 +941,8 @@ static int spc_emulate_testunitready(struct se_cmd *cmd)
940 941
941int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size) 942int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size)
942{ 943{
943 struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; 944 struct se_device *dev = cmd->se_dev;
945 struct se_subsystem_dev *su_dev = dev->se_sub_dev;
944 unsigned char *cdb = cmd->t_task_cdb; 946 unsigned char *cdb = cmd->t_task_cdb;
945 947
946 switch (cdb[0]) { 948 switch (cdb[0]) {
@@ -1050,6 +1052,44 @@ int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size)
1050 cmd->execute_cmd = spc_emulate_testunitready; 1052 cmd->execute_cmd = spc_emulate_testunitready;
1051 *size = 0; 1053 *size = 0;
1052 break; 1054 break;
1055 case MAINTENANCE_IN:
1056 if (dev->transport->get_device_type(dev) != TYPE_ROM) {
1057 /*
1058 * MAINTENANCE_IN from SCC-2
1059 * Check for emulated MI_REPORT_TARGET_PGS
1060 */
1061 if ((cdb[1] & 0x1f) == MI_REPORT_TARGET_PGS &&
1062 su_dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) {
1063 cmd->execute_cmd =
1064 target_emulate_report_target_port_groups;
1065 }
1066 *size = get_unaligned_be32(&cdb[6]);
1067 } else {
1068 /*
1069 * GPCMD_SEND_KEY from multi media commands
1070 */
1071 *size = get_unaligned_be16(&cdb[8]);
1072 }
1073 break;
1074 case MAINTENANCE_OUT:
1075 if (dev->transport->get_device_type(dev) != TYPE_ROM) {
1076 /*
1077 * MAINTENANCE_OUT from SCC-2
1078 * Check for emulated MO_SET_TARGET_PGS.
1079 */
1080 if (cdb[1] == MO_SET_TARGET_PGS &&
1081 su_dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) {
1082 cmd->execute_cmd =
1083 target_emulate_set_target_port_groups;
1084 }
1085 *size = get_unaligned_be32(&cdb[6]);
1086 } else {
1087 /*
1088 * GPCMD_SEND_KEY from multi media commands
1089 */
1090 *size = get_unaligned_be16(&cdb[8]);
1091 }
1092 break;
1053 default: 1093 default:
1054 pr_warn("TARGET_CORE[%s]: Unsupported SCSI Opcode" 1094 pr_warn("TARGET_CORE[%s]: Unsupported SCSI Opcode"
1055 " 0x%02x, sending CHECK_CONDITION.\n", 1095 " 0x%02x, sending CHECK_CONDITION.\n",