summaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-07-04 17:13:43 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-07-04 17:13:43 -0400
commit5c755fe142b421d295e7dd64a9833c12abbfd28e (patch)
tree768b637e9f7b72def5780c99d2368bc462fdaff4 /drivers/scsi
parent6d7c8e1b3a1fae91daaf1bec4df694239c7a430b (diff)
parent2ec1e9e20701f37a06562966dbd37e7dd072fcb8 (diff)
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull SCSI target updates from Nicholas Bellinger: "It's been a busy development cycle for target-core in a number of different areas. The fabric API usage for se_node_acl allocation is now within target-core code, dropping the external API callers for all fabric drivers tree-wide. There is a new conversion to RCU hlists for se_node_acl and se_portal_group LUN mappings, that turns fast-past LUN lookup into a completely lockless code-path. It also removes the original hard-coded limitation of 256 LUNs per fabric endpoint. The configfs attributes for backends can now be shared between core and driver code, allowing existing drivers to use common code while still allowing flexibility for new backend provided attributes. The highlights include: - Merge sbc_verify_dif_* into common code (sagi) - Remove iscsi-target support for obsolete IFMarker/OFMarker (Christophe Vu-Brugier) - Add bidi support in target/user backend (ilias + vangelis + agover) - Move se_node_acl allocation into target-core code (hch) - Add crc_t10dif_update common helper (akinobu + mkp) - Handle target-core odd SGL mapping for data transfer memory (akinobu) - Move transport ID handling into target-core (hch) - Move task tag into struct se_cmd + support 64-bit tags (bart) - Convert se_node_acl->device_list[] to RCU hlist (nab + hch + paulmck) - Convert se_portal_group->tpg_lun_list[] to RCU hlist (nab + hch + paulmck) - Simplify target backend driver registration (hch) - Consolidate + simplify target backend attribute implementations (hch + nab) - Subsume se_port + t10_alua_tg_pt_gp_member into se_lun (hch) - Drop lun_sep_lock for se_lun->lun_se_dev RCU usage (hch + nab) - Drop unnecessary core_tpg_register TFO parameter (nab) - Use 64-bit LUNs tree-wide (hannes) - Drop left-over TARGET_MAX_LUNS_PER_TRANSPORT limit (hannes)" * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (76 commits) target: Bump core version to v5.0 target: remove target_core_configfs.h target: remove unused TARGET_CORE_CONFIG_ROOT define target: consolidate version defines target: implement WRITE_SAME with UNMAP bit using ->execute_unmap target: simplify UNMAP handling target: replace se_cmd->execute_rw with a protocol_data field target/user: Fix inconsistent kmap_atomic/kunmap_atomic target: Send UA when changing LUN inventory target: Send UA upon LUN RESET tmr completion target: Send UA on ALUA target port group change target: Convert se_lun->lun_deve_lock to normal spinlock target: use 'se_dev_entry' when allocating UAs target: Remove 'ua_nacl' pointer from se_ua structure target_core_alua: Correct UA handling when switching states xen-scsiback: Fix compile warning for 64-bit LUN target: Remove TARGET_MAX_LUNS_PER_TRANSPORT target: use 64-bit LUNs target: Drop duplicate + unused se_dev_check_wce target: Drop unnecessary core_tpg_register TFO parameter ...
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/qla2xxx/qla_target.c52
-rw-r--r--drivers/scsi/qla2xxx/qla_target.h1
-rw-r--r--drivers/scsi/qla2xxx/tcm_qla2xxx.c227
-rw-r--r--drivers/scsi/qla2xxx/tcm_qla2xxx.h6
4 files changed, 38 insertions, 248 deletions
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index 4a484d60be0d..b749026aa592 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1191,7 +1191,7 @@ static int __qlt_24xx_handle_abts(struct scsi_qla_host *vha,
1191 list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list) { 1191 list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list) {
1192 struct qla_tgt_cmd *cmd = 1192 struct qla_tgt_cmd *cmd =
1193 container_of(se_cmd, struct qla_tgt_cmd, se_cmd); 1193 container_of(se_cmd, struct qla_tgt_cmd, se_cmd);
1194 if (cmd->tag == abts->exchange_addr_to_abort) { 1194 if (se_cmd->tag == abts->exchange_addr_to_abort) {
1195 lun = cmd->unpacked_lun; 1195 lun = cmd->unpacked_lun;
1196 found_lun = true; 1196 found_lun = true;
1197 break; 1197 break;
@@ -1728,9 +1728,8 @@ static int qlt_pre_xmit_response(struct qla_tgt_cmd *cmd,
1728 1728
1729 if (unlikely(cmd->aborted)) { 1729 if (unlikely(cmd->aborted)) {
1730 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf014, 1730 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf014,
1731 "qla_target(%d): terminating exchange " 1731 "qla_target(%d): terminating exchange for aborted cmd=%p (se_cmd=%p, tag=%lld)",
1732 "for aborted cmd=%p (se_cmd=%p, tag=%d)", vha->vp_idx, cmd, 1732 vha->vp_idx, cmd, se_cmd, se_cmd->tag);
1733 se_cmd, cmd->tag);
1734 1733
1735 cmd->state = QLA_TGT_STATE_ABORTED; 1734 cmd->state = QLA_TGT_STATE_ABORTED;
1736 cmd->cmd_flags |= BIT_6; 1735 cmd->cmd_flags |= BIT_6;
@@ -1765,18 +1764,17 @@ static int qlt_pre_xmit_response(struct qla_tgt_cmd *cmd,
1765 if (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) { 1764 if (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) {
1766 prm->residual = se_cmd->residual_count; 1765 prm->residual = se_cmd->residual_count;
1767 ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x305c, 1766 ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x305c,
1768 "Residual underflow: %d (tag %d, " 1767 "Residual underflow: %d (tag %lld, op %x, bufflen %d, rq_result %x)\n",
1769 "op %x, bufflen %d, rq_result %x)\n", prm->residual, 1768 prm->residual, se_cmd->tag,
1770 cmd->tag, se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0, 1769 se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0,
1771 cmd->bufflen, prm->rq_result); 1770 cmd->bufflen, prm->rq_result);
1772 prm->rq_result |= SS_RESIDUAL_UNDER; 1771 prm->rq_result |= SS_RESIDUAL_UNDER;
1773 } else if (se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) { 1772 } else if (se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) {
1774 prm->residual = se_cmd->residual_count; 1773 prm->residual = se_cmd->residual_count;
1775 ql_dbg(ql_dbg_io, vha, 0x305d, 1774 ql_dbg(ql_dbg_io, vha, 0x305d,
1776 "Residual overflow: %d (tag %d, " 1775 "Residual overflow: %d (tag %lld, op %x, bufflen %d, rq_result %x)\n",
1777 "op %x, bufflen %d, rq_result %x)\n", prm->residual, 1776 prm->residual, se_cmd->tag, se_cmd->t_task_cdb ?
1778 cmd->tag, se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0, 1777 se_cmd->t_task_cdb[0] : 0, cmd->bufflen, prm->rq_result);
1779 cmd->bufflen, prm->rq_result);
1780 prm->rq_result |= SS_RESIDUAL_OVER; 1778 prm->rq_result |= SS_RESIDUAL_OVER;
1781 } 1779 }
1782 1780
@@ -1849,7 +1847,7 @@ static void qlt_check_srr_debug(struct qla_tgt_cmd *cmd, int *xmit_type)
1849 == 50) { 1847 == 50) {
1850 *xmit_type &= ~QLA_TGT_XMIT_STATUS; 1848 *xmit_type &= ~QLA_TGT_XMIT_STATUS;
1851 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf015, 1849 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf015,
1852 "Dropping cmd %p (tag %d) status", cmd, cmd->tag); 1850 "Dropping cmd %p (tag %d) status", cmd, se_cmd->tag);
1853 } 1851 }
1854#endif 1852#endif
1855 /* 1853 /*
@@ -1873,7 +1871,7 @@ static void qlt_check_srr_debug(struct qla_tgt_cmd *cmd, int *xmit_type)
1873 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf016, 1871 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf016,
1874 "Cutting cmd %p (tag %d) buffer" 1872 "Cutting cmd %p (tag %d) buffer"
1875 " tail to len %d, sg_cnt %d (cmd->bufflen %d," 1873 " tail to len %d, sg_cnt %d (cmd->bufflen %d,"
1876 " cmd->sg_cnt %d)", cmd, cmd->tag, tot_len, leave, 1874 " cmd->sg_cnt %d)", cmd, se_cmd->tag, tot_len, leave,
1877 cmd->bufflen, cmd->sg_cnt); 1875 cmd->bufflen, cmd->sg_cnt);
1878 1876
1879 cmd->bufflen = tot_len; 1877 cmd->bufflen = tot_len;
@@ -1885,13 +1883,13 @@ static void qlt_check_srr_debug(struct qla_tgt_cmd *cmd, int *xmit_type)
1885 1883
1886 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf017, 1884 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf017,
1887 "Cutting cmd %p (tag %d) buffer head " 1885 "Cutting cmd %p (tag %d) buffer head "
1888 "to offset %d (cmd->bufflen %d)", cmd, cmd->tag, offset, 1886 "to offset %d (cmd->bufflen %d)", cmd, se_cmd->tag, offset,
1889 cmd->bufflen); 1887 cmd->bufflen);
1890 if (offset == 0) 1888 if (offset == 0)
1891 *xmit_type &= ~QLA_TGT_XMIT_DATA; 1889 *xmit_type &= ~QLA_TGT_XMIT_DATA;
1892 else if (qlt_set_data_offset(cmd, offset)) { 1890 else if (qlt_set_data_offset(cmd, offset)) {
1893 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf018, 1891 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf018,
1894 "qlt_set_data_offset() failed (tag %d)", cmd->tag); 1892 "qlt_set_data_offset() failed (tag %d)", se_cmd->tag);
1895 } 1893 }
1896 } 1894 }
1897} 1895}
@@ -3194,7 +3192,7 @@ skip_term:
3194 return; 3192 return;
3195 } else if (cmd->state == QLA_TGT_STATE_ABORTED) { 3193 } else if (cmd->state == QLA_TGT_STATE_ABORTED) {
3196 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01e, 3194 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01e,
3197 "Aborted command %p (tag %d) finished\n", cmd, cmd->tag); 3195 "Aborted command %p (tag %lld) finished\n", cmd, se_cmd->tag);
3198 } else { 3196 } else {
3199 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf05c, 3197 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf05c,
3200 "qla_target(%d): A command in state (%d) should " 3198 "qla_target(%d): A command in state (%d) should "
@@ -3266,7 +3264,7 @@ static void __qlt_do_work(struct qla_tgt_cmd *cmd)
3266 goto out_term; 3264 goto out_term;
3267 3265
3268 cdb = &atio->u.isp24.fcp_cmnd.cdb[0]; 3266 cdb = &atio->u.isp24.fcp_cmnd.cdb[0];
3269 cmd->tag = atio->u.isp24.exchange_addr; 3267 cmd->se_cmd.tag = atio->u.isp24.exchange_addr;
3270 cmd->unpacked_lun = scsilun_to_int( 3268 cmd->unpacked_lun = scsilun_to_int(
3271 (struct scsi_lun *)&atio->u.isp24.fcp_cmnd.lun); 3269 (struct scsi_lun *)&atio->u.isp24.fcp_cmnd.lun);
3272 3270
@@ -3893,9 +3891,8 @@ static void qlt_handle_srr(struct scsi_qla_host *vha,
3893 resp = 1; 3891 resp = 1;
3894 } else { 3892 } else {
3895 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf064, 3893 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf064,
3896 "qla_target(%d): SRR for in data for cmd " 3894 "qla_target(%d): SRR for in data for cmd without them (tag %lld, SCSI status %d), reject",
3897 "without them (tag %d, SCSI status %d), " 3895 vha->vp_idx, se_cmd->tag,
3898 "reject", vha->vp_idx, cmd->tag,
3899 cmd->se_cmd.scsi_status); 3896 cmd->se_cmd.scsi_status);
3900 goto out_reject; 3897 goto out_reject;
3901 } 3898 }
@@ -3929,10 +3926,8 @@ static void qlt_handle_srr(struct scsi_qla_host *vha,
3929 } 3926 }
3930 } else { 3927 } else {
3931 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf066, 3928 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf066,
3932 "qla_target(%d): SRR for out data for cmd " 3929 "qla_target(%d): SRR for out data for cmd without them (tag %lld, SCSI status %d), reject",
3933 "without them (tag %d, SCSI status %d), " 3930 vha->vp_idx, se_cmd->tag, cmd->se_cmd.scsi_status);
3934 "reject", vha->vp_idx, cmd->tag,
3935 cmd->se_cmd.scsi_status);
3936 goto out_reject; 3931 goto out_reject;
3937 } 3932 }
3938 break; 3933 break;
@@ -4053,10 +4048,9 @@ restart:
4053 cmd->sg = se_cmd->t_data_sg; 4048 cmd->sg = se_cmd->t_data_sg;
4054 4049
4055 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf02c, 4050 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf02c,
4056 "SRR cmd %p (se_cmd %p, tag %d, op %x), " 4051 "SRR cmd %p (se_cmd %p, tag %lld, op %x), sg_cnt=%d, offset=%d",
4057 "sg_cnt=%d, offset=%d", cmd, &cmd->se_cmd, cmd->tag, 4052 cmd, &cmd->se_cmd, se_cmd->tag, se_cmd->t_task_cdb ?
4058 se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0, 4053 se_cmd->t_task_cdb[0] : 0, cmd->sg_cnt, cmd->offset);
4059 cmd->sg_cnt, cmd->offset);
4060 4054
4061 qlt_handle_srr(vha, sctio, imm); 4055 qlt_handle_srr(vha, sctio, imm);
4062 4056
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h
index 332086776dfe..985d76dd706b 100644
--- a/drivers/scsi/qla2xxx/qla_target.h
+++ b/drivers/scsi/qla2xxx/qla_target.h
@@ -924,7 +924,6 @@ struct qla_tgt_cmd {
924 int sg_cnt; /* SG segments count */ 924 int sg_cnt; /* SG segments count */
925 int bufflen; /* cmd buffer length */ 925 int bufflen; /* cmd buffer length */
926 int offset; 926 int offset;
927 uint32_t tag;
928 uint32_t unpacked_lun; 927 uint32_t unpacked_lun;
929 enum dma_data_direction dma_data_direction; 928 enum dma_data_direction dma_data_direction;
930 uint32_t reset_count; 929 uint32_t reset_count;
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
index e32d24ec7a11..d9a8c6084346 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
@@ -44,7 +44,6 @@
44#include <target/target_core_base.h> 44#include <target/target_core_base.h>
45#include <target/target_core_fabric.h> 45#include <target/target_core_fabric.h>
46#include <target/target_core_fabric_configfs.h> 46#include <target/target_core_fabric_configfs.h>
47#include <target/target_core_configfs.h>
48#include <target/configfs_macros.h> 47#include <target/configfs_macros.h>
49 48
50#include "qla_def.h" 49#include "qla_def.h"
@@ -54,9 +53,6 @@
54static struct workqueue_struct *tcm_qla2xxx_free_wq; 53static struct workqueue_struct *tcm_qla2xxx_free_wq;
55static struct workqueue_struct *tcm_qla2xxx_cmd_wq; 54static struct workqueue_struct *tcm_qla2xxx_cmd_wq;
56 55
57static const struct target_core_fabric_ops tcm_qla2xxx_ops;
58static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops;
59
60/* 56/*
61 * Parse WWN. 57 * Parse WWN.
62 * If strict, we require lower-case hex and colon separators to be sure 58 * If strict, we require lower-case hex and colon separators to be sure
@@ -191,23 +187,6 @@ static char *tcm_qla2xxx_npiv_get_fabric_name(void)
191 return "qla2xxx_npiv"; 187 return "qla2xxx_npiv";
192} 188}
193 189
194static u8 tcm_qla2xxx_get_fabric_proto_ident(struct se_portal_group *se_tpg)
195{
196 struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
197 struct tcm_qla2xxx_tpg, se_tpg);
198 struct tcm_qla2xxx_lport *lport = tpg->lport;
199 u8 proto_id;
200
201 switch (lport->lport_proto_id) {
202 case SCSI_PROTOCOL_FCP:
203 default:
204 proto_id = fc_get_fabric_proto_ident(se_tpg);
205 break;
206 }
207
208 return proto_id;
209}
210
211static char *tcm_qla2xxx_get_fabric_wwn(struct se_portal_group *se_tpg) 190static char *tcm_qla2xxx_get_fabric_wwn(struct se_portal_group *se_tpg)
212{ 191{
213 struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, 192 struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
@@ -224,78 +203,6 @@ static u16 tcm_qla2xxx_get_tag(struct se_portal_group *se_tpg)
224 return tpg->lport_tpgt; 203 return tpg->lport_tpgt;
225} 204}
226 205
227static u32 tcm_qla2xxx_get_default_depth(struct se_portal_group *se_tpg)
228{
229 return 1;
230}
231
232static u32 tcm_qla2xxx_get_pr_transport_id(
233 struct se_portal_group *se_tpg,
234 struct se_node_acl *se_nacl,
235 struct t10_pr_registration *pr_reg,
236 int *format_code,
237 unsigned char *buf)
238{
239 struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
240 struct tcm_qla2xxx_tpg, se_tpg);
241 struct tcm_qla2xxx_lport *lport = tpg->lport;
242 int ret = 0;
243
244 switch (lport->lport_proto_id) {
245 case SCSI_PROTOCOL_FCP:
246 default:
247 ret = fc_get_pr_transport_id(se_tpg, se_nacl, pr_reg,
248 format_code, buf);
249 break;
250 }
251
252 return ret;
253}
254
255static u32 tcm_qla2xxx_get_pr_transport_id_len(
256 struct se_portal_group *se_tpg,
257 struct se_node_acl *se_nacl,
258 struct t10_pr_registration *pr_reg,
259 int *format_code)
260{
261 struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
262 struct tcm_qla2xxx_tpg, se_tpg);
263 struct tcm_qla2xxx_lport *lport = tpg->lport;
264 int ret = 0;
265
266 switch (lport->lport_proto_id) {
267 case SCSI_PROTOCOL_FCP:
268 default:
269 ret = fc_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,
270 format_code);
271 break;
272 }
273
274 return ret;
275}
276
277static char *tcm_qla2xxx_parse_pr_out_transport_id(
278 struct se_portal_group *se_tpg,
279 const char *buf,
280 u32 *out_tid_len,
281 char **port_nexus_ptr)
282{
283 struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
284 struct tcm_qla2xxx_tpg, se_tpg);
285 struct tcm_qla2xxx_lport *lport = tpg->lport;
286 char *tid = NULL;
287
288 switch (lport->lport_proto_id) {
289 case SCSI_PROTOCOL_FCP:
290 default:
291 tid = fc_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,
292 port_nexus_ptr);
293 break;
294 }
295
296 return tid;
297}
298
299static int tcm_qla2xxx_check_demo_mode(struct se_portal_group *se_tpg) 206static int tcm_qla2xxx_check_demo_mode(struct se_portal_group *se_tpg)
300{ 207{
301 struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, 208 struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
@@ -344,29 +251,6 @@ static int tcm_qla2xxx_check_prot_fabric_only(struct se_portal_group *se_tpg)
344 return tpg->tpg_attrib.fabric_prot_type; 251 return tpg->tpg_attrib.fabric_prot_type;
345} 252}
346 253
347static struct se_node_acl *tcm_qla2xxx_alloc_fabric_acl(
348 struct se_portal_group *se_tpg)
349{
350 struct tcm_qla2xxx_nacl *nacl;
351
352 nacl = kzalloc(sizeof(struct tcm_qla2xxx_nacl), GFP_KERNEL);
353 if (!nacl) {
354 pr_err("Unable to allocate struct tcm_qla2xxx_nacl\n");
355 return NULL;
356 }
357
358 return &nacl->se_node_acl;
359}
360
361static void tcm_qla2xxx_release_fabric_acl(
362 struct se_portal_group *se_tpg,
363 struct se_node_acl *se_nacl)
364{
365 struct tcm_qla2xxx_nacl *nacl = container_of(se_nacl,
366 struct tcm_qla2xxx_nacl, se_node_acl);
367 kfree(nacl);
368}
369
370static u32 tcm_qla2xxx_tpg_get_inst_index(struct se_portal_group *se_tpg) 254static u32 tcm_qla2xxx_tpg_get_inst_index(struct se_portal_group *se_tpg)
371{ 255{
372 struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, 256 struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
@@ -430,7 +314,7 @@ static int tcm_qla2xxx_check_stop_free(struct se_cmd *se_cmd)
430 cmd->cmd_flags |= BIT_14; 314 cmd->cmd_flags |= BIT_14;
431 } 315 }
432 316
433 return target_put_sess_cmd(se_cmd->se_sess, se_cmd); 317 return target_put_sess_cmd(se_cmd);
434} 318}
435 319
436/* tcm_qla2xxx_release_cmd - Callback from TCM Core to release underlying 320/* tcm_qla2xxx_release_cmd - Callback from TCM Core to release underlying
@@ -534,19 +418,6 @@ static void tcm_qla2xxx_set_default_node_attrs(struct se_node_acl *nacl)
534 return; 418 return;
535} 419}
536 420
537static u32 tcm_qla2xxx_get_task_tag(struct se_cmd *se_cmd)
538{
539 struct qla_tgt_cmd *cmd;
540
541 /* check for task mgmt cmd */
542 if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)
543 return 0xffffffff;
544
545 cmd = container_of(se_cmd, struct qla_tgt_cmd, se_cmd);
546
547 return cmd->tag;
548}
549
550static int tcm_qla2xxx_get_cmd_state(struct se_cmd *se_cmd) 421static int tcm_qla2xxx_get_cmd_state(struct se_cmd *se_cmd)
551{ 422{
552 return 0; 423 return 0;
@@ -827,17 +698,6 @@ static void tcm_qla2xxx_release_session(struct kref *kref)
827 qlt_unreg_sess(se_sess->fabric_sess_ptr); 698 qlt_unreg_sess(se_sess->fabric_sess_ptr);
828} 699}
829 700
830static void tcm_qla2xxx_put_session(struct se_session *se_sess)
831{
832 struct qla_tgt_sess *sess = se_sess->fabric_sess_ptr;
833 struct qla_hw_data *ha = sess->vha->hw;
834 unsigned long flags;
835
836 spin_lock_irqsave(&ha->hardware_lock, flags);
837 kref_put(&se_sess->sess_kref, tcm_qla2xxx_release_session);
838 spin_unlock_irqrestore(&ha->hardware_lock, flags);
839}
840
841static void tcm_qla2xxx_put_sess(struct qla_tgt_sess *sess) 701static void tcm_qla2xxx_put_sess(struct qla_tgt_sess *sess)
842{ 702{
843 if (!sess) 703 if (!sess)
@@ -853,53 +713,20 @@ static void tcm_qla2xxx_shutdown_sess(struct qla_tgt_sess *sess)
853 target_sess_cmd_list_set_waiting(sess->se_sess); 713 target_sess_cmd_list_set_waiting(sess->se_sess);
854} 714}
855 715
856static struct se_node_acl *tcm_qla2xxx_make_nodeacl( 716static int tcm_qla2xxx_init_nodeacl(struct se_node_acl *se_nacl,
857 struct se_portal_group *se_tpg, 717 const char *name)
858 struct config_group *group,
859 const char *name)
860{ 718{
861 struct se_node_acl *se_nacl, *se_nacl_new; 719 struct tcm_qla2xxx_nacl *nacl =
862 struct tcm_qla2xxx_nacl *nacl; 720 container_of(se_nacl, struct tcm_qla2xxx_nacl, se_node_acl);
863 u64 wwnn; 721 u64 wwnn;
864 u32 qla2xxx_nexus_depth;
865 722
866 if (tcm_qla2xxx_parse_wwn(name, &wwnn, 1) < 0) 723 if (tcm_qla2xxx_parse_wwn(name, &wwnn, 1) < 0)
867 return ERR_PTR(-EINVAL); 724 return -EINVAL;
868
869 se_nacl_new = tcm_qla2xxx_alloc_fabric_acl(se_tpg);
870 if (!se_nacl_new)
871 return ERR_PTR(-ENOMEM);
872/* #warning FIXME: Hardcoded qla2xxx_nexus depth in tcm_qla2xxx_make_nodeacl */
873 qla2xxx_nexus_depth = 1;
874 725
875 /*
876 * se_nacl_new may be released by core_tpg_add_initiator_node_acl()
877 * when converting a NodeACL from demo mode -> explict
878 */
879 se_nacl = core_tpg_add_initiator_node_acl(se_tpg, se_nacl_new,
880 name, qla2xxx_nexus_depth);
881 if (IS_ERR(se_nacl)) {
882 tcm_qla2xxx_release_fabric_acl(se_tpg, se_nacl_new);
883 return se_nacl;
884 }
885 /*
886 * Locate our struct tcm_qla2xxx_nacl and set the FC Nport WWPN
887 */
888 nacl = container_of(se_nacl, struct tcm_qla2xxx_nacl, se_node_acl);
889 nacl->nport_wwnn = wwnn; 726 nacl->nport_wwnn = wwnn;
890 tcm_qla2xxx_format_wwn(&nacl->nport_name[0], TCM_QLA2XXX_NAMELEN, wwnn); 727 tcm_qla2xxx_format_wwn(&nacl->nport_name[0], TCM_QLA2XXX_NAMELEN, wwnn);
891 728
892 return se_nacl; 729 return 0;
893}
894
895static void tcm_qla2xxx_drop_nodeacl(struct se_node_acl *se_acl)
896{
897 struct se_portal_group *se_tpg = se_acl->se_tpg;
898 struct tcm_qla2xxx_nacl *nacl = container_of(se_acl,
899 struct tcm_qla2xxx_nacl, se_node_acl);
900
901 core_tpg_del_initiator_node_acl(se_tpg, se_acl, 1);
902 kfree(nacl);
903} 730}
904 731
905/* Start items for tcm_qla2xxx_tpg_attrib_cit */ 732/* Start items for tcm_qla2xxx_tpg_attrib_cit */
@@ -1175,8 +1002,7 @@ static struct se_portal_group *tcm_qla2xxx_make_tpg(
1175 tpg->tpg_attrib.cache_dynamic_acls = 1; 1002 tpg->tpg_attrib.cache_dynamic_acls = 1;
1176 tpg->tpg_attrib.demo_mode_login_only = 1; 1003 tpg->tpg_attrib.demo_mode_login_only = 1;
1177 1004
1178 ret = core_tpg_register(&tcm_qla2xxx_ops, wwn, 1005 ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP);
1179 &tpg->se_tpg, tpg, TRANSPORT_TPG_TYPE_NORMAL);
1180 if (ret < 0) { 1006 if (ret < 0) {
1181 kfree(tpg); 1007 kfree(tpg);
1182 return NULL; 1008 return NULL;
@@ -1295,8 +1121,7 @@ static struct se_portal_group *tcm_qla2xxx_npiv_make_tpg(
1295 tpg->tpg_attrib.cache_dynamic_acls = 1; 1121 tpg->tpg_attrib.cache_dynamic_acls = 1;
1296 tpg->tpg_attrib.demo_mode_login_only = 1; 1122 tpg->tpg_attrib.demo_mode_login_only = 1;
1297 1123
1298 ret = core_tpg_register(&tcm_qla2xxx_npiv_ops, wwn, 1124 ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP);
1299 &tpg->se_tpg, tpg, TRANSPORT_TPG_TYPE_NORMAL);
1300 if (ret < 0) { 1125 if (ret < 0) {
1301 kfree(tpg); 1126 kfree(tpg);
1302 return NULL; 1127 return NULL;
@@ -1988,14 +1813,10 @@ static struct configfs_attribute *tcm_qla2xxx_wwn_attrs[] = {
1988static const struct target_core_fabric_ops tcm_qla2xxx_ops = { 1813static const struct target_core_fabric_ops tcm_qla2xxx_ops = {
1989 .module = THIS_MODULE, 1814 .module = THIS_MODULE,
1990 .name = "qla2xxx", 1815 .name = "qla2xxx",
1816 .node_acl_size = sizeof(struct tcm_qla2xxx_nacl),
1991 .get_fabric_name = tcm_qla2xxx_get_fabric_name, 1817 .get_fabric_name = tcm_qla2xxx_get_fabric_name,
1992 .get_fabric_proto_ident = tcm_qla2xxx_get_fabric_proto_ident,
1993 .tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn, 1818 .tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn,
1994 .tpg_get_tag = tcm_qla2xxx_get_tag, 1819 .tpg_get_tag = tcm_qla2xxx_get_tag,
1995 .tpg_get_default_depth = tcm_qla2xxx_get_default_depth,
1996 .tpg_get_pr_transport_id = tcm_qla2xxx_get_pr_transport_id,
1997 .tpg_get_pr_transport_id_len = tcm_qla2xxx_get_pr_transport_id_len,
1998 .tpg_parse_pr_out_transport_id = tcm_qla2xxx_parse_pr_out_transport_id,
1999 .tpg_check_demo_mode = tcm_qla2xxx_check_demo_mode, 1820 .tpg_check_demo_mode = tcm_qla2xxx_check_demo_mode,
2000 .tpg_check_demo_mode_cache = tcm_qla2xxx_check_demo_mode_cache, 1821 .tpg_check_demo_mode_cache = tcm_qla2xxx_check_demo_mode_cache,
2001 .tpg_check_demo_mode_write_protect = 1822 .tpg_check_demo_mode_write_protect =
@@ -2004,12 +1825,9 @@ static const struct target_core_fabric_ops tcm_qla2xxx_ops = {
2004 tcm_qla2xxx_check_prod_write_protect, 1825 tcm_qla2xxx_check_prod_write_protect,
2005 .tpg_check_prot_fabric_only = tcm_qla2xxx_check_prot_fabric_only, 1826 .tpg_check_prot_fabric_only = tcm_qla2xxx_check_prot_fabric_only,
2006 .tpg_check_demo_mode_login_only = tcm_qla2xxx_check_demo_mode_login_only, 1827 .tpg_check_demo_mode_login_only = tcm_qla2xxx_check_demo_mode_login_only,
2007 .tpg_alloc_fabric_acl = tcm_qla2xxx_alloc_fabric_acl,
2008 .tpg_release_fabric_acl = tcm_qla2xxx_release_fabric_acl,
2009 .tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index, 1828 .tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index,
2010 .check_stop_free = tcm_qla2xxx_check_stop_free, 1829 .check_stop_free = tcm_qla2xxx_check_stop_free,
2011 .release_cmd = tcm_qla2xxx_release_cmd, 1830 .release_cmd = tcm_qla2xxx_release_cmd,
2012 .put_session = tcm_qla2xxx_put_session,
2013 .shutdown_session = tcm_qla2xxx_shutdown_session, 1831 .shutdown_session = tcm_qla2xxx_shutdown_session,
2014 .close_session = tcm_qla2xxx_close_session, 1832 .close_session = tcm_qla2xxx_close_session,
2015 .sess_get_index = tcm_qla2xxx_sess_get_index, 1833 .sess_get_index = tcm_qla2xxx_sess_get_index,
@@ -2017,7 +1835,6 @@ static const struct target_core_fabric_ops tcm_qla2xxx_ops = {
2017 .write_pending = tcm_qla2xxx_write_pending, 1835 .write_pending = tcm_qla2xxx_write_pending,
2018 .write_pending_status = tcm_qla2xxx_write_pending_status, 1836 .write_pending_status = tcm_qla2xxx_write_pending_status,
2019 .set_default_node_attributes = tcm_qla2xxx_set_default_node_attrs, 1837 .set_default_node_attributes = tcm_qla2xxx_set_default_node_attrs,
2020 .get_task_tag = tcm_qla2xxx_get_task_tag,
2021 .get_cmd_state = tcm_qla2xxx_get_cmd_state, 1838 .get_cmd_state = tcm_qla2xxx_get_cmd_state,
2022 .queue_data_in = tcm_qla2xxx_queue_data_in, 1839 .queue_data_in = tcm_qla2xxx_queue_data_in,
2023 .queue_status = tcm_qla2xxx_queue_status, 1840 .queue_status = tcm_qla2xxx_queue_status,
@@ -2031,12 +1848,7 @@ static const struct target_core_fabric_ops tcm_qla2xxx_ops = {
2031 .fabric_drop_wwn = tcm_qla2xxx_drop_lport, 1848 .fabric_drop_wwn = tcm_qla2xxx_drop_lport,
2032 .fabric_make_tpg = tcm_qla2xxx_make_tpg, 1849 .fabric_make_tpg = tcm_qla2xxx_make_tpg,
2033 .fabric_drop_tpg = tcm_qla2xxx_drop_tpg, 1850 .fabric_drop_tpg = tcm_qla2xxx_drop_tpg,
2034 .fabric_post_link = NULL, 1851 .fabric_init_nodeacl = tcm_qla2xxx_init_nodeacl,
2035 .fabric_pre_unlink = NULL,
2036 .fabric_make_np = NULL,
2037 .fabric_drop_np = NULL,
2038 .fabric_make_nodeacl = tcm_qla2xxx_make_nodeacl,
2039 .fabric_drop_nodeacl = tcm_qla2xxx_drop_nodeacl,
2040 1852
2041 .tfc_wwn_attrs = tcm_qla2xxx_wwn_attrs, 1853 .tfc_wwn_attrs = tcm_qla2xxx_wwn_attrs,
2042 .tfc_tpg_base_attrs = tcm_qla2xxx_tpg_attrs, 1854 .tfc_tpg_base_attrs = tcm_qla2xxx_tpg_attrs,
@@ -2046,26 +1858,19 @@ static const struct target_core_fabric_ops tcm_qla2xxx_ops = {
2046static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = { 1858static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = {
2047 .module = THIS_MODULE, 1859 .module = THIS_MODULE,
2048 .name = "qla2xxx_npiv", 1860 .name = "qla2xxx_npiv",
1861 .node_acl_size = sizeof(struct tcm_qla2xxx_nacl),
2049 .get_fabric_name = tcm_qla2xxx_npiv_get_fabric_name, 1862 .get_fabric_name = tcm_qla2xxx_npiv_get_fabric_name,
2050 .get_fabric_proto_ident = tcm_qla2xxx_get_fabric_proto_ident,
2051 .tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn, 1863 .tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn,
2052 .tpg_get_tag = tcm_qla2xxx_get_tag, 1864 .tpg_get_tag = tcm_qla2xxx_get_tag,
2053 .tpg_get_default_depth = tcm_qla2xxx_get_default_depth,
2054 .tpg_get_pr_transport_id = tcm_qla2xxx_get_pr_transport_id,
2055 .tpg_get_pr_transport_id_len = tcm_qla2xxx_get_pr_transport_id_len,
2056 .tpg_parse_pr_out_transport_id = tcm_qla2xxx_parse_pr_out_transport_id,
2057 .tpg_check_demo_mode = tcm_qla2xxx_check_demo_mode, 1865 .tpg_check_demo_mode = tcm_qla2xxx_check_demo_mode,
2058 .tpg_check_demo_mode_cache = tcm_qla2xxx_check_demo_mode_cache, 1866 .tpg_check_demo_mode_cache = tcm_qla2xxx_check_demo_mode_cache,
2059 .tpg_check_demo_mode_write_protect = tcm_qla2xxx_check_demo_mode, 1867 .tpg_check_demo_mode_write_protect = tcm_qla2xxx_check_demo_mode,
2060 .tpg_check_prod_mode_write_protect = 1868 .tpg_check_prod_mode_write_protect =
2061 tcm_qla2xxx_check_prod_write_protect, 1869 tcm_qla2xxx_check_prod_write_protect,
2062 .tpg_check_demo_mode_login_only = tcm_qla2xxx_check_demo_mode_login_only, 1870 .tpg_check_demo_mode_login_only = tcm_qla2xxx_check_demo_mode_login_only,
2063 .tpg_alloc_fabric_acl = tcm_qla2xxx_alloc_fabric_acl,
2064 .tpg_release_fabric_acl = tcm_qla2xxx_release_fabric_acl,
2065 .tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index, 1871 .tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index,
2066 .check_stop_free = tcm_qla2xxx_check_stop_free, 1872 .check_stop_free = tcm_qla2xxx_check_stop_free,
2067 .release_cmd = tcm_qla2xxx_release_cmd, 1873 .release_cmd = tcm_qla2xxx_release_cmd,
2068 .put_session = tcm_qla2xxx_put_session,
2069 .shutdown_session = tcm_qla2xxx_shutdown_session, 1874 .shutdown_session = tcm_qla2xxx_shutdown_session,
2070 .close_session = tcm_qla2xxx_close_session, 1875 .close_session = tcm_qla2xxx_close_session,
2071 .sess_get_index = tcm_qla2xxx_sess_get_index, 1876 .sess_get_index = tcm_qla2xxx_sess_get_index,
@@ -2073,7 +1878,6 @@ static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = {
2073 .write_pending = tcm_qla2xxx_write_pending, 1878 .write_pending = tcm_qla2xxx_write_pending,
2074 .write_pending_status = tcm_qla2xxx_write_pending_status, 1879 .write_pending_status = tcm_qla2xxx_write_pending_status,
2075 .set_default_node_attributes = tcm_qla2xxx_set_default_node_attrs, 1880 .set_default_node_attributes = tcm_qla2xxx_set_default_node_attrs,
2076 .get_task_tag = tcm_qla2xxx_get_task_tag,
2077 .get_cmd_state = tcm_qla2xxx_get_cmd_state, 1881 .get_cmd_state = tcm_qla2xxx_get_cmd_state,
2078 .queue_data_in = tcm_qla2xxx_queue_data_in, 1882 .queue_data_in = tcm_qla2xxx_queue_data_in,
2079 .queue_status = tcm_qla2xxx_queue_status, 1883 .queue_status = tcm_qla2xxx_queue_status,
@@ -2087,12 +1891,7 @@ static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = {
2087 .fabric_drop_wwn = tcm_qla2xxx_npiv_drop_lport, 1891 .fabric_drop_wwn = tcm_qla2xxx_npiv_drop_lport,
2088 .fabric_make_tpg = tcm_qla2xxx_npiv_make_tpg, 1892 .fabric_make_tpg = tcm_qla2xxx_npiv_make_tpg,
2089 .fabric_drop_tpg = tcm_qla2xxx_drop_tpg, 1893 .fabric_drop_tpg = tcm_qla2xxx_drop_tpg,
2090 .fabric_post_link = NULL, 1894 .fabric_init_nodeacl = tcm_qla2xxx_init_nodeacl,
2091 .fabric_pre_unlink = NULL,
2092 .fabric_make_np = NULL,
2093 .fabric_drop_np = NULL,
2094 .fabric_make_nodeacl = tcm_qla2xxx_make_nodeacl,
2095 .fabric_drop_nodeacl = tcm_qla2xxx_drop_nodeacl,
2096 1895
2097 .tfc_wwn_attrs = tcm_qla2xxx_wwn_attrs, 1896 .tfc_wwn_attrs = tcm_qla2xxx_wwn_attrs,
2098 .tfc_tpg_base_attrs = tcm_qla2xxx_npiv_tpg_attrs, 1897 .tfc_tpg_base_attrs = tcm_qla2xxx_npiv_tpg_attrs,
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.h b/drivers/scsi/qla2xxx/tcm_qla2xxx.h
index 23295115c9fc..3bbf4cb6fd97 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.h
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.h
@@ -13,6 +13,8 @@
13#include "qla_target.h" 13#include "qla_target.h"
14 14
15struct tcm_qla2xxx_nacl { 15struct tcm_qla2xxx_nacl {
16 struct se_node_acl se_node_acl;
17
16 /* From libfc struct fc_rport->port_id */ 18 /* From libfc struct fc_rport->port_id */
17 u32 nport_id; 19 u32 nport_id;
18 /* Binary World Wide unique Node Name for remote FC Initiator Nport */ 20 /* Binary World Wide unique Node Name for remote FC Initiator Nport */
@@ -23,8 +25,6 @@ struct tcm_qla2xxx_nacl {
23 struct qla_tgt_sess *qla_tgt_sess; 25 struct qla_tgt_sess *qla_tgt_sess;
24 /* Pointer to TCM FC nexus */ 26 /* Pointer to TCM FC nexus */
25 struct se_session *nport_nexus; 27 struct se_session *nport_nexus;
26 /* Returned by tcm_qla2xxx_make_nodeacl() */
27 struct se_node_acl se_node_acl;
28}; 28};
29 29
30struct tcm_qla2xxx_tpg_attrib { 30struct tcm_qla2xxx_tpg_attrib {
@@ -57,8 +57,6 @@ struct tcm_qla2xxx_fc_loopid {
57}; 57};
58 58
59struct tcm_qla2xxx_lport { 59struct tcm_qla2xxx_lport {
60 /* SCSI protocol the lport is providing */
61 u8 lport_proto_id;
62 /* Binary World Wide unique Port Name for FC Target Lport */ 60 /* Binary World Wide unique Port Name for FC Target Lport */
63 u64 lport_wwpn; 61 u64 lport_wwpn;
64 /* Binary World Wide unique Port Name for FC NPIV Target Lport */ 62 /* Binary World Wide unique Port Name for FC NPIV Target Lport */