aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.c38
-rw-r--r--drivers/scsi/be2iscsi/be_iscsi.c25
-rw-r--r--drivers/scsi/be2iscsi/be_iscsi.h2
-rw-r--r--drivers/scsi/be2iscsi/be_main.c12
-rw-r--r--drivers/scsi/bnx2i/bnx2i_iscsi.c37
-rw-r--r--drivers/scsi/cxgbi/cxgb3i/cxgb3i.c8
-rw-r--r--drivers/scsi/cxgbi/cxgb4i/cxgb4i.c8
-rw-r--r--drivers/scsi/cxgbi/libcxgbi.c26
-rw-r--r--drivers/scsi/cxgbi/libcxgbi.h1
-rw-r--r--drivers/scsi/iscsi_tcp.c38
-rw-r--r--drivers/scsi/qla4xxx/ql4_os.c21
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c93
-rw-r--r--include/scsi/scsi_transport_iscsi.h5
13 files changed, 229 insertions, 85 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index 9c61b9c2c597..c716722628cf 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -632,6 +632,31 @@ iscsi_iser_ep_disconnect(struct iscsi_endpoint *ep)
632 iser_conn_terminate(ib_conn); 632 iser_conn_terminate(ib_conn);
633} 633}
634 634
635static mode_t iser_attr_is_visible(int param_type, int param)
636{
637 switch (param_type) {
638 case ISCSI_PARAM:
639 switch (param) {
640 case ISCSI_PARAM_MAX_RECV_DLENGTH:
641 case ISCSI_PARAM_MAX_XMIT_DLENGTH:
642 case ISCSI_PARAM_HDRDGST_EN:
643 case ISCSI_PARAM_DATADGST_EN:
644 case ISCSI_PARAM_CONN_ADDRESS:
645 case ISCSI_PARAM_CONN_PORT:
646 case ISCSI_PARAM_EXP_STATSN:
647 case ISCSI_PARAM_PERSISTENT_ADDRESS:
648 case ISCSI_PARAM_PERSISTENT_PORT:
649 case ISCSI_PARAM_PING_TMO:
650 case ISCSI_PARAM_RECV_TMO:
651 return S_IRUGO;
652 default:
653 return 0;
654 }
655 }
656
657 return 0;
658}
659
635static struct scsi_host_template iscsi_iser_sht = { 660static struct scsi_host_template iscsi_iser_sht = {
636 .module = THIS_MODULE, 661 .module = THIS_MODULE,
637 .name = "iSCSI Initiator over iSER, v." DRV_VER, 662 .name = "iSCSI Initiator over iSER, v." DRV_VER,
@@ -653,28 +678,18 @@ static struct iscsi_transport iscsi_iser_transport = {
653 .owner = THIS_MODULE, 678 .owner = THIS_MODULE,
654 .name = "iser", 679 .name = "iser",
655 .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T, 680 .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T,
656 .param_mask = ISCSI_MAX_RECV_DLENGTH | 681 .param_mask = ISCSI_INITIAL_R2T_EN |
657 ISCSI_MAX_XMIT_DLENGTH |
658 ISCSI_HDRDGST_EN |
659 ISCSI_DATADGST_EN |
660 ISCSI_INITIAL_R2T_EN |
661 ISCSI_MAX_R2T | 682 ISCSI_MAX_R2T |
662 ISCSI_IMM_DATA_EN | 683 ISCSI_IMM_DATA_EN |
663 ISCSI_FIRST_BURST | 684 ISCSI_FIRST_BURST |
664 ISCSI_MAX_BURST | 685 ISCSI_MAX_BURST |
665 ISCSI_PDU_INORDER_EN | 686 ISCSI_PDU_INORDER_EN |
666 ISCSI_DATASEQ_INORDER_EN | 687 ISCSI_DATASEQ_INORDER_EN |
667 ISCSI_CONN_PORT |
668 ISCSI_CONN_ADDRESS |
669 ISCSI_EXP_STATSN |
670 ISCSI_PERSISTENT_PORT |
671 ISCSI_PERSISTENT_ADDRESS |
672 ISCSI_TARGET_NAME | ISCSI_TPGT | 688 ISCSI_TARGET_NAME | ISCSI_TPGT |
673 ISCSI_USERNAME | ISCSI_PASSWORD | 689 ISCSI_USERNAME | ISCSI_PASSWORD |
674 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN | 690 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN |
675 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO | 691 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO |
676 ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO | 692 ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO |
677 ISCSI_PING_TMO | ISCSI_RECV_TMO |
678 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME, 693 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME,
679 .host_param_mask = ISCSI_HOST_HWADDRESS | 694 .host_param_mask = ISCSI_HOST_HWADDRESS |
680 ISCSI_HOST_NETDEV_NAME | 695 ISCSI_HOST_NETDEV_NAME |
@@ -686,6 +701,7 @@ static struct iscsi_transport iscsi_iser_transport = {
686 .create_conn = iscsi_iser_conn_create, 701 .create_conn = iscsi_iser_conn_create,
687 .bind_conn = iscsi_iser_conn_bind, 702 .bind_conn = iscsi_iser_conn_bind,
688 .destroy_conn = iscsi_iser_conn_destroy, 703 .destroy_conn = iscsi_iser_conn_destroy,
704 .attr_is_visible = iser_attr_is_visible,
689 .set_param = iscsi_iser_set_param, 705 .set_param = iscsi_iser_set_param,
690 .get_conn_param = iscsi_conn_get_param, 706 .get_conn_param = iscsi_conn_get_param,
691 .get_ep_param = iscsi_iser_get_ep_param, 707 .get_ep_param = iscsi_iser_get_ep_param,
diff --git a/drivers/scsi/be2iscsi/be_iscsi.c b/drivers/scsi/be2iscsi/be_iscsi.c
index 3cad10605023..87b7ae1ef488 100644
--- a/drivers/scsi/be2iscsi/be_iscsi.c
+++ b/drivers/scsi/be2iscsi/be_iscsi.c
@@ -733,3 +733,28 @@ void beiscsi_ep_disconnect(struct iscsi_endpoint *ep)
733 beiscsi_unbind_conn_to_cid(phba, beiscsi_ep->ep_cid); 733 beiscsi_unbind_conn_to_cid(phba, beiscsi_ep->ep_cid);
734 iscsi_destroy_endpoint(beiscsi_ep->openiscsi_ep); 734 iscsi_destroy_endpoint(beiscsi_ep->openiscsi_ep);
735} 735}
736
737mode_t be2iscsi_attr_is_visible(int param_type, int param)
738{
739 switch (param_type) {
740 case ISCSI_PARAM:
741 switch (param) {
742 case ISCSI_PARAM_MAX_RECV_DLENGTH:
743 case ISCSI_PARAM_MAX_XMIT_DLENGTH:
744 case ISCSI_PARAM_HDRDGST_EN:
745 case ISCSI_PARAM_DATADGST_EN:
746 case ISCSI_PARAM_CONN_ADDRESS:
747 case ISCSI_PARAM_CONN_PORT:
748 case ISCSI_PARAM_EXP_STATSN:
749 case ISCSI_PARAM_PERSISTENT_ADDRESS:
750 case ISCSI_PARAM_PERSISTENT_PORT:
751 case ISCSI_PARAM_PING_TMO:
752 case ISCSI_PARAM_RECV_TMO:
753 return S_IRUGO;
754 default:
755 return 0;
756 }
757 }
758
759 return 0;
760}
diff --git a/drivers/scsi/be2iscsi/be_iscsi.h b/drivers/scsi/be2iscsi/be_iscsi.h
index ff60b7fd92d6..4a1f2e393f31 100644
--- a/drivers/scsi/be2iscsi/be_iscsi.h
+++ b/drivers/scsi/be2iscsi/be_iscsi.h
@@ -26,6 +26,8 @@
26#define BE2_IPV4 0x1 26#define BE2_IPV4 0x1
27#define BE2_IPV6 0x10 27#define BE2_IPV6 0x10
28 28
29mode_t be2iscsi_attr_is_visible(int param_type, int param);
30
29void beiscsi_offload_connection(struct beiscsi_conn *beiscsi_conn, 31void beiscsi_offload_connection(struct beiscsi_conn *beiscsi_conn,
30 struct beiscsi_offload_params *params); 32 struct beiscsi_offload_params *params);
31 33
diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
index 0a9bdfa3d939..d2a3e4a4d024 100644
--- a/drivers/scsi/be2iscsi/be_main.c
+++ b/drivers/scsi/be2iscsi/be_main.c
@@ -4364,10 +4364,7 @@ struct iscsi_transport beiscsi_iscsi_transport = {
4364 .name = DRV_NAME, 4364 .name = DRV_NAME,
4365 .caps = CAP_RECOVERY_L0 | CAP_HDRDGST | CAP_TEXT_NEGO | 4365 .caps = CAP_RECOVERY_L0 | CAP_HDRDGST | CAP_TEXT_NEGO |
4366 CAP_MULTI_R2T | CAP_DATADGST | CAP_DATA_PATH_OFFLOAD, 4366 CAP_MULTI_R2T | CAP_DATADGST | CAP_DATA_PATH_OFFLOAD,
4367 .param_mask = ISCSI_MAX_RECV_DLENGTH | 4367 .param_mask =
4368 ISCSI_MAX_XMIT_DLENGTH |
4369 ISCSI_HDRDGST_EN |
4370 ISCSI_DATADGST_EN |
4371 ISCSI_INITIAL_R2T_EN | 4368 ISCSI_INITIAL_R2T_EN |
4372 ISCSI_MAX_R2T | 4369 ISCSI_MAX_R2T |
4373 ISCSI_IMM_DATA_EN | 4370 ISCSI_IMM_DATA_EN |
@@ -4376,17 +4373,11 @@ struct iscsi_transport beiscsi_iscsi_transport = {
4376 ISCSI_PDU_INORDER_EN | 4373 ISCSI_PDU_INORDER_EN |
4377 ISCSI_DATASEQ_INORDER_EN | 4374 ISCSI_DATASEQ_INORDER_EN |
4378 ISCSI_ERL | 4375 ISCSI_ERL |
4379 ISCSI_CONN_PORT |
4380 ISCSI_CONN_ADDRESS |
4381 ISCSI_EXP_STATSN |
4382 ISCSI_PERSISTENT_PORT |
4383 ISCSI_PERSISTENT_ADDRESS |
4384 ISCSI_TARGET_NAME | ISCSI_TPGT | 4376 ISCSI_TARGET_NAME | ISCSI_TPGT |
4385 ISCSI_USERNAME | ISCSI_PASSWORD | 4377 ISCSI_USERNAME | ISCSI_PASSWORD |
4386 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN | 4378 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN |
4387 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO | 4379 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO |
4388 ISCSI_LU_RESET_TMO | 4380 ISCSI_LU_RESET_TMO |
4389 ISCSI_PING_TMO | ISCSI_RECV_TMO |
4390 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME, 4381 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME,
4391 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS | 4382 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
4392 ISCSI_HOST_INITIATOR_NAME, 4383 ISCSI_HOST_INITIATOR_NAME,
@@ -4395,6 +4386,7 @@ struct iscsi_transport beiscsi_iscsi_transport = {
4395 .create_conn = beiscsi_conn_create, 4386 .create_conn = beiscsi_conn_create,
4396 .bind_conn = beiscsi_conn_bind, 4387 .bind_conn = beiscsi_conn_bind,
4397 .destroy_conn = iscsi_conn_teardown, 4388 .destroy_conn = iscsi_conn_teardown,
4389 .attr_is_visible = be2iscsi_attr_is_visible,
4398 .set_param = beiscsi_set_param, 4390 .set_param = beiscsi_set_param,
4399 .get_conn_param = iscsi_conn_get_param, 4391 .get_conn_param = iscsi_conn_get_param,
4400 .get_session_param = iscsi_session_get_param, 4392 .get_session_param = iscsi_session_get_param,
diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c b/drivers/scsi/bnx2i/bnx2i_iscsi.c
index cffd4d75df56..2d529c9fa1ad 100644
--- a/drivers/scsi/bnx2i/bnx2i_iscsi.c
+++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c
@@ -2177,6 +2177,30 @@ static int bnx2i_nl_set_path(struct Scsi_Host *shost, struct iscsi_path *params)
2177 return 0; 2177 return 0;
2178} 2178}
2179 2179
2180static mode_t bnx2i_attr_is_visible(int param_type, int param)
2181{
2182 switch (param_type) {
2183 case ISCSI_PARAM:
2184 switch (param) {
2185 case ISCSI_PARAM_MAX_RECV_DLENGTH:
2186 case ISCSI_PARAM_MAX_XMIT_DLENGTH:
2187 case ISCSI_PARAM_HDRDGST_EN:
2188 case ISCSI_PARAM_DATADGST_EN:
2189 case ISCSI_PARAM_CONN_ADDRESS:
2190 case ISCSI_PARAM_CONN_PORT:
2191 case ISCSI_PARAM_EXP_STATSN:
2192 case ISCSI_PARAM_PERSISTENT_ADDRESS:
2193 case ISCSI_PARAM_PERSISTENT_PORT:
2194 case ISCSI_PARAM_PING_TMO:
2195 case ISCSI_PARAM_RECV_TMO:
2196 return S_IRUGO;
2197 default:
2198 return 0;
2199 }
2200 }
2201
2202 return 0;
2203}
2180 2204
2181/* 2205/*
2182 * 'Scsi_Host_Template' structure and 'iscsi_tranport' structure template 2206 * 'Scsi_Host_Template' structure and 'iscsi_tranport' structure template
@@ -2207,11 +2231,7 @@ struct iscsi_transport bnx2i_iscsi_transport = {
2207 CAP_MULTI_R2T | CAP_DATADGST | 2231 CAP_MULTI_R2T | CAP_DATADGST |
2208 CAP_DATA_PATH_OFFLOAD | 2232 CAP_DATA_PATH_OFFLOAD |
2209 CAP_TEXT_NEGO, 2233 CAP_TEXT_NEGO,
2210 .param_mask = ISCSI_MAX_RECV_DLENGTH | 2234 .param_mask = ISCSI_INITIAL_R2T_EN |
2211 ISCSI_MAX_XMIT_DLENGTH |
2212 ISCSI_HDRDGST_EN |
2213 ISCSI_DATADGST_EN |
2214 ISCSI_INITIAL_R2T_EN |
2215 ISCSI_MAX_R2T | 2235 ISCSI_MAX_R2T |
2216 ISCSI_IMM_DATA_EN | 2236 ISCSI_IMM_DATA_EN |
2217 ISCSI_FIRST_BURST | 2237 ISCSI_FIRST_BURST |
@@ -2219,17 +2239,11 @@ struct iscsi_transport bnx2i_iscsi_transport = {
2219 ISCSI_PDU_INORDER_EN | 2239 ISCSI_PDU_INORDER_EN |
2220 ISCSI_DATASEQ_INORDER_EN | 2240 ISCSI_DATASEQ_INORDER_EN |
2221 ISCSI_ERL | 2241 ISCSI_ERL |
2222 ISCSI_CONN_PORT |
2223 ISCSI_CONN_ADDRESS |
2224 ISCSI_EXP_STATSN |
2225 ISCSI_PERSISTENT_PORT |
2226 ISCSI_PERSISTENT_ADDRESS |
2227 ISCSI_TARGET_NAME | ISCSI_TPGT | 2242 ISCSI_TARGET_NAME | ISCSI_TPGT |
2228 ISCSI_USERNAME | ISCSI_PASSWORD | 2243 ISCSI_USERNAME | ISCSI_PASSWORD |
2229 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN | 2244 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN |
2230 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO | 2245 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO |
2231 ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO | 2246 ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO |
2232 ISCSI_PING_TMO | ISCSI_RECV_TMO |
2233 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME, 2247 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME,
2234 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS | 2248 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
2235 ISCSI_HOST_NETDEV_NAME, 2249 ISCSI_HOST_NETDEV_NAME,
@@ -2238,6 +2252,7 @@ struct iscsi_transport bnx2i_iscsi_transport = {
2238 .create_conn = bnx2i_conn_create, 2252 .create_conn = bnx2i_conn_create,
2239 .bind_conn = bnx2i_conn_bind, 2253 .bind_conn = bnx2i_conn_bind,
2240 .destroy_conn = bnx2i_conn_destroy, 2254 .destroy_conn = bnx2i_conn_destroy,
2255 .attr_is_visible = bnx2i_attr_is_visible,
2241 .set_param = iscsi_set_param, 2256 .set_param = iscsi_set_param,
2242 .get_conn_param = iscsi_conn_get_param, 2257 .get_conn_param = iscsi_conn_get_param,
2243 .get_session_param = iscsi_session_get_param, 2258 .get_session_param = iscsi_session_get_param,
diff --git a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
index bd22041e2789..c13b3f0a4f03 100644
--- a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
+++ b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
@@ -106,25 +106,21 @@ static struct iscsi_transport cxgb3i_iscsi_transport = {
106 .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST 106 .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
107 | CAP_DATADGST | CAP_DIGEST_OFFLOAD | 107 | CAP_DATADGST | CAP_DIGEST_OFFLOAD |
108 CAP_PADDING_OFFLOAD | CAP_TEXT_NEGO, 108 CAP_PADDING_OFFLOAD | CAP_TEXT_NEGO,
109 .param_mask = ISCSI_MAX_RECV_DLENGTH | ISCSI_MAX_XMIT_DLENGTH | 109 .param_mask =
110 ISCSI_HDRDGST_EN | ISCSI_DATADGST_EN |
111 ISCSI_INITIAL_R2T_EN | ISCSI_MAX_R2T | 110 ISCSI_INITIAL_R2T_EN | ISCSI_MAX_R2T |
112 ISCSI_IMM_DATA_EN | ISCSI_FIRST_BURST | 111 ISCSI_IMM_DATA_EN | ISCSI_FIRST_BURST |
113 ISCSI_MAX_BURST | ISCSI_PDU_INORDER_EN | 112 ISCSI_MAX_BURST | ISCSI_PDU_INORDER_EN |
114 ISCSI_DATASEQ_INORDER_EN | ISCSI_ERL | 113 ISCSI_DATASEQ_INORDER_EN | ISCSI_ERL |
115 ISCSI_CONN_PORT | ISCSI_CONN_ADDRESS |
116 ISCSI_EXP_STATSN | ISCSI_PERSISTENT_PORT |
117 ISCSI_PERSISTENT_ADDRESS |
118 ISCSI_TARGET_NAME | ISCSI_TPGT | 114 ISCSI_TARGET_NAME | ISCSI_TPGT |
119 ISCSI_USERNAME | ISCSI_PASSWORD | 115 ISCSI_USERNAME | ISCSI_PASSWORD |
120 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN | 116 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN |
121 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO | 117 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO |
122 ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO | 118 ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO |
123 ISCSI_PING_TMO | ISCSI_RECV_TMO |
124 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME, 119 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME,
125 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS | 120 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
126 ISCSI_HOST_INITIATOR_NAME | 121 ISCSI_HOST_INITIATOR_NAME |
127 ISCSI_HOST_NETDEV_NAME, 122 ISCSI_HOST_NETDEV_NAME,
123 .attr_is_visible = cxgbi_attr_is_visible,
128 .get_host_param = cxgbi_get_host_param, 124 .get_host_param = cxgbi_get_host_param,
129 .set_host_param = cxgbi_set_host_param, 125 .set_host_param = cxgbi_set_host_param,
130 /* session management */ 126 /* session management */
diff --git a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
index ae13c4993aa3..89fca4b0787c 100644
--- a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
+++ b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
@@ -107,25 +107,21 @@ static struct iscsi_transport cxgb4i_iscsi_transport = {
107 .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST | 107 .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST |
108 CAP_DATADGST | CAP_DIGEST_OFFLOAD | 108 CAP_DATADGST | CAP_DIGEST_OFFLOAD |
109 CAP_PADDING_OFFLOAD | CAP_TEXT_NEGO, 109 CAP_PADDING_OFFLOAD | CAP_TEXT_NEGO,
110 .param_mask = ISCSI_MAX_RECV_DLENGTH | ISCSI_MAX_XMIT_DLENGTH | 110 .param_mask =
111 ISCSI_HDRDGST_EN | ISCSI_DATADGST_EN |
112 ISCSI_INITIAL_R2T_EN | ISCSI_MAX_R2T | 111 ISCSI_INITIAL_R2T_EN | ISCSI_MAX_R2T |
113 ISCSI_IMM_DATA_EN | ISCSI_FIRST_BURST | 112 ISCSI_IMM_DATA_EN | ISCSI_FIRST_BURST |
114 ISCSI_MAX_BURST | ISCSI_PDU_INORDER_EN | 113 ISCSI_MAX_BURST | ISCSI_PDU_INORDER_EN |
115 ISCSI_DATASEQ_INORDER_EN | ISCSI_ERL | 114 ISCSI_DATASEQ_INORDER_EN | ISCSI_ERL |
116 ISCSI_CONN_PORT | ISCSI_CONN_ADDRESS |
117 ISCSI_EXP_STATSN | ISCSI_PERSISTENT_PORT |
118 ISCSI_PERSISTENT_ADDRESS |
119 ISCSI_TARGET_NAME | ISCSI_TPGT | 115 ISCSI_TARGET_NAME | ISCSI_TPGT |
120 ISCSI_USERNAME | ISCSI_PASSWORD | 116 ISCSI_USERNAME | ISCSI_PASSWORD |
121 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN | 117 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN |
122 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO | 118 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO |
123 ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO | 119 ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO |
124 ISCSI_PING_TMO | ISCSI_RECV_TMO |
125 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME, 120 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME,
126 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS | 121 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
127 ISCSI_HOST_INITIATOR_NAME | 122 ISCSI_HOST_INITIATOR_NAME |
128 ISCSI_HOST_NETDEV_NAME, 123 ISCSI_HOST_NETDEV_NAME,
124 .attr_is_visible = cxgbi_attr_is_visible,
129 .get_host_param = cxgbi_get_host_param, 125 .get_host_param = cxgbi_get_host_param,
130 .set_host_param = cxgbi_set_host_param, 126 .set_host_param = cxgbi_set_host_param,
131 /* session management */ 127 /* session management */
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c
index 77ac217ad5ce..e5f4f968ed7b 100644
--- a/drivers/scsi/cxgbi/libcxgbi.c
+++ b/drivers/scsi/cxgbi/libcxgbi.c
@@ -2566,6 +2566,32 @@ void cxgbi_iscsi_cleanup(struct iscsi_transport *itp,
2566} 2566}
2567EXPORT_SYMBOL_GPL(cxgbi_iscsi_cleanup); 2567EXPORT_SYMBOL_GPL(cxgbi_iscsi_cleanup);
2568 2568
2569mode_t cxgbi_attr_is_visible(int param_type, int param)
2570{
2571 switch (param_type) {
2572 case ISCSI_PARAM:
2573 switch (param) {
2574 case ISCSI_PARAM_MAX_RECV_DLENGTH:
2575 case ISCSI_PARAM_MAX_XMIT_DLENGTH:
2576 case ISCSI_PARAM_HDRDGST_EN:
2577 case ISCSI_PARAM_DATADGST_EN:
2578 case ISCSI_PARAM_CONN_ADDRESS:
2579 case ISCSI_PARAM_CONN_PORT:
2580 case ISCSI_PARAM_EXP_STATSN:
2581 case ISCSI_PARAM_PERSISTENT_ADDRESS:
2582 case ISCSI_PARAM_PERSISTENT_PORT:
2583 case ISCSI_PARAM_PING_TMO:
2584 case ISCSI_PARAM_RECV_TMO:
2585 return S_IRUGO;
2586 default:
2587 return 0;
2588 }
2589 }
2590
2591 return 0;
2592}
2593EXPORT_SYMBOL_GPL(cxgbi_attr_is_visible);
2594
2569static int __init libcxgbi_init_module(void) 2595static int __init libcxgbi_init_module(void)
2570{ 2596{
2571 sw_tag_idx_bits = (__ilog2_u32(ISCSI_ITT_MASK)) + 1; 2597 sw_tag_idx_bits = (__ilog2_u32(ISCSI_ITT_MASK)) + 1;
diff --git a/drivers/scsi/cxgbi/libcxgbi.h b/drivers/scsi/cxgbi/libcxgbi.h
index 9267844519c9..5d453a0dba1f 100644
--- a/drivers/scsi/cxgbi/libcxgbi.h
+++ b/drivers/scsi/cxgbi/libcxgbi.h
@@ -709,6 +709,7 @@ int cxgbi_conn_xmit_pdu(struct iscsi_task *);
709 709
710void cxgbi_cleanup_task(struct iscsi_task *task); 710void cxgbi_cleanup_task(struct iscsi_task *task);
711 711
712mode_t cxgbi_attr_is_visible(int param_type, int param);
712void cxgbi_get_conn_stats(struct iscsi_cls_conn *, struct iscsi_stats *); 713void cxgbi_get_conn_stats(struct iscsi_cls_conn *, struct iscsi_stats *);
713int cxgbi_set_conn_param(struct iscsi_cls_conn *, 714int cxgbi_set_conn_param(struct iscsi_cls_conn *,
714 enum iscsi_param, char *, int); 715 enum iscsi_param, char *, int);
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index 7724414588fa..1dcb4d183bc9 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -872,6 +872,31 @@ static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session *cls_session)
872 iscsi_host_free(shost); 872 iscsi_host_free(shost);
873} 873}
874 874
875static mode_t iscsi_sw_tcp_attr_is_visible(int param_type, int param)
876{
877 switch (param_type) {
878 case ISCSI_PARAM:
879 switch (param) {
880 case ISCSI_PARAM_MAX_RECV_DLENGTH:
881 case ISCSI_PARAM_MAX_XMIT_DLENGTH:
882 case ISCSI_PARAM_HDRDGST_EN:
883 case ISCSI_PARAM_DATADGST_EN:
884 case ISCSI_PARAM_CONN_ADDRESS:
885 case ISCSI_PARAM_CONN_PORT:
886 case ISCSI_PARAM_EXP_STATSN:
887 case ISCSI_PARAM_PERSISTENT_ADDRESS:
888 case ISCSI_PARAM_PERSISTENT_PORT:
889 case ISCSI_PARAM_PING_TMO:
890 case ISCSI_PARAM_RECV_TMO:
891 return S_IRUGO;
892 default:
893 return 0;
894 }
895 }
896
897 return 0;
898}
899
875static int iscsi_sw_tcp_slave_alloc(struct scsi_device *sdev) 900static int iscsi_sw_tcp_slave_alloc(struct scsi_device *sdev)
876{ 901{
877 set_bit(QUEUE_FLAG_BIDI, &sdev->request_queue->queue_flags); 902 set_bit(QUEUE_FLAG_BIDI, &sdev->request_queue->queue_flags);
@@ -910,11 +935,7 @@ static struct iscsi_transport iscsi_sw_tcp_transport = {
910 .name = "tcp", 935 .name = "tcp",
911 .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST 936 .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
912 | CAP_DATADGST, 937 | CAP_DATADGST,
913 .param_mask = ISCSI_MAX_RECV_DLENGTH | 938 .param_mask = ISCSI_INITIAL_R2T_EN |
914 ISCSI_MAX_XMIT_DLENGTH |
915 ISCSI_HDRDGST_EN |
916 ISCSI_DATADGST_EN |
917 ISCSI_INITIAL_R2T_EN |
918 ISCSI_MAX_R2T | 939 ISCSI_MAX_R2T |
919 ISCSI_IMM_DATA_EN | 940 ISCSI_IMM_DATA_EN |
920 ISCSI_FIRST_BURST | 941 ISCSI_FIRST_BURST |
@@ -922,17 +943,11 @@ static struct iscsi_transport iscsi_sw_tcp_transport = {
922 ISCSI_PDU_INORDER_EN | 943 ISCSI_PDU_INORDER_EN |
923 ISCSI_DATASEQ_INORDER_EN | 944 ISCSI_DATASEQ_INORDER_EN |
924 ISCSI_ERL | 945 ISCSI_ERL |
925 ISCSI_CONN_PORT |
926 ISCSI_CONN_ADDRESS |
927 ISCSI_EXP_STATSN |
928 ISCSI_PERSISTENT_PORT |
929 ISCSI_PERSISTENT_ADDRESS |
930 ISCSI_TARGET_NAME | ISCSI_TPGT | 946 ISCSI_TARGET_NAME | ISCSI_TPGT |
931 ISCSI_USERNAME | ISCSI_PASSWORD | 947 ISCSI_USERNAME | ISCSI_PASSWORD |
932 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN | 948 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN |
933 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO | 949 ISCSI_FAST_ABORT | ISCSI_ABORT_TMO |
934 ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO | 950 ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO |
935 ISCSI_PING_TMO | ISCSI_RECV_TMO |
936 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME, 951 ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME,
937 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS | 952 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
938 ISCSI_HOST_INITIATOR_NAME | 953 ISCSI_HOST_INITIATOR_NAME |
@@ -944,6 +959,7 @@ static struct iscsi_transport iscsi_sw_tcp_transport = {
944 .create_conn = iscsi_sw_tcp_conn_create, 959 .create_conn = iscsi_sw_tcp_conn_create,
945 .bind_conn = iscsi_sw_tcp_conn_bind, 960 .bind_conn = iscsi_sw_tcp_conn_bind,
946 .destroy_conn = iscsi_sw_tcp_conn_destroy, 961 .destroy_conn = iscsi_sw_tcp_conn_destroy,
962 .attr_is_visible = iscsi_sw_tcp_attr_is_visible,
947 .set_param = iscsi_sw_tcp_conn_set_param, 963 .set_param = iscsi_sw_tcp_conn_set_param,
948 .get_conn_param = iscsi_sw_tcp_conn_get_param, 964 .get_conn_param = iscsi_sw_tcp_conn_get_param,
949 .get_session_param = iscsi_session_get_param, 965 .get_session_param = iscsi_session_get_param,
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index 32df0c5fc9cc..f8a1506cb76a 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -100,6 +100,7 @@ static int qla4xxx_slave_alloc(struct scsi_device *device);
100static int qla4xxx_slave_configure(struct scsi_device *device); 100static int qla4xxx_slave_configure(struct scsi_device *device);
101static void qla4xxx_slave_destroy(struct scsi_device *sdev); 101static void qla4xxx_slave_destroy(struct scsi_device *sdev);
102static void qla4xxx_scan_start(struct Scsi_Host *shost); 102static void qla4xxx_scan_start(struct Scsi_Host *shost);
103static mode_t ql4_attr_is_visible(int param_type, int param);
103 104
104static struct qla4_8xxx_legacy_intr_set legacy_intr[] = 105static struct qla4_8xxx_legacy_intr_set legacy_intr[] =
105 QLA82XX_LEGACY_INTR_CONFIG; 106 QLA82XX_LEGACY_INTR_CONFIG;
@@ -137,8 +138,7 @@ static struct iscsi_transport qla4xxx_iscsi_transport = {
137 .name = DRIVER_NAME, 138 .name = DRIVER_NAME,
138 .caps = CAP_FW_DB | CAP_SENDTARGETS_OFFLOAD | 139 .caps = CAP_FW_DB | CAP_SENDTARGETS_OFFLOAD |
139 CAP_DATA_PATH_OFFLOAD, 140 CAP_DATA_PATH_OFFLOAD,
140 .param_mask = ISCSI_CONN_PORT | ISCSI_CONN_ADDRESS | 141 .param_mask = ISCSI_TARGET_NAME | ISCSI_TPGT |
141 ISCSI_TARGET_NAME | ISCSI_TPGT |
142 ISCSI_TARGET_ALIAS, 142 ISCSI_TARGET_ALIAS,
143 .host_param_mask = ISCSI_HOST_HWADDRESS | 143 .host_param_mask = ISCSI_HOST_HWADDRESS |
144 ISCSI_HOST_IPADDRESS | 144 ISCSI_HOST_IPADDRESS |
@@ -155,6 +155,7 @@ static struct iscsi_transport qla4xxx_iscsi_transport = {
155 ISCSI_NET_IPV6_LINKLOCAL_AUTOCFG | 155 ISCSI_NET_IPV6_LINKLOCAL_AUTOCFG |
156 ISCSI_NET_IFACE_ENABLE, 156 ISCSI_NET_IFACE_ENABLE,
157 .tgt_dscvr = qla4xxx_tgt_dscvr, 157 .tgt_dscvr = qla4xxx_tgt_dscvr,
158 .attr_is_visible = ql4_attr_is_visible,
158 .get_conn_param = qla4xxx_conn_get_param, 159 .get_conn_param = qla4xxx_conn_get_param,
159 .get_session_param = qla4xxx_sess_get_param, 160 .get_session_param = qla4xxx_sess_get_param,
160 .get_host_param = qla4xxx_host_get_param, 161 .get_host_param = qla4xxx_host_get_param,
@@ -165,6 +166,22 @@ static struct iscsi_transport qla4xxx_iscsi_transport = {
165 166
166static struct scsi_transport_template *qla4xxx_scsi_transport; 167static struct scsi_transport_template *qla4xxx_scsi_transport;
167 168
169static mode_t ql4_attr_is_visible(int param_type, int param)
170{
171 switch (param_type) {
172 case ISCSI_PARAM:
173 switch (param) {
174 case ISCSI_PARAM_CONN_ADDRESS:
175 case ISCSI_PARAM_CONN_PORT:
176 return S_IRUGO;
177 default:
178 return 0;
179 }
180 }
181
182 return 0;
183}
184
168static int qla4xxx_get_iface_param(struct iscsi_iface *iface, 185static int qla4xxx_get_iface_param(struct iscsi_iface *iface,
169 enum iscsi_param_type param_type, 186 enum iscsi_param_type param_type,
170 int param, char *buf) 187 int param, char *buf)
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 4d5e64f429e7..e9eca98e1102 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -78,7 +78,6 @@ struct iscsi_internal {
78 78
79 struct device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1]; 79 struct device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1];
80 struct transport_container conn_cont; 80 struct transport_container conn_cont;
81 struct device_attribute *conn_attrs[ISCSI_CONN_ATTRS + 1];
82 struct transport_container session_cont; 81 struct transport_container session_cont;
83 struct device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1]; 82 struct device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1];
84}; 83};
@@ -2030,6 +2029,70 @@ static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, \
2030iscsi_conn_ep_attr(address, ISCSI_PARAM_CONN_ADDRESS); 2029iscsi_conn_ep_attr(address, ISCSI_PARAM_CONN_ADDRESS);
2031iscsi_conn_ep_attr(port, ISCSI_PARAM_CONN_PORT); 2030iscsi_conn_ep_attr(port, ISCSI_PARAM_CONN_PORT);
2032 2031
2032static struct attribute *iscsi_conn_attrs[] = {
2033 &dev_attr_conn_max_recv_dlength.attr,
2034 &dev_attr_conn_max_xmit_dlength.attr,
2035 &dev_attr_conn_header_digest.attr,
2036 &dev_attr_conn_data_digest.attr,
2037 &dev_attr_conn_ifmarker.attr,
2038 &dev_attr_conn_ofmarker.attr,
2039 &dev_attr_conn_address.attr,
2040 &dev_attr_conn_port.attr,
2041 &dev_attr_conn_exp_statsn.attr,
2042 &dev_attr_conn_persistent_address.attr,
2043 &dev_attr_conn_persistent_port.attr,
2044 &dev_attr_conn_ping_tmo.attr,
2045 &dev_attr_conn_recv_tmo.attr,
2046 NULL,
2047};
2048
2049static mode_t iscsi_conn_attr_is_visible(struct kobject *kobj,
2050 struct attribute *attr, int i)
2051{
2052 struct device *cdev = container_of(kobj, struct device, kobj);
2053 struct iscsi_cls_conn *conn = transport_class_to_conn(cdev);
2054 struct iscsi_transport *t = conn->transport;
2055 int param;
2056
2057 if (attr == &dev_attr_conn_max_recv_dlength.attr)
2058 param = ISCSI_PARAM_MAX_RECV_DLENGTH;
2059 else if (attr == &dev_attr_conn_max_xmit_dlength.attr)
2060 param = ISCSI_PARAM_MAX_XMIT_DLENGTH;
2061 else if (attr == &dev_attr_conn_header_digest.attr)
2062 param = ISCSI_PARAM_HDRDGST_EN;
2063 else if (attr == &dev_attr_conn_data_digest.attr)
2064 param = ISCSI_PARAM_DATADGST_EN;
2065 else if (attr == &dev_attr_conn_ifmarker.attr)
2066 param = ISCSI_PARAM_IFMARKER_EN;
2067 else if (attr == &dev_attr_conn_ofmarker.attr)
2068 param = ISCSI_PARAM_OFMARKER_EN;
2069 else if (attr == &dev_attr_conn_address.attr)
2070 param = ISCSI_PARAM_CONN_ADDRESS;
2071 else if (attr == &dev_attr_conn_port.attr)
2072 param = ISCSI_PARAM_CONN_PORT;
2073 else if (attr == &dev_attr_conn_exp_statsn.attr)
2074 param = ISCSI_PARAM_EXP_STATSN;
2075 else if (attr == &dev_attr_conn_persistent_address.attr)
2076 param = ISCSI_PARAM_PERSISTENT_ADDRESS;
2077 else if (attr == &dev_attr_conn_persistent_port.attr)
2078 param = ISCSI_PARAM_PERSISTENT_PORT;
2079 else if (attr == &dev_attr_conn_ping_tmo.attr)
2080 param = ISCSI_PARAM_PING_TMO;
2081 else if (attr == &dev_attr_conn_recv_tmo.attr)
2082 param = ISCSI_PARAM_RECV_TMO;
2083 else {
2084 WARN_ONCE(1, "Invalid conn attr");
2085 return 0;
2086 }
2087
2088 return t->attr_is_visible(ISCSI_PARAM, param);
2089}
2090
2091static struct attribute_group iscsi_conn_group = {
2092 .attrs = iscsi_conn_attrs,
2093 .is_visible = iscsi_conn_attr_is_visible,
2094};
2095
2033/* 2096/*
2034 * iSCSI session attrs 2097 * iSCSI session attrs
2035 */ 2098 */
@@ -2171,14 +2234,6 @@ do { \
2171 } \ 2234 } \
2172} while (0) 2235} while (0)
2173 2236
2174#define SETUP_CONN_RD_ATTR(field, param_flag) \
2175do { \
2176 if (tt->param_mask & param_flag) { \
2177 priv->conn_attrs[count] = &dev_attr_conn_##field; \
2178 count++; \
2179 } \
2180} while (0)
2181
2182#define SETUP_HOST_RD_ATTR(field, param_flag) \ 2237#define SETUP_HOST_RD_ATTR(field, param_flag) \
2183do { \ 2238do { \
2184 if (tt->host_param_mask & param_flag) { \ 2239 if (tt->host_param_mask & param_flag) { \
@@ -2299,29 +2354,11 @@ iscsi_register_transport(struct iscsi_transport *tt)
2299 count = 0; 2354 count = 0;
2300 2355
2301 /* connection parameters */ 2356 /* connection parameters */
2302 priv->conn_cont.ac.attrs = &priv->conn_attrs[0];
2303 priv->conn_cont.ac.class = &iscsi_connection_class.class; 2357 priv->conn_cont.ac.class = &iscsi_connection_class.class;
2304 priv->conn_cont.ac.match = iscsi_conn_match; 2358 priv->conn_cont.ac.match = iscsi_conn_match;
2359 priv->conn_cont.ac.grp = &iscsi_conn_group;
2305 transport_container_register(&priv->conn_cont); 2360 transport_container_register(&priv->conn_cont);
2306 2361
2307 SETUP_CONN_RD_ATTR(max_recv_dlength, ISCSI_MAX_RECV_DLENGTH);
2308 SETUP_CONN_RD_ATTR(max_xmit_dlength, ISCSI_MAX_XMIT_DLENGTH);
2309 SETUP_CONN_RD_ATTR(header_digest, ISCSI_HDRDGST_EN);
2310 SETUP_CONN_RD_ATTR(data_digest, ISCSI_DATADGST_EN);
2311 SETUP_CONN_RD_ATTR(ifmarker, ISCSI_IFMARKER_EN);
2312 SETUP_CONN_RD_ATTR(ofmarker, ISCSI_OFMARKER_EN);
2313 SETUP_CONN_RD_ATTR(address, ISCSI_CONN_ADDRESS);
2314 SETUP_CONN_RD_ATTR(port, ISCSI_CONN_PORT);
2315 SETUP_CONN_RD_ATTR(exp_statsn, ISCSI_EXP_STATSN);
2316 SETUP_CONN_RD_ATTR(persistent_address, ISCSI_PERSISTENT_ADDRESS);
2317 SETUP_CONN_RD_ATTR(persistent_port, ISCSI_PERSISTENT_PORT);
2318 SETUP_CONN_RD_ATTR(ping_tmo, ISCSI_PING_TMO);
2319 SETUP_CONN_RD_ATTR(recv_tmo, ISCSI_RECV_TMO);
2320
2321 BUG_ON(count > ISCSI_CONN_ATTRS);
2322 priv->conn_attrs[count] = NULL;
2323 count = 0;
2324
2325 /* session parameters */ 2362 /* session parameters */
2326 priv->session_cont.ac.attrs = &priv->session_attrs[0]; 2363 priv->session_cont.ac.attrs = &priv->session_attrs[0];
2327 priv->session_cont.ac.class = &iscsi_session_class.class; 2364 priv->session_cont.ac.class = &iscsi_session_class.class;
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index e1f210a173a5..8918329feaac 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -144,8 +144,10 @@ struct iscsi_transport {
144 int (*get_iface_param) (struct iscsi_iface *iface, 144 int (*get_iface_param) (struct iscsi_iface *iface,
145 enum iscsi_param_type param_type, 145 enum iscsi_param_type param_type,
146 int param, char *buf); 146 int param, char *buf);
147 mode_t (*attr_is_visible)(int param_type, int param);
147}; 148};
148 149
150
149/* 151/*
150 * transport registration upcalls 152 * transport registration upcalls
151 */ 153 */
@@ -178,6 +180,9 @@ struct iscsi_cls_conn {
178#define iscsi_dev_to_conn(_dev) \ 180#define iscsi_dev_to_conn(_dev) \
179 container_of(_dev, struct iscsi_cls_conn, dev) 181 container_of(_dev, struct iscsi_cls_conn, dev)
180 182
183#define transport_class_to_conn(_cdev) \
184 iscsi_dev_to_conn(_cdev->parent)
185
181#define iscsi_conn_to_session(_conn) \ 186#define iscsi_conn_to_session(_conn) \
182 iscsi_dev_to_session(_conn->dev.parent) 187 iscsi_dev_to_session(_conn->dev.parent)
183 188