1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * iSCSI transport class definitions
5 * Copyright (C) IBM Corporation, 2004
6 * Copyright (C) Mike Christie, 2004 - 2005
7 * Copyright (C) Dmitry Yusupov, 2004 - 2005
8 * Copyright (C) Alex Aizman, 2004 - 2005
10 #include <linux/module.h>
11 #include <linux/mutex.h>
12 #include <linux/slab.h>
13 #include <linux/bsg-lib.h>
14 #include <linux/idr.h>
16 #include <scsi/scsi.h>
17 #include <scsi/scsi_host.h>
18 #include <scsi/scsi_device.h>
19 #include <scsi/scsi_transport.h>
20 #include <scsi/scsi_transport_iscsi.h>
21 #include <scsi/iscsi_if.h>
22 #include <scsi/scsi_cmnd.h>
23 #include <scsi/scsi_bsg_iscsi.h>
25 #define ISCSI_TRANSPORT_VERSION "2.0-870"
27 #define ISCSI_SEND_MAX_ALLOWED 10
29 #define CREATE_TRACE_POINTS
30 #include <trace/events/iscsi.h>
33 * Export tracepoint symbols to be used by other modules.
35 EXPORT_TRACEPOINT_SYMBOL_GPL(iscsi_dbg_conn
);
36 EXPORT_TRACEPOINT_SYMBOL_GPL(iscsi_dbg_eh
);
37 EXPORT_TRACEPOINT_SYMBOL_GPL(iscsi_dbg_session
);
38 EXPORT_TRACEPOINT_SYMBOL_GPL(iscsi_dbg_tcp
);
39 EXPORT_TRACEPOINT_SYMBOL_GPL(iscsi_dbg_sw_tcp
);
41 static int dbg_session
;
42 module_param_named(debug_session
, dbg_session
, int,
44 MODULE_PARM_DESC(debug_session
,
45 "Turn on debugging for sessions in scsi_transport_iscsi "
46 "module. Set to 1 to turn on, and zero to turn off. Default "
50 module_param_named(debug_conn
, dbg_conn
, int,
52 MODULE_PARM_DESC(debug_conn
,
53 "Turn on debugging for connections in scsi_transport_iscsi "
54 "module. Set to 1 to turn on, and zero to turn off. Default "
57 #define ISCSI_DBG_TRANS_SESSION(_session, dbg_fmt, arg...) \
60 iscsi_cls_session_printk(KERN_INFO, _session, \
63 iscsi_dbg_trace(trace_iscsi_dbg_trans_session, \
65 "%s " dbg_fmt, __func__, ##arg); \
68 #define ISCSI_DBG_TRANS_CONN(_conn, dbg_fmt, arg...) \
71 iscsi_cls_conn_printk(KERN_INFO, _conn, \
74 iscsi_dbg_trace(trace_iscsi_dbg_trans_conn, \
76 "%s " dbg_fmt, __func__, ##arg); \
79 struct iscsi_internal
{
80 struct scsi_transport_template t
;
81 struct iscsi_transport
*iscsi_transport
;
82 struct list_head list
;
85 struct transport_container conn_cont
;
86 struct transport_container session_cont
;
89 static DEFINE_IDR(iscsi_ep_idr
);
90 static DEFINE_MUTEX(iscsi_ep_idr_mutex
);
92 static atomic_t iscsi_session_nr
; /* sysfs session id for next new session */
94 static struct workqueue_struct
*iscsi_conn_cleanup_workq
;
96 static DEFINE_IDA(iscsi_sess_ida
);
98 * list of registered transports and lock that must
99 * be held while accessing list. The iscsi_transport_lock must
100 * be acquired after the rx_queue_mutex.
102 static LIST_HEAD(iscsi_transports
);
103 static DEFINE_SPINLOCK(iscsi_transport_lock
);
105 #define to_iscsi_internal(tmpl) \
106 container_of(tmpl, struct iscsi_internal, t)
108 #define dev_to_iscsi_internal(_dev) \
109 container_of(_dev, struct iscsi_internal, dev)
111 static void iscsi_transport_release(struct device
*dev
)
113 struct iscsi_internal
*priv
= dev_to_iscsi_internal(dev
);
118 * iscsi_transport_class represents the iscsi_transports that are
121 static struct class iscsi_transport_class
= {
122 .name
= "iscsi_transport",
123 .dev_release
= iscsi_transport_release
,
127 show_transport_handle(struct device
*dev
, struct device_attribute
*attr
,
130 struct iscsi_internal
*priv
= dev_to_iscsi_internal(dev
);
132 if (!capable(CAP_SYS_ADMIN
))
134 return sysfs_emit(buf
, "%llu\n",
135 (unsigned long long)iscsi_handle(priv
->iscsi_transport
));
137 static DEVICE_ATTR(handle
, S_IRUGO
, show_transport_handle
, NULL
);
139 #define show_transport_attr(name, format) \
141 show_transport_##name(struct device *dev, \
142 struct device_attribute *attr,char *buf) \
144 struct iscsi_internal *priv = dev_to_iscsi_internal(dev); \
145 return sysfs_emit(buf, format"\n", priv->iscsi_transport->name);\
147 static DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL);
149 show_transport_attr(caps
, "0x%x");
151 static struct attribute
*iscsi_transport_attrs
[] = {
152 &dev_attr_handle
.attr
,
157 static struct attribute_group iscsi_transport_group
= {
158 .attrs
= iscsi_transport_attrs
,
162 * iSCSI endpoint attrs
164 #define iscsi_dev_to_endpoint(_dev) \
165 container_of(_dev, struct iscsi_endpoint, dev)
167 #define ISCSI_ATTR(_prefix,_name,_mode,_show,_store) \
168 struct device_attribute dev_attr_##_prefix##_##_name = \
169 __ATTR(_name,_mode,_show,_store)
171 static void iscsi_endpoint_release(struct device
*dev
)
173 struct iscsi_endpoint
*ep
= iscsi_dev_to_endpoint(dev
);
175 mutex_lock(&iscsi_ep_idr_mutex
);
176 idr_remove(&iscsi_ep_idr
, ep
->id
);
177 mutex_unlock(&iscsi_ep_idr_mutex
);
182 static struct class iscsi_endpoint_class
= {
183 .name
= "iscsi_endpoint",
184 .dev_release
= iscsi_endpoint_release
,
188 show_ep_handle(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
190 struct iscsi_endpoint
*ep
= iscsi_dev_to_endpoint(dev
);
191 return sysfs_emit(buf
, "%d\n", ep
->id
);
193 static ISCSI_ATTR(ep
, handle
, S_IRUGO
, show_ep_handle
, NULL
);
195 static struct attribute
*iscsi_endpoint_attrs
[] = {
196 &dev_attr_ep_handle
.attr
,
200 static struct attribute_group iscsi_endpoint_group
= {
201 .attrs
= iscsi_endpoint_attrs
,
204 struct iscsi_endpoint
*
205 iscsi_create_endpoint(int dd_size
)
207 struct iscsi_endpoint
*ep
;
210 ep
= kzalloc(sizeof(*ep
) + dd_size
, GFP_KERNEL
);
214 mutex_lock(&iscsi_ep_idr_mutex
);
217 * First endpoint id should be 1 to comply with user space
218 * applications (iscsid).
220 id
= idr_alloc(&iscsi_ep_idr
, ep
, 1, -1, GFP_NOIO
);
222 mutex_unlock(&iscsi_ep_idr_mutex
);
223 printk(KERN_ERR
"Could not allocate endpoint ID. Error %d.\n",
227 mutex_unlock(&iscsi_ep_idr_mutex
);
230 ep
->dev
.class = &iscsi_endpoint_class
;
231 dev_set_name(&ep
->dev
, "ep-%d", id
);
232 err
= device_register(&ep
->dev
);
236 err
= sysfs_create_group(&ep
->dev
.kobj
, &iscsi_endpoint_group
);
241 ep
->dd_data
= &ep
[1];
245 device_unregister(&ep
->dev
);
249 mutex_lock(&iscsi_ep_idr_mutex
);
250 idr_remove(&iscsi_ep_idr
, id
);
251 mutex_unlock(&iscsi_ep_idr_mutex
);
252 put_device(&ep
->dev
);
258 EXPORT_SYMBOL_GPL(iscsi_create_endpoint
);
260 void iscsi_destroy_endpoint(struct iscsi_endpoint
*ep
)
262 sysfs_remove_group(&ep
->dev
.kobj
, &iscsi_endpoint_group
);
263 device_unregister(&ep
->dev
);
265 EXPORT_SYMBOL_GPL(iscsi_destroy_endpoint
);
267 void iscsi_put_endpoint(struct iscsi_endpoint
*ep
)
269 put_device(&ep
->dev
);
271 EXPORT_SYMBOL_GPL(iscsi_put_endpoint
);
274 * iscsi_lookup_endpoint - get ep from handle
275 * @handle: endpoint handle
277 * Caller must do a iscsi_put_endpoint.
279 struct iscsi_endpoint
*iscsi_lookup_endpoint(u64 handle
)
281 struct iscsi_endpoint
*ep
;
283 mutex_lock(&iscsi_ep_idr_mutex
);
284 ep
= idr_find(&iscsi_ep_idr
, handle
);
288 get_device(&ep
->dev
);
290 mutex_unlock(&iscsi_ep_idr_mutex
);
293 EXPORT_SYMBOL_GPL(iscsi_lookup_endpoint
);
296 * Interface to display network param to sysfs
299 static void iscsi_iface_release(struct device
*dev
)
301 struct iscsi_iface
*iface
= iscsi_dev_to_iface(dev
);
302 struct device
*parent
= iface
->dev
.parent
;
309 static struct class iscsi_iface_class
= {
310 .name
= "iscsi_iface",
311 .dev_release
= iscsi_iface_release
,
314 #define ISCSI_IFACE_ATTR(_prefix, _name, _mode, _show, _store) \
315 struct device_attribute dev_attr_##_prefix##_##_name = \
316 __ATTR(_name, _mode, _show, _store)
318 /* iface attrs show */
319 #define iscsi_iface_attr_show(type, name, param_type, param) \
321 show_##type##_##name(struct device *dev, struct device_attribute *attr, \
324 struct iscsi_iface *iface = iscsi_dev_to_iface(dev); \
325 struct iscsi_transport *t = iface->transport; \
326 return t->get_iface_param(iface, param_type, param, buf); \
329 #define iscsi_iface_net_attr(type, name, param) \
330 iscsi_iface_attr_show(type, name, ISCSI_NET_PARAM, param) \
331 static ISCSI_IFACE_ATTR(type, name, S_IRUGO, show_##type##_##name, NULL);
333 #define iscsi_iface_attr(type, name, param) \
334 iscsi_iface_attr_show(type, name, ISCSI_IFACE_PARAM, param) \
335 static ISCSI_IFACE_ATTR(type, name, S_IRUGO, show_##type##_##name, NULL);
337 /* generic read only ipv4 attribute */
338 iscsi_iface_net_attr(ipv4_iface
, ipaddress
, ISCSI_NET_PARAM_IPV4_ADDR
);
339 iscsi_iface_net_attr(ipv4_iface
, gateway
, ISCSI_NET_PARAM_IPV4_GW
);
340 iscsi_iface_net_attr(ipv4_iface
, subnet
, ISCSI_NET_PARAM_IPV4_SUBNET
);
341 iscsi_iface_net_attr(ipv4_iface
, bootproto
, ISCSI_NET_PARAM_IPV4_BOOTPROTO
);
342 iscsi_iface_net_attr(ipv4_iface
, dhcp_dns_address_en
,
343 ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN
);
344 iscsi_iface_net_attr(ipv4_iface
, dhcp_slp_da_info_en
,
345 ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN
);
346 iscsi_iface_net_attr(ipv4_iface
, tos_en
, ISCSI_NET_PARAM_IPV4_TOS_EN
);
347 iscsi_iface_net_attr(ipv4_iface
, tos
, ISCSI_NET_PARAM_IPV4_TOS
);
348 iscsi_iface_net_attr(ipv4_iface
, grat_arp_en
,
349 ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN
);
350 iscsi_iface_net_attr(ipv4_iface
, dhcp_alt_client_id_en
,
351 ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN
);
352 iscsi_iface_net_attr(ipv4_iface
, dhcp_alt_client_id
,
353 ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID
);
354 iscsi_iface_net_attr(ipv4_iface
, dhcp_req_vendor_id_en
,
355 ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN
);
356 iscsi_iface_net_attr(ipv4_iface
, dhcp_use_vendor_id_en
,
357 ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN
);
358 iscsi_iface_net_attr(ipv4_iface
, dhcp_vendor_id
,
359 ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID
);
360 iscsi_iface_net_attr(ipv4_iface
, dhcp_learn_iqn_en
,
361 ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN
);
362 iscsi_iface_net_attr(ipv4_iface
, fragment_disable
,
363 ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE
);
364 iscsi_iface_net_attr(ipv4_iface
, incoming_forwarding_en
,
365 ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN
);
366 iscsi_iface_net_attr(ipv4_iface
, ttl
, ISCSI_NET_PARAM_IPV4_TTL
);
368 /* generic read only ipv6 attribute */
369 iscsi_iface_net_attr(ipv6_iface
, ipaddress
, ISCSI_NET_PARAM_IPV6_ADDR
);
370 iscsi_iface_net_attr(ipv6_iface
, link_local_addr
,
371 ISCSI_NET_PARAM_IPV6_LINKLOCAL
);
372 iscsi_iface_net_attr(ipv6_iface
, router_addr
, ISCSI_NET_PARAM_IPV6_ROUTER
);
373 iscsi_iface_net_attr(ipv6_iface
, ipaddr_autocfg
,
374 ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG
);
375 iscsi_iface_net_attr(ipv6_iface
, link_local_autocfg
,
376 ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG
);
377 iscsi_iface_net_attr(ipv6_iface
, link_local_state
,
378 ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE
);
379 iscsi_iface_net_attr(ipv6_iface
, router_state
,
380 ISCSI_NET_PARAM_IPV6_ROUTER_STATE
);
381 iscsi_iface_net_attr(ipv6_iface
, grat_neighbor_adv_en
,
382 ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN
);
383 iscsi_iface_net_attr(ipv6_iface
, mld_en
, ISCSI_NET_PARAM_IPV6_MLD_EN
);
384 iscsi_iface_net_attr(ipv6_iface
, flow_label
, ISCSI_NET_PARAM_IPV6_FLOW_LABEL
);
385 iscsi_iface_net_attr(ipv6_iface
, traffic_class
,
386 ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS
);
387 iscsi_iface_net_attr(ipv6_iface
, hop_limit
, ISCSI_NET_PARAM_IPV6_HOP_LIMIT
);
388 iscsi_iface_net_attr(ipv6_iface
, nd_reachable_tmo
,
389 ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO
);
390 iscsi_iface_net_attr(ipv6_iface
, nd_rexmit_time
,
391 ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME
);
392 iscsi_iface_net_attr(ipv6_iface
, nd_stale_tmo
,
393 ISCSI_NET_PARAM_IPV6_ND_STALE_TMO
);
394 iscsi_iface_net_attr(ipv6_iface
, dup_addr_detect_cnt
,
395 ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT
);
396 iscsi_iface_net_attr(ipv6_iface
, router_adv_link_mtu
,
397 ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU
);
399 /* common read only iface attribute */
400 iscsi_iface_net_attr(iface
, enabled
, ISCSI_NET_PARAM_IFACE_ENABLE
);
401 iscsi_iface_net_attr(iface
, vlan_id
, ISCSI_NET_PARAM_VLAN_ID
);
402 iscsi_iface_net_attr(iface
, vlan_priority
, ISCSI_NET_PARAM_VLAN_PRIORITY
);
403 iscsi_iface_net_attr(iface
, vlan_enabled
, ISCSI_NET_PARAM_VLAN_ENABLED
);
404 iscsi_iface_net_attr(iface
, mtu
, ISCSI_NET_PARAM_MTU
);
405 iscsi_iface_net_attr(iface
, port
, ISCSI_NET_PARAM_PORT
);
406 iscsi_iface_net_attr(iface
, ipaddress_state
, ISCSI_NET_PARAM_IPADDR_STATE
);
407 iscsi_iface_net_attr(iface
, delayed_ack_en
, ISCSI_NET_PARAM_DELAYED_ACK_EN
);
408 iscsi_iface_net_attr(iface
, tcp_nagle_disable
,
409 ISCSI_NET_PARAM_TCP_NAGLE_DISABLE
);
410 iscsi_iface_net_attr(iface
, tcp_wsf_disable
, ISCSI_NET_PARAM_TCP_WSF_DISABLE
);
411 iscsi_iface_net_attr(iface
, tcp_wsf
, ISCSI_NET_PARAM_TCP_WSF
);
412 iscsi_iface_net_attr(iface
, tcp_timer_scale
, ISCSI_NET_PARAM_TCP_TIMER_SCALE
);
413 iscsi_iface_net_attr(iface
, tcp_timestamp_en
, ISCSI_NET_PARAM_TCP_TIMESTAMP_EN
);
414 iscsi_iface_net_attr(iface
, cache_id
, ISCSI_NET_PARAM_CACHE_ID
);
415 iscsi_iface_net_attr(iface
, redirect_en
, ISCSI_NET_PARAM_REDIRECT_EN
);
417 /* common iscsi specific settings attributes */
418 iscsi_iface_attr(iface
, def_taskmgmt_tmo
, ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO
);
419 iscsi_iface_attr(iface
, header_digest
, ISCSI_IFACE_PARAM_HDRDGST_EN
);
420 iscsi_iface_attr(iface
, data_digest
, ISCSI_IFACE_PARAM_DATADGST_EN
);
421 iscsi_iface_attr(iface
, immediate_data
, ISCSI_IFACE_PARAM_IMM_DATA_EN
);
422 iscsi_iface_attr(iface
, initial_r2t
, ISCSI_IFACE_PARAM_INITIAL_R2T_EN
);
423 iscsi_iface_attr(iface
, data_seq_in_order
,
424 ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN
);
425 iscsi_iface_attr(iface
, data_pdu_in_order
, ISCSI_IFACE_PARAM_PDU_INORDER_EN
);
426 iscsi_iface_attr(iface
, erl
, ISCSI_IFACE_PARAM_ERL
);
427 iscsi_iface_attr(iface
, max_recv_dlength
, ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH
);
428 iscsi_iface_attr(iface
, first_burst_len
, ISCSI_IFACE_PARAM_FIRST_BURST
);
429 iscsi_iface_attr(iface
, max_outstanding_r2t
, ISCSI_IFACE_PARAM_MAX_R2T
);
430 iscsi_iface_attr(iface
, max_burst_len
, ISCSI_IFACE_PARAM_MAX_BURST
);
431 iscsi_iface_attr(iface
, chap_auth
, ISCSI_IFACE_PARAM_CHAP_AUTH_EN
);
432 iscsi_iface_attr(iface
, bidi_chap
, ISCSI_IFACE_PARAM_BIDI_CHAP_EN
);
433 iscsi_iface_attr(iface
, discovery_auth_optional
,
434 ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL
);
435 iscsi_iface_attr(iface
, discovery_logout
,
436 ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN
);
437 iscsi_iface_attr(iface
, strict_login_comp_en
,
438 ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN
);
439 iscsi_iface_attr(iface
, initiator_name
, ISCSI_IFACE_PARAM_INITIATOR_NAME
);
441 static umode_t
iscsi_iface_attr_is_visible(struct kobject
*kobj
,
442 struct attribute
*attr
, int i
)
444 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
445 struct iscsi_iface
*iface
= iscsi_dev_to_iface(dev
);
446 struct iscsi_transport
*t
= iface
->transport
;
449 if (attr
== &dev_attr_iface_def_taskmgmt_tmo
.attr
)
450 param
= ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO
;
451 else if (attr
== &dev_attr_iface_header_digest
.attr
)
452 param
= ISCSI_IFACE_PARAM_HDRDGST_EN
;
453 else if (attr
== &dev_attr_iface_data_digest
.attr
)
454 param
= ISCSI_IFACE_PARAM_DATADGST_EN
;
455 else if (attr
== &dev_attr_iface_immediate_data
.attr
)
456 param
= ISCSI_IFACE_PARAM_IMM_DATA_EN
;
457 else if (attr
== &dev_attr_iface_initial_r2t
.attr
)
458 param
= ISCSI_IFACE_PARAM_INITIAL_R2T_EN
;
459 else if (attr
== &dev_attr_iface_data_seq_in_order
.attr
)
460 param
= ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN
;
461 else if (attr
== &dev_attr_iface_data_pdu_in_order
.attr
)
462 param
= ISCSI_IFACE_PARAM_PDU_INORDER_EN
;
463 else if (attr
== &dev_attr_iface_erl
.attr
)
464 param
= ISCSI_IFACE_PARAM_ERL
;
465 else if (attr
== &dev_attr_iface_max_recv_dlength
.attr
)
466 param
= ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH
;
467 else if (attr
== &dev_attr_iface_first_burst_len
.attr
)
468 param
= ISCSI_IFACE_PARAM_FIRST_BURST
;
469 else if (attr
== &dev_attr_iface_max_outstanding_r2t
.attr
)
470 param
= ISCSI_IFACE_PARAM_MAX_R2T
;
471 else if (attr
== &dev_attr_iface_max_burst_len
.attr
)
472 param
= ISCSI_IFACE_PARAM_MAX_BURST
;
473 else if (attr
== &dev_attr_iface_chap_auth
.attr
)
474 param
= ISCSI_IFACE_PARAM_CHAP_AUTH_EN
;
475 else if (attr
== &dev_attr_iface_bidi_chap
.attr
)
476 param
= ISCSI_IFACE_PARAM_BIDI_CHAP_EN
;
477 else if (attr
== &dev_attr_iface_discovery_auth_optional
.attr
)
478 param
= ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL
;
479 else if (attr
== &dev_attr_iface_discovery_logout
.attr
)
480 param
= ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN
;
481 else if (attr
== &dev_attr_iface_strict_login_comp_en
.attr
)
482 param
= ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN
;
483 else if (attr
== &dev_attr_iface_initiator_name
.attr
)
484 param
= ISCSI_IFACE_PARAM_INITIATOR_NAME
;
487 return t
->attr_is_visible(ISCSI_IFACE_PARAM
, param
);
489 if (attr
== &dev_attr_iface_enabled
.attr
)
490 param
= ISCSI_NET_PARAM_IFACE_ENABLE
;
491 else if (attr
== &dev_attr_iface_vlan_id
.attr
)
492 param
= ISCSI_NET_PARAM_VLAN_ID
;
493 else if (attr
== &dev_attr_iface_vlan_priority
.attr
)
494 param
= ISCSI_NET_PARAM_VLAN_PRIORITY
;
495 else if (attr
== &dev_attr_iface_vlan_enabled
.attr
)
496 param
= ISCSI_NET_PARAM_VLAN_ENABLED
;
497 else if (attr
== &dev_attr_iface_mtu
.attr
)
498 param
= ISCSI_NET_PARAM_MTU
;
499 else if (attr
== &dev_attr_iface_port
.attr
)
500 param
= ISCSI_NET_PARAM_PORT
;
501 else if (attr
== &dev_attr_iface_ipaddress_state
.attr
)
502 param
= ISCSI_NET_PARAM_IPADDR_STATE
;
503 else if (attr
== &dev_attr_iface_delayed_ack_en
.attr
)
504 param
= ISCSI_NET_PARAM_DELAYED_ACK_EN
;
505 else if (attr
== &dev_attr_iface_tcp_nagle_disable
.attr
)
506 param
= ISCSI_NET_PARAM_TCP_NAGLE_DISABLE
;
507 else if (attr
== &dev_attr_iface_tcp_wsf_disable
.attr
)
508 param
= ISCSI_NET_PARAM_TCP_WSF_DISABLE
;
509 else if (attr
== &dev_attr_iface_tcp_wsf
.attr
)
510 param
= ISCSI_NET_PARAM_TCP_WSF
;
511 else if (attr
== &dev_attr_iface_tcp_timer_scale
.attr
)
512 param
= ISCSI_NET_PARAM_TCP_TIMER_SCALE
;
513 else if (attr
== &dev_attr_iface_tcp_timestamp_en
.attr
)
514 param
= ISCSI_NET_PARAM_TCP_TIMESTAMP_EN
;
515 else if (attr
== &dev_attr_iface_cache_id
.attr
)
516 param
= ISCSI_NET_PARAM_CACHE_ID
;
517 else if (attr
== &dev_attr_iface_redirect_en
.attr
)
518 param
= ISCSI_NET_PARAM_REDIRECT_EN
;
519 else if (iface
->iface_type
== ISCSI_IFACE_TYPE_IPV4
) {
520 if (attr
== &dev_attr_ipv4_iface_ipaddress
.attr
)
521 param
= ISCSI_NET_PARAM_IPV4_ADDR
;
522 else if (attr
== &dev_attr_ipv4_iface_gateway
.attr
)
523 param
= ISCSI_NET_PARAM_IPV4_GW
;
524 else if (attr
== &dev_attr_ipv4_iface_subnet
.attr
)
525 param
= ISCSI_NET_PARAM_IPV4_SUBNET
;
526 else if (attr
== &dev_attr_ipv4_iface_bootproto
.attr
)
527 param
= ISCSI_NET_PARAM_IPV4_BOOTPROTO
;
529 &dev_attr_ipv4_iface_dhcp_dns_address_en
.attr
)
530 param
= ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN
;
532 &dev_attr_ipv4_iface_dhcp_slp_da_info_en
.attr
)
533 param
= ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN
;
534 else if (attr
== &dev_attr_ipv4_iface_tos_en
.attr
)
535 param
= ISCSI_NET_PARAM_IPV4_TOS_EN
;
536 else if (attr
== &dev_attr_ipv4_iface_tos
.attr
)
537 param
= ISCSI_NET_PARAM_IPV4_TOS
;
538 else if (attr
== &dev_attr_ipv4_iface_grat_arp_en
.attr
)
539 param
= ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN
;
541 &dev_attr_ipv4_iface_dhcp_alt_client_id_en
.attr
)
542 param
= ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN
;
543 else if (attr
== &dev_attr_ipv4_iface_dhcp_alt_client_id
.attr
)
544 param
= ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID
;
546 &dev_attr_ipv4_iface_dhcp_req_vendor_id_en
.attr
)
547 param
= ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN
;
549 &dev_attr_ipv4_iface_dhcp_use_vendor_id_en
.attr
)
550 param
= ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN
;
551 else if (attr
== &dev_attr_ipv4_iface_dhcp_vendor_id
.attr
)
552 param
= ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID
;
554 &dev_attr_ipv4_iface_dhcp_learn_iqn_en
.attr
)
555 param
= ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN
;
557 &dev_attr_ipv4_iface_fragment_disable
.attr
)
558 param
= ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE
;
560 &dev_attr_ipv4_iface_incoming_forwarding_en
.attr
)
561 param
= ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN
;
562 else if (attr
== &dev_attr_ipv4_iface_ttl
.attr
)
563 param
= ISCSI_NET_PARAM_IPV4_TTL
;
566 } else if (iface
->iface_type
== ISCSI_IFACE_TYPE_IPV6
) {
567 if (attr
== &dev_attr_ipv6_iface_ipaddress
.attr
)
568 param
= ISCSI_NET_PARAM_IPV6_ADDR
;
569 else if (attr
== &dev_attr_ipv6_iface_link_local_addr
.attr
)
570 param
= ISCSI_NET_PARAM_IPV6_LINKLOCAL
;
571 else if (attr
== &dev_attr_ipv6_iface_router_addr
.attr
)
572 param
= ISCSI_NET_PARAM_IPV6_ROUTER
;
573 else if (attr
== &dev_attr_ipv6_iface_ipaddr_autocfg
.attr
)
574 param
= ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG
;
575 else if (attr
== &dev_attr_ipv6_iface_link_local_autocfg
.attr
)
576 param
= ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG
;
577 else if (attr
== &dev_attr_ipv6_iface_link_local_state
.attr
)
578 param
= ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE
;
579 else if (attr
== &dev_attr_ipv6_iface_router_state
.attr
)
580 param
= ISCSI_NET_PARAM_IPV6_ROUTER_STATE
;
582 &dev_attr_ipv6_iface_grat_neighbor_adv_en
.attr
)
583 param
= ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN
;
584 else if (attr
== &dev_attr_ipv6_iface_mld_en
.attr
)
585 param
= ISCSI_NET_PARAM_IPV6_MLD_EN
;
586 else if (attr
== &dev_attr_ipv6_iface_flow_label
.attr
)
587 param
= ISCSI_NET_PARAM_IPV6_FLOW_LABEL
;
588 else if (attr
== &dev_attr_ipv6_iface_traffic_class
.attr
)
589 param
= ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS
;
590 else if (attr
== &dev_attr_ipv6_iface_hop_limit
.attr
)
591 param
= ISCSI_NET_PARAM_IPV6_HOP_LIMIT
;
592 else if (attr
== &dev_attr_ipv6_iface_nd_reachable_tmo
.attr
)
593 param
= ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO
;
594 else if (attr
== &dev_attr_ipv6_iface_nd_rexmit_time
.attr
)
595 param
= ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME
;
596 else if (attr
== &dev_attr_ipv6_iface_nd_stale_tmo
.attr
)
597 param
= ISCSI_NET_PARAM_IPV6_ND_STALE_TMO
;
598 else if (attr
== &dev_attr_ipv6_iface_dup_addr_detect_cnt
.attr
)
599 param
= ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT
;
600 else if (attr
== &dev_attr_ipv6_iface_router_adv_link_mtu
.attr
)
601 param
= ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU
;
605 WARN_ONCE(1, "Invalid iface attr");
609 return t
->attr_is_visible(ISCSI_NET_PARAM
, param
);
612 static struct attribute
*iscsi_iface_attrs
[] = {
613 &dev_attr_iface_enabled
.attr
,
614 &dev_attr_iface_vlan_id
.attr
,
615 &dev_attr_iface_vlan_priority
.attr
,
616 &dev_attr_iface_vlan_enabled
.attr
,
617 &dev_attr_ipv4_iface_ipaddress
.attr
,
618 &dev_attr_ipv4_iface_gateway
.attr
,
619 &dev_attr_ipv4_iface_subnet
.attr
,
620 &dev_attr_ipv4_iface_bootproto
.attr
,
621 &dev_attr_ipv6_iface_ipaddress
.attr
,
622 &dev_attr_ipv6_iface_link_local_addr
.attr
,
623 &dev_attr_ipv6_iface_router_addr
.attr
,
624 &dev_attr_ipv6_iface_ipaddr_autocfg
.attr
,
625 &dev_attr_ipv6_iface_link_local_autocfg
.attr
,
626 &dev_attr_iface_mtu
.attr
,
627 &dev_attr_iface_port
.attr
,
628 &dev_attr_iface_ipaddress_state
.attr
,
629 &dev_attr_iface_delayed_ack_en
.attr
,
630 &dev_attr_iface_tcp_nagle_disable
.attr
,
631 &dev_attr_iface_tcp_wsf_disable
.attr
,
632 &dev_attr_iface_tcp_wsf
.attr
,
633 &dev_attr_iface_tcp_timer_scale
.attr
,
634 &dev_attr_iface_tcp_timestamp_en
.attr
,
635 &dev_attr_iface_cache_id
.attr
,
636 &dev_attr_iface_redirect_en
.attr
,
637 &dev_attr_iface_def_taskmgmt_tmo
.attr
,
638 &dev_attr_iface_header_digest
.attr
,
639 &dev_attr_iface_data_digest
.attr
,
640 &dev_attr_iface_immediate_data
.attr
,
641 &dev_attr_iface_initial_r2t
.attr
,
642 &dev_attr_iface_data_seq_in_order
.attr
,
643 &dev_attr_iface_data_pdu_in_order
.attr
,
644 &dev_attr_iface_erl
.attr
,
645 &dev_attr_iface_max_recv_dlength
.attr
,
646 &dev_attr_iface_first_burst_len
.attr
,
647 &dev_attr_iface_max_outstanding_r2t
.attr
,
648 &dev_attr_iface_max_burst_len
.attr
,
649 &dev_attr_iface_chap_auth
.attr
,
650 &dev_attr_iface_bidi_chap
.attr
,
651 &dev_attr_iface_discovery_auth_optional
.attr
,
652 &dev_attr_iface_discovery_logout
.attr
,
653 &dev_attr_iface_strict_login_comp_en
.attr
,
654 &dev_attr_iface_initiator_name
.attr
,
655 &dev_attr_ipv4_iface_dhcp_dns_address_en
.attr
,
656 &dev_attr_ipv4_iface_dhcp_slp_da_info_en
.attr
,
657 &dev_attr_ipv4_iface_tos_en
.attr
,
658 &dev_attr_ipv4_iface_tos
.attr
,
659 &dev_attr_ipv4_iface_grat_arp_en
.attr
,
660 &dev_attr_ipv4_iface_dhcp_alt_client_id_en
.attr
,
661 &dev_attr_ipv4_iface_dhcp_alt_client_id
.attr
,
662 &dev_attr_ipv4_iface_dhcp_req_vendor_id_en
.attr
,
663 &dev_attr_ipv4_iface_dhcp_use_vendor_id_en
.attr
,
664 &dev_attr_ipv4_iface_dhcp_vendor_id
.attr
,
665 &dev_attr_ipv4_iface_dhcp_learn_iqn_en
.attr
,
666 &dev_attr_ipv4_iface_fragment_disable
.attr
,
667 &dev_attr_ipv4_iface_incoming_forwarding_en
.attr
,
668 &dev_attr_ipv4_iface_ttl
.attr
,
669 &dev_attr_ipv6_iface_link_local_state
.attr
,
670 &dev_attr_ipv6_iface_router_state
.attr
,
671 &dev_attr_ipv6_iface_grat_neighbor_adv_en
.attr
,
672 &dev_attr_ipv6_iface_mld_en
.attr
,
673 &dev_attr_ipv6_iface_flow_label
.attr
,
674 &dev_attr_ipv6_iface_traffic_class
.attr
,
675 &dev_attr_ipv6_iface_hop_limit
.attr
,
676 &dev_attr_ipv6_iface_nd_reachable_tmo
.attr
,
677 &dev_attr_ipv6_iface_nd_rexmit_time
.attr
,
678 &dev_attr_ipv6_iface_nd_stale_tmo
.attr
,
679 &dev_attr_ipv6_iface_dup_addr_detect_cnt
.attr
,
680 &dev_attr_ipv6_iface_router_adv_link_mtu
.attr
,
684 static struct attribute_group iscsi_iface_group
= {
685 .attrs
= iscsi_iface_attrs
,
686 .is_visible
= iscsi_iface_attr_is_visible
,
689 /* convert iscsi_ipaddress_state values to ascii string name */
690 static const struct {
691 enum iscsi_ipaddress_state value
;
693 } iscsi_ipaddress_state_names
[] = {
694 {ISCSI_IPDDRESS_STATE_UNCONFIGURED
, "Unconfigured" },
695 {ISCSI_IPDDRESS_STATE_ACQUIRING
, "Acquiring" },
696 {ISCSI_IPDDRESS_STATE_TENTATIVE
, "Tentative" },
697 {ISCSI_IPDDRESS_STATE_VALID
, "Valid" },
698 {ISCSI_IPDDRESS_STATE_DISABLING
, "Disabling" },
699 {ISCSI_IPDDRESS_STATE_INVALID
, "Invalid" },
700 {ISCSI_IPDDRESS_STATE_DEPRECATED
, "Deprecated" },
703 char *iscsi_get_ipaddress_state_name(enum iscsi_ipaddress_state port_state
)
708 for (i
= 0; i
< ARRAY_SIZE(iscsi_ipaddress_state_names
); i
++) {
709 if (iscsi_ipaddress_state_names
[i
].value
== port_state
) {
710 state
= iscsi_ipaddress_state_names
[i
].name
;
716 EXPORT_SYMBOL_GPL(iscsi_get_ipaddress_state_name
);
718 /* convert iscsi_router_state values to ascii string name */
719 static const struct {
720 enum iscsi_router_state value
;
722 } iscsi_router_state_names
[] = {
723 {ISCSI_ROUTER_STATE_UNKNOWN
, "Unknown" },
724 {ISCSI_ROUTER_STATE_ADVERTISED
, "Advertised" },
725 {ISCSI_ROUTER_STATE_MANUAL
, "Manual" },
726 {ISCSI_ROUTER_STATE_STALE
, "Stale" },
729 char *iscsi_get_router_state_name(enum iscsi_router_state router_state
)
734 for (i
= 0; i
< ARRAY_SIZE(iscsi_router_state_names
); i
++) {
735 if (iscsi_router_state_names
[i
].value
== router_state
) {
736 state
= iscsi_router_state_names
[i
].name
;
742 EXPORT_SYMBOL_GPL(iscsi_get_router_state_name
);
745 iscsi_create_iface(struct Scsi_Host
*shost
, struct iscsi_transport
*transport
,
746 uint32_t iface_type
, uint32_t iface_num
, int dd_size
)
748 struct iscsi_iface
*iface
;
751 iface
= kzalloc(sizeof(*iface
) + dd_size
, GFP_KERNEL
);
755 iface
->transport
= transport
;
756 iface
->iface_type
= iface_type
;
757 iface
->iface_num
= iface_num
;
758 iface
->dev
.release
= iscsi_iface_release
;
759 iface
->dev
.class = &iscsi_iface_class
;
760 /* parent reference released in iscsi_iface_release */
761 iface
->dev
.parent
= get_device(&shost
->shost_gendev
);
762 if (iface_type
== ISCSI_IFACE_TYPE_IPV4
)
763 dev_set_name(&iface
->dev
, "ipv4-iface-%u-%u", shost
->host_no
,
766 dev_set_name(&iface
->dev
, "ipv6-iface-%u-%u", shost
->host_no
,
769 err
= device_register(&iface
->dev
);
773 err
= sysfs_create_group(&iface
->dev
.kobj
, &iscsi_iface_group
);
778 iface
->dd_data
= &iface
[1];
782 device_unregister(&iface
->dev
);
786 put_device(&iface
->dev
);
789 EXPORT_SYMBOL_GPL(iscsi_create_iface
);
791 void iscsi_destroy_iface(struct iscsi_iface
*iface
)
793 sysfs_remove_group(&iface
->dev
.kobj
, &iscsi_iface_group
);
794 device_unregister(&iface
->dev
);
796 EXPORT_SYMBOL_GPL(iscsi_destroy_iface
);
799 * Interface to display flash node params to sysfs
802 #define ISCSI_FLASHNODE_ATTR(_prefix, _name, _mode, _show, _store) \
803 struct device_attribute dev_attr_##_prefix##_##_name = \
804 __ATTR(_name, _mode, _show, _store)
806 /* flash node session attrs show */
807 #define iscsi_flashnode_sess_attr_show(type, name, param) \
809 show_##type##_##name(struct device *dev, struct device_attribute *attr, \
812 struct iscsi_bus_flash_session *fnode_sess = \
813 iscsi_dev_to_flash_session(dev);\
814 struct iscsi_transport *t = fnode_sess->transport; \
815 return t->get_flashnode_param(fnode_sess, param, buf); \
819 #define iscsi_flashnode_sess_attr(type, name, param) \
820 iscsi_flashnode_sess_attr_show(type, name, param) \
821 static ISCSI_FLASHNODE_ATTR(type, name, S_IRUGO, \
822 show_##type##_##name, NULL);
824 /* Flash node session attributes */
826 iscsi_flashnode_sess_attr(fnode
, auto_snd_tgt_disable
,
827 ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE
);
828 iscsi_flashnode_sess_attr(fnode
, discovery_session
,
829 ISCSI_FLASHNODE_DISCOVERY_SESS
);
830 iscsi_flashnode_sess_attr(fnode
, portal_type
, ISCSI_FLASHNODE_PORTAL_TYPE
);
831 iscsi_flashnode_sess_attr(fnode
, entry_enable
, ISCSI_FLASHNODE_ENTRY_EN
);
832 iscsi_flashnode_sess_attr(fnode
, immediate_data
, ISCSI_FLASHNODE_IMM_DATA_EN
);
833 iscsi_flashnode_sess_attr(fnode
, initial_r2t
, ISCSI_FLASHNODE_INITIAL_R2T_EN
);
834 iscsi_flashnode_sess_attr(fnode
, data_seq_in_order
,
835 ISCSI_FLASHNODE_DATASEQ_INORDER
);
836 iscsi_flashnode_sess_attr(fnode
, data_pdu_in_order
,
837 ISCSI_FLASHNODE_PDU_INORDER
);
838 iscsi_flashnode_sess_attr(fnode
, chap_auth
, ISCSI_FLASHNODE_CHAP_AUTH_EN
);
839 iscsi_flashnode_sess_attr(fnode
, discovery_logout
,
840 ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN
);
841 iscsi_flashnode_sess_attr(fnode
, bidi_chap
, ISCSI_FLASHNODE_BIDI_CHAP_EN
);
842 iscsi_flashnode_sess_attr(fnode
, discovery_auth_optional
,
843 ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL
);
844 iscsi_flashnode_sess_attr(fnode
, erl
, ISCSI_FLASHNODE_ERL
);
845 iscsi_flashnode_sess_attr(fnode
, first_burst_len
, ISCSI_FLASHNODE_FIRST_BURST
);
846 iscsi_flashnode_sess_attr(fnode
, def_time2wait
, ISCSI_FLASHNODE_DEF_TIME2WAIT
);
847 iscsi_flashnode_sess_attr(fnode
, def_time2retain
,
848 ISCSI_FLASHNODE_DEF_TIME2RETAIN
);
849 iscsi_flashnode_sess_attr(fnode
, max_outstanding_r2t
, ISCSI_FLASHNODE_MAX_R2T
);
850 iscsi_flashnode_sess_attr(fnode
, isid
, ISCSI_FLASHNODE_ISID
);
851 iscsi_flashnode_sess_attr(fnode
, tsid
, ISCSI_FLASHNODE_TSID
);
852 iscsi_flashnode_sess_attr(fnode
, max_burst_len
, ISCSI_FLASHNODE_MAX_BURST
);
853 iscsi_flashnode_sess_attr(fnode
, def_taskmgmt_tmo
,
854 ISCSI_FLASHNODE_DEF_TASKMGMT_TMO
);
855 iscsi_flashnode_sess_attr(fnode
, targetalias
, ISCSI_FLASHNODE_ALIAS
);
856 iscsi_flashnode_sess_attr(fnode
, targetname
, ISCSI_FLASHNODE_NAME
);
857 iscsi_flashnode_sess_attr(fnode
, tpgt
, ISCSI_FLASHNODE_TPGT
);
858 iscsi_flashnode_sess_attr(fnode
, discovery_parent_idx
,
859 ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX
);
860 iscsi_flashnode_sess_attr(fnode
, discovery_parent_type
,
861 ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE
);
862 iscsi_flashnode_sess_attr(fnode
, chap_in_idx
, ISCSI_FLASHNODE_CHAP_IN_IDX
);
863 iscsi_flashnode_sess_attr(fnode
, chap_out_idx
, ISCSI_FLASHNODE_CHAP_OUT_IDX
);
864 iscsi_flashnode_sess_attr(fnode
, username
, ISCSI_FLASHNODE_USERNAME
);
865 iscsi_flashnode_sess_attr(fnode
, username_in
, ISCSI_FLASHNODE_USERNAME_IN
);
866 iscsi_flashnode_sess_attr(fnode
, password
, ISCSI_FLASHNODE_PASSWORD
);
867 iscsi_flashnode_sess_attr(fnode
, password_in
, ISCSI_FLASHNODE_PASSWORD_IN
);
868 iscsi_flashnode_sess_attr(fnode
, is_boot_target
, ISCSI_FLASHNODE_IS_BOOT_TGT
);
870 static struct attribute
*iscsi_flashnode_sess_attrs
[] = {
871 &dev_attr_fnode_auto_snd_tgt_disable
.attr
,
872 &dev_attr_fnode_discovery_session
.attr
,
873 &dev_attr_fnode_portal_type
.attr
,
874 &dev_attr_fnode_entry_enable
.attr
,
875 &dev_attr_fnode_immediate_data
.attr
,
876 &dev_attr_fnode_initial_r2t
.attr
,
877 &dev_attr_fnode_data_seq_in_order
.attr
,
878 &dev_attr_fnode_data_pdu_in_order
.attr
,
879 &dev_attr_fnode_chap_auth
.attr
,
880 &dev_attr_fnode_discovery_logout
.attr
,
881 &dev_attr_fnode_bidi_chap
.attr
,
882 &dev_attr_fnode_discovery_auth_optional
.attr
,
883 &dev_attr_fnode_erl
.attr
,
884 &dev_attr_fnode_first_burst_len
.attr
,
885 &dev_attr_fnode_def_time2wait
.attr
,
886 &dev_attr_fnode_def_time2retain
.attr
,
887 &dev_attr_fnode_max_outstanding_r2t
.attr
,
888 &dev_attr_fnode_isid
.attr
,
889 &dev_attr_fnode_tsid
.attr
,
890 &dev_attr_fnode_max_burst_len
.attr
,
891 &dev_attr_fnode_def_taskmgmt_tmo
.attr
,
892 &dev_attr_fnode_targetalias
.attr
,
893 &dev_attr_fnode_targetname
.attr
,
894 &dev_attr_fnode_tpgt
.attr
,
895 &dev_attr_fnode_discovery_parent_idx
.attr
,
896 &dev_attr_fnode_discovery_parent_type
.attr
,
897 &dev_attr_fnode_chap_in_idx
.attr
,
898 &dev_attr_fnode_chap_out_idx
.attr
,
899 &dev_attr_fnode_username
.attr
,
900 &dev_attr_fnode_username_in
.attr
,
901 &dev_attr_fnode_password
.attr
,
902 &dev_attr_fnode_password_in
.attr
,
903 &dev_attr_fnode_is_boot_target
.attr
,
907 static umode_t
iscsi_flashnode_sess_attr_is_visible(struct kobject
*kobj
,
908 struct attribute
*attr
,
911 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
912 struct iscsi_bus_flash_session
*fnode_sess
=
913 iscsi_dev_to_flash_session(dev
);
914 struct iscsi_transport
*t
= fnode_sess
->transport
;
917 if (attr
== &dev_attr_fnode_auto_snd_tgt_disable
.attr
) {
918 param
= ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE
;
919 } else if (attr
== &dev_attr_fnode_discovery_session
.attr
) {
920 param
= ISCSI_FLASHNODE_DISCOVERY_SESS
;
921 } else if (attr
== &dev_attr_fnode_portal_type
.attr
) {
922 param
= ISCSI_FLASHNODE_PORTAL_TYPE
;
923 } else if (attr
== &dev_attr_fnode_entry_enable
.attr
) {
924 param
= ISCSI_FLASHNODE_ENTRY_EN
;
925 } else if (attr
== &dev_attr_fnode_immediate_data
.attr
) {
926 param
= ISCSI_FLASHNODE_IMM_DATA_EN
;
927 } else if (attr
== &dev_attr_fnode_initial_r2t
.attr
) {
928 param
= ISCSI_FLASHNODE_INITIAL_R2T_EN
;
929 } else if (attr
== &dev_attr_fnode_data_seq_in_order
.attr
) {
930 param
= ISCSI_FLASHNODE_DATASEQ_INORDER
;
931 } else if (attr
== &dev_attr_fnode_data_pdu_in_order
.attr
) {
932 param
= ISCSI_FLASHNODE_PDU_INORDER
;
933 } else if (attr
== &dev_attr_fnode_chap_auth
.attr
) {
934 param
= ISCSI_FLASHNODE_CHAP_AUTH_EN
;
935 } else if (attr
== &dev_attr_fnode_discovery_logout
.attr
) {
936 param
= ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN
;
937 } else if (attr
== &dev_attr_fnode_bidi_chap
.attr
) {
938 param
= ISCSI_FLASHNODE_BIDI_CHAP_EN
;
939 } else if (attr
== &dev_attr_fnode_discovery_auth_optional
.attr
) {
940 param
= ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL
;
941 } else if (attr
== &dev_attr_fnode_erl
.attr
) {
942 param
= ISCSI_FLASHNODE_ERL
;
943 } else if (attr
== &dev_attr_fnode_first_burst_len
.attr
) {
944 param
= ISCSI_FLASHNODE_FIRST_BURST
;
945 } else if (attr
== &dev_attr_fnode_def_time2wait
.attr
) {
946 param
= ISCSI_FLASHNODE_DEF_TIME2WAIT
;
947 } else if (attr
== &dev_attr_fnode_def_time2retain
.attr
) {
948 param
= ISCSI_FLASHNODE_DEF_TIME2RETAIN
;
949 } else if (attr
== &dev_attr_fnode_max_outstanding_r2t
.attr
) {
950 param
= ISCSI_FLASHNODE_MAX_R2T
;
951 } else if (attr
== &dev_attr_fnode_isid
.attr
) {
952 param
= ISCSI_FLASHNODE_ISID
;
953 } else if (attr
== &dev_attr_fnode_tsid
.attr
) {
954 param
= ISCSI_FLASHNODE_TSID
;
955 } else if (attr
== &dev_attr_fnode_max_burst_len
.attr
) {
956 param
= ISCSI_FLASHNODE_MAX_BURST
;
957 } else if (attr
== &dev_attr_fnode_def_taskmgmt_tmo
.attr
) {
958 param
= ISCSI_FLASHNODE_DEF_TASKMGMT_TMO
;
959 } else if (attr
== &dev_attr_fnode_targetalias
.attr
) {
960 param
= ISCSI_FLASHNODE_ALIAS
;
961 } else if (attr
== &dev_attr_fnode_targetname
.attr
) {
962 param
= ISCSI_FLASHNODE_NAME
;
963 } else if (attr
== &dev_attr_fnode_tpgt
.attr
) {
964 param
= ISCSI_FLASHNODE_TPGT
;
965 } else if (attr
== &dev_attr_fnode_discovery_parent_idx
.attr
) {
966 param
= ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX
;
967 } else if (attr
== &dev_attr_fnode_discovery_parent_type
.attr
) {
968 param
= ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE
;
969 } else if (attr
== &dev_attr_fnode_chap_in_idx
.attr
) {
970 param
= ISCSI_FLASHNODE_CHAP_IN_IDX
;
971 } else if (attr
== &dev_attr_fnode_chap_out_idx
.attr
) {
972 param
= ISCSI_FLASHNODE_CHAP_OUT_IDX
;
973 } else if (attr
== &dev_attr_fnode_username
.attr
) {
974 param
= ISCSI_FLASHNODE_USERNAME
;
975 } else if (attr
== &dev_attr_fnode_username_in
.attr
) {
976 param
= ISCSI_FLASHNODE_USERNAME_IN
;
977 } else if (attr
== &dev_attr_fnode_password
.attr
) {
978 param
= ISCSI_FLASHNODE_PASSWORD
;
979 } else if (attr
== &dev_attr_fnode_password_in
.attr
) {
980 param
= ISCSI_FLASHNODE_PASSWORD_IN
;
981 } else if (attr
== &dev_attr_fnode_is_boot_target
.attr
) {
982 param
= ISCSI_FLASHNODE_IS_BOOT_TGT
;
984 WARN_ONCE(1, "Invalid flashnode session attr");
988 return t
->attr_is_visible(ISCSI_FLASHNODE_PARAM
, param
);
991 static struct attribute_group iscsi_flashnode_sess_attr_group
= {
992 .attrs
= iscsi_flashnode_sess_attrs
,
993 .is_visible
= iscsi_flashnode_sess_attr_is_visible
,
996 static const struct attribute_group
*iscsi_flashnode_sess_attr_groups
[] = {
997 &iscsi_flashnode_sess_attr_group
,
1001 static void iscsi_flashnode_sess_release(struct device
*dev
)
1003 struct iscsi_bus_flash_session
*fnode_sess
=
1004 iscsi_dev_to_flash_session(dev
);
1006 kfree(fnode_sess
->targetname
);
1007 kfree(fnode_sess
->targetalias
);
1008 kfree(fnode_sess
->portal_type
);
1012 static const struct device_type iscsi_flashnode_sess_dev_type
= {
1013 .name
= "iscsi_flashnode_sess_dev_type",
1014 .groups
= iscsi_flashnode_sess_attr_groups
,
1015 .release
= iscsi_flashnode_sess_release
,
1018 /* flash node connection attrs show */
1019 #define iscsi_flashnode_conn_attr_show(type, name, param) \
1021 show_##type##_##name(struct device *dev, struct device_attribute *attr, \
1024 struct iscsi_bus_flash_conn *fnode_conn = iscsi_dev_to_flash_conn(dev);\
1025 struct iscsi_bus_flash_session *fnode_sess = \
1026 iscsi_flash_conn_to_flash_session(fnode_conn);\
1027 struct iscsi_transport *t = fnode_conn->transport; \
1028 return t->get_flashnode_param(fnode_sess, param, buf); \
1032 #define iscsi_flashnode_conn_attr(type, name, param) \
1033 iscsi_flashnode_conn_attr_show(type, name, param) \
1034 static ISCSI_FLASHNODE_ATTR(type, name, S_IRUGO, \
1035 show_##type##_##name, NULL);
1037 /* Flash node connection attributes */
1039 iscsi_flashnode_conn_attr(fnode
, is_fw_assigned_ipv6
,
1040 ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6
);
1041 iscsi_flashnode_conn_attr(fnode
, header_digest
, ISCSI_FLASHNODE_HDR_DGST_EN
);
1042 iscsi_flashnode_conn_attr(fnode
, data_digest
, ISCSI_FLASHNODE_DATA_DGST_EN
);
1043 iscsi_flashnode_conn_attr(fnode
, snack_req
, ISCSI_FLASHNODE_SNACK_REQ_EN
);
1044 iscsi_flashnode_conn_attr(fnode
, tcp_timestamp_stat
,
1045 ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT
);
1046 iscsi_flashnode_conn_attr(fnode
, tcp_nagle_disable
,
1047 ISCSI_FLASHNODE_TCP_NAGLE_DISABLE
);
1048 iscsi_flashnode_conn_attr(fnode
, tcp_wsf_disable
,
1049 ISCSI_FLASHNODE_TCP_WSF_DISABLE
);
1050 iscsi_flashnode_conn_attr(fnode
, tcp_timer_scale
,
1051 ISCSI_FLASHNODE_TCP_TIMER_SCALE
);
1052 iscsi_flashnode_conn_attr(fnode
, tcp_timestamp_enable
,
1053 ISCSI_FLASHNODE_TCP_TIMESTAMP_EN
);
1054 iscsi_flashnode_conn_attr(fnode
, fragment_disable
,
1055 ISCSI_FLASHNODE_IP_FRAG_DISABLE
);
1056 iscsi_flashnode_conn_attr(fnode
, keepalive_tmo
, ISCSI_FLASHNODE_KEEPALIVE_TMO
);
1057 iscsi_flashnode_conn_attr(fnode
, port
, ISCSI_FLASHNODE_PORT
);
1058 iscsi_flashnode_conn_attr(fnode
, ipaddress
, ISCSI_FLASHNODE_IPADDR
);
1059 iscsi_flashnode_conn_attr(fnode
, max_recv_dlength
,
1060 ISCSI_FLASHNODE_MAX_RECV_DLENGTH
);
1061 iscsi_flashnode_conn_attr(fnode
, max_xmit_dlength
,
1062 ISCSI_FLASHNODE_MAX_XMIT_DLENGTH
);
1063 iscsi_flashnode_conn_attr(fnode
, local_port
, ISCSI_FLASHNODE_LOCAL_PORT
);
1064 iscsi_flashnode_conn_attr(fnode
, ipv4_tos
, ISCSI_FLASHNODE_IPV4_TOS
);
1065 iscsi_flashnode_conn_attr(fnode
, ipv6_traffic_class
, ISCSI_FLASHNODE_IPV6_TC
);
1066 iscsi_flashnode_conn_attr(fnode
, ipv6_flow_label
,
1067 ISCSI_FLASHNODE_IPV6_FLOW_LABEL
);
1068 iscsi_flashnode_conn_attr(fnode
, redirect_ipaddr
,
1069 ISCSI_FLASHNODE_REDIRECT_IPADDR
);
1070 iscsi_flashnode_conn_attr(fnode
, max_segment_size
,
1071 ISCSI_FLASHNODE_MAX_SEGMENT_SIZE
);
1072 iscsi_flashnode_conn_attr(fnode
, link_local_ipv6
,
1073 ISCSI_FLASHNODE_LINK_LOCAL_IPV6
);
1074 iscsi_flashnode_conn_attr(fnode
, tcp_xmit_wsf
, ISCSI_FLASHNODE_TCP_XMIT_WSF
);
1075 iscsi_flashnode_conn_attr(fnode
, tcp_recv_wsf
, ISCSI_FLASHNODE_TCP_RECV_WSF
);
1076 iscsi_flashnode_conn_attr(fnode
, statsn
, ISCSI_FLASHNODE_STATSN
);
1077 iscsi_flashnode_conn_attr(fnode
, exp_statsn
, ISCSI_FLASHNODE_EXP_STATSN
);
1079 static struct attribute
*iscsi_flashnode_conn_attrs
[] = {
1080 &dev_attr_fnode_is_fw_assigned_ipv6
.attr
,
1081 &dev_attr_fnode_header_digest
.attr
,
1082 &dev_attr_fnode_data_digest
.attr
,
1083 &dev_attr_fnode_snack_req
.attr
,
1084 &dev_attr_fnode_tcp_timestamp_stat
.attr
,
1085 &dev_attr_fnode_tcp_nagle_disable
.attr
,
1086 &dev_attr_fnode_tcp_wsf_disable
.attr
,
1087 &dev_attr_fnode_tcp_timer_scale
.attr
,
1088 &dev_attr_fnode_tcp_timestamp_enable
.attr
,
1089 &dev_attr_fnode_fragment_disable
.attr
,
1090 &dev_attr_fnode_max_recv_dlength
.attr
,
1091 &dev_attr_fnode_max_xmit_dlength
.attr
,
1092 &dev_attr_fnode_keepalive_tmo
.attr
,
1093 &dev_attr_fnode_port
.attr
,
1094 &dev_attr_fnode_ipaddress
.attr
,
1095 &dev_attr_fnode_redirect_ipaddr
.attr
,
1096 &dev_attr_fnode_max_segment_size
.attr
,
1097 &dev_attr_fnode_local_port
.attr
,
1098 &dev_attr_fnode_ipv4_tos
.attr
,
1099 &dev_attr_fnode_ipv6_traffic_class
.attr
,
1100 &dev_attr_fnode_ipv6_flow_label
.attr
,
1101 &dev_attr_fnode_link_local_ipv6
.attr
,
1102 &dev_attr_fnode_tcp_xmit_wsf
.attr
,
1103 &dev_attr_fnode_tcp_recv_wsf
.attr
,
1104 &dev_attr_fnode_statsn
.attr
,
1105 &dev_attr_fnode_exp_statsn
.attr
,
1109 static umode_t
iscsi_flashnode_conn_attr_is_visible(struct kobject
*kobj
,
1110 struct attribute
*attr
,
1113 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
1114 struct iscsi_bus_flash_conn
*fnode_conn
= iscsi_dev_to_flash_conn(dev
);
1115 struct iscsi_transport
*t
= fnode_conn
->transport
;
1118 if (attr
== &dev_attr_fnode_is_fw_assigned_ipv6
.attr
) {
1119 param
= ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6
;
1120 } else if (attr
== &dev_attr_fnode_header_digest
.attr
) {
1121 param
= ISCSI_FLASHNODE_HDR_DGST_EN
;
1122 } else if (attr
== &dev_attr_fnode_data_digest
.attr
) {
1123 param
= ISCSI_FLASHNODE_DATA_DGST_EN
;
1124 } else if (attr
== &dev_attr_fnode_snack_req
.attr
) {
1125 param
= ISCSI_FLASHNODE_SNACK_REQ_EN
;
1126 } else if (attr
== &dev_attr_fnode_tcp_timestamp_stat
.attr
) {
1127 param
= ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT
;
1128 } else if (attr
== &dev_attr_fnode_tcp_nagle_disable
.attr
) {
1129 param
= ISCSI_FLASHNODE_TCP_NAGLE_DISABLE
;
1130 } else if (attr
== &dev_attr_fnode_tcp_wsf_disable
.attr
) {
1131 param
= ISCSI_FLASHNODE_TCP_WSF_DISABLE
;
1132 } else if (attr
== &dev_attr_fnode_tcp_timer_scale
.attr
) {
1133 param
= ISCSI_FLASHNODE_TCP_TIMER_SCALE
;
1134 } else if (attr
== &dev_attr_fnode_tcp_timestamp_enable
.attr
) {
1135 param
= ISCSI_FLASHNODE_TCP_TIMESTAMP_EN
;
1136 } else if (attr
== &dev_attr_fnode_fragment_disable
.attr
) {
1137 param
= ISCSI_FLASHNODE_IP_FRAG_DISABLE
;
1138 } else if (attr
== &dev_attr_fnode_max_recv_dlength
.attr
) {
1139 param
= ISCSI_FLASHNODE_MAX_RECV_DLENGTH
;
1140 } else if (attr
== &dev_attr_fnode_max_xmit_dlength
.attr
) {
1141 param
= ISCSI_FLASHNODE_MAX_XMIT_DLENGTH
;
1142 } else if (attr
== &dev_attr_fnode_keepalive_tmo
.attr
) {
1143 param
= ISCSI_FLASHNODE_KEEPALIVE_TMO
;
1144 } else if (attr
== &dev_attr_fnode_port
.attr
) {
1145 param
= ISCSI_FLASHNODE_PORT
;
1146 } else if (attr
== &dev_attr_fnode_ipaddress
.attr
) {
1147 param
= ISCSI_FLASHNODE_IPADDR
;
1148 } else if (attr
== &dev_attr_fnode_redirect_ipaddr
.attr
) {
1149 param
= ISCSI_FLASHNODE_REDIRECT_IPADDR
;
1150 } else if (attr
== &dev_attr_fnode_max_segment_size
.attr
) {
1151 param
= ISCSI_FLASHNODE_MAX_SEGMENT_SIZE
;
1152 } else if (attr
== &dev_attr_fnode_local_port
.attr
) {
1153 param
= ISCSI_FLASHNODE_LOCAL_PORT
;
1154 } else if (attr
== &dev_attr_fnode_ipv4_tos
.attr
) {
1155 param
= ISCSI_FLASHNODE_IPV4_TOS
;
1156 } else if (attr
== &dev_attr_fnode_ipv6_traffic_class
.attr
) {
1157 param
= ISCSI_FLASHNODE_IPV6_TC
;
1158 } else if (attr
== &dev_attr_fnode_ipv6_flow_label
.attr
) {
1159 param
= ISCSI_FLASHNODE_IPV6_FLOW_LABEL
;
1160 } else if (attr
== &dev_attr_fnode_link_local_ipv6
.attr
) {
1161 param
= ISCSI_FLASHNODE_LINK_LOCAL_IPV6
;
1162 } else if (attr
== &dev_attr_fnode_tcp_xmit_wsf
.attr
) {
1163 param
= ISCSI_FLASHNODE_TCP_XMIT_WSF
;
1164 } else if (attr
== &dev_attr_fnode_tcp_recv_wsf
.attr
) {
1165 param
= ISCSI_FLASHNODE_TCP_RECV_WSF
;
1166 } else if (attr
== &dev_attr_fnode_statsn
.attr
) {
1167 param
= ISCSI_FLASHNODE_STATSN
;
1168 } else if (attr
== &dev_attr_fnode_exp_statsn
.attr
) {
1169 param
= ISCSI_FLASHNODE_EXP_STATSN
;
1171 WARN_ONCE(1, "Invalid flashnode connection attr");
1175 return t
->attr_is_visible(ISCSI_FLASHNODE_PARAM
, param
);
1178 static struct attribute_group iscsi_flashnode_conn_attr_group
= {
1179 .attrs
= iscsi_flashnode_conn_attrs
,
1180 .is_visible
= iscsi_flashnode_conn_attr_is_visible
,
1183 static const struct attribute_group
*iscsi_flashnode_conn_attr_groups
[] = {
1184 &iscsi_flashnode_conn_attr_group
,
1188 static void iscsi_flashnode_conn_release(struct device
*dev
)
1190 struct iscsi_bus_flash_conn
*fnode_conn
= iscsi_dev_to_flash_conn(dev
);
1192 kfree(fnode_conn
->ipaddress
);
1193 kfree(fnode_conn
->redirect_ipaddr
);
1194 kfree(fnode_conn
->link_local_ipv6_addr
);
1198 static const struct device_type iscsi_flashnode_conn_dev_type
= {
1199 .name
= "iscsi_flashnode_conn_dev_type",
1200 .groups
= iscsi_flashnode_conn_attr_groups
,
1201 .release
= iscsi_flashnode_conn_release
,
1204 static const struct bus_type iscsi_flashnode_bus
;
1206 int iscsi_flashnode_bus_match(struct device
*dev
,
1207 const struct device_driver
*drv
)
1209 if (dev
->bus
== &iscsi_flashnode_bus
)
1213 EXPORT_SYMBOL_GPL(iscsi_flashnode_bus_match
);
1215 static const struct bus_type iscsi_flashnode_bus
= {
1216 .name
= "iscsi_flashnode",
1217 .match
= &iscsi_flashnode_bus_match
,
1221 * iscsi_create_flashnode_sess - Add flashnode session entry in sysfs
1222 * @shost: pointer to host data
1223 * @index: index of flashnode to add in sysfs
1224 * @transport: pointer to transport data
1225 * @dd_size: total size to allocate
1227 * Adds a sysfs entry for the flashnode session attributes
1230 * pointer to allocated flashnode sess on success
1233 struct iscsi_bus_flash_session
*
1234 iscsi_create_flashnode_sess(struct Scsi_Host
*shost
, int index
,
1235 struct iscsi_transport
*transport
,
1238 struct iscsi_bus_flash_session
*fnode_sess
;
1241 fnode_sess
= kzalloc(sizeof(*fnode_sess
) + dd_size
, GFP_KERNEL
);
1245 fnode_sess
->transport
= transport
;
1246 fnode_sess
->target_id
= index
;
1247 fnode_sess
->dev
.type
= &iscsi_flashnode_sess_dev_type
;
1248 fnode_sess
->dev
.bus
= &iscsi_flashnode_bus
;
1249 fnode_sess
->dev
.parent
= &shost
->shost_gendev
;
1250 dev_set_name(&fnode_sess
->dev
, "flashnode_sess-%u:%u",
1251 shost
->host_no
, index
);
1253 err
= device_register(&fnode_sess
->dev
);
1258 fnode_sess
->dd_data
= &fnode_sess
[1];
1263 put_device(&fnode_sess
->dev
);
1266 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_sess
);
1269 * iscsi_create_flashnode_conn - Add flashnode conn entry in sysfs
1270 * @shost: pointer to host data
1271 * @fnode_sess: pointer to the parent flashnode session entry
1272 * @transport: pointer to transport data
1273 * @dd_size: total size to allocate
1275 * Adds a sysfs entry for the flashnode connection attributes
1278 * pointer to allocated flashnode conn on success
1281 struct iscsi_bus_flash_conn
*
1282 iscsi_create_flashnode_conn(struct Scsi_Host
*shost
,
1283 struct iscsi_bus_flash_session
*fnode_sess
,
1284 struct iscsi_transport
*transport
,
1287 struct iscsi_bus_flash_conn
*fnode_conn
;
1290 fnode_conn
= kzalloc(sizeof(*fnode_conn
) + dd_size
, GFP_KERNEL
);
1294 fnode_conn
->transport
= transport
;
1295 fnode_conn
->dev
.type
= &iscsi_flashnode_conn_dev_type
;
1296 fnode_conn
->dev
.bus
= &iscsi_flashnode_bus
;
1297 fnode_conn
->dev
.parent
= &fnode_sess
->dev
;
1298 dev_set_name(&fnode_conn
->dev
, "flashnode_conn-%u:%u:0",
1299 shost
->host_no
, fnode_sess
->target_id
);
1301 err
= device_register(&fnode_conn
->dev
);
1306 fnode_conn
->dd_data
= &fnode_conn
[1];
1311 put_device(&fnode_conn
->dev
);
1314 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_conn
);
1317 * iscsi_is_flashnode_conn_dev - verify passed device is to be flashnode conn
1318 * @dev: device to verify
1319 * @data: pointer to data containing value to use for verification
1321 * Verifies if the passed device is flashnode conn device
1327 static int iscsi_is_flashnode_conn_dev(struct device
*dev
, void *data
)
1329 return dev
->bus
== &iscsi_flashnode_bus
;
1332 static int iscsi_destroy_flashnode_conn(struct iscsi_bus_flash_conn
*fnode_conn
)
1334 device_unregister(&fnode_conn
->dev
);
1338 static int flashnode_match_index(struct device
*dev
, void *data
)
1340 struct iscsi_bus_flash_session
*fnode_sess
= NULL
;
1343 if (!iscsi_flashnode_bus_match(dev
, NULL
))
1344 goto exit_match_index
;
1346 fnode_sess
= iscsi_dev_to_flash_session(dev
);
1347 ret
= (fnode_sess
->target_id
== *((int *)data
)) ? 1 : 0;
1354 * iscsi_get_flashnode_by_index -finds flashnode session entry by index
1355 * @shost: pointer to host data
1356 * @idx: index to match
1358 * Finds the flashnode session object for the passed index
1361 * pointer to found flashnode session object on success
1364 static struct iscsi_bus_flash_session
*
1365 iscsi_get_flashnode_by_index(struct Scsi_Host
*shost
, uint32_t idx
)
1367 struct iscsi_bus_flash_session
*fnode_sess
= NULL
;
1370 dev
= device_find_child(&shost
->shost_gendev
, &idx
,
1371 flashnode_match_index
);
1373 fnode_sess
= iscsi_dev_to_flash_session(dev
);
1379 * iscsi_find_flashnode_sess - finds flashnode session entry
1380 * @shost: pointer to host data
1381 * @data: pointer to data containing value to use for comparison
1382 * @fn: function pointer that does actual comparison
1384 * Finds the flashnode session object comparing the data passed using logic
1385 * defined in passed function pointer
1388 * pointer to found flashnode session device object on success
1392 iscsi_find_flashnode_sess(struct Scsi_Host
*shost
, void *data
,
1393 int (*fn
)(struct device
*dev
, void *data
))
1395 return device_find_child(&shost
->shost_gendev
, data
, fn
);
1397 EXPORT_SYMBOL_GPL(iscsi_find_flashnode_sess
);
1400 * iscsi_find_flashnode_conn - finds flashnode connection entry
1401 * @fnode_sess: pointer to parent flashnode session entry
1403 * Finds the flashnode connection object comparing the data passed using logic
1404 * defined in passed function pointer
1407 * pointer to found flashnode connection device object on success
1411 iscsi_find_flashnode_conn(struct iscsi_bus_flash_session
*fnode_sess
)
1413 return device_find_child(&fnode_sess
->dev
, NULL
,
1414 iscsi_is_flashnode_conn_dev
);
1416 EXPORT_SYMBOL_GPL(iscsi_find_flashnode_conn
);
1418 static int iscsi_iter_destroy_flashnode_conn_fn(struct device
*dev
, void *data
)
1420 if (!iscsi_is_flashnode_conn_dev(dev
, NULL
))
1423 return iscsi_destroy_flashnode_conn(iscsi_dev_to_flash_conn(dev
));
1427 * iscsi_destroy_flashnode_sess - destroy flashnode session entry
1428 * @fnode_sess: pointer to flashnode session entry to be destroyed
1430 * Deletes the flashnode session entry and all children flashnode connection
1431 * entries from sysfs
1433 void iscsi_destroy_flashnode_sess(struct iscsi_bus_flash_session
*fnode_sess
)
1437 err
= device_for_each_child(&fnode_sess
->dev
, NULL
,
1438 iscsi_iter_destroy_flashnode_conn_fn
);
1440 pr_err("Could not delete all connections for %s. Error %d.\n",
1441 fnode_sess
->dev
.kobj
.name
, err
);
1443 device_unregister(&fnode_sess
->dev
);
1445 EXPORT_SYMBOL_GPL(iscsi_destroy_flashnode_sess
);
1447 static int iscsi_iter_destroy_flashnode_fn(struct device
*dev
, void *data
)
1449 if (!iscsi_flashnode_bus_match(dev
, NULL
))
1452 iscsi_destroy_flashnode_sess(iscsi_dev_to_flash_session(dev
));
1457 * iscsi_destroy_all_flashnode - destroy all flashnode session entries
1458 * @shost: pointer to host data
1460 * Destroys all the flashnode session entries and all corresponding children
1461 * flashnode connection entries from sysfs
1463 void iscsi_destroy_all_flashnode(struct Scsi_Host
*shost
)
1465 device_for_each_child(&shost
->shost_gendev
, NULL
,
1466 iscsi_iter_destroy_flashnode_fn
);
1468 EXPORT_SYMBOL_GPL(iscsi_destroy_all_flashnode
);
1474 * iscsi_bsg_host_dispatch - Dispatch command to LLD.
1475 * @job: bsg job to be processed
1477 static int iscsi_bsg_host_dispatch(struct bsg_job
*job
)
1479 struct Scsi_Host
*shost
= iscsi_job_to_shost(job
);
1480 struct iscsi_bsg_request
*req
= job
->request
;
1481 struct iscsi_bsg_reply
*reply
= job
->reply
;
1482 struct iscsi_internal
*i
= to_iscsi_internal(shost
->transportt
);
1483 int cmdlen
= sizeof(uint32_t); /* start with length of msgcode */
1486 /* check if we have the msgcode value at least */
1487 if (job
->request_len
< sizeof(uint32_t)) {
1492 /* Validate the host command */
1493 switch (req
->msgcode
) {
1494 case ISCSI_BSG_HST_VENDOR
:
1495 cmdlen
+= sizeof(struct iscsi_bsg_host_vendor
);
1496 if ((shost
->hostt
->vendor_id
== 0L) ||
1497 (req
->rqst_data
.h_vendor
.vendor_id
!=
1498 shost
->hostt
->vendor_id
)) {
1508 /* check if we really have all the request data needed */
1509 if (job
->request_len
< cmdlen
) {
1514 ret
= i
->iscsi_transport
->bsg_request(job
);
1519 /* return the errno failure code as the only status */
1520 BUG_ON(job
->reply_len
< sizeof(uint32_t));
1521 reply
->reply_payload_rcv_len
= 0;
1522 reply
->result
= ret
;
1523 job
->reply_len
= sizeof(uint32_t);
1524 bsg_job_done(job
, ret
, 0);
1529 * iscsi_bsg_host_add - Create and add the bsg hooks to receive requests
1530 * @shost: shost for iscsi_host
1531 * @ihost: iscsi_cls_host adding the structures to
1534 iscsi_bsg_host_add(struct Scsi_Host
*shost
, struct iscsi_cls_host
*ihost
)
1536 struct device
*dev
= &shost
->shost_gendev
;
1537 struct iscsi_internal
*i
= to_iscsi_internal(shost
->transportt
);
1538 struct queue_limits lim
;
1539 struct request_queue
*q
;
1542 if (!i
->iscsi_transport
->bsg_request
)
1545 snprintf(bsg_name
, sizeof(bsg_name
), "iscsi_host%d", shost
->host_no
);
1546 scsi_init_limits(shost
, &lim
);
1547 q
= bsg_setup_queue(dev
, bsg_name
, &lim
, iscsi_bsg_host_dispatch
, NULL
,
1550 shost_printk(KERN_ERR
, shost
, "bsg interface failed to "
1551 "initialize - no request queue\n");
1559 static int iscsi_setup_host(struct transport_container
*tc
, struct device
*dev
,
1560 struct device
*cdev
)
1562 struct Scsi_Host
*shost
= dev_to_shost(dev
);
1563 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
1565 memset(ihost
, 0, sizeof(*ihost
));
1566 mutex_init(&ihost
->mutex
);
1568 iscsi_bsg_host_add(shost
, ihost
);
1569 /* ignore any bsg add error - we just can't do sgio */
1574 static int iscsi_remove_host(struct transport_container
*tc
,
1575 struct device
*dev
, struct device
*cdev
)
1577 struct Scsi_Host
*shost
= dev_to_shost(dev
);
1578 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
1580 bsg_remove_queue(ihost
->bsg_q
);
1584 static DECLARE_TRANSPORT_CLASS(iscsi_host_class
,
1590 static DECLARE_TRANSPORT_CLASS(iscsi_session_class
,
1596 static DECLARE_TRANSPORT_CLASS(iscsi_connection_class
,
1602 static struct sock
*nls
;
1603 static DEFINE_MUTEX(rx_queue_mutex
);
1605 static LIST_HEAD(sesslist
);
1606 static DEFINE_SPINLOCK(sesslock
);
1607 static LIST_HEAD(connlist
);
1608 static DEFINE_SPINLOCK(connlock
);
1610 static uint32_t iscsi_conn_get_sid(struct iscsi_cls_conn
*conn
)
1612 struct iscsi_cls_session
*sess
= iscsi_dev_to_session(conn
->dev
.parent
);
1617 * Returns the matching session to a given sid
1619 static struct iscsi_cls_session
*iscsi_session_lookup(uint32_t sid
)
1621 unsigned long flags
;
1622 struct iscsi_cls_session
*sess
;
1624 spin_lock_irqsave(&sesslock
, flags
);
1625 list_for_each_entry(sess
, &sesslist
, sess_list
) {
1626 if (sess
->sid
== sid
) {
1627 spin_unlock_irqrestore(&sesslock
, flags
);
1631 spin_unlock_irqrestore(&sesslock
, flags
);
1636 * Returns the matching connection to a given sid / cid tuple
1638 static struct iscsi_cls_conn
*iscsi_conn_lookup(uint32_t sid
, uint32_t cid
)
1640 unsigned long flags
;
1641 struct iscsi_cls_conn
*conn
;
1643 spin_lock_irqsave(&connlock
, flags
);
1644 list_for_each_entry(conn
, &connlist
, conn_list
) {
1645 if ((conn
->cid
== cid
) && (iscsi_conn_get_sid(conn
) == sid
)) {
1646 spin_unlock_irqrestore(&connlock
, flags
);
1650 spin_unlock_irqrestore(&connlock
, flags
);
1655 * The following functions can be used by LLDs that allocate
1656 * their own scsi_hosts or by software iscsi LLDs
1661 } iscsi_session_state_names
[] = {
1662 { ISCSI_SESSION_LOGGED_IN
, "LOGGED_IN" },
1663 { ISCSI_SESSION_FAILED
, "FAILED" },
1664 { ISCSI_SESSION_FREE
, "FREE" },
1667 static const char *iscsi_session_state_name(int state
)
1672 for (i
= 0; i
< ARRAY_SIZE(iscsi_session_state_names
); i
++) {
1673 if (iscsi_session_state_names
[i
].value
== state
) {
1674 name
= iscsi_session_state_names
[i
].name
;
1681 static char *iscsi_session_target_state_name
[] = {
1682 [ISCSI_SESSION_TARGET_UNBOUND
] = "UNBOUND",
1683 [ISCSI_SESSION_TARGET_ALLOCATED
] = "ALLOCATED",
1684 [ISCSI_SESSION_TARGET_SCANNED
] = "SCANNED",
1685 [ISCSI_SESSION_TARGET_UNBINDING
] = "UNBINDING",
1688 int iscsi_session_chkready(struct iscsi_cls_session
*session
)
1692 switch (session
->state
) {
1693 case ISCSI_SESSION_LOGGED_IN
:
1696 case ISCSI_SESSION_FAILED
:
1697 err
= DID_IMM_RETRY
<< 16;
1699 case ISCSI_SESSION_FREE
:
1700 err
= DID_TRANSPORT_FAILFAST
<< 16;
1703 err
= DID_NO_CONNECT
<< 16;
1708 EXPORT_SYMBOL_GPL(iscsi_session_chkready
);
1710 int iscsi_is_session_online(struct iscsi_cls_session
*session
)
1712 unsigned long flags
;
1715 spin_lock_irqsave(&session
->lock
, flags
);
1716 if (session
->state
== ISCSI_SESSION_LOGGED_IN
)
1718 spin_unlock_irqrestore(&session
->lock
, flags
);
1721 EXPORT_SYMBOL_GPL(iscsi_is_session_online
);
1723 static void iscsi_session_release(struct device
*dev
)
1725 struct iscsi_cls_session
*session
= iscsi_dev_to_session(dev
);
1726 struct Scsi_Host
*shost
;
1728 shost
= iscsi_session_to_shost(session
);
1729 scsi_host_put(shost
);
1730 ISCSI_DBG_TRANS_SESSION(session
, "Completing session release\n");
1734 int iscsi_is_session_dev(const struct device
*dev
)
1736 return dev
->release
== iscsi_session_release
;
1738 EXPORT_SYMBOL_GPL(iscsi_is_session_dev
);
1740 static int iscsi_iter_session_fn(struct device
*dev
, void *data
)
1742 void (* fn
) (struct iscsi_cls_session
*) = data
;
1744 if (!iscsi_is_session_dev(dev
))
1746 fn(iscsi_dev_to_session(dev
));
1750 void iscsi_host_for_each_session(struct Scsi_Host
*shost
,
1751 void (*fn
)(struct iscsi_cls_session
*))
1753 device_for_each_child(&shost
->shost_gendev
, fn
,
1754 iscsi_iter_session_fn
);
1756 EXPORT_SYMBOL_GPL(iscsi_host_for_each_session
);
1758 struct iscsi_scan_data
{
1759 unsigned int channel
;
1762 enum scsi_scan_mode rescan
;
1765 static int iscsi_user_scan_session(struct device
*dev
, void *data
)
1767 struct iscsi_scan_data
*scan_data
= data
;
1768 struct iscsi_cls_session
*session
;
1769 struct Scsi_Host
*shost
;
1770 struct iscsi_cls_host
*ihost
;
1771 unsigned long flags
;
1774 if (!iscsi_is_session_dev(dev
))
1777 session
= iscsi_dev_to_session(dev
);
1779 ISCSI_DBG_TRANS_SESSION(session
, "Scanning session\n");
1781 shost
= iscsi_session_to_shost(session
);
1782 ihost
= shost
->shost_data
;
1784 mutex_lock(&ihost
->mutex
);
1785 spin_lock_irqsave(&session
->lock
, flags
);
1786 if (session
->state
!= ISCSI_SESSION_LOGGED_IN
) {
1787 spin_unlock_irqrestore(&session
->lock
, flags
);
1788 goto user_scan_exit
;
1790 id
= session
->target_id
;
1791 spin_unlock_irqrestore(&session
->lock
, flags
);
1793 if (id
!= ISCSI_MAX_TARGET
) {
1794 if ((scan_data
->channel
== SCAN_WILD_CARD
||
1795 scan_data
->channel
== 0) &&
1796 (scan_data
->id
== SCAN_WILD_CARD
||
1797 scan_data
->id
== id
)) {
1798 scsi_scan_target(&session
->dev
, 0, id
,
1799 scan_data
->lun
, scan_data
->rescan
);
1800 spin_lock_irqsave(&session
->lock
, flags
);
1801 session
->target_state
= ISCSI_SESSION_TARGET_SCANNED
;
1802 spin_unlock_irqrestore(&session
->lock
, flags
);
1807 mutex_unlock(&ihost
->mutex
);
1808 ISCSI_DBG_TRANS_SESSION(session
, "Completed session scan\n");
1812 static int iscsi_user_scan(struct Scsi_Host
*shost
, uint channel
,
1815 struct iscsi_scan_data scan_data
;
1817 scan_data
.channel
= channel
;
1819 scan_data
.lun
= lun
;
1820 scan_data
.rescan
= SCSI_SCAN_MANUAL
;
1822 return device_for_each_child(&shost
->shost_gendev
, &scan_data
,
1823 iscsi_user_scan_session
);
1826 static void iscsi_scan_session(struct work_struct
*work
)
1828 struct iscsi_cls_session
*session
=
1829 container_of(work
, struct iscsi_cls_session
, scan_work
);
1830 struct iscsi_scan_data scan_data
;
1832 scan_data
.channel
= 0;
1833 scan_data
.id
= SCAN_WILD_CARD
;
1834 scan_data
.lun
= SCAN_WILD_CARD
;
1835 scan_data
.rescan
= SCSI_SCAN_RESCAN
;
1837 iscsi_user_scan_session(&session
->dev
, &scan_data
);
1841 * iscsi_block_scsi_eh - block scsi eh until session state has transistioned
1842 * @cmd: scsi cmd passed to scsi eh handler
1844 * If the session is down this function will wait for the recovery
1845 * timer to fire or for the session to be logged back in. If the
1846 * recovery timer fires then FAST_IO_FAIL is returned. The caller
1847 * should pass this error value to the scsi eh.
1849 int iscsi_block_scsi_eh(struct scsi_cmnd
*cmd
)
1851 struct iscsi_cls_session
*session
=
1852 starget_to_session(scsi_target(cmd
->device
));
1853 unsigned long flags
;
1856 spin_lock_irqsave(&session
->lock
, flags
);
1857 while (session
->state
!= ISCSI_SESSION_LOGGED_IN
) {
1858 if (session
->state
== ISCSI_SESSION_FREE
) {
1862 spin_unlock_irqrestore(&session
->lock
, flags
);
1864 spin_lock_irqsave(&session
->lock
, flags
);
1866 spin_unlock_irqrestore(&session
->lock
, flags
);
1869 EXPORT_SYMBOL_GPL(iscsi_block_scsi_eh
);
1871 static void session_recovery_timedout(struct work_struct
*work
)
1873 struct iscsi_cls_session
*session
=
1874 container_of(work
, struct iscsi_cls_session
,
1875 recovery_work
.work
);
1876 unsigned long flags
;
1878 iscsi_cls_session_printk(KERN_INFO
, session
,
1879 "session recovery timed out after %d secs\n",
1880 session
->recovery_tmo
);
1882 spin_lock_irqsave(&session
->lock
, flags
);
1883 switch (session
->state
) {
1884 case ISCSI_SESSION_FAILED
:
1885 session
->state
= ISCSI_SESSION_FREE
;
1887 case ISCSI_SESSION_LOGGED_IN
:
1888 case ISCSI_SESSION_FREE
:
1889 /* we raced with the unblock's flush */
1890 spin_unlock_irqrestore(&session
->lock
, flags
);
1893 spin_unlock_irqrestore(&session
->lock
, flags
);
1895 ISCSI_DBG_TRANS_SESSION(session
, "Unblocking SCSI target\n");
1896 scsi_target_unblock(&session
->dev
, SDEV_TRANSPORT_OFFLINE
);
1897 ISCSI_DBG_TRANS_SESSION(session
, "Completed unblocking SCSI target\n");
1899 if (session
->transport
->session_recovery_timedout
)
1900 session
->transport
->session_recovery_timedout(session
);
1903 static void __iscsi_unblock_session(struct work_struct
*work
)
1905 struct iscsi_cls_session
*session
=
1906 container_of(work
, struct iscsi_cls_session
,
1908 unsigned long flags
;
1910 ISCSI_DBG_TRANS_SESSION(session
, "Unblocking session\n");
1912 cancel_delayed_work_sync(&session
->recovery_work
);
1913 spin_lock_irqsave(&session
->lock
, flags
);
1914 session
->state
= ISCSI_SESSION_LOGGED_IN
;
1915 spin_unlock_irqrestore(&session
->lock
, flags
);
1917 scsi_target_unblock(&session
->dev
, SDEV_RUNNING
);
1918 ISCSI_DBG_TRANS_SESSION(session
, "Completed unblocking session\n");
1922 * iscsi_unblock_session - set a session as logged in and start IO.
1923 * @session: iscsi session
1925 * Mark a session as ready to accept IO.
1927 void iscsi_unblock_session(struct iscsi_cls_session
*session
)
1929 if (!cancel_work_sync(&session
->block_work
))
1930 cancel_delayed_work_sync(&session
->recovery_work
);
1932 queue_work(session
->workq
, &session
->unblock_work
);
1934 * Blocking the session can be done from any context so we only
1935 * queue the block work. Make sure the unblock work has completed
1936 * because it flushes/cancels the other works and updates the state.
1938 flush_work(&session
->unblock_work
);
1940 EXPORT_SYMBOL_GPL(iscsi_unblock_session
);
1942 static void __iscsi_block_session(struct work_struct
*work
)
1944 struct iscsi_cls_session
*session
=
1945 container_of(work
, struct iscsi_cls_session
,
1947 struct Scsi_Host
*shost
= iscsi_session_to_shost(session
);
1948 unsigned long flags
;
1950 ISCSI_DBG_TRANS_SESSION(session
, "Blocking session\n");
1951 spin_lock_irqsave(&session
->lock
, flags
);
1952 session
->state
= ISCSI_SESSION_FAILED
;
1953 spin_unlock_irqrestore(&session
->lock
, flags
);
1954 scsi_block_targets(shost
, &session
->dev
);
1955 ISCSI_DBG_TRANS_SESSION(session
, "Completed SCSI target blocking\n");
1956 if (session
->recovery_tmo
>= 0)
1957 queue_delayed_work(session
->workq
,
1958 &session
->recovery_work
,
1959 session
->recovery_tmo
* HZ
);
1962 void iscsi_block_session(struct iscsi_cls_session
*session
)
1964 queue_work(session
->workq
, &session
->block_work
);
1966 EXPORT_SYMBOL_GPL(iscsi_block_session
);
1968 static void __iscsi_unbind_session(struct work_struct
*work
)
1970 struct iscsi_cls_session
*session
=
1971 container_of(work
, struct iscsi_cls_session
,
1973 struct Scsi_Host
*shost
= iscsi_session_to_shost(session
);
1974 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
1975 unsigned long flags
;
1976 unsigned int target_id
;
1977 bool remove_target
= true;
1979 ISCSI_DBG_TRANS_SESSION(session
, "Unbinding session\n");
1981 /* Prevent new scans and make sure scanning is not in progress */
1982 mutex_lock(&ihost
->mutex
);
1983 spin_lock_irqsave(&session
->lock
, flags
);
1984 if (session
->target_state
== ISCSI_SESSION_TARGET_ALLOCATED
) {
1985 remove_target
= false;
1986 } else if (session
->target_state
!= ISCSI_SESSION_TARGET_SCANNED
) {
1987 spin_unlock_irqrestore(&session
->lock
, flags
);
1988 mutex_unlock(&ihost
->mutex
);
1989 ISCSI_DBG_TRANS_SESSION(session
,
1990 "Skipping target unbinding: Session is unbound/unbinding.\n");
1994 session
->target_state
= ISCSI_SESSION_TARGET_UNBINDING
;
1995 target_id
= session
->target_id
;
1996 session
->target_id
= ISCSI_MAX_TARGET
;
1997 spin_unlock_irqrestore(&session
->lock
, flags
);
1998 mutex_unlock(&ihost
->mutex
);
2001 scsi_remove_target(&session
->dev
);
2003 if (session
->ida_used
)
2004 ida_free(&iscsi_sess_ida
, target_id
);
2006 iscsi_session_event(session
, ISCSI_KEVENT_UNBIND_SESSION
);
2007 ISCSI_DBG_TRANS_SESSION(session
, "Completed target removal\n");
2009 spin_lock_irqsave(&session
->lock
, flags
);
2010 session
->target_state
= ISCSI_SESSION_TARGET_UNBOUND
;
2011 spin_unlock_irqrestore(&session
->lock
, flags
);
2014 static void __iscsi_destroy_session(struct work_struct
*work
)
2016 struct iscsi_cls_session
*session
=
2017 container_of(work
, struct iscsi_cls_session
, destroy_work
);
2019 session
->transport
->destroy_session(session
);
2022 struct iscsi_cls_session
*
2023 iscsi_alloc_session(struct Scsi_Host
*shost
, struct iscsi_transport
*transport
,
2026 struct iscsi_cls_session
*session
;
2028 session
= kzalloc(sizeof(*session
) + dd_size
,
2033 session
->transport
= transport
;
2034 session
->creator
= -1;
2035 session
->recovery_tmo
= 120;
2036 session
->recovery_tmo_sysfs_override
= false;
2037 session
->state
= ISCSI_SESSION_FREE
;
2038 INIT_DELAYED_WORK(&session
->recovery_work
, session_recovery_timedout
);
2039 INIT_LIST_HEAD(&session
->sess_list
);
2040 INIT_WORK(&session
->unblock_work
, __iscsi_unblock_session
);
2041 INIT_WORK(&session
->block_work
, __iscsi_block_session
);
2042 INIT_WORK(&session
->unbind_work
, __iscsi_unbind_session
);
2043 INIT_WORK(&session
->scan_work
, iscsi_scan_session
);
2044 INIT_WORK(&session
->destroy_work
, __iscsi_destroy_session
);
2045 spin_lock_init(&session
->lock
);
2047 /* this is released in the dev's release function */
2048 scsi_host_get(shost
);
2049 session
->dev
.parent
= &shost
->shost_gendev
;
2050 session
->dev
.release
= iscsi_session_release
;
2051 device_initialize(&session
->dev
);
2053 session
->dd_data
= &session
[1];
2055 ISCSI_DBG_TRANS_SESSION(session
, "Completed session allocation\n");
2058 EXPORT_SYMBOL_GPL(iscsi_alloc_session
);
2060 int iscsi_add_session(struct iscsi_cls_session
*session
, unsigned int target_id
)
2062 struct Scsi_Host
*shost
= iscsi_session_to_shost(session
);
2063 unsigned long flags
;
2067 session
->sid
= atomic_add_return(1, &iscsi_session_nr
);
2069 session
->workq
= alloc_workqueue("iscsi_ctrl_%d:%d",
2070 WQ_SYSFS
| WQ_MEM_RECLAIM
| WQ_UNBOUND
, 0,
2071 shost
->host_no
, session
->sid
);
2072 if (!session
->workq
)
2075 if (target_id
== ISCSI_MAX_TARGET
) {
2076 id
= ida_alloc(&iscsi_sess_ida
, GFP_KERNEL
);
2079 iscsi_cls_session_printk(KERN_ERR
, session
,
2080 "Failure in Target ID Allocation\n");
2084 session
->target_id
= (unsigned int)id
;
2085 session
->ida_used
= true;
2087 session
->target_id
= target_id
;
2088 spin_lock_irqsave(&session
->lock
, flags
);
2089 session
->target_state
= ISCSI_SESSION_TARGET_ALLOCATED
;
2090 spin_unlock_irqrestore(&session
->lock
, flags
);
2092 dev_set_name(&session
->dev
, "session%u", session
->sid
);
2093 err
= device_add(&session
->dev
);
2095 iscsi_cls_session_printk(KERN_ERR
, session
,
2096 "could not register session's dev\n");
2099 err
= transport_register_device(&session
->dev
);
2101 iscsi_cls_session_printk(KERN_ERR
, session
,
2102 "could not register transport's dev\n");
2106 spin_lock_irqsave(&sesslock
, flags
);
2107 list_add(&session
->sess_list
, &sesslist
);
2108 spin_unlock_irqrestore(&sesslock
, flags
);
2110 iscsi_session_event(session
, ISCSI_KEVENT_CREATE_SESSION
);
2111 ISCSI_DBG_TRANS_SESSION(session
, "Completed session adding\n");
2115 device_del(&session
->dev
);
2117 if (session
->ida_used
)
2118 ida_free(&iscsi_sess_ida
, session
->target_id
);
2120 destroy_workqueue(session
->workq
);
2123 EXPORT_SYMBOL_GPL(iscsi_add_session
);
2126 * iscsi_create_session - create iscsi class session
2128 * @transport: iscsi transport
2129 * @dd_size: private driver data size
2130 * @target_id: which target
2132 * This can be called from a LLD or iscsi_transport.
2134 struct iscsi_cls_session
*
2135 iscsi_create_session(struct Scsi_Host
*shost
, struct iscsi_transport
*transport
,
2136 int dd_size
, unsigned int target_id
)
2138 struct iscsi_cls_session
*session
;
2140 session
= iscsi_alloc_session(shost
, transport
, dd_size
);
2144 if (iscsi_add_session(session
, target_id
)) {
2145 iscsi_free_session(session
);
2150 EXPORT_SYMBOL_GPL(iscsi_create_session
);
2152 static void iscsi_conn_release(struct device
*dev
)
2154 struct iscsi_cls_conn
*conn
= iscsi_dev_to_conn(dev
);
2155 struct device
*parent
= conn
->dev
.parent
;
2157 ISCSI_DBG_TRANS_CONN(conn
, "Releasing conn\n");
2162 static int iscsi_is_conn_dev(const struct device
*dev
)
2164 return dev
->release
== iscsi_conn_release
;
2167 static int iscsi_iter_destroy_conn_fn(struct device
*dev
, void *data
)
2169 if (!iscsi_is_conn_dev(dev
))
2172 iscsi_remove_conn(iscsi_dev_to_conn(dev
));
2176 void iscsi_remove_session(struct iscsi_cls_session
*session
)
2178 unsigned long flags
;
2181 ISCSI_DBG_TRANS_SESSION(session
, "Removing session\n");
2183 spin_lock_irqsave(&sesslock
, flags
);
2184 if (!list_empty(&session
->sess_list
))
2185 list_del(&session
->sess_list
);
2186 spin_unlock_irqrestore(&sesslock
, flags
);
2188 if (!cancel_work_sync(&session
->block_work
))
2189 cancel_delayed_work_sync(&session
->recovery_work
);
2190 cancel_work_sync(&session
->unblock_work
);
2192 * If we are blocked let commands flow again. The lld or iscsi
2193 * layer should set up the queuecommand to fail commands.
2194 * We assume that LLD will not be calling block/unblock while
2195 * removing the session.
2197 spin_lock_irqsave(&session
->lock
, flags
);
2198 session
->state
= ISCSI_SESSION_FREE
;
2199 spin_unlock_irqrestore(&session
->lock
, flags
);
2201 scsi_target_unblock(&session
->dev
, SDEV_TRANSPORT_OFFLINE
);
2203 * qla4xxx can perform it's own scans when it runs in kernel only
2204 * mode. Make sure to flush those scans.
2206 flush_work(&session
->scan_work
);
2207 /* flush running unbind operations */
2208 flush_work(&session
->unbind_work
);
2209 __iscsi_unbind_session(&session
->unbind_work
);
2211 /* hw iscsi may not have removed all connections from session */
2212 err
= device_for_each_child(&session
->dev
, NULL
,
2213 iscsi_iter_destroy_conn_fn
);
2215 iscsi_cls_session_printk(KERN_ERR
, session
,
2216 "Could not delete all connections "
2217 "for session. Error %d.\n", err
);
2219 transport_unregister_device(&session
->dev
);
2221 destroy_workqueue(session
->workq
);
2223 ISCSI_DBG_TRANS_SESSION(session
, "Completing session removal\n");
2224 device_del(&session
->dev
);
2226 EXPORT_SYMBOL_GPL(iscsi_remove_session
);
2228 static void iscsi_stop_conn(struct iscsi_cls_conn
*conn
, int flag
)
2230 ISCSI_DBG_TRANS_CONN(conn
, "Stopping conn.\n");
2233 case STOP_CONN_RECOVER
:
2234 WRITE_ONCE(conn
->state
, ISCSI_CONN_FAILED
);
2236 case STOP_CONN_TERM
:
2237 WRITE_ONCE(conn
->state
, ISCSI_CONN_DOWN
);
2240 iscsi_cls_conn_printk(KERN_ERR
, conn
, "invalid stop flag %d\n",
2245 conn
->transport
->stop_conn(conn
, flag
);
2246 ISCSI_DBG_TRANS_CONN(conn
, "Stopping conn done.\n");
2249 static void iscsi_ep_disconnect(struct iscsi_cls_conn
*conn
, bool is_active
)
2251 struct iscsi_cls_session
*session
= iscsi_conn_to_session(conn
);
2252 struct iscsi_endpoint
*ep
;
2254 ISCSI_DBG_TRANS_CONN(conn
, "disconnect ep.\n");
2255 WRITE_ONCE(conn
->state
, ISCSI_CONN_FAILED
);
2257 if (!conn
->ep
|| !session
->transport
->ep_disconnect
)
2263 session
->transport
->unbind_conn(conn
, is_active
);
2264 session
->transport
->ep_disconnect(ep
);
2265 ISCSI_DBG_TRANS_CONN(conn
, "disconnect ep done.\n");
2268 static void iscsi_if_disconnect_bound_ep(struct iscsi_cls_conn
*conn
,
2269 struct iscsi_endpoint
*ep
,
2272 /* Check if this was a conn error and the kernel took ownership */
2273 spin_lock_irq(&conn
->lock
);
2274 if (!test_bit(ISCSI_CLS_CONN_BIT_CLEANUP
, &conn
->flags
)) {
2275 spin_unlock_irq(&conn
->lock
);
2276 iscsi_ep_disconnect(conn
, is_active
);
2278 spin_unlock_irq(&conn
->lock
);
2279 ISCSI_DBG_TRANS_CONN(conn
, "flush kernel conn cleanup.\n");
2280 mutex_unlock(&conn
->ep_mutex
);
2282 flush_work(&conn
->cleanup_work
);
2284 * Userspace is now done with the EP so we can release the ref
2285 * iscsi_cleanup_conn_work_fn took.
2287 iscsi_put_endpoint(ep
);
2288 mutex_lock(&conn
->ep_mutex
);
2292 static int iscsi_if_stop_conn(struct iscsi_cls_conn
*conn
, int flag
)
2294 ISCSI_DBG_TRANS_CONN(conn
, "iscsi if conn stop.\n");
2296 * For offload, iscsid may not know about the ep like when iscsid is
2297 * restarted or for kernel based session shutdown iscsid is not even
2298 * up. For these cases, we do the disconnect now.
2300 mutex_lock(&conn
->ep_mutex
);
2302 iscsi_if_disconnect_bound_ep(conn
, conn
->ep
, true);
2303 mutex_unlock(&conn
->ep_mutex
);
2306 * If this is a termination we have to call stop_conn with that flag
2307 * so the correct states get set. If we haven't run the work yet try to
2308 * avoid the extra run.
2310 if (flag
== STOP_CONN_TERM
) {
2311 cancel_work_sync(&conn
->cleanup_work
);
2312 iscsi_stop_conn(conn
, flag
);
2315 * Figure out if it was the kernel or userspace initiating this.
2317 spin_lock_irq(&conn
->lock
);
2318 if (!test_and_set_bit(ISCSI_CLS_CONN_BIT_CLEANUP
, &conn
->flags
)) {
2319 spin_unlock_irq(&conn
->lock
);
2320 iscsi_stop_conn(conn
, flag
);
2322 spin_unlock_irq(&conn
->lock
);
2323 ISCSI_DBG_TRANS_CONN(conn
,
2324 "flush kernel conn cleanup.\n");
2325 flush_work(&conn
->cleanup_work
);
2328 * Only clear for recovery to avoid extra cleanup runs during
2331 spin_lock_irq(&conn
->lock
);
2332 clear_bit(ISCSI_CLS_CONN_BIT_CLEANUP
, &conn
->flags
);
2333 spin_unlock_irq(&conn
->lock
);
2335 ISCSI_DBG_TRANS_CONN(conn
, "iscsi if conn stop done.\n");
2339 static void iscsi_cleanup_conn_work_fn(struct work_struct
*work
)
2341 struct iscsi_cls_conn
*conn
= container_of(work
, struct iscsi_cls_conn
,
2343 struct iscsi_cls_session
*session
= iscsi_conn_to_session(conn
);
2345 mutex_lock(&conn
->ep_mutex
);
2347 * Get a ref to the ep, so we don't release its ID until after
2348 * userspace is done referencing it in iscsi_if_disconnect_bound_ep.
2351 get_device(&conn
->ep
->dev
);
2352 iscsi_ep_disconnect(conn
, false);
2354 if (system_state
!= SYSTEM_RUNNING
) {
2356 * If the user has set up for the session to never timeout
2357 * then hang like they wanted. For all other cases fail right
2358 * away since userspace is not going to relogin.
2360 if (session
->recovery_tmo
> 0)
2361 session
->recovery_tmo
= 0;
2364 iscsi_stop_conn(conn
, STOP_CONN_RECOVER
);
2365 mutex_unlock(&conn
->ep_mutex
);
2366 ISCSI_DBG_TRANS_CONN(conn
, "cleanup done.\n");
2369 static int iscsi_iter_force_destroy_conn_fn(struct device
*dev
, void *data
)
2371 struct iscsi_transport
*transport
;
2372 struct iscsi_cls_conn
*conn
;
2374 if (!iscsi_is_conn_dev(dev
))
2377 conn
= iscsi_dev_to_conn(dev
);
2378 transport
= conn
->transport
;
2380 if (READ_ONCE(conn
->state
) != ISCSI_CONN_DOWN
)
2381 iscsi_if_stop_conn(conn
, STOP_CONN_TERM
);
2383 transport
->destroy_conn(conn
);
2388 * iscsi_force_destroy_session - destroy a session from the kernel
2389 * @session: session to destroy
2391 * Force the destruction of a session from the kernel. This should only be
2392 * used when userspace is no longer running during system shutdown.
2394 void iscsi_force_destroy_session(struct iscsi_cls_session
*session
)
2396 struct iscsi_transport
*transport
= session
->transport
;
2397 unsigned long flags
;
2399 WARN_ON_ONCE(system_state
== SYSTEM_RUNNING
);
2401 spin_lock_irqsave(&sesslock
, flags
);
2402 if (list_empty(&session
->sess_list
)) {
2403 spin_unlock_irqrestore(&sesslock
, flags
);
2405 * Conn/ep is already freed. Session is being torn down via
2406 * async path. For shutdown we don't care about it so return.
2410 spin_unlock_irqrestore(&sesslock
, flags
);
2412 device_for_each_child(&session
->dev
, NULL
,
2413 iscsi_iter_force_destroy_conn_fn
);
2414 transport
->destroy_session(session
);
2416 EXPORT_SYMBOL_GPL(iscsi_force_destroy_session
);
2418 void iscsi_free_session(struct iscsi_cls_session
*session
)
2420 ISCSI_DBG_TRANS_SESSION(session
, "Freeing session\n");
2421 iscsi_session_event(session
, ISCSI_KEVENT_DESTROY_SESSION
);
2422 put_device(&session
->dev
);
2424 EXPORT_SYMBOL_GPL(iscsi_free_session
);
2427 * iscsi_alloc_conn - alloc iscsi class connection
2428 * @session: iscsi cls session
2429 * @dd_size: private driver data size
2430 * @cid: connection id
2432 struct iscsi_cls_conn
*
2433 iscsi_alloc_conn(struct iscsi_cls_session
*session
, int dd_size
, uint32_t cid
)
2435 struct iscsi_transport
*transport
= session
->transport
;
2436 struct iscsi_cls_conn
*conn
;
2438 conn
= kzalloc(sizeof(*conn
) + dd_size
, GFP_KERNEL
);
2442 conn
->dd_data
= &conn
[1];
2444 mutex_init(&conn
->ep_mutex
);
2445 spin_lock_init(&conn
->lock
);
2446 INIT_LIST_HEAD(&conn
->conn_list
);
2447 INIT_WORK(&conn
->cleanup_work
, iscsi_cleanup_conn_work_fn
);
2448 conn
->transport
= transport
;
2450 WRITE_ONCE(conn
->state
, ISCSI_CONN_DOWN
);
2452 /* this is released in the dev's release function */
2453 if (!get_device(&session
->dev
))
2456 dev_set_name(&conn
->dev
, "connection%d:%u", session
->sid
, cid
);
2457 device_initialize(&conn
->dev
);
2458 conn
->dev
.parent
= &session
->dev
;
2459 conn
->dev
.release
= iscsi_conn_release
;
2467 EXPORT_SYMBOL_GPL(iscsi_alloc_conn
);
2470 * iscsi_add_conn - add iscsi class connection
2471 * @conn: iscsi cls connection
2473 * This will expose iscsi_cls_conn to sysfs so make sure the related
2474 * resources for sysfs attributes are initialized before calling this.
2476 int iscsi_add_conn(struct iscsi_cls_conn
*conn
)
2479 unsigned long flags
;
2480 struct iscsi_cls_session
*session
= iscsi_dev_to_session(conn
->dev
.parent
);
2482 err
= device_add(&conn
->dev
);
2484 iscsi_cls_session_printk(KERN_ERR
, session
,
2485 "could not register connection's dev\n");
2488 err
= transport_register_device(&conn
->dev
);
2490 iscsi_cls_session_printk(KERN_ERR
, session
,
2491 "could not register transport's dev\n");
2492 device_del(&conn
->dev
);
2496 spin_lock_irqsave(&connlock
, flags
);
2497 list_add(&conn
->conn_list
, &connlist
);
2498 spin_unlock_irqrestore(&connlock
, flags
);
2502 EXPORT_SYMBOL_GPL(iscsi_add_conn
);
2505 * iscsi_remove_conn - remove iscsi class connection from sysfs
2506 * @conn: iscsi cls connection
2508 * Remove iscsi_cls_conn from sysfs, and wait for previous
2509 * read/write of iscsi_cls_conn's attributes in sysfs to finish.
2511 void iscsi_remove_conn(struct iscsi_cls_conn
*conn
)
2513 unsigned long flags
;
2515 spin_lock_irqsave(&connlock
, flags
);
2516 list_del(&conn
->conn_list
);
2517 spin_unlock_irqrestore(&connlock
, flags
);
2519 transport_unregister_device(&conn
->dev
);
2520 device_del(&conn
->dev
);
2522 EXPORT_SYMBOL_GPL(iscsi_remove_conn
);
2524 void iscsi_put_conn(struct iscsi_cls_conn
*conn
)
2526 put_device(&conn
->dev
);
2528 EXPORT_SYMBOL_GPL(iscsi_put_conn
);
2530 void iscsi_get_conn(struct iscsi_cls_conn
*conn
)
2532 get_device(&conn
->dev
);
2534 EXPORT_SYMBOL_GPL(iscsi_get_conn
);
2537 * iscsi interface functions
2539 static struct iscsi_internal
*
2540 iscsi_if_transport_lookup(struct iscsi_transport
*tt
)
2542 struct iscsi_internal
*priv
;
2543 unsigned long flags
;
2545 spin_lock_irqsave(&iscsi_transport_lock
, flags
);
2546 list_for_each_entry(priv
, &iscsi_transports
, list
) {
2547 if (tt
== priv
->iscsi_transport
) {
2548 spin_unlock_irqrestore(&iscsi_transport_lock
, flags
);
2552 spin_unlock_irqrestore(&iscsi_transport_lock
, flags
);
2557 iscsi_multicast_skb(struct sk_buff
*skb
, uint32_t group
, gfp_t gfp
)
2559 return nlmsg_multicast(nls
, skb
, 0, group
, gfp
);
2563 iscsi_unicast_skb(struct sk_buff
*skb
, u32 portid
)
2565 return nlmsg_unicast(nls
, skb
, portid
);
2568 int iscsi_recv_pdu(struct iscsi_cls_conn
*conn
, struct iscsi_hdr
*hdr
,
2569 char *data
, uint32_t data_size
)
2571 struct nlmsghdr
*nlh
;
2572 struct sk_buff
*skb
;
2573 struct iscsi_uevent
*ev
;
2575 struct iscsi_internal
*priv
;
2576 int len
= nlmsg_total_size(sizeof(*ev
) + sizeof(struct iscsi_hdr
) +
2579 priv
= iscsi_if_transport_lookup(conn
->transport
);
2583 skb
= alloc_skb(len
, GFP_ATOMIC
);
2585 iscsi_conn_error_event(conn
, ISCSI_ERR_CONN_FAILED
);
2586 iscsi_cls_conn_printk(KERN_ERR
, conn
, "can not deliver "
2587 "control PDU: OOM\n");
2591 nlh
= __nlmsg_put(skb
, 0, 0, 0, (len
- sizeof(*nlh
)), 0);
2592 ev
= nlmsg_data(nlh
);
2593 memset(ev
, 0, sizeof(*ev
));
2594 ev
->transport_handle
= iscsi_handle(conn
->transport
);
2595 ev
->type
= ISCSI_KEVENT_RECV_PDU
;
2596 ev
->r
.recv_req
.cid
= conn
->cid
;
2597 ev
->r
.recv_req
.sid
= iscsi_conn_get_sid(conn
);
2598 pdu
= (char*)ev
+ sizeof(*ev
);
2599 memcpy(pdu
, hdr
, sizeof(struct iscsi_hdr
));
2600 memcpy(pdu
+ sizeof(struct iscsi_hdr
), data
, data_size
);
2602 return iscsi_multicast_skb(skb
, ISCSI_NL_GRP_ISCSID
, GFP_ATOMIC
);
2604 EXPORT_SYMBOL_GPL(iscsi_recv_pdu
);
2606 int iscsi_offload_mesg(struct Scsi_Host
*shost
,
2607 struct iscsi_transport
*transport
, uint32_t type
,
2608 char *data
, uint16_t data_size
)
2610 struct nlmsghdr
*nlh
;
2611 struct sk_buff
*skb
;
2612 struct iscsi_uevent
*ev
;
2613 int len
= nlmsg_total_size(sizeof(*ev
) + data_size
);
2615 skb
= alloc_skb(len
, GFP_ATOMIC
);
2617 printk(KERN_ERR
"can not deliver iscsi offload message:OOM\n");
2621 nlh
= __nlmsg_put(skb
, 0, 0, 0, (len
- sizeof(*nlh
)), 0);
2622 ev
= nlmsg_data(nlh
);
2623 memset(ev
, 0, sizeof(*ev
));
2625 ev
->transport_handle
= iscsi_handle(transport
);
2627 case ISCSI_KEVENT_PATH_REQ
:
2628 ev
->r
.req_path
.host_no
= shost
->host_no
;
2630 case ISCSI_KEVENT_IF_DOWN
:
2631 ev
->r
.notify_if_down
.host_no
= shost
->host_no
;
2635 memcpy((char *)ev
+ sizeof(*ev
), data
, data_size
);
2637 return iscsi_multicast_skb(skb
, ISCSI_NL_GRP_UIP
, GFP_ATOMIC
);
2639 EXPORT_SYMBOL_GPL(iscsi_offload_mesg
);
2641 void iscsi_conn_error_event(struct iscsi_cls_conn
*conn
, enum iscsi_err error
)
2643 struct nlmsghdr
*nlh
;
2644 struct sk_buff
*skb
;
2645 struct iscsi_uevent
*ev
;
2646 struct iscsi_internal
*priv
;
2647 int len
= nlmsg_total_size(sizeof(*ev
));
2648 unsigned long flags
;
2651 spin_lock_irqsave(&conn
->lock
, flags
);
2653 * Userspace will only do a stop call if we are at least bound. And, we
2654 * only need to do the in kernel cleanup if in the UP state so cmds can
2655 * be released to upper layers. If in other states just wait for
2656 * userspace to avoid races that can leave the cleanup_work queued.
2658 state
= READ_ONCE(conn
->state
);
2660 case ISCSI_CONN_BOUND
:
2662 if (!test_and_set_bit(ISCSI_CLS_CONN_BIT_CLEANUP
,
2664 queue_work(iscsi_conn_cleanup_workq
,
2665 &conn
->cleanup_work
);
2669 ISCSI_DBG_TRANS_CONN(conn
, "Got conn error in state %d\n",
2673 spin_unlock_irqrestore(&conn
->lock
, flags
);
2675 priv
= iscsi_if_transport_lookup(conn
->transport
);
2679 skb
= alloc_skb(len
, GFP_ATOMIC
);
2681 iscsi_cls_conn_printk(KERN_ERR
, conn
, "gracefully ignored "
2682 "conn error (%d)\n", error
);
2686 nlh
= __nlmsg_put(skb
, 0, 0, 0, (len
- sizeof(*nlh
)), 0);
2687 ev
= nlmsg_data(nlh
);
2688 ev
->transport_handle
= iscsi_handle(conn
->transport
);
2689 ev
->type
= ISCSI_KEVENT_CONN_ERROR
;
2690 ev
->r
.connerror
.error
= error
;
2691 ev
->r
.connerror
.cid
= conn
->cid
;
2692 ev
->r
.connerror
.sid
= iscsi_conn_get_sid(conn
);
2694 iscsi_multicast_skb(skb
, ISCSI_NL_GRP_ISCSID
, GFP_ATOMIC
);
2696 iscsi_cls_conn_printk(KERN_INFO
, conn
, "detected conn error (%d)\n",
2699 EXPORT_SYMBOL_GPL(iscsi_conn_error_event
);
2701 void iscsi_conn_login_event(struct iscsi_cls_conn
*conn
,
2702 enum iscsi_conn_state state
)
2704 struct nlmsghdr
*nlh
;
2705 struct sk_buff
*skb
;
2706 struct iscsi_uevent
*ev
;
2707 struct iscsi_internal
*priv
;
2708 int len
= nlmsg_total_size(sizeof(*ev
));
2710 priv
= iscsi_if_transport_lookup(conn
->transport
);
2714 skb
= alloc_skb(len
, GFP_ATOMIC
);
2716 iscsi_cls_conn_printk(KERN_ERR
, conn
, "gracefully ignored "
2717 "conn login (%d)\n", state
);
2721 nlh
= __nlmsg_put(skb
, 0, 0, 0, (len
- sizeof(*nlh
)), 0);
2722 ev
= nlmsg_data(nlh
);
2723 ev
->transport_handle
= iscsi_handle(conn
->transport
);
2724 ev
->type
= ISCSI_KEVENT_CONN_LOGIN_STATE
;
2725 ev
->r
.conn_login
.state
= state
;
2726 ev
->r
.conn_login
.cid
= conn
->cid
;
2727 ev
->r
.conn_login
.sid
= iscsi_conn_get_sid(conn
);
2728 iscsi_multicast_skb(skb
, ISCSI_NL_GRP_ISCSID
, GFP_ATOMIC
);
2730 iscsi_cls_conn_printk(KERN_INFO
, conn
, "detected conn login (%d)\n",
2733 EXPORT_SYMBOL_GPL(iscsi_conn_login_event
);
2735 void iscsi_post_host_event(uint32_t host_no
, struct iscsi_transport
*transport
,
2736 enum iscsi_host_event_code code
, uint32_t data_size
,
2739 struct nlmsghdr
*nlh
;
2740 struct sk_buff
*skb
;
2741 struct iscsi_uevent
*ev
;
2742 int len
= nlmsg_total_size(sizeof(*ev
) + data_size
);
2744 skb
= alloc_skb(len
, GFP_NOIO
);
2746 printk(KERN_ERR
"gracefully ignored host event (%d):%d OOM\n",
2751 nlh
= __nlmsg_put(skb
, 0, 0, 0, (len
- sizeof(*nlh
)), 0);
2752 ev
= nlmsg_data(nlh
);
2753 ev
->transport_handle
= iscsi_handle(transport
);
2754 ev
->type
= ISCSI_KEVENT_HOST_EVENT
;
2755 ev
->r
.host_event
.host_no
= host_no
;
2756 ev
->r
.host_event
.code
= code
;
2757 ev
->r
.host_event
.data_size
= data_size
;
2760 memcpy((char *)ev
+ sizeof(*ev
), data
, data_size
);
2762 iscsi_multicast_skb(skb
, ISCSI_NL_GRP_ISCSID
, GFP_NOIO
);
2764 EXPORT_SYMBOL_GPL(iscsi_post_host_event
);
2766 void iscsi_ping_comp_event(uint32_t host_no
, struct iscsi_transport
*transport
,
2767 uint32_t status
, uint32_t pid
, uint32_t data_size
,
2770 struct nlmsghdr
*nlh
;
2771 struct sk_buff
*skb
;
2772 struct iscsi_uevent
*ev
;
2773 int len
= nlmsg_total_size(sizeof(*ev
) + data_size
);
2775 skb
= alloc_skb(len
, GFP_NOIO
);
2777 printk(KERN_ERR
"gracefully ignored ping comp: OOM\n");
2781 nlh
= __nlmsg_put(skb
, 0, 0, 0, (len
- sizeof(*nlh
)), 0);
2782 ev
= nlmsg_data(nlh
);
2783 ev
->transport_handle
= iscsi_handle(transport
);
2784 ev
->type
= ISCSI_KEVENT_PING_COMP
;
2785 ev
->r
.ping_comp
.host_no
= host_no
;
2786 ev
->r
.ping_comp
.status
= status
;
2787 ev
->r
.ping_comp
.pid
= pid
;
2788 ev
->r
.ping_comp
.data_size
= data_size
;
2789 memcpy((char *)ev
+ sizeof(*ev
), data
, data_size
);
2791 iscsi_multicast_skb(skb
, ISCSI_NL_GRP_ISCSID
, GFP_NOIO
);
2793 EXPORT_SYMBOL_GPL(iscsi_ping_comp_event
);
2796 iscsi_if_send_reply(u32 portid
, int type
, void *payload
, int size
)
2798 struct sk_buff
*skb
;
2799 struct nlmsghdr
*nlh
;
2800 int len
= nlmsg_total_size(size
);
2802 skb
= alloc_skb(len
, GFP_ATOMIC
);
2804 printk(KERN_ERR
"Could not allocate skb to send reply.\n");
2808 nlh
= __nlmsg_put(skb
, 0, 0, type
, (len
- sizeof(*nlh
)), 0);
2809 memcpy(nlmsg_data(nlh
), payload
, size
);
2810 return iscsi_unicast_skb(skb
, portid
);
2814 iscsi_if_get_stats(struct iscsi_transport
*transport
, struct nlmsghdr
*nlh
)
2816 struct iscsi_uevent
*ev
= nlmsg_data(nlh
);
2817 struct iscsi_stats
*stats
;
2818 struct sk_buff
*skbstat
;
2819 struct iscsi_cls_conn
*conn
;
2820 struct nlmsghdr
*nlhstat
;
2821 struct iscsi_uevent
*evstat
;
2822 struct iscsi_internal
*priv
;
2823 int len
= nlmsg_total_size(sizeof(*ev
) +
2824 sizeof(struct iscsi_stats
) +
2825 sizeof(struct iscsi_stats_custom
) *
2826 ISCSI_STATS_CUSTOM_MAX
);
2829 priv
= iscsi_if_transport_lookup(transport
);
2833 conn
= iscsi_conn_lookup(ev
->u
.get_stats
.sid
, ev
->u
.get_stats
.cid
);
2840 skbstat
= alloc_skb(len
, GFP_ATOMIC
);
2842 iscsi_cls_conn_printk(KERN_ERR
, conn
, "can not "
2843 "deliver stats: OOM\n");
2847 nlhstat
= __nlmsg_put(skbstat
, 0, 0, 0,
2848 (len
- sizeof(*nlhstat
)), 0);
2849 evstat
= nlmsg_data(nlhstat
);
2850 memset(evstat
, 0, sizeof(*evstat
));
2851 evstat
->transport_handle
= iscsi_handle(conn
->transport
);
2852 evstat
->type
= nlh
->nlmsg_type
;
2853 evstat
->u
.get_stats
.cid
=
2854 ev
->u
.get_stats
.cid
;
2855 evstat
->u
.get_stats
.sid
=
2856 ev
->u
.get_stats
.sid
;
2857 stats
= (struct iscsi_stats
*)
2858 ((char*)evstat
+ sizeof(*evstat
));
2859 memset(stats
, 0, sizeof(*stats
));
2861 transport
->get_stats(conn
, stats
);
2862 actual_size
= nlmsg_total_size(sizeof(struct iscsi_uevent
) +
2863 sizeof(struct iscsi_stats
) +
2864 sizeof(struct iscsi_stats_custom
) *
2865 stats
->custom_length
);
2866 actual_size
-= sizeof(*nlhstat
);
2867 actual_size
= nlmsg_msg_size(actual_size
);
2868 skb_trim(skbstat
, NLMSG_ALIGN(actual_size
));
2869 nlhstat
->nlmsg_len
= actual_size
;
2871 err
= iscsi_multicast_skb(skbstat
, ISCSI_NL_GRP_ISCSID
,
2873 } while (err
< 0 && err
!= -ECONNREFUSED
);
2879 * iscsi_session_event - send session destr. completion event
2880 * @session: iscsi class session
2881 * @event: type of event
2883 int iscsi_session_event(struct iscsi_cls_session
*session
,
2884 enum iscsi_uevent_e event
)
2886 struct iscsi_internal
*priv
;
2887 struct Scsi_Host
*shost
;
2888 struct iscsi_uevent
*ev
;
2889 struct sk_buff
*skb
;
2890 struct nlmsghdr
*nlh
;
2891 int rc
, len
= nlmsg_total_size(sizeof(*ev
));
2893 priv
= iscsi_if_transport_lookup(session
->transport
);
2896 shost
= iscsi_session_to_shost(session
);
2898 skb
= alloc_skb(len
, GFP_KERNEL
);
2900 iscsi_cls_session_printk(KERN_ERR
, session
,
2901 "Cannot notify userspace of session "
2902 "event %u\n", event
);
2906 nlh
= __nlmsg_put(skb
, 0, 0, 0, (len
- sizeof(*nlh
)), 0);
2907 ev
= nlmsg_data(nlh
);
2908 ev
->transport_handle
= iscsi_handle(session
->transport
);
2912 case ISCSI_KEVENT_DESTROY_SESSION
:
2913 ev
->r
.d_session
.host_no
= shost
->host_no
;
2914 ev
->r
.d_session
.sid
= session
->sid
;
2916 case ISCSI_KEVENT_CREATE_SESSION
:
2917 ev
->r
.c_session_ret
.host_no
= shost
->host_no
;
2918 ev
->r
.c_session_ret
.sid
= session
->sid
;
2920 case ISCSI_KEVENT_UNBIND_SESSION
:
2921 ev
->r
.unbind_session
.host_no
= shost
->host_no
;
2922 ev
->r
.unbind_session
.sid
= session
->sid
;
2925 iscsi_cls_session_printk(KERN_ERR
, session
, "Invalid event "
2932 * this will occur if the daemon is not up, so we just warn
2933 * the user and when the daemon is restarted it will handle it
2935 rc
= iscsi_multicast_skb(skb
, ISCSI_NL_GRP_ISCSID
, GFP_KERNEL
);
2937 iscsi_cls_session_printk(KERN_ERR
, session
,
2938 "Cannot notify userspace of session "
2939 "event %u. Check iscsi daemon\n",
2942 ISCSI_DBG_TRANS_SESSION(session
, "Completed handling event %d rc %d\n",
2946 EXPORT_SYMBOL_GPL(iscsi_session_event
);
2949 iscsi_if_create_session(struct iscsi_internal
*priv
, struct iscsi_endpoint
*ep
,
2950 struct iscsi_uevent
*ev
, pid_t pid
,
2951 uint32_t initial_cmdsn
, uint16_t cmds_max
,
2952 uint16_t queue_depth
)
2954 struct iscsi_transport
*transport
= priv
->iscsi_transport
;
2955 struct iscsi_cls_session
*session
;
2956 struct Scsi_Host
*shost
;
2958 session
= transport
->create_session(ep
, cmds_max
, queue_depth
,
2963 session
->creator
= pid
;
2964 shost
= iscsi_session_to_shost(session
);
2965 ev
->r
.c_session_ret
.host_no
= shost
->host_no
;
2966 ev
->r
.c_session_ret
.sid
= session
->sid
;
2967 ISCSI_DBG_TRANS_SESSION(session
,
2968 "Completed creating transport session\n");
2973 iscsi_if_create_conn(struct iscsi_transport
*transport
, struct iscsi_uevent
*ev
)
2975 struct iscsi_cls_conn
*conn
;
2976 struct iscsi_cls_session
*session
;
2978 session
= iscsi_session_lookup(ev
->u
.c_conn
.sid
);
2980 printk(KERN_ERR
"iscsi: invalid session %d.\n",
2985 conn
= transport
->create_conn(session
, ev
->u
.c_conn
.cid
);
2987 iscsi_cls_session_printk(KERN_ERR
, session
,
2988 "couldn't create a new connection.");
2992 ev
->r
.c_conn_ret
.sid
= session
->sid
;
2993 ev
->r
.c_conn_ret
.cid
= conn
->cid
;
2995 ISCSI_DBG_TRANS_CONN(conn
, "Completed creating transport conn\n");
3000 iscsi_if_destroy_conn(struct iscsi_transport
*transport
, struct iscsi_uevent
*ev
)
3002 struct iscsi_cls_conn
*conn
;
3004 conn
= iscsi_conn_lookup(ev
->u
.d_conn
.sid
, ev
->u
.d_conn
.cid
);
3008 ISCSI_DBG_TRANS_CONN(conn
, "Flushing cleanup during destruction\n");
3009 flush_work(&conn
->cleanup_work
);
3010 ISCSI_DBG_TRANS_CONN(conn
, "Destroying transport conn\n");
3012 if (transport
->destroy_conn
)
3013 transport
->destroy_conn(conn
);
3018 iscsi_if_set_param(struct iscsi_transport
*transport
, struct iscsi_uevent
*ev
, u32 rlen
)
3020 char *data
= (char*)ev
+ sizeof(*ev
);
3021 struct iscsi_cls_conn
*conn
;
3022 struct iscsi_cls_session
*session
;
3023 int err
= 0, value
= 0, state
;
3025 if (ev
->u
.set_param
.len
> rlen
||
3026 ev
->u
.set_param
.len
> PAGE_SIZE
)
3029 session
= iscsi_session_lookup(ev
->u
.set_param
.sid
);
3030 conn
= iscsi_conn_lookup(ev
->u
.set_param
.sid
, ev
->u
.set_param
.cid
);
3031 if (!conn
|| !session
)
3034 /* data will be regarded as NULL-ended string, do length check */
3035 if (strlen(data
) > ev
->u
.set_param
.len
)
3038 switch (ev
->u
.set_param
.param
) {
3039 case ISCSI_PARAM_SESS_RECOVERY_TMO
:
3040 sscanf(data
, "%d", &value
);
3041 if (!session
->recovery_tmo_sysfs_override
)
3042 session
->recovery_tmo
= value
;
3045 state
= READ_ONCE(conn
->state
);
3046 if (state
== ISCSI_CONN_BOUND
|| state
== ISCSI_CONN_UP
) {
3047 err
= transport
->set_param(conn
, ev
->u
.set_param
.param
,
3048 data
, ev
->u
.set_param
.len
);
3057 static int iscsi_if_ep_connect(struct iscsi_transport
*transport
,
3058 struct iscsi_uevent
*ev
, int msg_type
)
3060 struct iscsi_endpoint
*ep
;
3061 struct sockaddr
*dst_addr
;
3062 struct Scsi_Host
*shost
= NULL
;
3063 int non_blocking
, err
= 0;
3065 if (!transport
->ep_connect
)
3068 if (msg_type
== ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST
) {
3069 shost
= scsi_host_lookup(ev
->u
.ep_connect_through_host
.host_no
);
3071 printk(KERN_ERR
"ep connect failed. Could not find "
3073 ev
->u
.ep_connect_through_host
.host_no
);
3076 non_blocking
= ev
->u
.ep_connect_through_host
.non_blocking
;
3078 non_blocking
= ev
->u
.ep_connect
.non_blocking
;
3080 dst_addr
= (struct sockaddr
*)((char*)ev
+ sizeof(*ev
));
3081 ep
= transport
->ep_connect(shost
, dst_addr
, non_blocking
);
3087 ev
->r
.ep_connect_ret
.handle
= ep
->id
;
3090 scsi_host_put(shost
);
3094 static int iscsi_if_ep_disconnect(struct iscsi_transport
*transport
,
3097 struct iscsi_cls_conn
*conn
;
3098 struct iscsi_endpoint
*ep
;
3100 if (!transport
->ep_disconnect
)
3103 ep
= iscsi_lookup_endpoint(ep_handle
);
3110 * conn was not even bound yet, so we can't get iscsi conn
3113 transport
->ep_disconnect(ep
);
3117 mutex_lock(&conn
->ep_mutex
);
3118 iscsi_if_disconnect_bound_ep(conn
, ep
, false);
3119 mutex_unlock(&conn
->ep_mutex
);
3121 iscsi_put_endpoint(ep
);
3126 iscsi_if_transport_ep(struct iscsi_transport
*transport
,
3127 struct iscsi_uevent
*ev
, int msg_type
, u32 rlen
)
3129 struct iscsi_endpoint
*ep
;
3133 case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST
:
3134 case ISCSI_UEVENT_TRANSPORT_EP_CONNECT
:
3135 if (rlen
< sizeof(struct sockaddr
))
3138 rc
= iscsi_if_ep_connect(transport
, ev
, msg_type
);
3140 case ISCSI_UEVENT_TRANSPORT_EP_POLL
:
3141 if (!transport
->ep_poll
)
3144 ep
= iscsi_lookup_endpoint(ev
->u
.ep_poll
.ep_handle
);
3148 ev
->r
.retcode
= transport
->ep_poll(ep
,
3149 ev
->u
.ep_poll
.timeout_ms
);
3150 iscsi_put_endpoint(ep
);
3152 case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT
:
3153 rc
= iscsi_if_ep_disconnect(transport
,
3154 ev
->u
.ep_disconnect
.ep_handle
);
3161 iscsi_tgt_dscvr(struct iscsi_transport
*transport
,
3162 struct iscsi_uevent
*ev
, u32 rlen
)
3164 struct Scsi_Host
*shost
;
3165 struct sockaddr
*dst_addr
;
3168 if (rlen
< sizeof(*dst_addr
))
3171 if (!transport
->tgt_dscvr
)
3174 shost
= scsi_host_lookup(ev
->u
.tgt_dscvr
.host_no
);
3176 printk(KERN_ERR
"target discovery could not find host no %u\n",
3177 ev
->u
.tgt_dscvr
.host_no
);
3182 dst_addr
= (struct sockaddr
*)((char*)ev
+ sizeof(*ev
));
3183 err
= transport
->tgt_dscvr(shost
, ev
->u
.tgt_dscvr
.type
,
3184 ev
->u
.tgt_dscvr
.enable
, dst_addr
);
3185 scsi_host_put(shost
);
3190 iscsi_set_host_param(struct iscsi_transport
*transport
,
3191 struct iscsi_uevent
*ev
, u32 rlen
)
3193 char *data
= (char*)ev
+ sizeof(*ev
);
3194 struct Scsi_Host
*shost
;
3197 if (!transport
->set_host_param
)
3200 if (ev
->u
.set_host_param
.len
> rlen
||
3201 ev
->u
.set_host_param
.len
> PAGE_SIZE
)
3204 shost
= scsi_host_lookup(ev
->u
.set_host_param
.host_no
);
3206 printk(KERN_ERR
"set_host_param could not find host no %u\n",
3207 ev
->u
.set_host_param
.host_no
);
3211 /* see similar check in iscsi_if_set_param() */
3212 if (strlen(data
) > ev
->u
.set_host_param
.len
)
3215 err
= transport
->set_host_param(shost
, ev
->u
.set_host_param
.param
,
3216 data
, ev
->u
.set_host_param
.len
);
3217 scsi_host_put(shost
);
3222 iscsi_set_path(struct iscsi_transport
*transport
, struct iscsi_uevent
*ev
, u32 rlen
)
3224 struct Scsi_Host
*shost
;
3225 struct iscsi_path
*params
;
3228 if (rlen
< sizeof(*params
))
3231 if (!transport
->set_path
)
3234 shost
= scsi_host_lookup(ev
->u
.set_path
.host_no
);
3236 printk(KERN_ERR
"set path could not find host no %u\n",
3237 ev
->u
.set_path
.host_no
);
3241 params
= (struct iscsi_path
*)((char *)ev
+ sizeof(*ev
));
3242 err
= transport
->set_path(shost
, params
);
3244 scsi_host_put(shost
);
3248 static int iscsi_session_has_conns(int sid
)
3250 struct iscsi_cls_conn
*conn
;
3251 unsigned long flags
;
3254 spin_lock_irqsave(&connlock
, flags
);
3255 list_for_each_entry(conn
, &connlist
, conn_list
) {
3256 if (iscsi_conn_get_sid(conn
) == sid
) {
3261 spin_unlock_irqrestore(&connlock
, flags
);
3267 iscsi_set_iface_params(struct iscsi_transport
*transport
,
3268 struct iscsi_uevent
*ev
, uint32_t len
)
3270 char *data
= (char *)ev
+ sizeof(*ev
);
3271 struct Scsi_Host
*shost
;
3274 if (!transport
->set_iface_param
)
3277 shost
= scsi_host_lookup(ev
->u
.set_iface_params
.host_no
);
3279 printk(KERN_ERR
"set_iface_params could not find host no %u\n",
3280 ev
->u
.set_iface_params
.host_no
);
3284 err
= transport
->set_iface_param(shost
, data
, len
);
3285 scsi_host_put(shost
);
3290 iscsi_send_ping(struct iscsi_transport
*transport
, struct iscsi_uevent
*ev
, u32 rlen
)
3292 struct Scsi_Host
*shost
;
3293 struct sockaddr
*dst_addr
;
3296 if (rlen
< sizeof(*dst_addr
))
3299 if (!transport
->send_ping
)
3302 shost
= scsi_host_lookup(ev
->u
.iscsi_ping
.host_no
);
3304 printk(KERN_ERR
"iscsi_ping could not find host no %u\n",
3305 ev
->u
.iscsi_ping
.host_no
);
3309 dst_addr
= (struct sockaddr
*)((char *)ev
+ sizeof(*ev
));
3310 err
= transport
->send_ping(shost
, ev
->u
.iscsi_ping
.iface_num
,
3311 ev
->u
.iscsi_ping
.iface_type
,
3312 ev
->u
.iscsi_ping
.payload_size
,
3313 ev
->u
.iscsi_ping
.pid
,
3315 scsi_host_put(shost
);
3320 iscsi_get_chap(struct iscsi_transport
*transport
, struct nlmsghdr
*nlh
)
3322 struct iscsi_uevent
*ev
= nlmsg_data(nlh
);
3323 struct Scsi_Host
*shost
= NULL
;
3324 struct iscsi_chap_rec
*chap_rec
;
3325 struct iscsi_internal
*priv
;
3326 struct sk_buff
*skbchap
;
3327 struct nlmsghdr
*nlhchap
;
3328 struct iscsi_uevent
*evchap
;
3329 uint32_t chap_buf_size
;
3333 if (!transport
->get_chap
)
3336 priv
= iscsi_if_transport_lookup(transport
);
3340 chap_buf_size
= (ev
->u
.get_chap
.num_entries
* sizeof(*chap_rec
));
3341 len
= nlmsg_total_size(sizeof(*ev
) + chap_buf_size
);
3343 shost
= scsi_host_lookup(ev
->u
.get_chap
.host_no
);
3345 printk(KERN_ERR
"%s: failed. Could not find host no %u\n",
3346 __func__
, ev
->u
.get_chap
.host_no
);
3353 skbchap
= alloc_skb(len
, GFP_KERNEL
);
3355 printk(KERN_ERR
"can not deliver chap: OOM\n");
3360 nlhchap
= __nlmsg_put(skbchap
, 0, 0, 0,
3361 (len
- sizeof(*nlhchap
)), 0);
3362 evchap
= nlmsg_data(nlhchap
);
3363 memset(evchap
, 0, sizeof(*evchap
));
3364 evchap
->transport_handle
= iscsi_handle(transport
);
3365 evchap
->type
= nlh
->nlmsg_type
;
3366 evchap
->u
.get_chap
.host_no
= ev
->u
.get_chap
.host_no
;
3367 evchap
->u
.get_chap
.chap_tbl_idx
= ev
->u
.get_chap
.chap_tbl_idx
;
3368 evchap
->u
.get_chap
.num_entries
= ev
->u
.get_chap
.num_entries
;
3369 buf
= (char *)evchap
+ sizeof(*evchap
);
3370 memset(buf
, 0, chap_buf_size
);
3372 err
= transport
->get_chap(shost
, ev
->u
.get_chap
.chap_tbl_idx
,
3373 &evchap
->u
.get_chap
.num_entries
, buf
);
3375 actual_size
= nlmsg_total_size(sizeof(*ev
) + chap_buf_size
);
3376 skb_trim(skbchap
, NLMSG_ALIGN(actual_size
));
3377 nlhchap
->nlmsg_len
= actual_size
;
3379 err
= iscsi_multicast_skb(skbchap
, ISCSI_NL_GRP_ISCSID
,
3381 } while (err
< 0 && err
!= -ECONNREFUSED
);
3384 scsi_host_put(shost
);
3388 static int iscsi_set_chap(struct iscsi_transport
*transport
,
3389 struct iscsi_uevent
*ev
, uint32_t len
)
3391 char *data
= (char *)ev
+ sizeof(*ev
);
3392 struct Scsi_Host
*shost
;
3395 if (!transport
->set_chap
)
3398 shost
= scsi_host_lookup(ev
->u
.set_path
.host_no
);
3400 pr_err("%s could not find host no %u\n",
3401 __func__
, ev
->u
.set_path
.host_no
);
3405 err
= transport
->set_chap(shost
, data
, len
);
3406 scsi_host_put(shost
);
3410 static int iscsi_delete_chap(struct iscsi_transport
*transport
,
3411 struct iscsi_uevent
*ev
)
3413 struct Scsi_Host
*shost
;
3416 if (!transport
->delete_chap
)
3419 shost
= scsi_host_lookup(ev
->u
.delete_chap
.host_no
);
3421 printk(KERN_ERR
"%s could not find host no %u\n",
3422 __func__
, ev
->u
.delete_chap
.host_no
);
3426 err
= transport
->delete_chap(shost
, ev
->u
.delete_chap
.chap_tbl_idx
);
3427 scsi_host_put(shost
);
3431 static const struct {
3432 enum iscsi_discovery_parent_type value
;
3434 } iscsi_discovery_parent_names
[] = {
3435 {ISCSI_DISC_PARENT_UNKNOWN
, "Unknown" },
3436 {ISCSI_DISC_PARENT_SENDTGT
, "Sendtarget" },
3437 {ISCSI_DISC_PARENT_ISNS
, "isns" },
3440 char *iscsi_get_discovery_parent_name(int parent_type
)
3443 char *state
= "Unknown!";
3445 for (i
= 0; i
< ARRAY_SIZE(iscsi_discovery_parent_names
); i
++) {
3446 if (iscsi_discovery_parent_names
[i
].value
& parent_type
) {
3447 state
= iscsi_discovery_parent_names
[i
].name
;
3453 EXPORT_SYMBOL_GPL(iscsi_get_discovery_parent_name
);
3455 static int iscsi_set_flashnode_param(struct iscsi_transport
*transport
,
3456 struct iscsi_uevent
*ev
, uint32_t len
)
3458 char *data
= (char *)ev
+ sizeof(*ev
);
3459 struct Scsi_Host
*shost
;
3460 struct iscsi_bus_flash_session
*fnode_sess
;
3461 struct iscsi_bus_flash_conn
*fnode_conn
;
3466 if (!transport
->set_flashnode_param
) {
3468 goto exit_set_fnode
;
3471 shost
= scsi_host_lookup(ev
->u
.set_flashnode
.host_no
);
3473 pr_err("%s could not find host no %u\n",
3474 __func__
, ev
->u
.set_flashnode
.host_no
);
3476 goto exit_set_fnode
;
3479 idx
= ev
->u
.set_flashnode
.flashnode_idx
;
3480 fnode_sess
= iscsi_get_flashnode_by_index(shost
, idx
);
3482 pr_err("%s could not find flashnode %u for host no %u\n",
3483 __func__
, idx
, ev
->u
.set_flashnode
.host_no
);
3488 dev
= iscsi_find_flashnode_conn(fnode_sess
);
3494 fnode_conn
= iscsi_dev_to_flash_conn(dev
);
3495 err
= transport
->set_flashnode_param(fnode_sess
, fnode_conn
, data
, len
);
3499 put_device(&fnode_sess
->dev
);
3502 scsi_host_put(shost
);
3508 static int iscsi_new_flashnode(struct iscsi_transport
*transport
,
3509 struct iscsi_uevent
*ev
, uint32_t len
)
3511 char *data
= (char *)ev
+ sizeof(*ev
);
3512 struct Scsi_Host
*shost
;
3516 if (!transport
->new_flashnode
) {
3518 goto exit_new_fnode
;
3521 shost
= scsi_host_lookup(ev
->u
.new_flashnode
.host_no
);
3523 pr_err("%s could not find host no %u\n",
3524 __func__
, ev
->u
.new_flashnode
.host_no
);
3529 index
= transport
->new_flashnode(shost
, data
, len
);
3532 ev
->r
.new_flashnode_ret
.flashnode_idx
= index
;
3537 scsi_host_put(shost
);
3543 static int iscsi_del_flashnode(struct iscsi_transport
*transport
,
3544 struct iscsi_uevent
*ev
)
3546 struct Scsi_Host
*shost
;
3547 struct iscsi_bus_flash_session
*fnode_sess
;
3551 if (!transport
->del_flashnode
) {
3553 goto exit_del_fnode
;
3556 shost
= scsi_host_lookup(ev
->u
.del_flashnode
.host_no
);
3558 pr_err("%s could not find host no %u\n",
3559 __func__
, ev
->u
.del_flashnode
.host_no
);
3564 idx
= ev
->u
.del_flashnode
.flashnode_idx
;
3565 fnode_sess
= iscsi_get_flashnode_by_index(shost
, idx
);
3567 pr_err("%s could not find flashnode %u for host no %u\n",
3568 __func__
, idx
, ev
->u
.del_flashnode
.host_no
);
3573 err
= transport
->del_flashnode(fnode_sess
);
3574 put_device(&fnode_sess
->dev
);
3577 scsi_host_put(shost
);
3583 static int iscsi_login_flashnode(struct iscsi_transport
*transport
,
3584 struct iscsi_uevent
*ev
)
3586 struct Scsi_Host
*shost
;
3587 struct iscsi_bus_flash_session
*fnode_sess
;
3588 struct iscsi_bus_flash_conn
*fnode_conn
;
3593 if (!transport
->login_flashnode
) {
3595 goto exit_login_fnode
;
3598 shost
= scsi_host_lookup(ev
->u
.login_flashnode
.host_no
);
3600 pr_err("%s could not find host no %u\n",
3601 __func__
, ev
->u
.login_flashnode
.host_no
);
3606 idx
= ev
->u
.login_flashnode
.flashnode_idx
;
3607 fnode_sess
= iscsi_get_flashnode_by_index(shost
, idx
);
3609 pr_err("%s could not find flashnode %u for host no %u\n",
3610 __func__
, idx
, ev
->u
.login_flashnode
.host_no
);
3615 dev
= iscsi_find_flashnode_conn(fnode_sess
);
3621 fnode_conn
= iscsi_dev_to_flash_conn(dev
);
3622 err
= transport
->login_flashnode(fnode_sess
, fnode_conn
);
3626 put_device(&fnode_sess
->dev
);
3629 scsi_host_put(shost
);
3635 static int iscsi_logout_flashnode(struct iscsi_transport
*transport
,
3636 struct iscsi_uevent
*ev
)
3638 struct Scsi_Host
*shost
;
3639 struct iscsi_bus_flash_session
*fnode_sess
;
3640 struct iscsi_bus_flash_conn
*fnode_conn
;
3645 if (!transport
->logout_flashnode
) {
3647 goto exit_logout_fnode
;
3650 shost
= scsi_host_lookup(ev
->u
.logout_flashnode
.host_no
);
3652 pr_err("%s could not find host no %u\n",
3653 __func__
, ev
->u
.logout_flashnode
.host_no
);
3658 idx
= ev
->u
.logout_flashnode
.flashnode_idx
;
3659 fnode_sess
= iscsi_get_flashnode_by_index(shost
, idx
);
3661 pr_err("%s could not find flashnode %u for host no %u\n",
3662 __func__
, idx
, ev
->u
.logout_flashnode
.host_no
);
3667 dev
= iscsi_find_flashnode_conn(fnode_sess
);
3673 fnode_conn
= iscsi_dev_to_flash_conn(dev
);
3675 err
= transport
->logout_flashnode(fnode_sess
, fnode_conn
);
3679 put_device(&fnode_sess
->dev
);
3682 scsi_host_put(shost
);
3688 static int iscsi_logout_flashnode_sid(struct iscsi_transport
*transport
,
3689 struct iscsi_uevent
*ev
)
3691 struct Scsi_Host
*shost
;
3692 struct iscsi_cls_session
*session
;
3695 if (!transport
->logout_flashnode_sid
) {
3697 goto exit_logout_sid
;
3700 shost
= scsi_host_lookup(ev
->u
.logout_flashnode_sid
.host_no
);
3702 pr_err("%s could not find host no %u\n",
3703 __func__
, ev
->u
.logout_flashnode
.host_no
);
3708 session
= iscsi_session_lookup(ev
->u
.logout_flashnode_sid
.sid
);
3710 pr_err("%s could not find session id %u\n",
3711 __func__
, ev
->u
.logout_flashnode_sid
.sid
);
3716 err
= transport
->logout_flashnode_sid(session
);
3719 scsi_host_put(shost
);
3726 iscsi_get_host_stats(struct iscsi_transport
*transport
, struct nlmsghdr
*nlh
)
3728 struct iscsi_uevent
*ev
= nlmsg_data(nlh
);
3729 struct Scsi_Host
*shost
= NULL
;
3730 struct iscsi_internal
*priv
;
3731 struct sk_buff
*skbhost_stats
;
3732 struct nlmsghdr
*nlhhost_stats
;
3733 struct iscsi_uevent
*evhost_stats
;
3734 int host_stats_size
= 0;
3738 if (!transport
->get_host_stats
)
3741 priv
= iscsi_if_transport_lookup(transport
);
3745 host_stats_size
= sizeof(struct iscsi_offload_host_stats
);
3746 len
= nlmsg_total_size(sizeof(*ev
) + host_stats_size
);
3748 shost
= scsi_host_lookup(ev
->u
.get_host_stats
.host_no
);
3750 pr_err("%s: failed. Could not find host no %u\n",
3751 __func__
, ev
->u
.get_host_stats
.host_no
);
3758 skbhost_stats
= alloc_skb(len
, GFP_KERNEL
);
3759 if (!skbhost_stats
) {
3760 pr_err("cannot deliver host stats: OOM\n");
3762 goto exit_host_stats
;
3765 nlhhost_stats
= __nlmsg_put(skbhost_stats
, 0, 0, 0,
3766 (len
- sizeof(*nlhhost_stats
)), 0);
3767 evhost_stats
= nlmsg_data(nlhhost_stats
);
3768 memset(evhost_stats
, 0, sizeof(*evhost_stats
));
3769 evhost_stats
->transport_handle
= iscsi_handle(transport
);
3770 evhost_stats
->type
= nlh
->nlmsg_type
;
3771 evhost_stats
->u
.get_host_stats
.host_no
=
3772 ev
->u
.get_host_stats
.host_no
;
3773 buf
= (char *)evhost_stats
+ sizeof(*evhost_stats
);
3774 memset(buf
, 0, host_stats_size
);
3776 err
= transport
->get_host_stats(shost
, buf
, host_stats_size
);
3778 kfree_skb(skbhost_stats
);
3779 goto exit_host_stats
;
3782 actual_size
= nlmsg_total_size(sizeof(*ev
) + host_stats_size
);
3783 skb_trim(skbhost_stats
, NLMSG_ALIGN(actual_size
));
3784 nlhhost_stats
->nlmsg_len
= actual_size
;
3786 err
= iscsi_multicast_skb(skbhost_stats
, ISCSI_NL_GRP_ISCSID
,
3788 } while (err
< 0 && err
!= -ECONNREFUSED
);
3791 scsi_host_put(shost
);
3795 static int iscsi_if_transport_conn(struct iscsi_transport
*transport
,
3796 struct nlmsghdr
*nlh
, u32 pdu_len
)
3798 struct iscsi_uevent
*ev
= nlmsg_data(nlh
);
3799 struct iscsi_cls_session
*session
;
3800 struct iscsi_cls_conn
*conn
= NULL
;
3801 struct iscsi_endpoint
*ep
;
3804 switch (nlh
->nlmsg_type
) {
3805 case ISCSI_UEVENT_CREATE_CONN
:
3806 return iscsi_if_create_conn(transport
, ev
);
3807 case ISCSI_UEVENT_DESTROY_CONN
:
3808 return iscsi_if_destroy_conn(transport
, ev
);
3809 case ISCSI_UEVENT_STOP_CONN
:
3810 conn
= iscsi_conn_lookup(ev
->u
.stop_conn
.sid
,
3811 ev
->u
.stop_conn
.cid
);
3815 return iscsi_if_stop_conn(conn
, ev
->u
.stop_conn
.flag
);
3819 * The following cmds need to be run under the ep_mutex so in kernel
3820 * conn cleanup (ep_disconnect + unbind and conn) is not done while
3821 * these are running. They also must not run if we have just run a conn
3822 * cleanup because they would set the state in a way that might allow
3823 * IO or send IO themselves.
3825 switch (nlh
->nlmsg_type
) {
3826 case ISCSI_UEVENT_START_CONN
:
3827 conn
= iscsi_conn_lookup(ev
->u
.start_conn
.sid
,
3828 ev
->u
.start_conn
.cid
);
3830 case ISCSI_UEVENT_BIND_CONN
:
3831 conn
= iscsi_conn_lookup(ev
->u
.b_conn
.sid
, ev
->u
.b_conn
.cid
);
3833 case ISCSI_UEVENT_SEND_PDU
:
3834 conn
= iscsi_conn_lookup(ev
->u
.send_pdu
.sid
, ev
->u
.send_pdu
.cid
);
3841 mutex_lock(&conn
->ep_mutex
);
3842 spin_lock_irq(&conn
->lock
);
3843 if (test_bit(ISCSI_CLS_CONN_BIT_CLEANUP
, &conn
->flags
)) {
3844 spin_unlock_irq(&conn
->lock
);
3845 mutex_unlock(&conn
->ep_mutex
);
3846 ev
->r
.retcode
= -ENOTCONN
;
3849 spin_unlock_irq(&conn
->lock
);
3851 switch (nlh
->nlmsg_type
) {
3852 case ISCSI_UEVENT_BIND_CONN
:
3853 session
= iscsi_session_lookup(ev
->u
.b_conn
.sid
);
3859 ev
->r
.retcode
= transport
->bind_conn(session
, conn
,
3860 ev
->u
.b_conn
.transport_eph
,
3861 ev
->u
.b_conn
.is_leading
);
3863 WRITE_ONCE(conn
->state
, ISCSI_CONN_BOUND
);
3865 if (ev
->r
.retcode
|| !transport
->ep_connect
)
3868 ep
= iscsi_lookup_endpoint(ev
->u
.b_conn
.transport_eph
);
3872 iscsi_put_endpoint(ep
);
3875 iscsi_cls_conn_printk(KERN_ERR
, conn
,
3876 "Could not set ep conn binding\n");
3879 case ISCSI_UEVENT_START_CONN
:
3880 ev
->r
.retcode
= transport
->start_conn(conn
);
3882 WRITE_ONCE(conn
->state
, ISCSI_CONN_UP
);
3885 case ISCSI_UEVENT_SEND_PDU
:
3886 if ((ev
->u
.send_pdu
.hdr_size
> pdu_len
) ||
3887 (ev
->u
.send_pdu
.data_size
> (pdu_len
- ev
->u
.send_pdu
.hdr_size
))) {
3892 ev
->r
.retcode
= transport
->send_pdu(conn
,
3893 (struct iscsi_hdr
*)((char *)ev
+ sizeof(*ev
)),
3894 (char *)ev
+ sizeof(*ev
) + ev
->u
.send_pdu
.hdr_size
,
3895 ev
->u
.send_pdu
.data_size
);
3901 mutex_unlock(&conn
->ep_mutex
);
3906 iscsi_if_recv_msg(struct sk_buff
*skb
, struct nlmsghdr
*nlh
, uint32_t *group
)
3910 struct iscsi_uevent
*ev
= nlmsg_data(nlh
);
3911 struct iscsi_transport
*transport
= NULL
;
3912 struct iscsi_internal
*priv
;
3913 struct iscsi_cls_session
*session
;
3914 struct iscsi_endpoint
*ep
= NULL
;
3917 if (!netlink_capable(skb
, CAP_SYS_ADMIN
))
3920 if (nlh
->nlmsg_type
== ISCSI_UEVENT_PATH_UPDATE
)
3921 *group
= ISCSI_NL_GRP_UIP
;
3923 *group
= ISCSI_NL_GRP_ISCSID
;
3925 priv
= iscsi_if_transport_lookup(iscsi_ptr(ev
->transport_handle
));
3928 transport
= priv
->iscsi_transport
;
3930 if (!try_module_get(transport
->owner
))
3933 portid
= NETLINK_CB(skb
).portid
;
3936 * Even though the remaining payload may not be regarded as nlattr,
3937 * (like address or something else), calculate the remaining length
3938 * here to ease following length checks.
3940 rlen
= nlmsg_attrlen(nlh
, sizeof(*ev
));
3942 switch (nlh
->nlmsg_type
) {
3943 case ISCSI_UEVENT_CREATE_SESSION
:
3944 err
= iscsi_if_create_session(priv
, ep
, ev
,
3946 ev
->u
.c_session
.initial_cmdsn
,
3947 ev
->u
.c_session
.cmds_max
,
3948 ev
->u
.c_session
.queue_depth
);
3950 case ISCSI_UEVENT_CREATE_BOUND_SESSION
:
3951 ep
= iscsi_lookup_endpoint(ev
->u
.c_bound_session
.ep_handle
);
3957 err
= iscsi_if_create_session(priv
, ep
, ev
,
3959 ev
->u
.c_bound_session
.initial_cmdsn
,
3960 ev
->u
.c_bound_session
.cmds_max
,
3961 ev
->u
.c_bound_session
.queue_depth
);
3962 iscsi_put_endpoint(ep
);
3964 case ISCSI_UEVENT_DESTROY_SESSION
:
3965 session
= iscsi_session_lookup(ev
->u
.d_session
.sid
);
3968 else if (iscsi_session_has_conns(ev
->u
.d_session
.sid
))
3971 transport
->destroy_session(session
);
3973 case ISCSI_UEVENT_DESTROY_SESSION_ASYNC
:
3974 session
= iscsi_session_lookup(ev
->u
.d_session
.sid
);
3977 else if (iscsi_session_has_conns(ev
->u
.d_session
.sid
))
3980 unsigned long flags
;
3982 /* Prevent this session from being found again */
3983 spin_lock_irqsave(&sesslock
, flags
);
3984 list_del_init(&session
->sess_list
);
3985 spin_unlock_irqrestore(&sesslock
, flags
);
3987 queue_work(system_unbound_wq
, &session
->destroy_work
);
3990 case ISCSI_UEVENT_UNBIND_SESSION
:
3991 session
= iscsi_session_lookup(ev
->u
.d_session
.sid
);
3993 queue_work(session
->workq
, &session
->unbind_work
);
3997 case ISCSI_UEVENT_SET_PARAM
:
3998 err
= iscsi_if_set_param(transport
, ev
, rlen
);
4000 case ISCSI_UEVENT_CREATE_CONN
:
4001 case ISCSI_UEVENT_DESTROY_CONN
:
4002 case ISCSI_UEVENT_STOP_CONN
:
4003 case ISCSI_UEVENT_START_CONN
:
4004 case ISCSI_UEVENT_BIND_CONN
:
4005 case ISCSI_UEVENT_SEND_PDU
:
4006 err
= iscsi_if_transport_conn(transport
, nlh
, rlen
);
4008 case ISCSI_UEVENT_GET_STATS
:
4009 err
= iscsi_if_get_stats(transport
, nlh
);
4011 case ISCSI_UEVENT_TRANSPORT_EP_CONNECT
:
4012 case ISCSI_UEVENT_TRANSPORT_EP_POLL
:
4013 case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT
:
4014 case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST
:
4015 err
= iscsi_if_transport_ep(transport
, ev
, nlh
->nlmsg_type
, rlen
);
4017 case ISCSI_UEVENT_TGT_DSCVR
:
4018 err
= iscsi_tgt_dscvr(transport
, ev
, rlen
);
4020 case ISCSI_UEVENT_SET_HOST_PARAM
:
4021 err
= iscsi_set_host_param(transport
, ev
, rlen
);
4023 case ISCSI_UEVENT_PATH_UPDATE
:
4024 err
= iscsi_set_path(transport
, ev
, rlen
);
4026 case ISCSI_UEVENT_SET_IFACE_PARAMS
:
4027 err
= iscsi_set_iface_params(transport
, ev
, rlen
);
4029 case ISCSI_UEVENT_PING
:
4030 err
= iscsi_send_ping(transport
, ev
, rlen
);
4032 case ISCSI_UEVENT_GET_CHAP
:
4033 err
= iscsi_get_chap(transport
, nlh
);
4035 case ISCSI_UEVENT_DELETE_CHAP
:
4036 err
= iscsi_delete_chap(transport
, ev
);
4038 case ISCSI_UEVENT_SET_FLASHNODE_PARAMS
:
4039 err
= iscsi_set_flashnode_param(transport
, ev
, rlen
);
4041 case ISCSI_UEVENT_NEW_FLASHNODE
:
4042 err
= iscsi_new_flashnode(transport
, ev
, rlen
);
4044 case ISCSI_UEVENT_DEL_FLASHNODE
:
4045 err
= iscsi_del_flashnode(transport
, ev
);
4047 case ISCSI_UEVENT_LOGIN_FLASHNODE
:
4048 err
= iscsi_login_flashnode(transport
, ev
);
4050 case ISCSI_UEVENT_LOGOUT_FLASHNODE
:
4051 err
= iscsi_logout_flashnode(transport
, ev
);
4053 case ISCSI_UEVENT_LOGOUT_FLASHNODE_SID
:
4054 err
= iscsi_logout_flashnode_sid(transport
, ev
);
4056 case ISCSI_UEVENT_SET_CHAP
:
4057 err
= iscsi_set_chap(transport
, ev
, rlen
);
4059 case ISCSI_UEVENT_GET_HOST_STATS
:
4060 err
= iscsi_get_host_stats(transport
, nlh
);
4067 module_put(transport
->owner
);
4072 * Get message from skb. Each message is processed by iscsi_if_recv_msg.
4073 * Malformed skbs with wrong lengths or invalid creds are not processed.
4076 iscsi_if_rx(struct sk_buff
*skb
)
4078 u32 portid
= NETLINK_CB(skb
).portid
;
4080 mutex_lock(&rx_queue_mutex
);
4081 while (skb
->len
>= NLMSG_HDRLEN
) {
4084 struct nlmsghdr
*nlh
;
4085 struct iscsi_uevent
*ev
;
4087 int retries
= ISCSI_SEND_MAX_ALLOWED
;
4089 nlh
= nlmsg_hdr(skb
);
4090 if (nlh
->nlmsg_len
< sizeof(*nlh
) + sizeof(*ev
) ||
4091 skb
->len
< nlh
->nlmsg_len
) {
4095 ev
= nlmsg_data(nlh
);
4096 rlen
= NLMSG_ALIGN(nlh
->nlmsg_len
);
4097 if (rlen
> skb
->len
)
4100 err
= iscsi_if_recv_msg(skb
, nlh
, &group
);
4102 ev
->type
= ISCSI_KEVENT_IF_ERROR
;
4107 * special case for GET_STATS:
4108 * on success - sending reply and stats from
4109 * inside of if_recv_msg(),
4110 * on error - fall through.
4112 if (ev
->type
== ISCSI_UEVENT_GET_STATS
&& !err
)
4114 if (ev
->type
== ISCSI_UEVENT_GET_CHAP
&& !err
)
4116 err
= iscsi_if_send_reply(portid
, nlh
->nlmsg_type
,
4118 if (err
== -EAGAIN
&& --retries
< 0) {
4119 printk(KERN_WARNING
"Send reply failed, error %d\n", err
);
4122 } while (err
< 0 && err
!= -ECONNREFUSED
&& err
!= -ESRCH
);
4123 skb_pull(skb
, rlen
);
4125 mutex_unlock(&rx_queue_mutex
);
4128 #define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store) \
4129 struct device_attribute dev_attr_##_prefix##_##_name = \
4130 __ATTR(_name,_mode,_show,_store)
4133 * iSCSI connection attrs
4135 #define iscsi_conn_attr_show(param) \
4137 show_conn_param_##param(struct device *dev, \
4138 struct device_attribute *attr, char *buf) \
4140 struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent); \
4141 struct iscsi_transport *t = conn->transport; \
4142 return t->get_conn_param(conn, param, buf); \
4145 #define iscsi_conn_attr(field, param) \
4146 iscsi_conn_attr_show(param) \
4147 static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_param_##param, \
4150 iscsi_conn_attr(max_recv_dlength
, ISCSI_PARAM_MAX_RECV_DLENGTH
);
4151 iscsi_conn_attr(max_xmit_dlength
, ISCSI_PARAM_MAX_XMIT_DLENGTH
);
4152 iscsi_conn_attr(header_digest
, ISCSI_PARAM_HDRDGST_EN
);
4153 iscsi_conn_attr(data_digest
, ISCSI_PARAM_DATADGST_EN
);
4154 iscsi_conn_attr(ifmarker
, ISCSI_PARAM_IFMARKER_EN
);
4155 iscsi_conn_attr(ofmarker
, ISCSI_PARAM_OFMARKER_EN
);
4156 iscsi_conn_attr(persistent_port
, ISCSI_PARAM_PERSISTENT_PORT
);
4157 iscsi_conn_attr(exp_statsn
, ISCSI_PARAM_EXP_STATSN
);
4158 iscsi_conn_attr(persistent_address
, ISCSI_PARAM_PERSISTENT_ADDRESS
);
4159 iscsi_conn_attr(ping_tmo
, ISCSI_PARAM_PING_TMO
);
4160 iscsi_conn_attr(recv_tmo
, ISCSI_PARAM_RECV_TMO
);
4161 iscsi_conn_attr(local_port
, ISCSI_PARAM_LOCAL_PORT
);
4162 iscsi_conn_attr(statsn
, ISCSI_PARAM_STATSN
);
4163 iscsi_conn_attr(keepalive_tmo
, ISCSI_PARAM_KEEPALIVE_TMO
);
4164 iscsi_conn_attr(max_segment_size
, ISCSI_PARAM_MAX_SEGMENT_SIZE
);
4165 iscsi_conn_attr(tcp_timestamp_stat
, ISCSI_PARAM_TCP_TIMESTAMP_STAT
);
4166 iscsi_conn_attr(tcp_wsf_disable
, ISCSI_PARAM_TCP_WSF_DISABLE
);
4167 iscsi_conn_attr(tcp_nagle_disable
, ISCSI_PARAM_TCP_NAGLE_DISABLE
);
4168 iscsi_conn_attr(tcp_timer_scale
, ISCSI_PARAM_TCP_TIMER_SCALE
);
4169 iscsi_conn_attr(tcp_timestamp_enable
, ISCSI_PARAM_TCP_TIMESTAMP_EN
);
4170 iscsi_conn_attr(fragment_disable
, ISCSI_PARAM_IP_FRAGMENT_DISABLE
);
4171 iscsi_conn_attr(ipv4_tos
, ISCSI_PARAM_IPV4_TOS
);
4172 iscsi_conn_attr(ipv6_traffic_class
, ISCSI_PARAM_IPV6_TC
);
4173 iscsi_conn_attr(ipv6_flow_label
, ISCSI_PARAM_IPV6_FLOW_LABEL
);
4174 iscsi_conn_attr(is_fw_assigned_ipv6
, ISCSI_PARAM_IS_FW_ASSIGNED_IPV6
);
4175 iscsi_conn_attr(tcp_xmit_wsf
, ISCSI_PARAM_TCP_XMIT_WSF
);
4176 iscsi_conn_attr(tcp_recv_wsf
, ISCSI_PARAM_TCP_RECV_WSF
);
4177 iscsi_conn_attr(local_ipaddr
, ISCSI_PARAM_LOCAL_IPADDR
);
4179 static const char *const connection_state_names
[] = {
4180 [ISCSI_CONN_UP
] = "up",
4181 [ISCSI_CONN_DOWN
] = "down",
4182 [ISCSI_CONN_FAILED
] = "failed",
4183 [ISCSI_CONN_BOUND
] = "bound"
4186 static ssize_t
show_conn_state(struct device
*dev
,
4187 struct device_attribute
*attr
, char *buf
)
4189 struct iscsi_cls_conn
*conn
= iscsi_dev_to_conn(dev
->parent
);
4190 const char *state
= "unknown";
4191 int conn_state
= READ_ONCE(conn
->state
);
4193 if (conn_state
>= 0 &&
4194 conn_state
< ARRAY_SIZE(connection_state_names
))
4195 state
= connection_state_names
[conn_state
];
4197 return sysfs_emit(buf
, "%s\n", state
);
4199 static ISCSI_CLASS_ATTR(conn
, state
, S_IRUGO
, show_conn_state
,
4202 #define iscsi_conn_ep_attr_show(param) \
4203 static ssize_t show_conn_ep_param_##param(struct device *dev, \
4204 struct device_attribute *attr,\
4207 struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent); \
4208 struct iscsi_transport *t = conn->transport; \
4209 struct iscsi_endpoint *ep; \
4213 * Need to make sure ep_disconnect does not free the LLD's \
4214 * interconnect resources while we are trying to read them. \
4216 mutex_lock(&conn->ep_mutex); \
4218 if (!ep && t->ep_connect) { \
4219 mutex_unlock(&conn->ep_mutex); \
4224 rc = t->get_ep_param(ep, param, buf); \
4226 rc = t->get_conn_param(conn, param, buf); \
4227 mutex_unlock(&conn->ep_mutex); \
4231 #define iscsi_conn_ep_attr(field, param) \
4232 iscsi_conn_ep_attr_show(param) \
4233 static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, \
4234 show_conn_ep_param_##param, NULL);
4236 iscsi_conn_ep_attr(address
, ISCSI_PARAM_CONN_ADDRESS
);
4237 iscsi_conn_ep_attr(port
, ISCSI_PARAM_CONN_PORT
);
4239 static struct attribute
*iscsi_conn_attrs
[] = {
4240 &dev_attr_conn_max_recv_dlength
.attr
,
4241 &dev_attr_conn_max_xmit_dlength
.attr
,
4242 &dev_attr_conn_header_digest
.attr
,
4243 &dev_attr_conn_data_digest
.attr
,
4244 &dev_attr_conn_ifmarker
.attr
,
4245 &dev_attr_conn_ofmarker
.attr
,
4246 &dev_attr_conn_address
.attr
,
4247 &dev_attr_conn_port
.attr
,
4248 &dev_attr_conn_exp_statsn
.attr
,
4249 &dev_attr_conn_persistent_address
.attr
,
4250 &dev_attr_conn_persistent_port
.attr
,
4251 &dev_attr_conn_ping_tmo
.attr
,
4252 &dev_attr_conn_recv_tmo
.attr
,
4253 &dev_attr_conn_local_port
.attr
,
4254 &dev_attr_conn_statsn
.attr
,
4255 &dev_attr_conn_keepalive_tmo
.attr
,
4256 &dev_attr_conn_max_segment_size
.attr
,
4257 &dev_attr_conn_tcp_timestamp_stat
.attr
,
4258 &dev_attr_conn_tcp_wsf_disable
.attr
,
4259 &dev_attr_conn_tcp_nagle_disable
.attr
,
4260 &dev_attr_conn_tcp_timer_scale
.attr
,
4261 &dev_attr_conn_tcp_timestamp_enable
.attr
,
4262 &dev_attr_conn_fragment_disable
.attr
,
4263 &dev_attr_conn_ipv4_tos
.attr
,
4264 &dev_attr_conn_ipv6_traffic_class
.attr
,
4265 &dev_attr_conn_ipv6_flow_label
.attr
,
4266 &dev_attr_conn_is_fw_assigned_ipv6
.attr
,
4267 &dev_attr_conn_tcp_xmit_wsf
.attr
,
4268 &dev_attr_conn_tcp_recv_wsf
.attr
,
4269 &dev_attr_conn_local_ipaddr
.attr
,
4270 &dev_attr_conn_state
.attr
,
4274 static umode_t
iscsi_conn_attr_is_visible(struct kobject
*kobj
,
4275 struct attribute
*attr
, int i
)
4277 struct device
*cdev
= container_of(kobj
, struct device
, kobj
);
4278 struct iscsi_cls_conn
*conn
= transport_class_to_conn(cdev
);
4279 struct iscsi_transport
*t
= conn
->transport
;
4282 if (attr
== &dev_attr_conn_max_recv_dlength
.attr
)
4283 param
= ISCSI_PARAM_MAX_RECV_DLENGTH
;
4284 else if (attr
== &dev_attr_conn_max_xmit_dlength
.attr
)
4285 param
= ISCSI_PARAM_MAX_XMIT_DLENGTH
;
4286 else if (attr
== &dev_attr_conn_header_digest
.attr
)
4287 param
= ISCSI_PARAM_HDRDGST_EN
;
4288 else if (attr
== &dev_attr_conn_data_digest
.attr
)
4289 param
= ISCSI_PARAM_DATADGST_EN
;
4290 else if (attr
== &dev_attr_conn_ifmarker
.attr
)
4291 param
= ISCSI_PARAM_IFMARKER_EN
;
4292 else if (attr
== &dev_attr_conn_ofmarker
.attr
)
4293 param
= ISCSI_PARAM_OFMARKER_EN
;
4294 else if (attr
== &dev_attr_conn_address
.attr
)
4295 param
= ISCSI_PARAM_CONN_ADDRESS
;
4296 else if (attr
== &dev_attr_conn_port
.attr
)
4297 param
= ISCSI_PARAM_CONN_PORT
;
4298 else if (attr
== &dev_attr_conn_exp_statsn
.attr
)
4299 param
= ISCSI_PARAM_EXP_STATSN
;
4300 else if (attr
== &dev_attr_conn_persistent_address
.attr
)
4301 param
= ISCSI_PARAM_PERSISTENT_ADDRESS
;
4302 else if (attr
== &dev_attr_conn_persistent_port
.attr
)
4303 param
= ISCSI_PARAM_PERSISTENT_PORT
;
4304 else if (attr
== &dev_attr_conn_ping_tmo
.attr
)
4305 param
= ISCSI_PARAM_PING_TMO
;
4306 else if (attr
== &dev_attr_conn_recv_tmo
.attr
)
4307 param
= ISCSI_PARAM_RECV_TMO
;
4308 else if (attr
== &dev_attr_conn_local_port
.attr
)
4309 param
= ISCSI_PARAM_LOCAL_PORT
;
4310 else if (attr
== &dev_attr_conn_statsn
.attr
)
4311 param
= ISCSI_PARAM_STATSN
;
4312 else if (attr
== &dev_attr_conn_keepalive_tmo
.attr
)
4313 param
= ISCSI_PARAM_KEEPALIVE_TMO
;
4314 else if (attr
== &dev_attr_conn_max_segment_size
.attr
)
4315 param
= ISCSI_PARAM_MAX_SEGMENT_SIZE
;
4316 else if (attr
== &dev_attr_conn_tcp_timestamp_stat
.attr
)
4317 param
= ISCSI_PARAM_TCP_TIMESTAMP_STAT
;
4318 else if (attr
== &dev_attr_conn_tcp_wsf_disable
.attr
)
4319 param
= ISCSI_PARAM_TCP_WSF_DISABLE
;
4320 else if (attr
== &dev_attr_conn_tcp_nagle_disable
.attr
)
4321 param
= ISCSI_PARAM_TCP_NAGLE_DISABLE
;
4322 else if (attr
== &dev_attr_conn_tcp_timer_scale
.attr
)
4323 param
= ISCSI_PARAM_TCP_TIMER_SCALE
;
4324 else if (attr
== &dev_attr_conn_tcp_timestamp_enable
.attr
)
4325 param
= ISCSI_PARAM_TCP_TIMESTAMP_EN
;
4326 else if (attr
== &dev_attr_conn_fragment_disable
.attr
)
4327 param
= ISCSI_PARAM_IP_FRAGMENT_DISABLE
;
4328 else if (attr
== &dev_attr_conn_ipv4_tos
.attr
)
4329 param
= ISCSI_PARAM_IPV4_TOS
;
4330 else if (attr
== &dev_attr_conn_ipv6_traffic_class
.attr
)
4331 param
= ISCSI_PARAM_IPV6_TC
;
4332 else if (attr
== &dev_attr_conn_ipv6_flow_label
.attr
)
4333 param
= ISCSI_PARAM_IPV6_FLOW_LABEL
;
4334 else if (attr
== &dev_attr_conn_is_fw_assigned_ipv6
.attr
)
4335 param
= ISCSI_PARAM_IS_FW_ASSIGNED_IPV6
;
4336 else if (attr
== &dev_attr_conn_tcp_xmit_wsf
.attr
)
4337 param
= ISCSI_PARAM_TCP_XMIT_WSF
;
4338 else if (attr
== &dev_attr_conn_tcp_recv_wsf
.attr
)
4339 param
= ISCSI_PARAM_TCP_RECV_WSF
;
4340 else if (attr
== &dev_attr_conn_local_ipaddr
.attr
)
4341 param
= ISCSI_PARAM_LOCAL_IPADDR
;
4342 else if (attr
== &dev_attr_conn_state
.attr
)
4345 WARN_ONCE(1, "Invalid conn attr");
4349 return t
->attr_is_visible(ISCSI_PARAM
, param
);
4352 static struct attribute_group iscsi_conn_group
= {
4353 .attrs
= iscsi_conn_attrs
,
4354 .is_visible
= iscsi_conn_attr_is_visible
,
4358 * iSCSI session attrs
4360 #define iscsi_session_attr_show(param, perm) \
4362 show_session_param_##param(struct device *dev, \
4363 struct device_attribute *attr, char *buf) \
4365 struct iscsi_cls_session *session = \
4366 iscsi_dev_to_session(dev->parent); \
4367 struct iscsi_transport *t = session->transport; \
4369 if (perm && !capable(CAP_SYS_ADMIN)) \
4371 return t->get_session_param(session, param, buf); \
4374 #define iscsi_session_attr(field, param, perm) \
4375 iscsi_session_attr_show(param, perm) \
4376 static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_param_##param, \
4378 iscsi_session_attr(targetname
, ISCSI_PARAM_TARGET_NAME
, 0);
4379 iscsi_session_attr(initial_r2t
, ISCSI_PARAM_INITIAL_R2T_EN
, 0);
4380 iscsi_session_attr(max_outstanding_r2t
, ISCSI_PARAM_MAX_R2T
, 0);
4381 iscsi_session_attr(immediate_data
, ISCSI_PARAM_IMM_DATA_EN
, 0);
4382 iscsi_session_attr(first_burst_len
, ISCSI_PARAM_FIRST_BURST
, 0);
4383 iscsi_session_attr(max_burst_len
, ISCSI_PARAM_MAX_BURST
, 0);
4384 iscsi_session_attr(data_pdu_in_order
, ISCSI_PARAM_PDU_INORDER_EN
, 0);
4385 iscsi_session_attr(data_seq_in_order
, ISCSI_PARAM_DATASEQ_INORDER_EN
, 0);
4386 iscsi_session_attr(erl
, ISCSI_PARAM_ERL
, 0);
4387 iscsi_session_attr(tpgt
, ISCSI_PARAM_TPGT
, 0);
4388 iscsi_session_attr(username
, ISCSI_PARAM_USERNAME
, 1);
4389 iscsi_session_attr(username_in
, ISCSI_PARAM_USERNAME_IN
, 1);
4390 iscsi_session_attr(password
, ISCSI_PARAM_PASSWORD
, 1);
4391 iscsi_session_attr(password_in
, ISCSI_PARAM_PASSWORD_IN
, 1);
4392 iscsi_session_attr(chap_out_idx
, ISCSI_PARAM_CHAP_OUT_IDX
, 1);
4393 iscsi_session_attr(chap_in_idx
, ISCSI_PARAM_CHAP_IN_IDX
, 1);
4394 iscsi_session_attr(fast_abort
, ISCSI_PARAM_FAST_ABORT
, 0);
4395 iscsi_session_attr(abort_tmo
, ISCSI_PARAM_ABORT_TMO
, 0);
4396 iscsi_session_attr(lu_reset_tmo
, ISCSI_PARAM_LU_RESET_TMO
, 0);
4397 iscsi_session_attr(tgt_reset_tmo
, ISCSI_PARAM_TGT_RESET_TMO
, 0);
4398 iscsi_session_attr(ifacename
, ISCSI_PARAM_IFACE_NAME
, 0);
4399 iscsi_session_attr(initiatorname
, ISCSI_PARAM_INITIATOR_NAME
, 0);
4400 iscsi_session_attr(targetalias
, ISCSI_PARAM_TARGET_ALIAS
, 0);
4401 iscsi_session_attr(boot_root
, ISCSI_PARAM_BOOT_ROOT
, 0);
4402 iscsi_session_attr(boot_nic
, ISCSI_PARAM_BOOT_NIC
, 0);
4403 iscsi_session_attr(boot_target
, ISCSI_PARAM_BOOT_TARGET
, 0);
4404 iscsi_session_attr(auto_snd_tgt_disable
, ISCSI_PARAM_AUTO_SND_TGT_DISABLE
, 0);
4405 iscsi_session_attr(discovery_session
, ISCSI_PARAM_DISCOVERY_SESS
, 0);
4406 iscsi_session_attr(portal_type
, ISCSI_PARAM_PORTAL_TYPE
, 0);
4407 iscsi_session_attr(chap_auth
, ISCSI_PARAM_CHAP_AUTH_EN
, 0);
4408 iscsi_session_attr(discovery_logout
, ISCSI_PARAM_DISCOVERY_LOGOUT_EN
, 0);
4409 iscsi_session_attr(bidi_chap
, ISCSI_PARAM_BIDI_CHAP_EN
, 0);
4410 iscsi_session_attr(discovery_auth_optional
,
4411 ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL
, 0);
4412 iscsi_session_attr(def_time2wait
, ISCSI_PARAM_DEF_TIME2WAIT
, 0);
4413 iscsi_session_attr(def_time2retain
, ISCSI_PARAM_DEF_TIME2RETAIN
, 0);
4414 iscsi_session_attr(isid
, ISCSI_PARAM_ISID
, 0);
4415 iscsi_session_attr(tsid
, ISCSI_PARAM_TSID
, 0);
4416 iscsi_session_attr(def_taskmgmt_tmo
, ISCSI_PARAM_DEF_TASKMGMT_TMO
, 0);
4417 iscsi_session_attr(discovery_parent_idx
, ISCSI_PARAM_DISCOVERY_PARENT_IDX
, 0);
4418 iscsi_session_attr(discovery_parent_type
, ISCSI_PARAM_DISCOVERY_PARENT_TYPE
, 0);
4421 show_priv_session_target_state(struct device
*dev
, struct device_attribute
*attr
,
4424 struct iscsi_cls_session
*session
= iscsi_dev_to_session(dev
->parent
);
4426 return sysfs_emit(buf
, "%s\n",
4427 iscsi_session_target_state_name
[session
->target_state
]);
4430 static ISCSI_CLASS_ATTR(priv_sess
, target_state
, S_IRUGO
,
4431 show_priv_session_target_state
, NULL
);
4434 show_priv_session_state(struct device
*dev
, struct device_attribute
*attr
,
4437 struct iscsi_cls_session
*session
= iscsi_dev_to_session(dev
->parent
);
4438 return sysfs_emit(buf
, "%s\n", iscsi_session_state_name(session
->state
));
4440 static ISCSI_CLASS_ATTR(priv_sess
, state
, S_IRUGO
, show_priv_session_state
,
4443 show_priv_session_creator(struct device
*dev
, struct device_attribute
*attr
,
4446 struct iscsi_cls_session
*session
= iscsi_dev_to_session(dev
->parent
);
4447 return sysfs_emit(buf
, "%d\n", session
->creator
);
4449 static ISCSI_CLASS_ATTR(priv_sess
, creator
, S_IRUGO
, show_priv_session_creator
,
4452 show_priv_session_target_id(struct device
*dev
, struct device_attribute
*attr
,
4455 struct iscsi_cls_session
*session
= iscsi_dev_to_session(dev
->parent
);
4456 return sysfs_emit(buf
, "%d\n", session
->target_id
);
4458 static ISCSI_CLASS_ATTR(priv_sess
, target_id
, S_IRUGO
,
4459 show_priv_session_target_id
, NULL
);
4461 #define iscsi_priv_session_attr_show(field, format) \
4463 show_priv_session_##field(struct device *dev, \
4464 struct device_attribute *attr, char *buf) \
4466 struct iscsi_cls_session *session = \
4467 iscsi_dev_to_session(dev->parent); \
4468 if (session->field == -1) \
4469 return sysfs_emit(buf, "off\n"); \
4470 return sysfs_emit(buf, format"\n", session->field); \
4473 #define iscsi_priv_session_attr_store(field) \
4475 store_priv_session_##field(struct device *dev, \
4476 struct device_attribute *attr, \
4477 const char *buf, size_t count) \
4481 struct iscsi_cls_session *session = \
4482 iscsi_dev_to_session(dev->parent); \
4483 if ((session->state == ISCSI_SESSION_FREE) || \
4484 (session->state == ISCSI_SESSION_FAILED)) \
4486 if (strncmp(buf, "off", 3) == 0) { \
4487 session->field = -1; \
4488 session->field##_sysfs_override = true; \
4490 val = simple_strtoul(buf, &cp, 0); \
4491 if (*cp != '\0' && *cp != '\n') \
4493 session->field = val; \
4494 session->field##_sysfs_override = true; \
4499 #define iscsi_priv_session_rw_attr(field, format) \
4500 iscsi_priv_session_attr_show(field, format) \
4501 iscsi_priv_session_attr_store(field) \
4502 static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO | S_IWUSR, \
4503 show_priv_session_##field, \
4504 store_priv_session_##field)
4506 iscsi_priv_session_rw_attr(recovery_tmo
, "%d");
4508 static struct attribute
*iscsi_session_attrs
[] = {
4509 &dev_attr_sess_initial_r2t
.attr
,
4510 &dev_attr_sess_max_outstanding_r2t
.attr
,
4511 &dev_attr_sess_immediate_data
.attr
,
4512 &dev_attr_sess_first_burst_len
.attr
,
4513 &dev_attr_sess_max_burst_len
.attr
,
4514 &dev_attr_sess_data_pdu_in_order
.attr
,
4515 &dev_attr_sess_data_seq_in_order
.attr
,
4516 &dev_attr_sess_erl
.attr
,
4517 &dev_attr_sess_targetname
.attr
,
4518 &dev_attr_sess_tpgt
.attr
,
4519 &dev_attr_sess_password
.attr
,
4520 &dev_attr_sess_password_in
.attr
,
4521 &dev_attr_sess_username
.attr
,
4522 &dev_attr_sess_username_in
.attr
,
4523 &dev_attr_sess_fast_abort
.attr
,
4524 &dev_attr_sess_abort_tmo
.attr
,
4525 &dev_attr_sess_lu_reset_tmo
.attr
,
4526 &dev_attr_sess_tgt_reset_tmo
.attr
,
4527 &dev_attr_sess_ifacename
.attr
,
4528 &dev_attr_sess_initiatorname
.attr
,
4529 &dev_attr_sess_targetalias
.attr
,
4530 &dev_attr_sess_boot_root
.attr
,
4531 &dev_attr_sess_boot_nic
.attr
,
4532 &dev_attr_sess_boot_target
.attr
,
4533 &dev_attr_priv_sess_recovery_tmo
.attr
,
4534 &dev_attr_priv_sess_state
.attr
,
4535 &dev_attr_priv_sess_target_state
.attr
,
4536 &dev_attr_priv_sess_creator
.attr
,
4537 &dev_attr_sess_chap_out_idx
.attr
,
4538 &dev_attr_sess_chap_in_idx
.attr
,
4539 &dev_attr_priv_sess_target_id
.attr
,
4540 &dev_attr_sess_auto_snd_tgt_disable
.attr
,
4541 &dev_attr_sess_discovery_session
.attr
,
4542 &dev_attr_sess_portal_type
.attr
,
4543 &dev_attr_sess_chap_auth
.attr
,
4544 &dev_attr_sess_discovery_logout
.attr
,
4545 &dev_attr_sess_bidi_chap
.attr
,
4546 &dev_attr_sess_discovery_auth_optional
.attr
,
4547 &dev_attr_sess_def_time2wait
.attr
,
4548 &dev_attr_sess_def_time2retain
.attr
,
4549 &dev_attr_sess_isid
.attr
,
4550 &dev_attr_sess_tsid
.attr
,
4551 &dev_attr_sess_def_taskmgmt_tmo
.attr
,
4552 &dev_attr_sess_discovery_parent_idx
.attr
,
4553 &dev_attr_sess_discovery_parent_type
.attr
,
4557 static umode_t
iscsi_session_attr_is_visible(struct kobject
*kobj
,
4558 struct attribute
*attr
, int i
)
4560 struct device
*cdev
= container_of(kobj
, struct device
, kobj
);
4561 struct iscsi_cls_session
*session
= transport_class_to_session(cdev
);
4562 struct iscsi_transport
*t
= session
->transport
;
4565 if (attr
== &dev_attr_sess_initial_r2t
.attr
)
4566 param
= ISCSI_PARAM_INITIAL_R2T_EN
;
4567 else if (attr
== &dev_attr_sess_max_outstanding_r2t
.attr
)
4568 param
= ISCSI_PARAM_MAX_R2T
;
4569 else if (attr
== &dev_attr_sess_immediate_data
.attr
)
4570 param
= ISCSI_PARAM_IMM_DATA_EN
;
4571 else if (attr
== &dev_attr_sess_first_burst_len
.attr
)
4572 param
= ISCSI_PARAM_FIRST_BURST
;
4573 else if (attr
== &dev_attr_sess_max_burst_len
.attr
)
4574 param
= ISCSI_PARAM_MAX_BURST
;
4575 else if (attr
== &dev_attr_sess_data_pdu_in_order
.attr
)
4576 param
= ISCSI_PARAM_PDU_INORDER_EN
;
4577 else if (attr
== &dev_attr_sess_data_seq_in_order
.attr
)
4578 param
= ISCSI_PARAM_DATASEQ_INORDER_EN
;
4579 else if (attr
== &dev_attr_sess_erl
.attr
)
4580 param
= ISCSI_PARAM_ERL
;
4581 else if (attr
== &dev_attr_sess_targetname
.attr
)
4582 param
= ISCSI_PARAM_TARGET_NAME
;
4583 else if (attr
== &dev_attr_sess_tpgt
.attr
)
4584 param
= ISCSI_PARAM_TPGT
;
4585 else if (attr
== &dev_attr_sess_chap_in_idx
.attr
)
4586 param
= ISCSI_PARAM_CHAP_IN_IDX
;
4587 else if (attr
== &dev_attr_sess_chap_out_idx
.attr
)
4588 param
= ISCSI_PARAM_CHAP_OUT_IDX
;
4589 else if (attr
== &dev_attr_sess_password
.attr
)
4590 param
= ISCSI_PARAM_USERNAME
;
4591 else if (attr
== &dev_attr_sess_password_in
.attr
)
4592 param
= ISCSI_PARAM_USERNAME_IN
;
4593 else if (attr
== &dev_attr_sess_username
.attr
)
4594 param
= ISCSI_PARAM_PASSWORD
;
4595 else if (attr
== &dev_attr_sess_username_in
.attr
)
4596 param
= ISCSI_PARAM_PASSWORD_IN
;
4597 else if (attr
== &dev_attr_sess_fast_abort
.attr
)
4598 param
= ISCSI_PARAM_FAST_ABORT
;
4599 else if (attr
== &dev_attr_sess_abort_tmo
.attr
)
4600 param
= ISCSI_PARAM_ABORT_TMO
;
4601 else if (attr
== &dev_attr_sess_lu_reset_tmo
.attr
)
4602 param
= ISCSI_PARAM_LU_RESET_TMO
;
4603 else if (attr
== &dev_attr_sess_tgt_reset_tmo
.attr
)
4604 param
= ISCSI_PARAM_TGT_RESET_TMO
;
4605 else if (attr
== &dev_attr_sess_ifacename
.attr
)
4606 param
= ISCSI_PARAM_IFACE_NAME
;
4607 else if (attr
== &dev_attr_sess_initiatorname
.attr
)
4608 param
= ISCSI_PARAM_INITIATOR_NAME
;
4609 else if (attr
== &dev_attr_sess_targetalias
.attr
)
4610 param
= ISCSI_PARAM_TARGET_ALIAS
;
4611 else if (attr
== &dev_attr_sess_boot_root
.attr
)
4612 param
= ISCSI_PARAM_BOOT_ROOT
;
4613 else if (attr
== &dev_attr_sess_boot_nic
.attr
)
4614 param
= ISCSI_PARAM_BOOT_NIC
;
4615 else if (attr
== &dev_attr_sess_boot_target
.attr
)
4616 param
= ISCSI_PARAM_BOOT_TARGET
;
4617 else if (attr
== &dev_attr_sess_auto_snd_tgt_disable
.attr
)
4618 param
= ISCSI_PARAM_AUTO_SND_TGT_DISABLE
;
4619 else if (attr
== &dev_attr_sess_discovery_session
.attr
)
4620 param
= ISCSI_PARAM_DISCOVERY_SESS
;
4621 else if (attr
== &dev_attr_sess_portal_type
.attr
)
4622 param
= ISCSI_PARAM_PORTAL_TYPE
;
4623 else if (attr
== &dev_attr_sess_chap_auth
.attr
)
4624 param
= ISCSI_PARAM_CHAP_AUTH_EN
;
4625 else if (attr
== &dev_attr_sess_discovery_logout
.attr
)
4626 param
= ISCSI_PARAM_DISCOVERY_LOGOUT_EN
;
4627 else if (attr
== &dev_attr_sess_bidi_chap
.attr
)
4628 param
= ISCSI_PARAM_BIDI_CHAP_EN
;
4629 else if (attr
== &dev_attr_sess_discovery_auth_optional
.attr
)
4630 param
= ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL
;
4631 else if (attr
== &dev_attr_sess_def_time2wait
.attr
)
4632 param
= ISCSI_PARAM_DEF_TIME2WAIT
;
4633 else if (attr
== &dev_attr_sess_def_time2retain
.attr
)
4634 param
= ISCSI_PARAM_DEF_TIME2RETAIN
;
4635 else if (attr
== &dev_attr_sess_isid
.attr
)
4636 param
= ISCSI_PARAM_ISID
;
4637 else if (attr
== &dev_attr_sess_tsid
.attr
)
4638 param
= ISCSI_PARAM_TSID
;
4639 else if (attr
== &dev_attr_sess_def_taskmgmt_tmo
.attr
)
4640 param
= ISCSI_PARAM_DEF_TASKMGMT_TMO
;
4641 else if (attr
== &dev_attr_sess_discovery_parent_idx
.attr
)
4642 param
= ISCSI_PARAM_DISCOVERY_PARENT_IDX
;
4643 else if (attr
== &dev_attr_sess_discovery_parent_type
.attr
)
4644 param
= ISCSI_PARAM_DISCOVERY_PARENT_TYPE
;
4645 else if (attr
== &dev_attr_priv_sess_recovery_tmo
.attr
)
4646 return S_IRUGO
| S_IWUSR
;
4647 else if (attr
== &dev_attr_priv_sess_state
.attr
)
4649 else if (attr
== &dev_attr_priv_sess_target_state
.attr
)
4651 else if (attr
== &dev_attr_priv_sess_creator
.attr
)
4653 else if (attr
== &dev_attr_priv_sess_target_id
.attr
)
4656 WARN_ONCE(1, "Invalid session attr");
4660 return t
->attr_is_visible(ISCSI_PARAM
, param
);
4663 static struct attribute_group iscsi_session_group
= {
4664 .attrs
= iscsi_session_attrs
,
4665 .is_visible
= iscsi_session_attr_is_visible
,
4671 #define iscsi_host_attr_show(param) \
4673 show_host_param_##param(struct device *dev, \
4674 struct device_attribute *attr, char *buf) \
4676 struct Scsi_Host *shost = transport_class_to_shost(dev); \
4677 struct iscsi_internal *priv = to_iscsi_internal(shost->transportt); \
4678 return priv->iscsi_transport->get_host_param(shost, param, buf); \
4681 #define iscsi_host_attr(field, param) \
4682 iscsi_host_attr_show(param) \
4683 static ISCSI_CLASS_ATTR(host, field, S_IRUGO, show_host_param_##param, \
4686 iscsi_host_attr(netdev
, ISCSI_HOST_PARAM_NETDEV_NAME
);
4687 iscsi_host_attr(hwaddress
, ISCSI_HOST_PARAM_HWADDRESS
);
4688 iscsi_host_attr(ipaddress
, ISCSI_HOST_PARAM_IPADDRESS
);
4689 iscsi_host_attr(initiatorname
, ISCSI_HOST_PARAM_INITIATOR_NAME
);
4690 iscsi_host_attr(port_state
, ISCSI_HOST_PARAM_PORT_STATE
);
4691 iscsi_host_attr(port_speed
, ISCSI_HOST_PARAM_PORT_SPEED
);
4693 static struct attribute
*iscsi_host_attrs
[] = {
4694 &dev_attr_host_netdev
.attr
,
4695 &dev_attr_host_hwaddress
.attr
,
4696 &dev_attr_host_ipaddress
.attr
,
4697 &dev_attr_host_initiatorname
.attr
,
4698 &dev_attr_host_port_state
.attr
,
4699 &dev_attr_host_port_speed
.attr
,
4703 static umode_t
iscsi_host_attr_is_visible(struct kobject
*kobj
,
4704 struct attribute
*attr
, int i
)
4706 struct device
*cdev
= container_of(kobj
, struct device
, kobj
);
4707 struct Scsi_Host
*shost
= transport_class_to_shost(cdev
);
4708 struct iscsi_internal
*priv
= to_iscsi_internal(shost
->transportt
);
4711 if (attr
== &dev_attr_host_netdev
.attr
)
4712 param
= ISCSI_HOST_PARAM_NETDEV_NAME
;
4713 else if (attr
== &dev_attr_host_hwaddress
.attr
)
4714 param
= ISCSI_HOST_PARAM_HWADDRESS
;
4715 else if (attr
== &dev_attr_host_ipaddress
.attr
)
4716 param
= ISCSI_HOST_PARAM_IPADDRESS
;
4717 else if (attr
== &dev_attr_host_initiatorname
.attr
)
4718 param
= ISCSI_HOST_PARAM_INITIATOR_NAME
;
4719 else if (attr
== &dev_attr_host_port_state
.attr
)
4720 param
= ISCSI_HOST_PARAM_PORT_STATE
;
4721 else if (attr
== &dev_attr_host_port_speed
.attr
)
4722 param
= ISCSI_HOST_PARAM_PORT_SPEED
;
4724 WARN_ONCE(1, "Invalid host attr");
4728 return priv
->iscsi_transport
->attr_is_visible(ISCSI_HOST_PARAM
, param
);
4731 static struct attribute_group iscsi_host_group
= {
4732 .attrs
= iscsi_host_attrs
,
4733 .is_visible
= iscsi_host_attr_is_visible
,
4736 /* convert iscsi_port_speed values to ascii string name */
4737 static const struct {
4738 enum iscsi_port_speed value
;
4740 } iscsi_port_speed_names
[] = {
4741 {ISCSI_PORT_SPEED_UNKNOWN
, "Unknown" },
4742 {ISCSI_PORT_SPEED_10MBPS
, "10 Mbps" },
4743 {ISCSI_PORT_SPEED_100MBPS
, "100 Mbps" },
4744 {ISCSI_PORT_SPEED_1GBPS
, "1 Gbps" },
4745 {ISCSI_PORT_SPEED_10GBPS
, "10 Gbps" },
4746 {ISCSI_PORT_SPEED_25GBPS
, "25 Gbps" },
4747 {ISCSI_PORT_SPEED_40GBPS
, "40 Gbps" },
4750 char *iscsi_get_port_speed_name(struct Scsi_Host
*shost
)
4753 char *speed
= "Unknown!";
4754 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
4755 uint32_t port_speed
= ihost
->port_speed
;
4757 for (i
= 0; i
< ARRAY_SIZE(iscsi_port_speed_names
); i
++) {
4758 if (iscsi_port_speed_names
[i
].value
& port_speed
) {
4759 speed
= iscsi_port_speed_names
[i
].name
;
4765 EXPORT_SYMBOL_GPL(iscsi_get_port_speed_name
);
4767 /* convert iscsi_port_state values to ascii string name */
4768 static const struct {
4769 enum iscsi_port_state value
;
4771 } iscsi_port_state_names
[] = {
4772 {ISCSI_PORT_STATE_DOWN
, "LINK DOWN" },
4773 {ISCSI_PORT_STATE_UP
, "LINK UP" },
4776 char *iscsi_get_port_state_name(struct Scsi_Host
*shost
)
4779 char *state
= "Unknown!";
4780 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
4781 uint32_t port_state
= ihost
->port_state
;
4783 for (i
= 0; i
< ARRAY_SIZE(iscsi_port_state_names
); i
++) {
4784 if (iscsi_port_state_names
[i
].value
& port_state
) {
4785 state
= iscsi_port_state_names
[i
].name
;
4791 EXPORT_SYMBOL_GPL(iscsi_get_port_state_name
);
4793 static int iscsi_session_match(struct attribute_container
*cont
,
4796 struct iscsi_cls_session
*session
;
4797 struct Scsi_Host
*shost
;
4798 struct iscsi_internal
*priv
;
4800 if (!iscsi_is_session_dev(dev
))
4803 session
= iscsi_dev_to_session(dev
);
4804 shost
= iscsi_session_to_shost(session
);
4805 if (!shost
->transportt
)
4808 priv
= to_iscsi_internal(shost
->transportt
);
4809 if (priv
->session_cont
.ac
.class != &iscsi_session_class
.class)
4812 return &priv
->session_cont
.ac
== cont
;
4815 static int iscsi_conn_match(struct attribute_container
*cont
,
4818 struct iscsi_cls_session
*session
;
4819 struct iscsi_cls_conn
*conn
;
4820 struct Scsi_Host
*shost
;
4821 struct iscsi_internal
*priv
;
4823 if (!iscsi_is_conn_dev(dev
))
4826 conn
= iscsi_dev_to_conn(dev
);
4827 session
= iscsi_dev_to_session(conn
->dev
.parent
);
4828 shost
= iscsi_session_to_shost(session
);
4830 if (!shost
->transportt
)
4833 priv
= to_iscsi_internal(shost
->transportt
);
4834 if (priv
->conn_cont
.ac
.class != &iscsi_connection_class
.class)
4837 return &priv
->conn_cont
.ac
== cont
;
4840 static int iscsi_host_match(struct attribute_container
*cont
,
4843 struct Scsi_Host
*shost
;
4844 struct iscsi_internal
*priv
;
4846 if (!scsi_is_host_device(dev
))
4849 shost
= dev_to_shost(dev
);
4850 if (!shost
->transportt
||
4851 shost
->transportt
->host_attrs
.ac
.class != &iscsi_host_class
.class)
4854 priv
= to_iscsi_internal(shost
->transportt
);
4855 return &priv
->t
.host_attrs
.ac
== cont
;
4858 struct scsi_transport_template
*
4859 iscsi_register_transport(struct iscsi_transport
*tt
)
4861 struct iscsi_internal
*priv
;
4862 unsigned long flags
;
4866 WARN_ON(tt
->ep_disconnect
&& !tt
->unbind_conn
);
4868 priv
= iscsi_if_transport_lookup(tt
);
4872 priv
= kzalloc(sizeof(*priv
), GFP_KERNEL
);
4875 INIT_LIST_HEAD(&priv
->list
);
4876 priv
->iscsi_transport
= tt
;
4877 priv
->t
.user_scan
= iscsi_user_scan
;
4879 priv
->dev
.class = &iscsi_transport_class
;
4880 dev_set_name(&priv
->dev
, "%s", tt
->name
);
4881 err
= device_register(&priv
->dev
);
4885 err
= sysfs_create_group(&priv
->dev
.kobj
, &iscsi_transport_group
);
4887 goto unregister_dev
;
4889 /* host parameters */
4890 priv
->t
.host_attrs
.ac
.class = &iscsi_host_class
.class;
4891 priv
->t
.host_attrs
.ac
.match
= iscsi_host_match
;
4892 priv
->t
.host_attrs
.ac
.grp
= &iscsi_host_group
;
4893 priv
->t
.host_size
= sizeof(struct iscsi_cls_host
);
4894 transport_container_register(&priv
->t
.host_attrs
);
4896 /* connection parameters */
4897 priv
->conn_cont
.ac
.class = &iscsi_connection_class
.class;
4898 priv
->conn_cont
.ac
.match
= iscsi_conn_match
;
4899 priv
->conn_cont
.ac
.grp
= &iscsi_conn_group
;
4900 transport_container_register(&priv
->conn_cont
);
4902 /* session parameters */
4903 priv
->session_cont
.ac
.class = &iscsi_session_class
.class;
4904 priv
->session_cont
.ac
.match
= iscsi_session_match
;
4905 priv
->session_cont
.ac
.grp
= &iscsi_session_group
;
4906 transport_container_register(&priv
->session_cont
);
4908 spin_lock_irqsave(&iscsi_transport_lock
, flags
);
4909 list_add(&priv
->list
, &iscsi_transports
);
4910 spin_unlock_irqrestore(&iscsi_transport_lock
, flags
);
4912 printk(KERN_NOTICE
"iscsi: registered transport (%s)\n", tt
->name
);
4916 device_unregister(&priv
->dev
);
4919 put_device(&priv
->dev
);
4922 EXPORT_SYMBOL_GPL(iscsi_register_transport
);
4924 void iscsi_unregister_transport(struct iscsi_transport
*tt
)
4926 struct iscsi_internal
*priv
;
4927 unsigned long flags
;
4931 mutex_lock(&rx_queue_mutex
);
4933 priv
= iscsi_if_transport_lookup(tt
);
4936 spin_lock_irqsave(&iscsi_transport_lock
, flags
);
4937 list_del(&priv
->list
);
4938 spin_unlock_irqrestore(&iscsi_transport_lock
, flags
);
4940 transport_container_unregister(&priv
->conn_cont
);
4941 transport_container_unregister(&priv
->session_cont
);
4942 transport_container_unregister(&priv
->t
.host_attrs
);
4944 sysfs_remove_group(&priv
->dev
.kobj
, &iscsi_transport_group
);
4945 device_unregister(&priv
->dev
);
4946 mutex_unlock(&rx_queue_mutex
);
4948 EXPORT_SYMBOL_GPL(iscsi_unregister_transport
);
4950 void iscsi_dbg_trace(void (*trace
)(struct device
*dev
, struct va_format
*),
4951 struct device
*dev
, const char *fmt
, ...)
4953 struct va_format vaf
;
4956 va_start(args
, fmt
);
4962 EXPORT_SYMBOL_GPL(iscsi_dbg_trace
);
4964 static __init
int iscsi_transport_init(void)
4967 struct netlink_kernel_cfg cfg
= {
4969 .input
= iscsi_if_rx
,
4971 printk(KERN_INFO
"Loading iSCSI transport class v%s.\n",
4972 ISCSI_TRANSPORT_VERSION
);
4974 atomic_set(&iscsi_session_nr
, 0);
4976 err
= class_register(&iscsi_transport_class
);
4980 err
= class_register(&iscsi_endpoint_class
);
4982 goto unregister_transport_class
;
4984 err
= class_register(&iscsi_iface_class
);
4986 goto unregister_endpoint_class
;
4988 err
= transport_class_register(&iscsi_host_class
);
4990 goto unregister_iface_class
;
4992 err
= transport_class_register(&iscsi_connection_class
);
4994 goto unregister_host_class
;
4996 err
= transport_class_register(&iscsi_session_class
);
4998 goto unregister_conn_class
;
5000 err
= bus_register(&iscsi_flashnode_bus
);
5002 goto unregister_session_class
;
5004 nls
= netlink_kernel_create(&init_net
, NETLINK_ISCSI
, &cfg
);
5007 goto unregister_flashnode_bus
;
5010 iscsi_conn_cleanup_workq
= alloc_workqueue("%s",
5011 WQ_SYSFS
| WQ_MEM_RECLAIM
| WQ_UNBOUND
, 0,
5012 "iscsi_conn_cleanup");
5013 if (!iscsi_conn_cleanup_workq
) {
5021 netlink_kernel_release(nls
);
5022 unregister_flashnode_bus
:
5023 bus_unregister(&iscsi_flashnode_bus
);
5024 unregister_session_class
:
5025 transport_class_unregister(&iscsi_session_class
);
5026 unregister_conn_class
:
5027 transport_class_unregister(&iscsi_connection_class
);
5028 unregister_host_class
:
5029 transport_class_unregister(&iscsi_host_class
);
5030 unregister_iface_class
:
5031 class_unregister(&iscsi_iface_class
);
5032 unregister_endpoint_class
:
5033 class_unregister(&iscsi_endpoint_class
);
5034 unregister_transport_class
:
5035 class_unregister(&iscsi_transport_class
);
5039 static void __exit
iscsi_transport_exit(void)
5041 destroy_workqueue(iscsi_conn_cleanup_workq
);
5042 netlink_kernel_release(nls
);
5043 bus_unregister(&iscsi_flashnode_bus
);
5044 transport_class_unregister(&iscsi_connection_class
);
5045 transport_class_unregister(&iscsi_session_class
);
5046 transport_class_unregister(&iscsi_host_class
);
5047 class_unregister(&iscsi_endpoint_class
);
5048 class_unregister(&iscsi_iface_class
);
5049 class_unregister(&iscsi_transport_class
);
5052 module_init(iscsi_transport_init
);
5053 module_exit(iscsi_transport_exit
);
5055 MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
5056 "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
5057 "Alex Aizman <itn780@yahoo.com>");
5058 MODULE_DESCRIPTION("iSCSI Transport Interface");
5059 MODULE_LICENSE("GPL");
5060 MODULE_VERSION(ISCSI_TRANSPORT_VERSION
);
5061 MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK
, NETLINK_ISCSI
);