linux/drivers/scsi/scsi_transport_iscsi.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * iSCSI transport class definitions
   4 *
   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
   9 */
  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>
  15#include <net/tcp.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>
  24
  25#define ISCSI_TRANSPORT_VERSION "2.0-870"
  26
  27#define ISCSI_SEND_MAX_ALLOWED  10
  28
  29#define CREATE_TRACE_POINTS
  30#include <trace/events/iscsi.h>
  31
  32/*
  33 * Export tracepoint symbols to be used by other modules.
  34 */
  35EXPORT_TRACEPOINT_SYMBOL_GPL(iscsi_dbg_conn);
  36EXPORT_TRACEPOINT_SYMBOL_GPL(iscsi_dbg_eh);
  37EXPORT_TRACEPOINT_SYMBOL_GPL(iscsi_dbg_session);
  38EXPORT_TRACEPOINT_SYMBOL_GPL(iscsi_dbg_tcp);
  39EXPORT_TRACEPOINT_SYMBOL_GPL(iscsi_dbg_sw_tcp);
  40
  41static int dbg_session;
  42module_param_named(debug_session, dbg_session, int,
  43                   S_IRUGO | S_IWUSR);
  44MODULE_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 "
  47                 "is off.");
  48
  49static int dbg_conn;
  50module_param_named(debug_conn, dbg_conn, int,
  51                   S_IRUGO | S_IWUSR);
  52MODULE_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 "
  55                 "is off.");
  56
  57#define ISCSI_DBG_TRANS_SESSION(_session, dbg_fmt, arg...)              \
  58        do {                                                            \
  59                if (dbg_session)                                        \
  60                        iscsi_cls_session_printk(KERN_INFO, _session,   \
  61                                                 "%s: " dbg_fmt,        \
  62                                                 __func__, ##arg);      \
  63                iscsi_dbg_trace(trace_iscsi_dbg_trans_session,          \
  64                                &(_session)->dev,                       \
  65                                "%s " dbg_fmt, __func__, ##arg);        \
  66        } while (0);
  67
  68#define ISCSI_DBG_TRANS_CONN(_conn, dbg_fmt, arg...)                    \
  69        do {                                                            \
  70                if (dbg_conn)                                           \
  71                        iscsi_cls_conn_printk(KERN_INFO, _conn,         \
  72                                              "%s: " dbg_fmt,           \
  73                                              __func__, ##arg);         \
  74                iscsi_dbg_trace(trace_iscsi_dbg_trans_conn,             \
  75                                &(_conn)->dev,                          \
  76                                "%s " dbg_fmt, __func__, ##arg);        \
  77        } while (0);
  78
  79struct iscsi_internal {
  80        struct scsi_transport_template t;
  81        struct iscsi_transport *iscsi_transport;
  82        struct list_head list;
  83        struct device dev;
  84
  85        struct transport_container conn_cont;
  86        struct transport_container session_cont;
  87};
  88
  89/* Worker to perform connection failure on unresponsive connections
  90 * completely in kernel space.
  91 */
  92static void stop_conn_work_fn(struct work_struct *work);
  93static DECLARE_WORK(stop_conn_work, stop_conn_work_fn);
  94
  95static atomic_t iscsi_session_nr; /* sysfs session id for next new session */
  96static struct workqueue_struct *iscsi_eh_timer_workq;
  97
  98static struct workqueue_struct *iscsi_destroy_workq;
  99
 100static DEFINE_IDA(iscsi_sess_ida);
 101/*
 102 * list of registered transports and lock that must
 103 * be held while accessing list. The iscsi_transport_lock must
 104 * be acquired after the rx_queue_mutex.
 105 */
 106static LIST_HEAD(iscsi_transports);
 107static DEFINE_SPINLOCK(iscsi_transport_lock);
 108
 109#define to_iscsi_internal(tmpl) \
 110        container_of(tmpl, struct iscsi_internal, t)
 111
 112#define dev_to_iscsi_internal(_dev) \
 113        container_of(_dev, struct iscsi_internal, dev)
 114
 115static void iscsi_transport_release(struct device *dev)
 116{
 117        struct iscsi_internal *priv = dev_to_iscsi_internal(dev);
 118        kfree(priv);
 119}
 120
 121/*
 122 * iscsi_transport_class represents the iscsi_transports that are
 123 * registered.
 124 */
 125static struct class iscsi_transport_class = {
 126        .name = "iscsi_transport",
 127        .dev_release = iscsi_transport_release,
 128};
 129
 130static ssize_t
 131show_transport_handle(struct device *dev, struct device_attribute *attr,
 132                      char *buf)
 133{
 134        struct iscsi_internal *priv = dev_to_iscsi_internal(dev);
 135        return sprintf(buf, "%llu\n", (unsigned long long)iscsi_handle(priv->iscsi_transport));
 136}
 137static DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL);
 138
 139#define show_transport_attr(name, format)                               \
 140static ssize_t                                                          \
 141show_transport_##name(struct device *dev,                               \
 142                      struct device_attribute *attr,char *buf)          \
 143{                                                                       \
 144        struct iscsi_internal *priv = dev_to_iscsi_internal(dev);       \
 145        return sprintf(buf, format"\n", priv->iscsi_transport->name);   \
 146}                                                                       \
 147static DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL);
 148
 149show_transport_attr(caps, "0x%x");
 150
 151static struct attribute *iscsi_transport_attrs[] = {
 152        &dev_attr_handle.attr,
 153        &dev_attr_caps.attr,
 154        NULL,
 155};
 156
 157static struct attribute_group iscsi_transport_group = {
 158        .attrs = iscsi_transport_attrs,
 159};
 160
 161/*
 162 * iSCSI endpoint attrs
 163 */
 164#define iscsi_dev_to_endpoint(_dev) \
 165        container_of(_dev, struct iscsi_endpoint, dev)
 166
 167#define ISCSI_ATTR(_prefix,_name,_mode,_show,_store)    \
 168struct device_attribute dev_attr_##_prefix##_##_name =  \
 169        __ATTR(_name,_mode,_show,_store)
 170
 171static void iscsi_endpoint_release(struct device *dev)
 172{
 173        struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
 174        kfree(ep);
 175}
 176
 177static struct class iscsi_endpoint_class = {
 178        .name = "iscsi_endpoint",
 179        .dev_release = iscsi_endpoint_release,
 180};
 181
 182static ssize_t
 183show_ep_handle(struct device *dev, struct device_attribute *attr, char *buf)
 184{
 185        struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
 186        return sprintf(buf, "%llu\n", (unsigned long long) ep->id);
 187}
 188static ISCSI_ATTR(ep, handle, S_IRUGO, show_ep_handle, NULL);
 189
 190static struct attribute *iscsi_endpoint_attrs[] = {
 191        &dev_attr_ep_handle.attr,
 192        NULL,
 193};
 194
 195static struct attribute_group iscsi_endpoint_group = {
 196        .attrs = iscsi_endpoint_attrs,
 197};
 198
 199#define ISCSI_MAX_EPID -1
 200
 201static int iscsi_match_epid(struct device *dev, const void *data)
 202{
 203        struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
 204        const uint64_t *epid = data;
 205
 206        return *epid == ep->id;
 207}
 208
 209struct iscsi_endpoint *
 210iscsi_create_endpoint(int dd_size)
 211{
 212        struct device *dev;
 213        struct iscsi_endpoint *ep;
 214        uint64_t id;
 215        int err;
 216
 217        for (id = 1; id < ISCSI_MAX_EPID; id++) {
 218                dev = class_find_device(&iscsi_endpoint_class, NULL, &id,
 219                                        iscsi_match_epid);
 220                if (!dev)
 221                        break;
 222                else
 223                        put_device(dev);
 224        }
 225        if (id == ISCSI_MAX_EPID) {
 226                printk(KERN_ERR "Too many connections. Max supported %u\n",
 227                       ISCSI_MAX_EPID - 1);
 228                return NULL;
 229        }
 230
 231        ep = kzalloc(sizeof(*ep) + dd_size, GFP_KERNEL);
 232        if (!ep)
 233                return NULL;
 234
 235        ep->id = id;
 236        ep->dev.class = &iscsi_endpoint_class;
 237        dev_set_name(&ep->dev, "ep-%llu", (unsigned long long) id);
 238        err = device_register(&ep->dev);
 239        if (err)
 240                goto free_ep;
 241
 242        err = sysfs_create_group(&ep->dev.kobj, &iscsi_endpoint_group);
 243        if (err)
 244                goto unregister_dev;
 245
 246        if (dd_size)
 247                ep->dd_data = &ep[1];
 248        return ep;
 249
 250unregister_dev:
 251        device_unregister(&ep->dev);
 252        return NULL;
 253
 254free_ep:
 255        kfree(ep);
 256        return NULL;
 257}
 258EXPORT_SYMBOL_GPL(iscsi_create_endpoint);
 259
 260void iscsi_destroy_endpoint(struct iscsi_endpoint *ep)
 261{
 262        sysfs_remove_group(&ep->dev.kobj, &iscsi_endpoint_group);
 263        device_unregister(&ep->dev);
 264}
 265EXPORT_SYMBOL_GPL(iscsi_destroy_endpoint);
 266
 267struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle)
 268{
 269        struct iscsi_endpoint *ep;
 270        struct device *dev;
 271
 272        dev = class_find_device(&iscsi_endpoint_class, NULL, &handle,
 273                                iscsi_match_epid);
 274        if (!dev)
 275                return NULL;
 276
 277        ep = iscsi_dev_to_endpoint(dev);
 278        /*
 279         * we can drop this now because the interface will prevent
 280         * removals and lookups from racing.
 281         */
 282        put_device(dev);
 283        return ep;
 284}
 285EXPORT_SYMBOL_GPL(iscsi_lookup_endpoint);
 286
 287/*
 288 * Interface to display network param to sysfs
 289 */
 290
 291static void iscsi_iface_release(struct device *dev)
 292{
 293        struct iscsi_iface *iface = iscsi_dev_to_iface(dev);
 294        struct device *parent = iface->dev.parent;
 295
 296        kfree(iface);
 297        put_device(parent);
 298}
 299
 300
 301static struct class iscsi_iface_class = {
 302        .name = "iscsi_iface",
 303        .dev_release = iscsi_iface_release,
 304};
 305
 306#define ISCSI_IFACE_ATTR(_prefix, _name, _mode, _show, _store)  \
 307struct device_attribute dev_attr_##_prefix##_##_name =          \
 308        __ATTR(_name, _mode, _show, _store)
 309
 310/* iface attrs show */
 311#define iscsi_iface_attr_show(type, name, param_type, param)            \
 312static ssize_t                                                          \
 313show_##type##_##name(struct device *dev, struct device_attribute *attr, \
 314                     char *buf)                                         \
 315{                                                                       \
 316        struct iscsi_iface *iface = iscsi_dev_to_iface(dev);            \
 317        struct iscsi_transport *t = iface->transport;                   \
 318        return t->get_iface_param(iface, param_type, param, buf);       \
 319}                                                                       \
 320
 321#define iscsi_iface_net_attr(type, name, param)                         \
 322        iscsi_iface_attr_show(type, name, ISCSI_NET_PARAM, param)       \
 323static ISCSI_IFACE_ATTR(type, name, S_IRUGO, show_##type##_##name, NULL);
 324
 325#define iscsi_iface_attr(type, name, param)                             \
 326        iscsi_iface_attr_show(type, name, ISCSI_IFACE_PARAM, param)     \
 327static ISCSI_IFACE_ATTR(type, name, S_IRUGO, show_##type##_##name, NULL);
 328
 329/* generic read only ipv4 attribute */
 330iscsi_iface_net_attr(ipv4_iface, ipaddress, ISCSI_NET_PARAM_IPV4_ADDR);
 331iscsi_iface_net_attr(ipv4_iface, gateway, ISCSI_NET_PARAM_IPV4_GW);
 332iscsi_iface_net_attr(ipv4_iface, subnet, ISCSI_NET_PARAM_IPV4_SUBNET);
 333iscsi_iface_net_attr(ipv4_iface, bootproto, ISCSI_NET_PARAM_IPV4_BOOTPROTO);
 334iscsi_iface_net_attr(ipv4_iface, dhcp_dns_address_en,
 335                     ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN);
 336iscsi_iface_net_attr(ipv4_iface, dhcp_slp_da_info_en,
 337                     ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN);
 338iscsi_iface_net_attr(ipv4_iface, tos_en, ISCSI_NET_PARAM_IPV4_TOS_EN);
 339iscsi_iface_net_attr(ipv4_iface, tos, ISCSI_NET_PARAM_IPV4_TOS);
 340iscsi_iface_net_attr(ipv4_iface, grat_arp_en,
 341                     ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN);
 342iscsi_iface_net_attr(ipv4_iface, dhcp_alt_client_id_en,
 343                     ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN);
 344iscsi_iface_net_attr(ipv4_iface, dhcp_alt_client_id,
 345                     ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID);
 346iscsi_iface_net_attr(ipv4_iface, dhcp_req_vendor_id_en,
 347                     ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN);
 348iscsi_iface_net_attr(ipv4_iface, dhcp_use_vendor_id_en,
 349                     ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN);
 350iscsi_iface_net_attr(ipv4_iface, dhcp_vendor_id,
 351                     ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID);
 352iscsi_iface_net_attr(ipv4_iface, dhcp_learn_iqn_en,
 353                     ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN);
 354iscsi_iface_net_attr(ipv4_iface, fragment_disable,
 355                     ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE);
 356iscsi_iface_net_attr(ipv4_iface, incoming_forwarding_en,
 357                     ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN);
 358iscsi_iface_net_attr(ipv4_iface, ttl, ISCSI_NET_PARAM_IPV4_TTL);
 359
 360/* generic read only ipv6 attribute */
 361iscsi_iface_net_attr(ipv6_iface, ipaddress, ISCSI_NET_PARAM_IPV6_ADDR);
 362iscsi_iface_net_attr(ipv6_iface, link_local_addr,
 363                     ISCSI_NET_PARAM_IPV6_LINKLOCAL);
 364iscsi_iface_net_attr(ipv6_iface, router_addr, ISCSI_NET_PARAM_IPV6_ROUTER);
 365iscsi_iface_net_attr(ipv6_iface, ipaddr_autocfg,
 366                     ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG);
 367iscsi_iface_net_attr(ipv6_iface, link_local_autocfg,
 368                     ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG);
 369iscsi_iface_net_attr(ipv6_iface, link_local_state,
 370                     ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE);
 371iscsi_iface_net_attr(ipv6_iface, router_state,
 372                     ISCSI_NET_PARAM_IPV6_ROUTER_STATE);
 373iscsi_iface_net_attr(ipv6_iface, grat_neighbor_adv_en,
 374                     ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN);
 375iscsi_iface_net_attr(ipv6_iface, mld_en, ISCSI_NET_PARAM_IPV6_MLD_EN);
 376iscsi_iface_net_attr(ipv6_iface, flow_label, ISCSI_NET_PARAM_IPV6_FLOW_LABEL);
 377iscsi_iface_net_attr(ipv6_iface, traffic_class,
 378                     ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS);
 379iscsi_iface_net_attr(ipv6_iface, hop_limit, ISCSI_NET_PARAM_IPV6_HOP_LIMIT);
 380iscsi_iface_net_attr(ipv6_iface, nd_reachable_tmo,
 381                     ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO);
 382iscsi_iface_net_attr(ipv6_iface, nd_rexmit_time,
 383                     ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME);
 384iscsi_iface_net_attr(ipv6_iface, nd_stale_tmo,
 385                     ISCSI_NET_PARAM_IPV6_ND_STALE_TMO);
 386iscsi_iface_net_attr(ipv6_iface, dup_addr_detect_cnt,
 387                     ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT);
 388iscsi_iface_net_attr(ipv6_iface, router_adv_link_mtu,
 389                     ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU);
 390
 391/* common read only iface attribute */
 392iscsi_iface_net_attr(iface, enabled, ISCSI_NET_PARAM_IFACE_ENABLE);
 393iscsi_iface_net_attr(iface, vlan_id, ISCSI_NET_PARAM_VLAN_ID);
 394iscsi_iface_net_attr(iface, vlan_priority, ISCSI_NET_PARAM_VLAN_PRIORITY);
 395iscsi_iface_net_attr(iface, vlan_enabled, ISCSI_NET_PARAM_VLAN_ENABLED);
 396iscsi_iface_net_attr(iface, mtu, ISCSI_NET_PARAM_MTU);
 397iscsi_iface_net_attr(iface, port, ISCSI_NET_PARAM_PORT);
 398iscsi_iface_net_attr(iface, ipaddress_state, ISCSI_NET_PARAM_IPADDR_STATE);
 399iscsi_iface_net_attr(iface, delayed_ack_en, ISCSI_NET_PARAM_DELAYED_ACK_EN);
 400iscsi_iface_net_attr(iface, tcp_nagle_disable,
 401                     ISCSI_NET_PARAM_TCP_NAGLE_DISABLE);
 402iscsi_iface_net_attr(iface, tcp_wsf_disable, ISCSI_NET_PARAM_TCP_WSF_DISABLE);
 403iscsi_iface_net_attr(iface, tcp_wsf, ISCSI_NET_PARAM_TCP_WSF);
 404iscsi_iface_net_attr(iface, tcp_timer_scale, ISCSI_NET_PARAM_TCP_TIMER_SCALE);
 405iscsi_iface_net_attr(iface, tcp_timestamp_en, ISCSI_NET_PARAM_TCP_TIMESTAMP_EN);
 406iscsi_iface_net_attr(iface, cache_id, ISCSI_NET_PARAM_CACHE_ID);
 407iscsi_iface_net_attr(iface, redirect_en, ISCSI_NET_PARAM_REDIRECT_EN);
 408
 409/* common iscsi specific settings attributes */
 410iscsi_iface_attr(iface, def_taskmgmt_tmo, ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO);
 411iscsi_iface_attr(iface, header_digest, ISCSI_IFACE_PARAM_HDRDGST_EN);
 412iscsi_iface_attr(iface, data_digest, ISCSI_IFACE_PARAM_DATADGST_EN);
 413iscsi_iface_attr(iface, immediate_data, ISCSI_IFACE_PARAM_IMM_DATA_EN);
 414iscsi_iface_attr(iface, initial_r2t, ISCSI_IFACE_PARAM_INITIAL_R2T_EN);
 415iscsi_iface_attr(iface, data_seq_in_order,
 416                 ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN);
 417iscsi_iface_attr(iface, data_pdu_in_order, ISCSI_IFACE_PARAM_PDU_INORDER_EN);
 418iscsi_iface_attr(iface, erl, ISCSI_IFACE_PARAM_ERL);
 419iscsi_iface_attr(iface, max_recv_dlength, ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH);
 420iscsi_iface_attr(iface, first_burst_len, ISCSI_IFACE_PARAM_FIRST_BURST);
 421iscsi_iface_attr(iface, max_outstanding_r2t, ISCSI_IFACE_PARAM_MAX_R2T);
 422iscsi_iface_attr(iface, max_burst_len, ISCSI_IFACE_PARAM_MAX_BURST);
 423iscsi_iface_attr(iface, chap_auth, ISCSI_IFACE_PARAM_CHAP_AUTH_EN);
 424iscsi_iface_attr(iface, bidi_chap, ISCSI_IFACE_PARAM_BIDI_CHAP_EN);
 425iscsi_iface_attr(iface, discovery_auth_optional,
 426                 ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL);
 427iscsi_iface_attr(iface, discovery_logout,
 428                 ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN);
 429iscsi_iface_attr(iface, strict_login_comp_en,
 430                 ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN);
 431iscsi_iface_attr(iface, initiator_name, ISCSI_IFACE_PARAM_INITIATOR_NAME);
 432
 433static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
 434                                          struct attribute *attr, int i)
 435{
 436        struct device *dev = container_of(kobj, struct device, kobj);
 437        struct iscsi_iface *iface = iscsi_dev_to_iface(dev);
 438        struct iscsi_transport *t = iface->transport;
 439        int param;
 440        int param_type;
 441
 442        if (attr == &dev_attr_iface_enabled.attr)
 443                param = ISCSI_NET_PARAM_IFACE_ENABLE;
 444        else if (attr == &dev_attr_iface_vlan_id.attr)
 445                param = ISCSI_NET_PARAM_VLAN_ID;
 446        else if (attr == &dev_attr_iface_vlan_priority.attr)
 447                param = ISCSI_NET_PARAM_VLAN_PRIORITY;
 448        else if (attr == &dev_attr_iface_vlan_enabled.attr)
 449                param = ISCSI_NET_PARAM_VLAN_ENABLED;
 450        else if (attr == &dev_attr_iface_mtu.attr)
 451                param = ISCSI_NET_PARAM_MTU;
 452        else if (attr == &dev_attr_iface_port.attr)
 453                param = ISCSI_NET_PARAM_PORT;
 454        else if (attr == &dev_attr_iface_ipaddress_state.attr)
 455                param = ISCSI_NET_PARAM_IPADDR_STATE;
 456        else if (attr == &dev_attr_iface_delayed_ack_en.attr)
 457                param = ISCSI_NET_PARAM_DELAYED_ACK_EN;
 458        else if (attr == &dev_attr_iface_tcp_nagle_disable.attr)
 459                param = ISCSI_NET_PARAM_TCP_NAGLE_DISABLE;
 460        else if (attr == &dev_attr_iface_tcp_wsf_disable.attr)
 461                param = ISCSI_NET_PARAM_TCP_WSF_DISABLE;
 462        else if (attr == &dev_attr_iface_tcp_wsf.attr)
 463                param = ISCSI_NET_PARAM_TCP_WSF;
 464        else if (attr == &dev_attr_iface_tcp_timer_scale.attr)
 465                param = ISCSI_NET_PARAM_TCP_TIMER_SCALE;
 466        else if (attr == &dev_attr_iface_tcp_timestamp_en.attr)
 467                param = ISCSI_NET_PARAM_TCP_TIMESTAMP_EN;
 468        else if (attr == &dev_attr_iface_cache_id.attr)
 469                param = ISCSI_NET_PARAM_CACHE_ID;
 470        else if (attr == &dev_attr_iface_redirect_en.attr)
 471                param = ISCSI_NET_PARAM_REDIRECT_EN;
 472        else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr)
 473                param = ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO;
 474        else if (attr == &dev_attr_iface_header_digest.attr)
 475                param = ISCSI_IFACE_PARAM_HDRDGST_EN;
 476        else if (attr == &dev_attr_iface_data_digest.attr)
 477                param = ISCSI_IFACE_PARAM_DATADGST_EN;
 478        else if (attr == &dev_attr_iface_immediate_data.attr)
 479                param = ISCSI_IFACE_PARAM_IMM_DATA_EN;
 480        else if (attr == &dev_attr_iface_initial_r2t.attr)
 481                param = ISCSI_IFACE_PARAM_INITIAL_R2T_EN;
 482        else if (attr == &dev_attr_iface_data_seq_in_order.attr)
 483                param = ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN;
 484        else if (attr == &dev_attr_iface_data_pdu_in_order.attr)
 485                param = ISCSI_IFACE_PARAM_PDU_INORDER_EN;
 486        else if (attr == &dev_attr_iface_erl.attr)
 487                param = ISCSI_IFACE_PARAM_ERL;
 488        else if (attr == &dev_attr_iface_max_recv_dlength.attr)
 489                param = ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH;
 490        else if (attr == &dev_attr_iface_first_burst_len.attr)
 491                param = ISCSI_IFACE_PARAM_FIRST_BURST;
 492        else if (attr == &dev_attr_iface_max_outstanding_r2t.attr)
 493                param = ISCSI_IFACE_PARAM_MAX_R2T;
 494        else if (attr == &dev_attr_iface_max_burst_len.attr)
 495                param = ISCSI_IFACE_PARAM_MAX_BURST;
 496        else if (attr == &dev_attr_iface_chap_auth.attr)
 497                param = ISCSI_IFACE_PARAM_CHAP_AUTH_EN;
 498        else if (attr == &dev_attr_iface_bidi_chap.attr)
 499                param = ISCSI_IFACE_PARAM_BIDI_CHAP_EN;
 500        else if (attr == &dev_attr_iface_discovery_auth_optional.attr)
 501                param = ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL;
 502        else if (attr == &dev_attr_iface_discovery_logout.attr)
 503                param = ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN;
 504        else if (attr == &dev_attr_iface_strict_login_comp_en.attr)
 505                param = ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN;
 506        else if (attr == &dev_attr_iface_initiator_name.attr)
 507                param = ISCSI_IFACE_PARAM_INITIATOR_NAME;
 508        else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
 509                if (attr == &dev_attr_ipv4_iface_ipaddress.attr)
 510                        param = ISCSI_NET_PARAM_IPV4_ADDR;
 511                else if (attr == &dev_attr_ipv4_iface_gateway.attr)
 512                        param = ISCSI_NET_PARAM_IPV4_GW;
 513                else if (attr == &dev_attr_ipv4_iface_subnet.attr)
 514                        param = ISCSI_NET_PARAM_IPV4_SUBNET;
 515                else if (attr == &dev_attr_ipv4_iface_bootproto.attr)
 516                        param = ISCSI_NET_PARAM_IPV4_BOOTPROTO;
 517                else if (attr ==
 518                         &dev_attr_ipv4_iface_dhcp_dns_address_en.attr)
 519                        param = ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN;
 520                else if (attr ==
 521                         &dev_attr_ipv4_iface_dhcp_slp_da_info_en.attr)
 522                        param = ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN;
 523                else if (attr == &dev_attr_ipv4_iface_tos_en.attr)
 524                        param = ISCSI_NET_PARAM_IPV4_TOS_EN;
 525                else if (attr == &dev_attr_ipv4_iface_tos.attr)
 526                        param = ISCSI_NET_PARAM_IPV4_TOS;
 527                else if (attr == &dev_attr_ipv4_iface_grat_arp_en.attr)
 528                        param = ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN;
 529                else if (attr ==
 530                         &dev_attr_ipv4_iface_dhcp_alt_client_id_en.attr)
 531                        param = ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN;
 532                else if (attr == &dev_attr_ipv4_iface_dhcp_alt_client_id.attr)
 533                        param = ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID;
 534                else if (attr ==
 535                         &dev_attr_ipv4_iface_dhcp_req_vendor_id_en.attr)
 536                        param = ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN;
 537                else if (attr ==
 538                         &dev_attr_ipv4_iface_dhcp_use_vendor_id_en.attr)
 539                        param = ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN;
 540                else if (attr == &dev_attr_ipv4_iface_dhcp_vendor_id.attr)
 541                        param = ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID;
 542                else if (attr ==
 543                         &dev_attr_ipv4_iface_dhcp_learn_iqn_en.attr)
 544                        param = ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN;
 545                else if (attr ==
 546                         &dev_attr_ipv4_iface_fragment_disable.attr)
 547                        param = ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE;
 548                else if (attr ==
 549                         &dev_attr_ipv4_iface_incoming_forwarding_en.attr)
 550                        param = ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN;
 551                else if (attr == &dev_attr_ipv4_iface_ttl.attr)
 552                        param = ISCSI_NET_PARAM_IPV4_TTL;
 553                else
 554                        return 0;
 555        } else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV6) {
 556                if (attr == &dev_attr_ipv6_iface_ipaddress.attr)
 557                        param = ISCSI_NET_PARAM_IPV6_ADDR;
 558                else if (attr == &dev_attr_ipv6_iface_link_local_addr.attr)
 559                        param = ISCSI_NET_PARAM_IPV6_LINKLOCAL;
 560                else if (attr == &dev_attr_ipv6_iface_router_addr.attr)
 561                        param = ISCSI_NET_PARAM_IPV6_ROUTER;
 562                else if (attr == &dev_attr_ipv6_iface_ipaddr_autocfg.attr)
 563                        param = ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG;
 564                else if (attr == &dev_attr_ipv6_iface_link_local_autocfg.attr)
 565                        param = ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG;
 566                else if (attr == &dev_attr_ipv6_iface_link_local_state.attr)
 567                        param = ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE;
 568                else if (attr == &dev_attr_ipv6_iface_router_state.attr)
 569                        param = ISCSI_NET_PARAM_IPV6_ROUTER_STATE;
 570                else if (attr ==
 571                         &dev_attr_ipv6_iface_grat_neighbor_adv_en.attr)
 572                        param = ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN;
 573                else if (attr == &dev_attr_ipv6_iface_mld_en.attr)
 574                        param = ISCSI_NET_PARAM_IPV6_MLD_EN;
 575                else if (attr == &dev_attr_ipv6_iface_flow_label.attr)
 576                        param = ISCSI_NET_PARAM_IPV6_FLOW_LABEL;
 577                else if (attr == &dev_attr_ipv6_iface_traffic_class.attr)
 578                        param = ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS;
 579                else if (attr == &dev_attr_ipv6_iface_hop_limit.attr)
 580                        param = ISCSI_NET_PARAM_IPV6_HOP_LIMIT;
 581                else if (attr == &dev_attr_ipv6_iface_nd_reachable_tmo.attr)
 582                        param = ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO;
 583                else if (attr == &dev_attr_ipv6_iface_nd_rexmit_time.attr)
 584                        param = ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME;
 585                else if (attr == &dev_attr_ipv6_iface_nd_stale_tmo.attr)
 586                        param = ISCSI_NET_PARAM_IPV6_ND_STALE_TMO;
 587                else if (attr == &dev_attr_ipv6_iface_dup_addr_detect_cnt.attr)
 588                        param = ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT;
 589                else if (attr == &dev_attr_ipv6_iface_router_adv_link_mtu.attr)
 590                        param = ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU;
 591                else
 592                        return 0;
 593        } else {
 594                WARN_ONCE(1, "Invalid iface attr");
 595                return 0;
 596        }
 597
 598        switch (param) {
 599        case ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO:
 600        case ISCSI_IFACE_PARAM_HDRDGST_EN:
 601        case ISCSI_IFACE_PARAM_DATADGST_EN:
 602        case ISCSI_IFACE_PARAM_IMM_DATA_EN:
 603        case ISCSI_IFACE_PARAM_INITIAL_R2T_EN:
 604        case ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN:
 605        case ISCSI_IFACE_PARAM_PDU_INORDER_EN:
 606        case ISCSI_IFACE_PARAM_ERL:
 607        case ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH:
 608        case ISCSI_IFACE_PARAM_FIRST_BURST:
 609        case ISCSI_IFACE_PARAM_MAX_R2T:
 610        case ISCSI_IFACE_PARAM_MAX_BURST:
 611        case ISCSI_IFACE_PARAM_CHAP_AUTH_EN:
 612        case ISCSI_IFACE_PARAM_BIDI_CHAP_EN:
 613        case ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL:
 614        case ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN:
 615        case ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN:
 616        case ISCSI_IFACE_PARAM_INITIATOR_NAME:
 617                param_type = ISCSI_IFACE_PARAM;
 618                break;
 619        default:
 620                param_type = ISCSI_NET_PARAM;
 621        }
 622
 623        return t->attr_is_visible(param_type, param);
 624}
 625
 626static struct attribute *iscsi_iface_attrs[] = {
 627        &dev_attr_iface_enabled.attr,
 628        &dev_attr_iface_vlan_id.attr,
 629        &dev_attr_iface_vlan_priority.attr,
 630        &dev_attr_iface_vlan_enabled.attr,
 631        &dev_attr_ipv4_iface_ipaddress.attr,
 632        &dev_attr_ipv4_iface_gateway.attr,
 633        &dev_attr_ipv4_iface_subnet.attr,
 634        &dev_attr_ipv4_iface_bootproto.attr,
 635        &dev_attr_ipv6_iface_ipaddress.attr,
 636        &dev_attr_ipv6_iface_link_local_addr.attr,
 637        &dev_attr_ipv6_iface_router_addr.attr,
 638        &dev_attr_ipv6_iface_ipaddr_autocfg.attr,
 639        &dev_attr_ipv6_iface_link_local_autocfg.attr,
 640        &dev_attr_iface_mtu.attr,
 641        &dev_attr_iface_port.attr,
 642        &dev_attr_iface_ipaddress_state.attr,
 643        &dev_attr_iface_delayed_ack_en.attr,
 644        &dev_attr_iface_tcp_nagle_disable.attr,
 645        &dev_attr_iface_tcp_wsf_disable.attr,
 646        &dev_attr_iface_tcp_wsf.attr,
 647        &dev_attr_iface_tcp_timer_scale.attr,
 648        &dev_attr_iface_tcp_timestamp_en.attr,
 649        &dev_attr_iface_cache_id.attr,
 650        &dev_attr_iface_redirect_en.attr,
 651        &dev_attr_iface_def_taskmgmt_tmo.attr,
 652        &dev_attr_iface_header_digest.attr,
 653        &dev_attr_iface_data_digest.attr,
 654        &dev_attr_iface_immediate_data.attr,
 655        &dev_attr_iface_initial_r2t.attr,
 656        &dev_attr_iface_data_seq_in_order.attr,
 657        &dev_attr_iface_data_pdu_in_order.attr,
 658        &dev_attr_iface_erl.attr,
 659        &dev_attr_iface_max_recv_dlength.attr,
 660        &dev_attr_iface_first_burst_len.attr,
 661        &dev_attr_iface_max_outstanding_r2t.attr,
 662        &dev_attr_iface_max_burst_len.attr,
 663        &dev_attr_iface_chap_auth.attr,
 664        &dev_attr_iface_bidi_chap.attr,
 665        &dev_attr_iface_discovery_auth_optional.attr,
 666        &dev_attr_iface_discovery_logout.attr,
 667        &dev_attr_iface_strict_login_comp_en.attr,
 668        &dev_attr_iface_initiator_name.attr,
 669        &dev_attr_ipv4_iface_dhcp_dns_address_en.attr,
 670        &dev_attr_ipv4_iface_dhcp_slp_da_info_en.attr,
 671        &dev_attr_ipv4_iface_tos_en.attr,
 672        &dev_attr_ipv4_iface_tos.attr,
 673        &dev_attr_ipv4_iface_grat_arp_en.attr,
 674        &dev_attr_ipv4_iface_dhcp_alt_client_id_en.attr,
 675        &dev_attr_ipv4_iface_dhcp_alt_client_id.attr,
 676        &dev_attr_ipv4_iface_dhcp_req_vendor_id_en.attr,
 677        &dev_attr_ipv4_iface_dhcp_use_vendor_id_en.attr,
 678        &dev_attr_ipv4_iface_dhcp_vendor_id.attr,
 679        &dev_attr_ipv4_iface_dhcp_learn_iqn_en.attr,
 680        &dev_attr_ipv4_iface_fragment_disable.attr,
 681        &dev_attr_ipv4_iface_incoming_forwarding_en.attr,
 682        &dev_attr_ipv4_iface_ttl.attr,
 683        &dev_attr_ipv6_iface_link_local_state.attr,
 684        &dev_attr_ipv6_iface_router_state.attr,
 685        &dev_attr_ipv6_iface_grat_neighbor_adv_en.attr,
 686        &dev_attr_ipv6_iface_mld_en.attr,
 687        &dev_attr_ipv6_iface_flow_label.attr,
 688        &dev_attr_ipv6_iface_traffic_class.attr,
 689        &dev_attr_ipv6_iface_hop_limit.attr,
 690        &dev_attr_ipv6_iface_nd_reachable_tmo.attr,
 691        &dev_attr_ipv6_iface_nd_rexmit_time.attr,
 692        &dev_attr_ipv6_iface_nd_stale_tmo.attr,
 693        &dev_attr_ipv6_iface_dup_addr_detect_cnt.attr,
 694        &dev_attr_ipv6_iface_router_adv_link_mtu.attr,
 695        NULL,
 696};
 697
 698static struct attribute_group iscsi_iface_group = {
 699        .attrs = iscsi_iface_attrs,
 700        .is_visible = iscsi_iface_attr_is_visible,
 701};
 702
 703/* convert iscsi_ipaddress_state values to ascii string name */
 704static const struct {
 705        enum iscsi_ipaddress_state      value;
 706        char                            *name;
 707} iscsi_ipaddress_state_names[] = {
 708        {ISCSI_IPDDRESS_STATE_UNCONFIGURED,     "Unconfigured" },
 709        {ISCSI_IPDDRESS_STATE_ACQUIRING,        "Acquiring" },
 710        {ISCSI_IPDDRESS_STATE_TENTATIVE,        "Tentative" },
 711        {ISCSI_IPDDRESS_STATE_VALID,            "Valid" },
 712        {ISCSI_IPDDRESS_STATE_DISABLING,        "Disabling" },
 713        {ISCSI_IPDDRESS_STATE_INVALID,          "Invalid" },
 714        {ISCSI_IPDDRESS_STATE_DEPRECATED,       "Deprecated" },
 715};
 716
 717char *iscsi_get_ipaddress_state_name(enum iscsi_ipaddress_state port_state)
 718{
 719        int i;
 720        char *state = NULL;
 721
 722        for (i = 0; i < ARRAY_SIZE(iscsi_ipaddress_state_names); i++) {
 723                if (iscsi_ipaddress_state_names[i].value == port_state) {
 724                        state = iscsi_ipaddress_state_names[i].name;
 725                        break;
 726                }
 727        }
 728        return state;
 729}
 730EXPORT_SYMBOL_GPL(iscsi_get_ipaddress_state_name);
 731
 732/* convert iscsi_router_state values to ascii string name */
 733static const struct {
 734        enum iscsi_router_state value;
 735        char                    *name;
 736} iscsi_router_state_names[] = {
 737        {ISCSI_ROUTER_STATE_UNKNOWN,            "Unknown" },
 738        {ISCSI_ROUTER_STATE_ADVERTISED,         "Advertised" },
 739        {ISCSI_ROUTER_STATE_MANUAL,             "Manual" },
 740        {ISCSI_ROUTER_STATE_STALE,              "Stale" },
 741};
 742
 743char *iscsi_get_router_state_name(enum iscsi_router_state router_state)
 744{
 745        int i;
 746        char *state = NULL;
 747
 748        for (i = 0; i < ARRAY_SIZE(iscsi_router_state_names); i++) {
 749                if (iscsi_router_state_names[i].value == router_state) {
 750                        state = iscsi_router_state_names[i].name;
 751                        break;
 752                }
 753        }
 754        return state;
 755}
 756EXPORT_SYMBOL_GPL(iscsi_get_router_state_name);
 757
 758struct iscsi_iface *
 759iscsi_create_iface(struct Scsi_Host *shost, struct iscsi_transport *transport,
 760                   uint32_t iface_type, uint32_t iface_num, int dd_size)
 761{
 762        struct iscsi_iface *iface;
 763        int err;
 764
 765        iface = kzalloc(sizeof(*iface) + dd_size, GFP_KERNEL);
 766        if (!iface)
 767                return NULL;
 768
 769        iface->transport = transport;
 770        iface->iface_type = iface_type;
 771        iface->iface_num = iface_num;
 772        iface->dev.release = iscsi_iface_release;
 773        iface->dev.class = &iscsi_iface_class;
 774        /* parent reference released in iscsi_iface_release */
 775        iface->dev.parent = get_device(&shost->shost_gendev);
 776        if (iface_type == ISCSI_IFACE_TYPE_IPV4)
 777                dev_set_name(&iface->dev, "ipv4-iface-%u-%u", shost->host_no,
 778                             iface_num);
 779        else
 780                dev_set_name(&iface->dev, "ipv6-iface-%u-%u", shost->host_no,
 781                             iface_num);
 782
 783        err = device_register(&iface->dev);
 784        if (err)
 785                goto free_iface;
 786
 787        err = sysfs_create_group(&iface->dev.kobj, &iscsi_iface_group);
 788        if (err)
 789                goto unreg_iface;
 790
 791        if (dd_size)
 792                iface->dd_data = &iface[1];
 793        return iface;
 794
 795unreg_iface:
 796        device_unregister(&iface->dev);
 797        return NULL;
 798
 799free_iface:
 800        put_device(iface->dev.parent);
 801        kfree(iface);
 802        return NULL;
 803}
 804EXPORT_SYMBOL_GPL(iscsi_create_iface);
 805
 806void iscsi_destroy_iface(struct iscsi_iface *iface)
 807{
 808        sysfs_remove_group(&iface->dev.kobj, &iscsi_iface_group);
 809        device_unregister(&iface->dev);
 810}
 811EXPORT_SYMBOL_GPL(iscsi_destroy_iface);
 812
 813/*
 814 * Interface to display flash node params to sysfs
 815 */
 816
 817#define ISCSI_FLASHNODE_ATTR(_prefix, _name, _mode, _show, _store)      \
 818struct device_attribute dev_attr_##_prefix##_##_name =                  \
 819        __ATTR(_name, _mode, _show, _store)
 820
 821/* flash node session attrs show */
 822#define iscsi_flashnode_sess_attr_show(type, name, param)               \
 823static ssize_t                                                          \
 824show_##type##_##name(struct device *dev, struct device_attribute *attr, \
 825                     char *buf)                                         \
 826{                                                                       \
 827        struct iscsi_bus_flash_session *fnode_sess =                    \
 828                                        iscsi_dev_to_flash_session(dev);\
 829        struct iscsi_transport *t = fnode_sess->transport;              \
 830        return t->get_flashnode_param(fnode_sess, param, buf);          \
 831}                                                                       \
 832
 833
 834#define iscsi_flashnode_sess_attr(type, name, param)                    \
 835        iscsi_flashnode_sess_attr_show(type, name, param)               \
 836static ISCSI_FLASHNODE_ATTR(type, name, S_IRUGO,                        \
 837                            show_##type##_##name, NULL);
 838
 839/* Flash node session attributes */
 840
 841iscsi_flashnode_sess_attr(fnode, auto_snd_tgt_disable,
 842                          ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE);
 843iscsi_flashnode_sess_attr(fnode, discovery_session,
 844                          ISCSI_FLASHNODE_DISCOVERY_SESS);
 845iscsi_flashnode_sess_attr(fnode, portal_type, ISCSI_FLASHNODE_PORTAL_TYPE);
 846iscsi_flashnode_sess_attr(fnode, entry_enable, ISCSI_FLASHNODE_ENTRY_EN);
 847iscsi_flashnode_sess_attr(fnode, immediate_data, ISCSI_FLASHNODE_IMM_DATA_EN);
 848iscsi_flashnode_sess_attr(fnode, initial_r2t, ISCSI_FLASHNODE_INITIAL_R2T_EN);
 849iscsi_flashnode_sess_attr(fnode, data_seq_in_order,
 850                          ISCSI_FLASHNODE_DATASEQ_INORDER);
 851iscsi_flashnode_sess_attr(fnode, data_pdu_in_order,
 852                          ISCSI_FLASHNODE_PDU_INORDER);
 853iscsi_flashnode_sess_attr(fnode, chap_auth, ISCSI_FLASHNODE_CHAP_AUTH_EN);
 854iscsi_flashnode_sess_attr(fnode, discovery_logout,
 855                          ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN);
 856iscsi_flashnode_sess_attr(fnode, bidi_chap, ISCSI_FLASHNODE_BIDI_CHAP_EN);
 857iscsi_flashnode_sess_attr(fnode, discovery_auth_optional,
 858                          ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL);
 859iscsi_flashnode_sess_attr(fnode, erl, ISCSI_FLASHNODE_ERL);
 860iscsi_flashnode_sess_attr(fnode, first_burst_len, ISCSI_FLASHNODE_FIRST_BURST);
 861iscsi_flashnode_sess_attr(fnode, def_time2wait, ISCSI_FLASHNODE_DEF_TIME2WAIT);
 862iscsi_flashnode_sess_attr(fnode, def_time2retain,
 863                          ISCSI_FLASHNODE_DEF_TIME2RETAIN);
 864iscsi_flashnode_sess_attr(fnode, max_outstanding_r2t, ISCSI_FLASHNODE_MAX_R2T);
 865iscsi_flashnode_sess_attr(fnode, isid, ISCSI_FLASHNODE_ISID);
 866iscsi_flashnode_sess_attr(fnode, tsid, ISCSI_FLASHNODE_TSID);
 867iscsi_flashnode_sess_attr(fnode, max_burst_len, ISCSI_FLASHNODE_MAX_BURST);
 868iscsi_flashnode_sess_attr(fnode, def_taskmgmt_tmo,
 869                          ISCSI_FLASHNODE_DEF_TASKMGMT_TMO);
 870iscsi_flashnode_sess_attr(fnode, targetalias, ISCSI_FLASHNODE_ALIAS);
 871iscsi_flashnode_sess_attr(fnode, targetname, ISCSI_FLASHNODE_NAME);
 872iscsi_flashnode_sess_attr(fnode, tpgt, ISCSI_FLASHNODE_TPGT);
 873iscsi_flashnode_sess_attr(fnode, discovery_parent_idx,
 874                          ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX);
 875iscsi_flashnode_sess_attr(fnode, discovery_parent_type,
 876                          ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE);
 877iscsi_flashnode_sess_attr(fnode, chap_in_idx, ISCSI_FLASHNODE_CHAP_IN_IDX);
 878iscsi_flashnode_sess_attr(fnode, chap_out_idx, ISCSI_FLASHNODE_CHAP_OUT_IDX);
 879iscsi_flashnode_sess_attr(fnode, username, ISCSI_FLASHNODE_USERNAME);
 880iscsi_flashnode_sess_attr(fnode, username_in, ISCSI_FLASHNODE_USERNAME_IN);
 881iscsi_flashnode_sess_attr(fnode, password, ISCSI_FLASHNODE_PASSWORD);
 882iscsi_flashnode_sess_attr(fnode, password_in, ISCSI_FLASHNODE_PASSWORD_IN);
 883iscsi_flashnode_sess_attr(fnode, is_boot_target, ISCSI_FLASHNODE_IS_BOOT_TGT);
 884
 885static struct attribute *iscsi_flashnode_sess_attrs[] = {
 886        &dev_attr_fnode_auto_snd_tgt_disable.attr,
 887        &dev_attr_fnode_discovery_session.attr,
 888        &dev_attr_fnode_portal_type.attr,
 889        &dev_attr_fnode_entry_enable.attr,
 890        &dev_attr_fnode_immediate_data.attr,
 891        &dev_attr_fnode_initial_r2t.attr,
 892        &dev_attr_fnode_data_seq_in_order.attr,
 893        &dev_attr_fnode_data_pdu_in_order.attr,
 894        &dev_attr_fnode_chap_auth.attr,
 895        &dev_attr_fnode_discovery_logout.attr,
 896        &dev_attr_fnode_bidi_chap.attr,
 897        &dev_attr_fnode_discovery_auth_optional.attr,
 898        &dev_attr_fnode_erl.attr,
 899        &dev_attr_fnode_first_burst_len.attr,
 900        &dev_attr_fnode_def_time2wait.attr,
 901        &dev_attr_fnode_def_time2retain.attr,
 902        &dev_attr_fnode_max_outstanding_r2t.attr,
 903        &dev_attr_fnode_isid.attr,
 904        &dev_attr_fnode_tsid.attr,
 905        &dev_attr_fnode_max_burst_len.attr,
 906        &dev_attr_fnode_def_taskmgmt_tmo.attr,
 907        &dev_attr_fnode_targetalias.attr,
 908        &dev_attr_fnode_targetname.attr,
 909        &dev_attr_fnode_tpgt.attr,
 910        &dev_attr_fnode_discovery_parent_idx.attr,
 911        &dev_attr_fnode_discovery_parent_type.attr,
 912        &dev_attr_fnode_chap_in_idx.attr,
 913        &dev_attr_fnode_chap_out_idx.attr,
 914        &dev_attr_fnode_username.attr,
 915        &dev_attr_fnode_username_in.attr,
 916        &dev_attr_fnode_password.attr,
 917        &dev_attr_fnode_password_in.attr,
 918        &dev_attr_fnode_is_boot_target.attr,
 919        NULL,
 920};
 921
 922static umode_t iscsi_flashnode_sess_attr_is_visible(struct kobject *kobj,
 923                                                    struct attribute *attr,
 924                                                    int i)
 925{
 926        struct device *dev = container_of(kobj, struct device, kobj);
 927        struct iscsi_bus_flash_session *fnode_sess =
 928                                                iscsi_dev_to_flash_session(dev);
 929        struct iscsi_transport *t = fnode_sess->transport;
 930        int param;
 931
 932        if (attr == &dev_attr_fnode_auto_snd_tgt_disable.attr) {
 933                param = ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE;
 934        } else if (attr == &dev_attr_fnode_discovery_session.attr) {
 935                param = ISCSI_FLASHNODE_DISCOVERY_SESS;
 936        } else if (attr == &dev_attr_fnode_portal_type.attr) {
 937                param = ISCSI_FLASHNODE_PORTAL_TYPE;
 938        } else if (attr == &dev_attr_fnode_entry_enable.attr) {
 939                param = ISCSI_FLASHNODE_ENTRY_EN;
 940        } else if (attr == &dev_attr_fnode_immediate_data.attr) {
 941                param = ISCSI_FLASHNODE_IMM_DATA_EN;
 942        } else if (attr == &dev_attr_fnode_initial_r2t.attr) {
 943                param = ISCSI_FLASHNODE_INITIAL_R2T_EN;
 944        } else if (attr == &dev_attr_fnode_data_seq_in_order.attr) {
 945                param = ISCSI_FLASHNODE_DATASEQ_INORDER;
 946        } else if (attr == &dev_attr_fnode_data_pdu_in_order.attr) {
 947                param = ISCSI_FLASHNODE_PDU_INORDER;
 948        } else if (attr == &dev_attr_fnode_chap_auth.attr) {
 949                param = ISCSI_FLASHNODE_CHAP_AUTH_EN;
 950        } else if (attr == &dev_attr_fnode_discovery_logout.attr) {
 951                param = ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN;
 952        } else if (attr == &dev_attr_fnode_bidi_chap.attr) {
 953                param = ISCSI_FLASHNODE_BIDI_CHAP_EN;
 954        } else if (attr == &dev_attr_fnode_discovery_auth_optional.attr) {
 955                param = ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL;
 956        } else if (attr == &dev_attr_fnode_erl.attr) {
 957                param = ISCSI_FLASHNODE_ERL;
 958        } else if (attr == &dev_attr_fnode_first_burst_len.attr) {
 959                param = ISCSI_FLASHNODE_FIRST_BURST;
 960        } else if (attr == &dev_attr_fnode_def_time2wait.attr) {
 961                param = ISCSI_FLASHNODE_DEF_TIME2WAIT;
 962        } else if (attr == &dev_attr_fnode_def_time2retain.attr) {
 963                param = ISCSI_FLASHNODE_DEF_TIME2RETAIN;
 964        } else if (attr == &dev_attr_fnode_max_outstanding_r2t.attr) {
 965                param = ISCSI_FLASHNODE_MAX_R2T;
 966        } else if (attr == &dev_attr_fnode_isid.attr) {
 967                param = ISCSI_FLASHNODE_ISID;
 968        } else if (attr == &dev_attr_fnode_tsid.attr) {
 969                param = ISCSI_FLASHNODE_TSID;
 970        } else if (attr == &dev_attr_fnode_max_burst_len.attr) {
 971                param = ISCSI_FLASHNODE_MAX_BURST;
 972        } else if (attr == &dev_attr_fnode_def_taskmgmt_tmo.attr) {
 973                param = ISCSI_FLASHNODE_DEF_TASKMGMT_TMO;
 974        } else if (attr == &dev_attr_fnode_targetalias.attr) {
 975                param = ISCSI_FLASHNODE_ALIAS;
 976        } else if (attr == &dev_attr_fnode_targetname.attr) {
 977                param = ISCSI_FLASHNODE_NAME;
 978        } else if (attr == &dev_attr_fnode_tpgt.attr) {
 979                param = ISCSI_FLASHNODE_TPGT;
 980        } else if (attr == &dev_attr_fnode_discovery_parent_idx.attr) {
 981                param = ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX;
 982        } else if (attr == &dev_attr_fnode_discovery_parent_type.attr) {
 983                param = ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE;
 984        } else if (attr == &dev_attr_fnode_chap_in_idx.attr) {
 985                param = ISCSI_FLASHNODE_CHAP_IN_IDX;
 986        } else if (attr == &dev_attr_fnode_chap_out_idx.attr) {
 987                param = ISCSI_FLASHNODE_CHAP_OUT_IDX;
 988        } else if (attr == &dev_attr_fnode_username.attr) {
 989                param = ISCSI_FLASHNODE_USERNAME;
 990        } else if (attr == &dev_attr_fnode_username_in.attr) {
 991                param = ISCSI_FLASHNODE_USERNAME_IN;
 992        } else if (attr == &dev_attr_fnode_password.attr) {
 993                param = ISCSI_FLASHNODE_PASSWORD;
 994        } else if (attr == &dev_attr_fnode_password_in.attr) {
 995                param = ISCSI_FLASHNODE_PASSWORD_IN;
 996        } else if (attr == &dev_attr_fnode_is_boot_target.attr) {
 997                param = ISCSI_FLASHNODE_IS_BOOT_TGT;
 998        } else {
 999                WARN_ONCE(1, "Invalid flashnode session attr");
1000                return 0;
1001        }
1002
1003        return t->attr_is_visible(ISCSI_FLASHNODE_PARAM, param);
1004}
1005
1006static struct attribute_group iscsi_flashnode_sess_attr_group = {
1007        .attrs = iscsi_flashnode_sess_attrs,
1008        .is_visible = iscsi_flashnode_sess_attr_is_visible,
1009};
1010
1011static const struct attribute_group *iscsi_flashnode_sess_attr_groups[] = {
1012        &iscsi_flashnode_sess_attr_group,
1013        NULL,
1014};
1015
1016static void iscsi_flashnode_sess_release(struct device *dev)
1017{
1018        struct iscsi_bus_flash_session *fnode_sess =
1019                                                iscsi_dev_to_flash_session(dev);
1020
1021        kfree(fnode_sess->targetname);
1022        kfree(fnode_sess->targetalias);
1023        kfree(fnode_sess->portal_type);
1024        kfree(fnode_sess);
1025}
1026
1027static const struct device_type iscsi_flashnode_sess_dev_type = {
1028        .name = "iscsi_flashnode_sess_dev_type",
1029        .groups = iscsi_flashnode_sess_attr_groups,
1030        .release = iscsi_flashnode_sess_release,
1031};
1032
1033/* flash node connection attrs show */
1034#define iscsi_flashnode_conn_attr_show(type, name, param)               \
1035static ssize_t                                                          \
1036show_##type##_##name(struct device *dev, struct device_attribute *attr, \
1037                     char *buf)                                         \
1038{                                                                       \
1039        struct iscsi_bus_flash_conn *fnode_conn = iscsi_dev_to_flash_conn(dev);\
1040        struct iscsi_bus_flash_session *fnode_sess =                    \
1041                                iscsi_flash_conn_to_flash_session(fnode_conn);\
1042        struct iscsi_transport *t = fnode_conn->transport;              \
1043        return t->get_flashnode_param(fnode_sess, param, buf);          \
1044}                                                                       \
1045
1046
1047#define iscsi_flashnode_conn_attr(type, name, param)                    \
1048        iscsi_flashnode_conn_attr_show(type, name, param)               \
1049static ISCSI_FLASHNODE_ATTR(type, name, S_IRUGO,                        \
1050                            show_##type##_##name, NULL);
1051
1052/* Flash node connection attributes */
1053
1054iscsi_flashnode_conn_attr(fnode, is_fw_assigned_ipv6,
1055                          ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6);
1056iscsi_flashnode_conn_attr(fnode, header_digest, ISCSI_FLASHNODE_HDR_DGST_EN);
1057iscsi_flashnode_conn_attr(fnode, data_digest, ISCSI_FLASHNODE_DATA_DGST_EN);
1058iscsi_flashnode_conn_attr(fnode, snack_req, ISCSI_FLASHNODE_SNACK_REQ_EN);
1059iscsi_flashnode_conn_attr(fnode, tcp_timestamp_stat,
1060                          ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT);
1061iscsi_flashnode_conn_attr(fnode, tcp_nagle_disable,
1062                          ISCSI_FLASHNODE_TCP_NAGLE_DISABLE);
1063iscsi_flashnode_conn_attr(fnode, tcp_wsf_disable,
1064                          ISCSI_FLASHNODE_TCP_WSF_DISABLE);
1065iscsi_flashnode_conn_attr(fnode, tcp_timer_scale,
1066                          ISCSI_FLASHNODE_TCP_TIMER_SCALE);
1067iscsi_flashnode_conn_attr(fnode, tcp_timestamp_enable,
1068                          ISCSI_FLASHNODE_TCP_TIMESTAMP_EN);
1069iscsi_flashnode_conn_attr(fnode, fragment_disable,
1070                          ISCSI_FLASHNODE_IP_FRAG_DISABLE);
1071iscsi_flashnode_conn_attr(fnode, keepalive_tmo, ISCSI_FLASHNODE_KEEPALIVE_TMO);
1072iscsi_flashnode_conn_attr(fnode, port, ISCSI_FLASHNODE_PORT);
1073iscsi_flashnode_conn_attr(fnode, ipaddress, ISCSI_FLASHNODE_IPADDR);
1074iscsi_flashnode_conn_attr(fnode, max_recv_dlength,
1075                          ISCSI_FLASHNODE_MAX_RECV_DLENGTH);
1076iscsi_flashnode_conn_attr(fnode, max_xmit_dlength,
1077                          ISCSI_FLASHNODE_MAX_XMIT_DLENGTH);
1078iscsi_flashnode_conn_attr(fnode, local_port, ISCSI_FLASHNODE_LOCAL_PORT);
1079iscsi_flashnode_conn_attr(fnode, ipv4_tos, ISCSI_FLASHNODE_IPV4_TOS);
1080iscsi_flashnode_conn_attr(fnode, ipv6_traffic_class, ISCSI_FLASHNODE_IPV6_TC);
1081iscsi_flashnode_conn_attr(fnode, ipv6_flow_label,
1082                          ISCSI_FLASHNODE_IPV6_FLOW_LABEL);
1083iscsi_flashnode_conn_attr(fnode, redirect_ipaddr,
1084                          ISCSI_FLASHNODE_REDIRECT_IPADDR);
1085iscsi_flashnode_conn_attr(fnode, max_segment_size,
1086                          ISCSI_FLASHNODE_MAX_SEGMENT_SIZE);
1087iscsi_flashnode_conn_attr(fnode, link_local_ipv6,
1088                          ISCSI_FLASHNODE_LINK_LOCAL_IPV6);
1089iscsi_flashnode_conn_attr(fnode, tcp_xmit_wsf, ISCSI_FLASHNODE_TCP_XMIT_WSF);
1090iscsi_flashnode_conn_attr(fnode, tcp_recv_wsf, ISCSI_FLASHNODE_TCP_RECV_WSF);
1091iscsi_flashnode_conn_attr(fnode, statsn, ISCSI_FLASHNODE_STATSN);
1092iscsi_flashnode_conn_attr(fnode, exp_statsn, ISCSI_FLASHNODE_EXP_STATSN);
1093
1094static struct attribute *iscsi_flashnode_conn_attrs[] = {
1095        &dev_attr_fnode_is_fw_assigned_ipv6.attr,
1096        &dev_attr_fnode_header_digest.attr,
1097        &dev_attr_fnode_data_digest.attr,
1098        &dev_attr_fnode_snack_req.attr,
1099        &dev_attr_fnode_tcp_timestamp_stat.attr,
1100        &dev_attr_fnode_tcp_nagle_disable.attr,
1101        &dev_attr_fnode_tcp_wsf_disable.attr,
1102        &dev_attr_fnode_tcp_timer_scale.attr,
1103        &dev_attr_fnode_tcp_timestamp_enable.attr,
1104        &dev_attr_fnode_fragment_disable.attr,
1105        &dev_attr_fnode_max_recv_dlength.attr,
1106        &dev_attr_fnode_max_xmit_dlength.attr,
1107        &dev_attr_fnode_keepalive_tmo.attr,
1108        &dev_attr_fnode_port.attr,
1109        &dev_attr_fnode_ipaddress.attr,
1110        &dev_attr_fnode_redirect_ipaddr.attr,
1111        &dev_attr_fnode_max_segment_size.attr,
1112        &dev_attr_fnode_local_port.attr,
1113        &dev_attr_fnode_ipv4_tos.attr,
1114        &dev_attr_fnode_ipv6_traffic_class.attr,
1115        &dev_attr_fnode_ipv6_flow_label.attr,
1116        &dev_attr_fnode_link_local_ipv6.attr,
1117        &dev_attr_fnode_tcp_xmit_wsf.attr,
1118        &dev_attr_fnode_tcp_recv_wsf.attr,
1119        &dev_attr_fnode_statsn.attr,
1120        &dev_attr_fnode_exp_statsn.attr,
1121        NULL,
1122};
1123
1124static umode_t iscsi_flashnode_conn_attr_is_visible(struct kobject *kobj,
1125                                                    struct attribute *attr,
1126                                                    int i)
1127{
1128        struct device *dev = container_of(kobj, struct device, kobj);
1129        struct iscsi_bus_flash_conn *fnode_conn = iscsi_dev_to_flash_conn(dev);
1130        struct iscsi_transport *t = fnode_conn->transport;
1131        int param;
1132
1133        if (attr == &dev_attr_fnode_is_fw_assigned_ipv6.attr) {
1134                param = ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6;
1135        } else if (attr == &dev_attr_fnode_header_digest.attr) {
1136                param = ISCSI_FLASHNODE_HDR_DGST_EN;
1137        } else if (attr == &dev_attr_fnode_data_digest.attr) {
1138                param = ISCSI_FLASHNODE_DATA_DGST_EN;
1139        } else if (attr == &dev_attr_fnode_snack_req.attr) {
1140                param = ISCSI_FLASHNODE_SNACK_REQ_EN;
1141        } else if (attr == &dev_attr_fnode_tcp_timestamp_stat.attr) {
1142                param = ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT;
1143        } else if (attr == &dev_attr_fnode_tcp_nagle_disable.attr) {
1144                param = ISCSI_FLASHNODE_TCP_NAGLE_DISABLE;
1145        } else if (attr == &dev_attr_fnode_tcp_wsf_disable.attr) {
1146                param = ISCSI_FLASHNODE_TCP_WSF_DISABLE;
1147        } else if (attr == &dev_attr_fnode_tcp_timer_scale.attr) {
1148                param = ISCSI_FLASHNODE_TCP_TIMER_SCALE;
1149        } else if (attr == &dev_attr_fnode_tcp_timestamp_enable.attr) {
1150                param = ISCSI_FLASHNODE_TCP_TIMESTAMP_EN;
1151        } else if (attr == &dev_attr_fnode_fragment_disable.attr) {
1152                param = ISCSI_FLASHNODE_IP_FRAG_DISABLE;
1153        } else if (attr == &dev_attr_fnode_max_recv_dlength.attr) {
1154                param = ISCSI_FLASHNODE_MAX_RECV_DLENGTH;
1155        } else if (attr == &dev_attr_fnode_max_xmit_dlength.attr) {
1156                param = ISCSI_FLASHNODE_MAX_XMIT_DLENGTH;
1157        } else if (attr == &dev_attr_fnode_keepalive_tmo.attr) {
1158                param = ISCSI_FLASHNODE_KEEPALIVE_TMO;
1159        } else if (attr == &dev_attr_fnode_port.attr) {
1160                param = ISCSI_FLASHNODE_PORT;
1161        } else if (attr == &dev_attr_fnode_ipaddress.attr) {
1162                param = ISCSI_FLASHNODE_IPADDR;
1163        } else if (attr == &dev_attr_fnode_redirect_ipaddr.attr) {
1164                param = ISCSI_FLASHNODE_REDIRECT_IPADDR;
1165        } else if (attr == &dev_attr_fnode_max_segment_size.attr) {
1166                param = ISCSI_FLASHNODE_MAX_SEGMENT_SIZE;
1167        } else if (attr == &dev_attr_fnode_local_port.attr) {
1168                param = ISCSI_FLASHNODE_LOCAL_PORT;
1169        } else if (attr == &dev_attr_fnode_ipv4_tos.attr) {
1170                param = ISCSI_FLASHNODE_IPV4_TOS;
1171        } else if (attr == &dev_attr_fnode_ipv6_traffic_class.attr) {
1172                param = ISCSI_FLASHNODE_IPV6_TC;
1173        } else if (attr == &dev_attr_fnode_ipv6_flow_label.attr) {
1174                param = ISCSI_FLASHNODE_IPV6_FLOW_LABEL;
1175        } else if (attr == &dev_attr_fnode_link_local_ipv6.attr) {
1176                param = ISCSI_FLASHNODE_LINK_LOCAL_IPV6;
1177        } else if (attr == &dev_attr_fnode_tcp_xmit_wsf.attr) {
1178                param = ISCSI_FLASHNODE_TCP_XMIT_WSF;
1179        } else if (attr == &dev_attr_fnode_tcp_recv_wsf.attr) {
1180                param = ISCSI_FLASHNODE_TCP_RECV_WSF;
1181        } else if (attr == &dev_attr_fnode_statsn.attr) {
1182                param = ISCSI_FLASHNODE_STATSN;
1183        } else if (attr == &dev_attr_fnode_exp_statsn.attr) {
1184                param = ISCSI_FLASHNODE_EXP_STATSN;
1185        } else {
1186                WARN_ONCE(1, "Invalid flashnode connection attr");
1187                return 0;
1188        }
1189
1190        return t->attr_is_visible(ISCSI_FLASHNODE_PARAM, param);
1191}
1192
1193static struct attribute_group iscsi_flashnode_conn_attr_group = {
1194        .attrs = iscsi_flashnode_conn_attrs,
1195        .is_visible = iscsi_flashnode_conn_attr_is_visible,
1196};
1197
1198static const struct attribute_group *iscsi_flashnode_conn_attr_groups[] = {
1199        &iscsi_flashnode_conn_attr_group,
1200        NULL,
1201};
1202
1203static void iscsi_flashnode_conn_release(struct device *dev)
1204{
1205        struct iscsi_bus_flash_conn *fnode_conn = iscsi_dev_to_flash_conn(dev);
1206
1207        kfree(fnode_conn->ipaddress);
1208        kfree(fnode_conn->redirect_ipaddr);
1209        kfree(fnode_conn->link_local_ipv6_addr);
1210        kfree(fnode_conn);
1211}
1212
1213static const struct device_type iscsi_flashnode_conn_dev_type = {
1214        .name = "iscsi_flashnode_conn_dev_type",
1215        .groups = iscsi_flashnode_conn_attr_groups,
1216        .release = iscsi_flashnode_conn_release,
1217};
1218
1219static struct bus_type iscsi_flashnode_bus;
1220
1221int iscsi_flashnode_bus_match(struct device *dev,
1222                                     struct device_driver *drv)
1223{
1224        if (dev->bus == &iscsi_flashnode_bus)
1225                return 1;
1226        return 0;
1227}
1228EXPORT_SYMBOL_GPL(iscsi_flashnode_bus_match);
1229
1230static struct bus_type iscsi_flashnode_bus = {
1231        .name = "iscsi_flashnode",
1232        .match = &iscsi_flashnode_bus_match,
1233};
1234
1235/**
1236 * iscsi_create_flashnode_sess - Add flashnode session entry in sysfs
1237 * @shost: pointer to host data
1238 * @index: index of flashnode to add in sysfs
1239 * @transport: pointer to transport data
1240 * @dd_size: total size to allocate
1241 *
1242 * Adds a sysfs entry for the flashnode session attributes
1243 *
1244 * Returns:
1245 *  pointer to allocated flashnode sess on success
1246 *  %NULL on failure
1247 */
1248struct iscsi_bus_flash_session *
1249iscsi_create_flashnode_sess(struct Scsi_Host *shost, int index,
1250                            struct iscsi_transport *transport,
1251                            int dd_size)
1252{
1253        struct iscsi_bus_flash_session *fnode_sess;
1254        int err;
1255
1256        fnode_sess = kzalloc(sizeof(*fnode_sess) + dd_size, GFP_KERNEL);
1257        if (!fnode_sess)
1258                return NULL;
1259
1260        fnode_sess->transport = transport;
1261        fnode_sess->target_id = index;
1262        fnode_sess->dev.type = &iscsi_flashnode_sess_dev_type;
1263        fnode_sess->dev.bus = &iscsi_flashnode_bus;
1264        fnode_sess->dev.parent = &shost->shost_gendev;
1265        dev_set_name(&fnode_sess->dev, "flashnode_sess-%u:%u",
1266                     shost->host_no, index);
1267
1268        err = device_register(&fnode_sess->dev);
1269        if (err)
1270                goto free_fnode_sess;
1271
1272        if (dd_size)
1273                fnode_sess->dd_data = &fnode_sess[1];
1274
1275        return fnode_sess;
1276
1277free_fnode_sess:
1278        kfree(fnode_sess);
1279        return NULL;
1280}
1281EXPORT_SYMBOL_GPL(iscsi_create_flashnode_sess);
1282
1283/**
1284 * iscsi_create_flashnode_conn - Add flashnode conn entry in sysfs
1285 * @shost: pointer to host data
1286 * @fnode_sess: pointer to the parent flashnode session entry
1287 * @transport: pointer to transport data
1288 * @dd_size: total size to allocate
1289 *
1290 * Adds a sysfs entry for the flashnode connection attributes
1291 *
1292 * Returns:
1293 *  pointer to allocated flashnode conn on success
1294 *  %NULL on failure
1295 */
1296struct iscsi_bus_flash_conn *
1297iscsi_create_flashnode_conn(struct Scsi_Host *shost,
1298                            struct iscsi_bus_flash_session *fnode_sess,
1299                            struct iscsi_transport *transport,
1300                            int dd_size)
1301{
1302        struct iscsi_bus_flash_conn *fnode_conn;
1303        int err;
1304
1305        fnode_conn = kzalloc(sizeof(*fnode_conn) + dd_size, GFP_KERNEL);
1306        if (!fnode_conn)
1307                return NULL;
1308
1309        fnode_conn->transport = transport;
1310        fnode_conn->dev.type = &iscsi_flashnode_conn_dev_type;
1311        fnode_conn->dev.bus = &iscsi_flashnode_bus;
1312        fnode_conn->dev.parent = &fnode_sess->dev;
1313        dev_set_name(&fnode_conn->dev, "flashnode_conn-%u:%u:0",
1314                     shost->host_no, fnode_sess->target_id);
1315
1316        err = device_register(&fnode_conn->dev);
1317        if (err)
1318                goto free_fnode_conn;
1319
1320        if (dd_size)
1321                fnode_conn->dd_data = &fnode_conn[1];
1322
1323        return fnode_conn;
1324
1325free_fnode_conn:
1326        kfree(fnode_conn);
1327        return NULL;
1328}
1329EXPORT_SYMBOL_GPL(iscsi_create_flashnode_conn);
1330
1331/**
1332 * iscsi_is_flashnode_conn_dev - verify passed device is to be flashnode conn
1333 * @dev: device to verify
1334 * @data: pointer to data containing value to use for verification
1335 *
1336 * Verifies if the passed device is flashnode conn device
1337 *
1338 * Returns:
1339 *  1 on success
1340 *  0 on failure
1341 */
1342static int iscsi_is_flashnode_conn_dev(struct device *dev, void *data)
1343{
1344        return dev->bus == &iscsi_flashnode_bus;
1345}
1346
1347static int iscsi_destroy_flashnode_conn(struct iscsi_bus_flash_conn *fnode_conn)
1348{
1349        device_unregister(&fnode_conn->dev);
1350        return 0;
1351}
1352
1353static int flashnode_match_index(struct device *dev, void *data)
1354{
1355        struct iscsi_bus_flash_session *fnode_sess = NULL;
1356        int ret = 0;
1357
1358        if (!iscsi_flashnode_bus_match(dev, NULL))
1359                goto exit_match_index;
1360
1361        fnode_sess = iscsi_dev_to_flash_session(dev);
1362        ret = (fnode_sess->target_id == *((int *)data)) ? 1 : 0;
1363
1364exit_match_index:
1365        return ret;
1366}
1367
1368/**
1369 * iscsi_get_flashnode_by_index -finds flashnode session entry by index
1370 * @shost: pointer to host data
1371 * @idx: index to match
1372 *
1373 * Finds the flashnode session object for the passed index
1374 *
1375 * Returns:
1376 *  pointer to found flashnode session object on success
1377 *  %NULL on failure
1378 */
1379static struct iscsi_bus_flash_session *
1380iscsi_get_flashnode_by_index(struct Scsi_Host *shost, uint32_t idx)
1381{
1382        struct iscsi_bus_flash_session *fnode_sess = NULL;
1383        struct device *dev;
1384
1385        dev = device_find_child(&shost->shost_gendev, &idx,
1386                                flashnode_match_index);
1387        if (dev)
1388                fnode_sess = iscsi_dev_to_flash_session(dev);
1389
1390        return fnode_sess;
1391}
1392
1393/**
1394 * iscsi_find_flashnode_sess - finds flashnode session entry
1395 * @shost: pointer to host data
1396 * @data: pointer to data containing value to use for comparison
1397 * @fn: function pointer that does actual comparison
1398 *
1399 * Finds the flashnode session object comparing the data passed using logic
1400 * defined in passed function pointer
1401 *
1402 * Returns:
1403 *  pointer to found flashnode session device object on success
1404 *  %NULL on failure
1405 */
1406struct device *
1407iscsi_find_flashnode_sess(struct Scsi_Host *shost, void *data,
1408                          int (*fn)(struct device *dev, void *data))
1409{
1410        return device_find_child(&shost->shost_gendev, data, fn);
1411}
1412EXPORT_SYMBOL_GPL(iscsi_find_flashnode_sess);
1413
1414/**
1415 * iscsi_find_flashnode_conn - finds flashnode connection entry
1416 * @fnode_sess: pointer to parent flashnode session entry
1417 *
1418 * Finds the flashnode connection object comparing the data passed using logic
1419 * defined in passed function pointer
1420 *
1421 * Returns:
1422 *  pointer to found flashnode connection device object on success
1423 *  %NULL on failure
1424 */
1425struct device *
1426iscsi_find_flashnode_conn(struct iscsi_bus_flash_session *fnode_sess)
1427{
1428        return device_find_child(&fnode_sess->dev, NULL,
1429                                 iscsi_is_flashnode_conn_dev);
1430}
1431EXPORT_SYMBOL_GPL(iscsi_find_flashnode_conn);
1432
1433static int iscsi_iter_destroy_flashnode_conn_fn(struct device *dev, void *data)
1434{
1435        if (!iscsi_is_flashnode_conn_dev(dev, NULL))
1436                return 0;
1437
1438        return iscsi_destroy_flashnode_conn(iscsi_dev_to_flash_conn(dev));
1439}
1440
1441/**
1442 * iscsi_destroy_flashnode_sess - destroy flashnode session entry
1443 * @fnode_sess: pointer to flashnode session entry to be destroyed
1444 *
1445 * Deletes the flashnode session entry and all children flashnode connection
1446 * entries from sysfs
1447 */
1448void iscsi_destroy_flashnode_sess(struct iscsi_bus_flash_session *fnode_sess)
1449{
1450        int err;
1451
1452        err = device_for_each_child(&fnode_sess->dev, NULL,
1453                                    iscsi_iter_destroy_flashnode_conn_fn);
1454        if (err)
1455                pr_err("Could not delete all connections for %s. Error %d.\n",
1456                       fnode_sess->dev.kobj.name, err);
1457
1458        device_unregister(&fnode_sess->dev);
1459}
1460EXPORT_SYMBOL_GPL(iscsi_destroy_flashnode_sess);
1461
1462static int iscsi_iter_destroy_flashnode_fn(struct device *dev, void *data)
1463{
1464        if (!iscsi_flashnode_bus_match(dev, NULL))
1465                return 0;
1466
1467        iscsi_destroy_flashnode_sess(iscsi_dev_to_flash_session(dev));
1468        return 0;
1469}
1470
1471/**
1472 * iscsi_destroy_all_flashnode - destroy all flashnode session entries
1473 * @shost: pointer to host data
1474 *
1475 * Destroys all the flashnode session entries and all corresponding children
1476 * flashnode connection entries from sysfs
1477 */
1478void iscsi_destroy_all_flashnode(struct Scsi_Host *shost)
1479{
1480        device_for_each_child(&shost->shost_gendev, NULL,
1481                              iscsi_iter_destroy_flashnode_fn);
1482}
1483EXPORT_SYMBOL_GPL(iscsi_destroy_all_flashnode);
1484
1485/*
1486 * BSG support
1487 */
1488/**
1489 * iscsi_bsg_host_dispatch - Dispatch command to LLD.
1490 * @job: bsg job to be processed
1491 */
1492static int iscsi_bsg_host_dispatch(struct bsg_job *job)
1493{
1494        struct Scsi_Host *shost = iscsi_job_to_shost(job);
1495        struct iscsi_bsg_request *req = job->request;
1496        struct iscsi_bsg_reply *reply = job->reply;
1497        struct iscsi_internal *i = to_iscsi_internal(shost->transportt);
1498        int cmdlen = sizeof(uint32_t);  /* start with length of msgcode */
1499        int ret;
1500
1501        /* check if we have the msgcode value at least */
1502        if (job->request_len < sizeof(uint32_t)) {
1503                ret = -ENOMSG;
1504                goto fail_host_msg;
1505        }
1506
1507        /* Validate the host command */
1508        switch (req->msgcode) {
1509        case ISCSI_BSG_HST_VENDOR:
1510                cmdlen += sizeof(struct iscsi_bsg_host_vendor);
1511                if ((shost->hostt->vendor_id == 0L) ||
1512                    (req->rqst_data.h_vendor.vendor_id !=
1513                        shost->hostt->vendor_id)) {
1514                        ret = -ESRCH;
1515                        goto fail_host_msg;
1516                }
1517                break;
1518        default:
1519                ret = -EBADR;
1520                goto fail_host_msg;
1521        }
1522
1523        /* check if we really have all the request data needed */
1524        if (job->request_len < cmdlen) {
1525                ret = -ENOMSG;
1526                goto fail_host_msg;
1527        }
1528
1529        ret = i->iscsi_transport->bsg_request(job);
1530        if (!ret)
1531                return 0;
1532
1533fail_host_msg:
1534        /* return the errno failure code as the only status */
1535        BUG_ON(job->reply_len < sizeof(uint32_t));
1536        reply->reply_payload_rcv_len = 0;
1537        reply->result = ret;
1538        job->reply_len = sizeof(uint32_t);
1539        bsg_job_done(job, ret, 0);
1540        return 0;
1541}
1542
1543/**
1544 * iscsi_bsg_host_add - Create and add the bsg hooks to receive requests
1545 * @shost: shost for iscsi_host
1546 * @ihost: iscsi_cls_host adding the structures to
1547 */
1548static int
1549iscsi_bsg_host_add(struct Scsi_Host *shost, struct iscsi_cls_host *ihost)
1550{
1551        struct device *dev = &shost->shost_gendev;
1552        struct iscsi_internal *i = to_iscsi_internal(shost->transportt);
1553        struct request_queue *q;
1554        char bsg_name[20];
1555
1556        if (!i->iscsi_transport->bsg_request)
1557                return -ENOTSUPP;
1558
1559        snprintf(bsg_name, sizeof(bsg_name), "iscsi_host%d", shost->host_no);
1560        q = bsg_setup_queue(dev, bsg_name, iscsi_bsg_host_dispatch, NULL, 0);
1561        if (IS_ERR(q)) {
1562                shost_printk(KERN_ERR, shost, "bsg interface failed to "
1563                             "initialize - no request queue\n");
1564                return PTR_ERR(q);
1565        }
1566        __scsi_init_queue(shost, q);
1567
1568        ihost->bsg_q = q;
1569        return 0;
1570}
1571
1572static int iscsi_setup_host(struct transport_container *tc, struct device *dev,
1573                            struct device *cdev)
1574{
1575        struct Scsi_Host *shost = dev_to_shost(dev);
1576        struct iscsi_cls_host *ihost = shost->shost_data;
1577
1578        memset(ihost, 0, sizeof(*ihost));
1579        atomic_set(&ihost->nr_scans, 0);
1580        mutex_init(&ihost->mutex);
1581
1582        iscsi_bsg_host_add(shost, ihost);
1583        /* ignore any bsg add error - we just can't do sgio */
1584
1585        return 0;
1586}
1587
1588static int iscsi_remove_host(struct transport_container *tc,
1589                             struct device *dev, struct device *cdev)
1590{
1591        struct Scsi_Host *shost = dev_to_shost(dev);
1592        struct iscsi_cls_host *ihost = shost->shost_data;
1593
1594        bsg_remove_queue(ihost->bsg_q);
1595        return 0;
1596}
1597
1598static DECLARE_TRANSPORT_CLASS(iscsi_host_class,
1599                               "iscsi_host",
1600                               iscsi_setup_host,
1601                               iscsi_remove_host,
1602                               NULL);
1603
1604static DECLARE_TRANSPORT_CLASS(iscsi_session_class,
1605                               "iscsi_session",
1606                               NULL,
1607                               NULL,
1608                               NULL);
1609
1610static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,
1611                               "iscsi_connection",
1612                               NULL,
1613                               NULL,
1614                               NULL);
1615
1616static struct sock *nls;
1617static DEFINE_MUTEX(rx_queue_mutex);
1618
1619/*
1620 * conn_mutex protects the {start,bind,stop,destroy}_conn from racing
1621 * against the kernel stop_connection recovery mechanism
1622 */
1623static DEFINE_MUTEX(conn_mutex);
1624
1625static LIST_HEAD(sesslist);
1626static DEFINE_SPINLOCK(sesslock);
1627static LIST_HEAD(connlist);
1628static LIST_HEAD(connlist_err);
1629static DEFINE_SPINLOCK(connlock);
1630
1631static uint32_t iscsi_conn_get_sid(struct iscsi_cls_conn *conn)
1632{
1633        struct iscsi_cls_session *sess = iscsi_dev_to_session(conn->dev.parent);
1634        return sess->sid;
1635}
1636
1637/*
1638 * Returns the matching session to a given sid
1639 */
1640static struct iscsi_cls_session *iscsi_session_lookup(uint32_t sid)
1641{
1642        unsigned long flags;
1643        struct iscsi_cls_session *sess;
1644
1645        spin_lock_irqsave(&sesslock, flags);
1646        list_for_each_entry(sess, &sesslist, sess_list) {
1647                if (sess->sid == sid) {
1648                        spin_unlock_irqrestore(&sesslock, flags);
1649                        return sess;
1650                }
1651        }
1652        spin_unlock_irqrestore(&sesslock, flags);
1653        return NULL;
1654}
1655
1656/*
1657 * Returns the matching connection to a given sid / cid tuple
1658 */
1659static struct iscsi_cls_conn *iscsi_conn_lookup(uint32_t sid, uint32_t cid)
1660{
1661        unsigned long flags;
1662        struct iscsi_cls_conn *conn;
1663
1664        spin_lock_irqsave(&connlock, flags);
1665        list_for_each_entry(conn, &connlist, conn_list) {
1666                if ((conn->cid == cid) && (iscsi_conn_get_sid(conn) == sid)) {
1667                        spin_unlock_irqrestore(&connlock, flags);
1668                        return conn;
1669                }
1670        }
1671        spin_unlock_irqrestore(&connlock, flags);
1672        return NULL;
1673}
1674
1675/*
1676 * The following functions can be used by LLDs that allocate
1677 * their own scsi_hosts or by software iscsi LLDs
1678 */
1679static struct {
1680        int value;
1681        char *name;
1682} iscsi_session_state_names[] = {
1683        { ISCSI_SESSION_LOGGED_IN,      "LOGGED_IN" },
1684        { ISCSI_SESSION_FAILED,         "FAILED" },
1685        { ISCSI_SESSION_FREE,           "FREE" },
1686};
1687
1688static const char *iscsi_session_state_name(int state)
1689{
1690        int i;
1691        char *name = NULL;
1692
1693        for (i = 0; i < ARRAY_SIZE(iscsi_session_state_names); i++) {
1694                if (iscsi_session_state_names[i].value == state) {
1695                        name = iscsi_session_state_names[i].name;
1696                        break;
1697                }
1698        }
1699        return name;
1700}
1701
1702int iscsi_session_chkready(struct iscsi_cls_session *session)
1703{
1704        unsigned long flags;
1705        int err;
1706
1707        spin_lock_irqsave(&session->lock, flags);
1708        switch (session->state) {
1709        case ISCSI_SESSION_LOGGED_IN:
1710                err = 0;
1711                break;
1712        case ISCSI_SESSION_FAILED:
1713                err = DID_IMM_RETRY << 16;
1714                break;
1715        case ISCSI_SESSION_FREE:
1716                err = DID_TRANSPORT_FAILFAST << 16;
1717                break;
1718        default:
1719                err = DID_NO_CONNECT << 16;
1720                break;
1721        }
1722        spin_unlock_irqrestore(&session->lock, flags);
1723        return err;
1724}
1725EXPORT_SYMBOL_GPL(iscsi_session_chkready);
1726
1727int iscsi_is_session_online(struct iscsi_cls_session *session)
1728{
1729        unsigned long flags;
1730        int ret = 0;
1731
1732        spin_lock_irqsave(&session->lock, flags);
1733        if (session->state == ISCSI_SESSION_LOGGED_IN)
1734                ret = 1;
1735        spin_unlock_irqrestore(&session->lock, flags);
1736        return ret;
1737}
1738EXPORT_SYMBOL_GPL(iscsi_is_session_online);
1739
1740static void iscsi_session_release(struct device *dev)
1741{
1742        struct iscsi_cls_session *session = iscsi_dev_to_session(dev);
1743        struct Scsi_Host *shost;
1744
1745        shost = iscsi_session_to_shost(session);
1746        scsi_host_put(shost);
1747        ISCSI_DBG_TRANS_SESSION(session, "Completing session release\n");
1748        kfree(session);
1749}
1750
1751int iscsi_is_session_dev(const struct device *dev)
1752{
1753        return dev->release == iscsi_session_release;
1754}
1755EXPORT_SYMBOL_GPL(iscsi_is_session_dev);
1756
1757static int iscsi_iter_session_fn(struct device *dev, void *data)
1758{
1759        void (* fn) (struct iscsi_cls_session *) = data;
1760
1761        if (!iscsi_is_session_dev(dev))
1762                return 0;
1763        fn(iscsi_dev_to_session(dev));
1764        return 0;
1765}
1766
1767void iscsi_host_for_each_session(struct Scsi_Host *shost,
1768                                 void (*fn)(struct iscsi_cls_session *))
1769{
1770        device_for_each_child(&shost->shost_gendev, fn,
1771                              iscsi_iter_session_fn);
1772}
1773EXPORT_SYMBOL_GPL(iscsi_host_for_each_session);
1774
1775/**
1776 * iscsi_scan_finished - helper to report when running scans are done
1777 * @shost: scsi host
1778 * @time: scan run time
1779 *
1780 * This function can be used by drives like qla4xxx to report to the scsi
1781 * layer when the scans it kicked off at module load time are done.
1782 */
1783int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time)
1784{
1785        struct iscsi_cls_host *ihost = shost->shost_data;
1786        /*
1787         * qla4xxx will have kicked off some session unblocks before calling
1788         * scsi_scan_host, so just wait for them to complete.
1789         */
1790        return !atomic_read(&ihost->nr_scans);
1791}
1792EXPORT_SYMBOL_GPL(iscsi_scan_finished);
1793
1794struct iscsi_scan_data {
1795        unsigned int channel;
1796        unsigned int id;
1797        u64 lun;
1798        enum scsi_scan_mode rescan;
1799};
1800
1801static int iscsi_user_scan_session(struct device *dev, void *data)
1802{
1803        struct iscsi_scan_data *scan_data = data;
1804        struct iscsi_cls_session *session;
1805        struct Scsi_Host *shost;
1806        struct iscsi_cls_host *ihost;
1807        unsigned long flags;
1808        unsigned int id;
1809
1810        if (!iscsi_is_session_dev(dev))
1811                return 0;
1812
1813        session = iscsi_dev_to_session(dev);
1814
1815        ISCSI_DBG_TRANS_SESSION(session, "Scanning session\n");
1816
1817        shost = iscsi_session_to_shost(session);
1818        ihost = shost->shost_data;
1819
1820        mutex_lock(&ihost->mutex);
1821        spin_lock_irqsave(&session->lock, flags);
1822        if (session->state != ISCSI_SESSION_LOGGED_IN) {
1823                spin_unlock_irqrestore(&session->lock, flags);
1824                goto user_scan_exit;
1825        }
1826        id = session->target_id;
1827        spin_unlock_irqrestore(&session->lock, flags);
1828
1829        if (id != ISCSI_MAX_TARGET) {
1830                if ((scan_data->channel == SCAN_WILD_CARD ||
1831                     scan_data->channel == 0) &&
1832                    (scan_data->id == SCAN_WILD_CARD ||
1833                     scan_data->id == id))
1834                        scsi_scan_target(&session->dev, 0, id,
1835                                         scan_data->lun, scan_data->rescan);
1836        }
1837
1838user_scan_exit:
1839        mutex_unlock(&ihost->mutex);
1840        ISCSI_DBG_TRANS_SESSION(session, "Completed session scan\n");
1841        return 0;
1842}
1843
1844static int iscsi_user_scan(struct Scsi_Host *shost, uint channel,
1845                           uint id, u64 lun)
1846{
1847        struct iscsi_scan_data scan_data;
1848
1849        scan_data.channel = channel;
1850        scan_data.id = id;
1851        scan_data.lun = lun;
1852        scan_data.rescan = SCSI_SCAN_MANUAL;
1853
1854        return device_for_each_child(&shost->shost_gendev, &scan_data,
1855                                     iscsi_user_scan_session);
1856}
1857
1858static void iscsi_scan_session(struct work_struct *work)
1859{
1860        struct iscsi_cls_session *session =
1861                        container_of(work, struct iscsi_cls_session, scan_work);
1862        struct Scsi_Host *shost = iscsi_session_to_shost(session);
1863        struct iscsi_cls_host *ihost = shost->shost_data;
1864        struct iscsi_scan_data scan_data;
1865
1866        scan_data.channel = 0;
1867        scan_data.id = SCAN_WILD_CARD;
1868        scan_data.lun = SCAN_WILD_CARD;
1869        scan_data.rescan = SCSI_SCAN_RESCAN;
1870
1871        iscsi_user_scan_session(&session->dev, &scan_data);
1872        atomic_dec(&ihost->nr_scans);
1873}
1874
1875/**
1876 * iscsi_block_scsi_eh - block scsi eh until session state has transistioned
1877 * @cmd: scsi cmd passed to scsi eh handler
1878 *
1879 * If the session is down this function will wait for the recovery
1880 * timer to fire or for the session to be logged back in. If the
1881 * recovery timer fires then FAST_IO_FAIL is returned. The caller
1882 * should pass this error value to the scsi eh.
1883 */
1884int iscsi_block_scsi_eh(struct scsi_cmnd *cmd)
1885{
1886        struct iscsi_cls_session *session =
1887                        starget_to_session(scsi_target(cmd->device));
1888        unsigned long flags;
1889        int ret = 0;
1890
1891        spin_lock_irqsave(&session->lock, flags);
1892        while (session->state != ISCSI_SESSION_LOGGED_IN) {
1893                if (session->state == ISCSI_SESSION_FREE) {
1894                        ret = FAST_IO_FAIL;
1895                        break;
1896                }
1897                spin_unlock_irqrestore(&session->lock, flags);
1898                msleep(1000);
1899                spin_lock_irqsave(&session->lock, flags);
1900        }
1901        spin_unlock_irqrestore(&session->lock, flags);
1902        return ret;
1903}
1904EXPORT_SYMBOL_GPL(iscsi_block_scsi_eh);
1905
1906static void session_recovery_timedout(struct work_struct *work)
1907{
1908        struct iscsi_cls_session *session =
1909                container_of(work, struct iscsi_cls_session,
1910                             recovery_work.work);
1911        unsigned long flags;
1912
1913        iscsi_cls_session_printk(KERN_INFO, session,
1914                                 "session recovery timed out after %d secs\n",
1915                                 session->recovery_tmo);
1916
1917        spin_lock_irqsave(&session->lock, flags);
1918        switch (session->state) {
1919        case ISCSI_SESSION_FAILED:
1920                session->state = ISCSI_SESSION_FREE;
1921                break;
1922        case ISCSI_SESSION_LOGGED_IN:
1923        case ISCSI_SESSION_FREE:
1924                /* we raced with the unblock's flush */
1925                spin_unlock_irqrestore(&session->lock, flags);
1926                return;
1927        }
1928        spin_unlock_irqrestore(&session->lock, flags);
1929
1930        if (session->transport->session_recovery_timedout)
1931                session->transport->session_recovery_timedout(session);
1932
1933        ISCSI_DBG_TRANS_SESSION(session, "Unblocking SCSI target\n");
1934        scsi_target_unblock(&session->dev, SDEV_TRANSPORT_OFFLINE);
1935        ISCSI_DBG_TRANS_SESSION(session, "Completed unblocking SCSI target\n");
1936}
1937
1938static void __iscsi_unblock_session(struct work_struct *work)
1939{
1940        struct iscsi_cls_session *session =
1941                        container_of(work, struct iscsi_cls_session,
1942                                     unblock_work);
1943        struct Scsi_Host *shost = iscsi_session_to_shost(session);
1944        struct iscsi_cls_host *ihost = shost->shost_data;
1945        unsigned long flags;
1946
1947        ISCSI_DBG_TRANS_SESSION(session, "Unblocking session\n");
1948        /*
1949         * The recovery and unblock work get run from the same workqueue,
1950         * so try to cancel it if it was going to run after this unblock.
1951         */
1952        cancel_delayed_work(&session->recovery_work);
1953        spin_lock_irqsave(&session->lock, flags);
1954        session->state = ISCSI_SESSION_LOGGED_IN;
1955        spin_unlock_irqrestore(&session->lock, flags);
1956        /* start IO */
1957        scsi_target_unblock(&session->dev, SDEV_RUNNING);
1958        /*
1959         * Only do kernel scanning if the driver is properly hooked into
1960         * the async scanning code (drivers like iscsi_tcp do login and
1961         * scanning from userspace).
1962         */
1963        if (shost->hostt->scan_finished) {
1964                if (scsi_queue_work(shost, &session->scan_work))
1965                        atomic_inc(&ihost->nr_scans);
1966        }
1967        ISCSI_DBG_TRANS_SESSION(session, "Completed unblocking session\n");
1968}
1969
1970/**
1971 * iscsi_unblock_session - set a session as logged in and start IO.
1972 * @session: iscsi session
1973 *
1974 * Mark a session as ready to accept IO.
1975 */
1976void iscsi_unblock_session(struct iscsi_cls_session *session)
1977{
1978        queue_work(iscsi_eh_timer_workq, &session->unblock_work);
1979        /*
1980         * Blocking the session can be done from any context so we only
1981         * queue the block work. Make sure the unblock work has completed
1982         * because it flushes/cancels the other works and updates the state.
1983         */
1984        flush_work(&session->unblock_work);
1985}
1986EXPORT_SYMBOL_GPL(iscsi_unblock_session);
1987
1988static void __iscsi_block_session(struct work_struct *work)
1989{
1990        struct iscsi_cls_session *session =
1991                        container_of(work, struct iscsi_cls_session,
1992                                     block_work);
1993        unsigned long flags;
1994
1995        ISCSI_DBG_TRANS_SESSION(session, "Blocking session\n");
1996        spin_lock_irqsave(&session->lock, flags);
1997        session->state = ISCSI_SESSION_FAILED;
1998        spin_unlock_irqrestore(&session->lock, flags);
1999        scsi_target_block(&session->dev);
2000        ISCSI_DBG_TRANS_SESSION(session, "Completed SCSI target blocking\n");
2001        if (session->recovery_tmo >= 0)
2002                queue_delayed_work(iscsi_eh_timer_workq,
2003                                   &session->recovery_work,
2004                                   session->recovery_tmo * HZ);
2005}
2006
2007void iscsi_block_session(struct iscsi_cls_session *session)
2008{
2009        queue_work(iscsi_eh_timer_workq, &session->block_work);
2010}
2011EXPORT_SYMBOL_GPL(iscsi_block_session);
2012
2013static void __iscsi_unbind_session(struct work_struct *work)
2014{
2015        struct iscsi_cls_session *session =
2016                        container_of(work, struct iscsi_cls_session,
2017                                     unbind_work);
2018        struct Scsi_Host *shost = iscsi_session_to_shost(session);
2019        struct iscsi_cls_host *ihost = shost->shost_data;
2020        unsigned long flags;
2021        unsigned int target_id;
2022
2023        ISCSI_DBG_TRANS_SESSION(session, "Unbinding session\n");
2024
2025        /* Prevent new scans and make sure scanning is not in progress */
2026        mutex_lock(&ihost->mutex);
2027        spin_lock_irqsave(&session->lock, flags);
2028        if (session->target_id == ISCSI_MAX_TARGET) {
2029                spin_unlock_irqrestore(&session->lock, flags);
2030                mutex_unlock(&ihost->mutex);
2031                goto unbind_session_exit;
2032        }
2033
2034        target_id = session->target_id;
2035        session->target_id = ISCSI_MAX_TARGET;
2036        spin_unlock_irqrestore(&session->lock, flags);
2037        mutex_unlock(&ihost->mutex);
2038
2039        scsi_remove_target(&session->dev);
2040
2041        if (session->ida_used)
2042                ida_simple_remove(&iscsi_sess_ida, target_id);
2043
2044unbind_session_exit:
2045        iscsi_session_event(session, ISCSI_KEVENT_UNBIND_SESSION);
2046        ISCSI_DBG_TRANS_SESSION(session, "Completed target removal\n");
2047}
2048
2049static void __iscsi_destroy_session(struct work_struct *work)
2050{
2051        struct iscsi_cls_session *session =
2052                container_of(work, struct iscsi_cls_session, destroy_work);
2053
2054        session->transport->destroy_session(session);
2055}
2056
2057struct iscsi_cls_session *
2058iscsi_alloc_session(struct Scsi_Host *shost, struct iscsi_transport *transport,
2059                    int dd_size)
2060{
2061        struct iscsi_cls_session *session;
2062
2063        session = kzalloc(sizeof(*session) + dd_size,
2064                          GFP_KERNEL);
2065        if (!session)
2066                return NULL;
2067
2068        session->transport = transport;
2069        session->creator = -1;
2070        session->recovery_tmo = 120;
2071        session->recovery_tmo_sysfs_override = false;
2072        session->state = ISCSI_SESSION_FREE;
2073        INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout);
2074        INIT_LIST_HEAD(&session->sess_list);
2075        INIT_WORK(&session->unblock_work, __iscsi_unblock_session);
2076        INIT_WORK(&session->block_work, __iscsi_block_session);
2077        INIT_WORK(&session->unbind_work, __iscsi_unbind_session);
2078        INIT_WORK(&session->scan_work, iscsi_scan_session);
2079        INIT_WORK(&session->destroy_work, __iscsi_destroy_session);
2080        spin_lock_init(&session->lock);
2081
2082        /* this is released in the dev's release function */
2083        scsi_host_get(shost);
2084        session->dev.parent = &shost->shost_gendev;
2085        session->dev.release = iscsi_session_release;
2086        device_initialize(&session->dev);
2087        if (dd_size)
2088                session->dd_data = &session[1];
2089
2090        ISCSI_DBG_TRANS_SESSION(session, "Completed session allocation\n");
2091        return session;
2092}
2093EXPORT_SYMBOL_GPL(iscsi_alloc_session);
2094
2095int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id)
2096{
2097        unsigned long flags;
2098        int id = 0;
2099        int err;
2100
2101        session->sid = atomic_add_return(1, &iscsi_session_nr);
2102
2103        if (target_id == ISCSI_MAX_TARGET) {
2104                id = ida_simple_get(&iscsi_sess_ida, 0, 0, GFP_KERNEL);
2105
2106                if (id < 0) {
2107                        iscsi_cls_session_printk(KERN_ERR, session,
2108                                        "Failure in Target ID Allocation\n");
2109                        return id;
2110                }
2111                session->target_id = (unsigned int)id;
2112                session->ida_used = true;
2113        } else
2114                session->target_id = target_id;
2115
2116        dev_set_name(&session->dev, "session%u", session->sid);
2117        err = device_add(&session->dev);
2118        if (err) {
2119                iscsi_cls_session_printk(KERN_ERR, session,
2120                                         "could not register session's dev\n");
2121                goto release_ida;
2122        }
2123        err = transport_register_device(&session->dev);
2124        if (err) {
2125                iscsi_cls_session_printk(KERN_ERR, session,
2126                                         "could not register transport's dev\n");
2127                goto release_dev;
2128        }
2129
2130        spin_lock_irqsave(&sesslock, flags);
2131        list_add(&session->sess_list, &sesslist);
2132        spin_unlock_irqrestore(&sesslock, flags);
2133
2134        iscsi_session_event(session, ISCSI_KEVENT_CREATE_SESSION);
2135        ISCSI_DBG_TRANS_SESSION(session, "Completed session adding\n");
2136        return 0;
2137
2138release_dev:
2139        device_del(&session->dev);
2140release_ida:
2141        if (session->ida_used)
2142                ida_simple_remove(&iscsi_sess_ida, session->target_id);
2143
2144        return err;
2145}
2146EXPORT_SYMBOL_GPL(iscsi_add_session);
2147
2148/**
2149 * iscsi_create_session - create iscsi class session
2150 * @shost: scsi host
2151 * @transport: iscsi transport
2152 * @dd_size: private driver data size
2153 * @target_id: which target
2154 *
2155 * This can be called from a LLD or iscsi_transport.
2156 */
2157struct iscsi_cls_session *
2158iscsi_create_session(struct Scsi_Host *shost, struct iscsi_transport *transport,
2159                     int dd_size, unsigned int target_id)
2160{
2161        struct iscsi_cls_session *session;
2162
2163        session = iscsi_alloc_session(shost, transport, dd_size);
2164        if (!session)
2165                return NULL;
2166
2167        if (iscsi_add_session(session, target_id)) {
2168                iscsi_free_session(session);
2169                return NULL;
2170        }
2171        return session;
2172}
2173EXPORT_SYMBOL_GPL(iscsi_create_session);
2174
2175static void iscsi_conn_release(struct device *dev)
2176{
2177        struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev);
2178        struct device *parent = conn->dev.parent;
2179
2180        ISCSI_DBG_TRANS_CONN(conn, "Releasing conn\n");
2181        kfree(conn);
2182        put_device(parent);
2183}
2184
2185static int iscsi_is_conn_dev(const struct device *dev)
2186{
2187        return dev->release == iscsi_conn_release;
2188}
2189
2190static int iscsi_iter_destroy_conn_fn(struct device *dev, void *data)
2191{
2192        if (!iscsi_is_conn_dev(dev))
2193                return 0;
2194        return iscsi_destroy_conn(iscsi_dev_to_conn(dev));
2195}
2196
2197void iscsi_remove_session(struct iscsi_cls_session *session)
2198{
2199        unsigned long flags;
2200        int err;
2201
2202        ISCSI_DBG_TRANS_SESSION(session, "Removing session\n");
2203
2204        spin_lock_irqsave(&sesslock, flags);
2205        if (!list_empty(&session->sess_list))
2206                list_del(&session->sess_list);
2207        spin_unlock_irqrestore(&sesslock, flags);
2208
2209        flush_work(&session->block_work);
2210        flush_work(&session->unblock_work);
2211        cancel_delayed_work_sync(&session->recovery_work);
2212        /*
2213         * If we are blocked let commands flow again. The lld or iscsi
2214         * layer should set up the queuecommand to fail commands.
2215         * We assume that LLD will not be calling block/unblock while
2216         * removing the session.
2217         */
2218        spin_lock_irqsave(&session->lock, flags);
2219        session->state = ISCSI_SESSION_FREE;
2220        spin_unlock_irqrestore(&session->lock, flags);
2221
2222        scsi_target_unblock(&session->dev, SDEV_TRANSPORT_OFFLINE);
2223        /* flush running scans then delete devices */
2224        flush_work(&session->scan_work);
2225        /* flush running unbind operations */
2226        flush_work(&session->unbind_work);
2227        __iscsi_unbind_session(&session->unbind_work);
2228
2229        /* hw iscsi may not have removed all connections from session */
2230        err = device_for_each_child(&session->dev, NULL,
2231                                    iscsi_iter_destroy_conn_fn);
2232        if (err)
2233                iscsi_cls_session_printk(KERN_ERR, session,
2234                                         "Could not delete all connections "
2235                                         "for session. Error %d.\n", err);
2236
2237        transport_unregister_device(&session->dev);
2238
2239        ISCSI_DBG_TRANS_SESSION(session, "Completing session removal\n");
2240        device_del(&session->dev);
2241}
2242EXPORT_SYMBOL_GPL(iscsi_remove_session);
2243
2244void iscsi_free_session(struct iscsi_cls_session *session)
2245{
2246        ISCSI_DBG_TRANS_SESSION(session, "Freeing session\n");
2247        iscsi_session_event(session, ISCSI_KEVENT_DESTROY_SESSION);
2248        put_device(&session->dev);
2249}
2250EXPORT_SYMBOL_GPL(iscsi_free_session);
2251
2252/**
2253 * iscsi_create_conn - create iscsi class connection
2254 * @session: iscsi cls session
2255 * @dd_size: private driver data size
2256 * @cid: connection id
2257 *
2258 * This can be called from a LLD or iscsi_transport. The connection
2259 * is child of the session so cid must be unique for all connections
2260 * on the session.
2261 *
2262 * Since we do not support MCS, cid will normally be zero. In some cases
2263 * for software iscsi we could be trying to preallocate a connection struct
2264 * in which case there could be two connection structs and cid would be
2265 * non-zero.
2266 */
2267struct iscsi_cls_conn *
2268iscsi_create_conn(struct iscsi_cls_session *session, int dd_size, uint32_t cid)
2269{
2270        struct iscsi_transport *transport = session->transport;
2271        struct iscsi_cls_conn *conn;
2272        unsigned long flags;
2273        int err;
2274
2275        conn = kzalloc(sizeof(*conn) + dd_size, GFP_KERNEL);
2276        if (!conn)
2277                return NULL;
2278        if (dd_size)
2279                conn->dd_data = &conn[1];
2280
2281        mutex_init(&conn->ep_mutex);
2282        INIT_LIST_HEAD(&conn->conn_list);
2283        INIT_LIST_HEAD(&conn->conn_list_err);
2284        conn->transport = transport;
2285        conn->cid = cid;
2286        conn->state = ISCSI_CONN_DOWN;
2287
2288        /* this is released in the dev's release function */
2289        if (!get_device(&session->dev))
2290                goto free_conn;
2291
2292        dev_set_name(&conn->dev, "connection%d:%u", session->sid, cid);
2293        conn->dev.parent = &session->dev;
2294        conn->dev.release = iscsi_conn_release;
2295        err = device_register(&conn->dev);
2296        if (err) {
2297                iscsi_cls_session_printk(KERN_ERR, session, "could not "
2298                                         "register connection's dev\n");
2299                goto release_parent_ref;
2300        }
2301        err = transport_register_device(&conn->dev);
2302        if (err) {
2303                iscsi_cls_session_printk(KERN_ERR, session, "could not "
2304                                         "register transport's dev\n");
2305                goto release_conn_ref;
2306        }
2307
2308        spin_lock_irqsave(&connlock, flags);
2309        list_add(&conn->conn_list, &connlist);
2310        spin_unlock_irqrestore(&connlock, flags);
2311
2312        ISCSI_DBG_TRANS_CONN(conn, "Completed conn creation\n");
2313        return conn;
2314
2315release_conn_ref:
2316        put_device(&conn->dev);
2317release_parent_ref:
2318        put_device(&session->dev);
2319free_conn:
2320        kfree(conn);
2321        return NULL;
2322}
2323
2324EXPORT_SYMBOL_GPL(iscsi_create_conn);
2325
2326/**
2327 * iscsi_destroy_conn - destroy iscsi class connection
2328 * @conn: iscsi cls session
2329 *
2330 * This can be called from a LLD or iscsi_transport.
2331 */
2332int iscsi_destroy_conn(struct iscsi_cls_conn *conn)
2333{
2334        unsigned long flags;
2335
2336        spin_lock_irqsave(&connlock, flags);
2337        list_del(&conn->conn_list);
2338        list_del(&conn->conn_list_err);
2339        spin_unlock_irqrestore(&connlock, flags);
2340
2341        transport_unregister_device(&conn->dev);
2342        ISCSI_DBG_TRANS_CONN(conn, "Completing conn destruction\n");
2343        device_unregister(&conn->dev);
2344        return 0;
2345}
2346EXPORT_SYMBOL_GPL(iscsi_destroy_conn);
2347
2348/*
2349 * iscsi interface functions
2350 */
2351static struct iscsi_internal *
2352iscsi_if_transport_lookup(struct iscsi_transport *tt)
2353{
2354        struct iscsi_internal *priv;
2355        unsigned long flags;
2356
2357        spin_lock_irqsave(&iscsi_transport_lock, flags);
2358        list_for_each_entry(priv, &iscsi_transports, list) {
2359                if (tt == priv->iscsi_transport) {
2360                        spin_unlock_irqrestore(&iscsi_transport_lock, flags);
2361                        return priv;
2362                }
2363        }
2364        spin_unlock_irqrestore(&iscsi_transport_lock, flags);
2365        return NULL;
2366}
2367
2368static int
2369iscsi_multicast_skb(struct sk_buff *skb, uint32_t group, gfp_t gfp)
2370{
2371        return nlmsg_multicast(nls, skb, 0, group, gfp);
2372}
2373
2374static int
2375iscsi_unicast_skb(struct sk_buff *skb, u32 portid)
2376{
2377        return nlmsg_unicast(nls, skb, portid);
2378}
2379
2380int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
2381                   char *data, uint32_t data_size)
2382{
2383        struct nlmsghdr *nlh;
2384        struct sk_buff *skb;
2385        struct iscsi_uevent *ev;
2386        char *pdu;
2387        struct iscsi_internal *priv;
2388        int len = nlmsg_total_size(sizeof(*ev) + sizeof(struct iscsi_hdr) +
2389                                   data_size);
2390
2391        priv = iscsi_if_transport_lookup(conn->transport);
2392        if (!priv)
2393                return -EINVAL;
2394
2395        skb = alloc_skb(len, GFP_ATOMIC);
2396        if (!skb) {
2397                iscsi_conn_error_event(conn, ISCSI_ERR_CONN_FAILED);
2398                iscsi_cls_conn_printk(KERN_ERR, conn, "can not deliver "
2399                                      "control PDU: OOM\n");
2400                return -ENOMEM;
2401        }
2402
2403        nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2404        ev = nlmsg_data(nlh);
2405        memset(ev, 0, sizeof(*ev));
2406        ev->transport_handle = iscsi_handle(conn->transport);
2407        ev->type = ISCSI_KEVENT_RECV_PDU;
2408        ev->r.recv_req.cid = conn->cid;
2409        ev->r.recv_req.sid = iscsi_conn_get_sid(conn);
2410        pdu = (char*)ev + sizeof(*ev);
2411        memcpy(pdu, hdr, sizeof(struct iscsi_hdr));
2412        memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size);
2413
2414        return iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
2415}
2416EXPORT_SYMBOL_GPL(iscsi_recv_pdu);
2417
2418int iscsi_offload_mesg(struct Scsi_Host *shost,
2419                       struct iscsi_transport *transport, uint32_t type,
2420                       char *data, uint16_t data_size)
2421{
2422        struct nlmsghdr *nlh;
2423        struct sk_buff *skb;
2424        struct iscsi_uevent *ev;
2425        int len = nlmsg_total_size(sizeof(*ev) + data_size);
2426
2427        skb = alloc_skb(len, GFP_ATOMIC);
2428        if (!skb) {
2429                printk(KERN_ERR "can not deliver iscsi offload message:OOM\n");
2430                return -ENOMEM;
2431        }
2432
2433        nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2434        ev = nlmsg_data(nlh);
2435        memset(ev, 0, sizeof(*ev));
2436        ev->type = type;
2437        ev->transport_handle = iscsi_handle(transport);
2438        switch (type) {
2439        case ISCSI_KEVENT_PATH_REQ:
2440                ev->r.req_path.host_no = shost->host_no;
2441                break;
2442        case ISCSI_KEVENT_IF_DOWN:
2443                ev->r.notify_if_down.host_no = shost->host_no;
2444                break;
2445        }
2446
2447        memcpy((char *)ev + sizeof(*ev), data, data_size);
2448
2449        return iscsi_multicast_skb(skb, ISCSI_NL_GRP_UIP, GFP_ATOMIC);
2450}
2451EXPORT_SYMBOL_GPL(iscsi_offload_mesg);
2452
2453/*
2454 * This can be called without the rx_queue_mutex, if invoked by the kernel
2455 * stop work. But, in that case, it is guaranteed not to race with
2456 * iscsi_destroy by conn_mutex.
2457 */
2458static void iscsi_if_stop_conn(struct iscsi_cls_conn *conn, int flag)
2459{
2460        /*
2461         * It is important that this path doesn't rely on
2462         * rx_queue_mutex, otherwise, a thread doing allocation on a
2463         * start_session/start_connection could sleep waiting on a
2464         * writeback to a failed iscsi device, that cannot be recovered
2465         * because the lock is held.  If we don't hold it here, the
2466         * kernel stop_conn_work_fn has a chance to stop the broken
2467         * session and resolve the allocation.
2468         *
2469         * Still, the user invoked .stop_conn() needs to be serialized
2470         * with stop_conn_work_fn by a private mutex.  Not pretty, but
2471         * it works.
2472         */
2473        mutex_lock(&conn_mutex);
2474        conn->transport->stop_conn(conn, flag);
2475        mutex_unlock(&conn_mutex);
2476
2477}
2478
2479static void stop_conn_work_fn(struct work_struct *work)
2480{
2481        struct iscsi_cls_conn *conn, *tmp;
2482        unsigned long flags;
2483        LIST_HEAD(recovery_list);
2484
2485        spin_lock_irqsave(&connlock, flags);
2486        if (list_empty(&connlist_err)) {
2487                spin_unlock_irqrestore(&connlock, flags);
2488                return;
2489        }
2490        list_splice_init(&connlist_err, &recovery_list);
2491        spin_unlock_irqrestore(&connlock, flags);
2492
2493        list_for_each_entry_safe(conn, tmp, &recovery_list, conn_list_err) {
2494                uint32_t sid = iscsi_conn_get_sid(conn);
2495                struct iscsi_cls_session *session;
2496
2497                session = iscsi_session_lookup(sid);
2498                if (session) {
2499                        if (system_state != SYSTEM_RUNNING) {
2500                                session->recovery_tmo = 0;
2501                                iscsi_if_stop_conn(conn, STOP_CONN_TERM);
2502                        } else {
2503                                iscsi_if_stop_conn(conn, STOP_CONN_RECOVER);
2504                        }
2505                }
2506
2507                list_del_init(&conn->conn_list_err);
2508        }
2509}
2510
2511void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error)
2512{
2513        struct nlmsghdr *nlh;
2514        struct sk_buff  *skb;
2515        struct iscsi_uevent *ev;
2516        struct iscsi_internal *priv;
2517        int len = nlmsg_total_size(sizeof(*ev));
2518        unsigned long flags;
2519
2520        spin_lock_irqsave(&connlock, flags);
2521        list_add(&conn->conn_list_err, &connlist_err);
2522        spin_unlock_irqrestore(&connlock, flags);
2523        queue_work(system_unbound_wq, &stop_conn_work);
2524
2525        priv = iscsi_if_transport_lookup(conn->transport);
2526        if (!priv)
2527                return;
2528
2529        skb = alloc_skb(len, GFP_ATOMIC);
2530        if (!skb) {
2531                iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored "
2532                                      "conn error (%d)\n", error);
2533                return;
2534        }
2535
2536        nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2537        ev = nlmsg_data(nlh);
2538        ev->transport_handle = iscsi_handle(conn->transport);
2539        ev->type = ISCSI_KEVENT_CONN_ERROR;
2540        ev->r.connerror.error = error;
2541        ev->r.connerror.cid = conn->cid;
2542        ev->r.connerror.sid = iscsi_conn_get_sid(conn);
2543
2544        iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
2545
2546        iscsi_cls_conn_printk(KERN_INFO, conn, "detected conn error (%d)\n",
2547                              error);
2548}
2549EXPORT_SYMBOL_GPL(iscsi_conn_error_event);
2550
2551void iscsi_conn_login_event(struct iscsi_cls_conn *conn,
2552                            enum iscsi_conn_state state)
2553{
2554        struct nlmsghdr *nlh;
2555        struct sk_buff  *skb;
2556        struct iscsi_uevent *ev;
2557        struct iscsi_internal *priv;
2558        int len = nlmsg_total_size(sizeof(*ev));
2559
2560        priv = iscsi_if_transport_lookup(conn->transport);
2561        if (!priv)
2562                return;
2563
2564        skb = alloc_skb(len, GFP_ATOMIC);
2565        if (!skb) {
2566                iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored "
2567                                      "conn login (%d)\n", state);
2568                return;
2569        }
2570
2571        nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2572        ev = nlmsg_data(nlh);
2573        ev->transport_handle = iscsi_handle(conn->transport);
2574        ev->type = ISCSI_KEVENT_CONN_LOGIN_STATE;
2575        ev->r.conn_login.state = state;
2576        ev->r.conn_login.cid = conn->cid;
2577        ev->r.conn_login.sid = iscsi_conn_get_sid(conn);
2578        iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
2579
2580        iscsi_cls_conn_printk(KERN_INFO, conn, "detected conn login (%d)\n",
2581                              state);
2582}
2583EXPORT_SYMBOL_GPL(iscsi_conn_login_event);
2584
2585void iscsi_post_host_event(uint32_t host_no, struct iscsi_transport *transport,
2586                           enum iscsi_host_event_code code, uint32_t data_size,
2587                           uint8_t *data)
2588{
2589        struct nlmsghdr *nlh;
2590        struct sk_buff *skb;
2591        struct iscsi_uevent *ev;
2592        int len = nlmsg_total_size(sizeof(*ev) + data_size);
2593
2594        skb = alloc_skb(len, GFP_NOIO);
2595        if (!skb) {
2596                printk(KERN_ERR "gracefully ignored host event (%d):%d OOM\n",
2597                       host_no, code);
2598                return;
2599        }
2600
2601        nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2602        ev = nlmsg_data(nlh);
2603        ev->transport_handle = iscsi_handle(transport);
2604        ev->type = ISCSI_KEVENT_HOST_EVENT;
2605        ev->r.host_event.host_no = host_no;
2606        ev->r.host_event.code = code;
2607        ev->r.host_event.data_size = data_size;
2608
2609        if (data_size)
2610                memcpy((char *)ev + sizeof(*ev), data, data_size);
2611
2612        iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_NOIO);
2613}
2614EXPORT_SYMBOL_GPL(iscsi_post_host_event);
2615
2616void iscsi_ping_comp_event(uint32_t host_no, struct iscsi_transport *transport,
2617                           uint32_t status, uint32_t pid, uint32_t data_size,
2618                           uint8_t *data)
2619{
2620        struct nlmsghdr *nlh;
2621        struct sk_buff *skb;
2622        struct iscsi_uevent *ev;
2623        int len = nlmsg_total_size(sizeof(*ev) + data_size);
2624
2625        skb = alloc_skb(len, GFP_NOIO);
2626        if (!skb) {
2627                printk(KERN_ERR "gracefully ignored ping comp: OOM\n");
2628                return;
2629        }
2630
2631        nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2632        ev = nlmsg_data(nlh);
2633        ev->transport_handle = iscsi_handle(transport);
2634        ev->type = ISCSI_KEVENT_PING_COMP;
2635        ev->r.ping_comp.host_no = host_no;
2636        ev->r.ping_comp.status = status;
2637        ev->r.ping_comp.pid = pid;
2638        ev->r.ping_comp.data_size = data_size;
2639        memcpy((char *)ev + sizeof(*ev), data, data_size);
2640
2641        iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_NOIO);
2642}
2643EXPORT_SYMBOL_GPL(iscsi_ping_comp_event);
2644
2645static int
2646iscsi_if_send_reply(u32 portid, int type, void *payload, int size)
2647{
2648        struct sk_buff  *skb;
2649        struct nlmsghdr *nlh;
2650        int len = nlmsg_total_size(size);
2651
2652        skb = alloc_skb(len, GFP_ATOMIC);
2653        if (!skb) {
2654                printk(KERN_ERR "Could not allocate skb to send reply.\n");
2655                return -ENOMEM;
2656        }
2657
2658        nlh = __nlmsg_put(skb, 0, 0, type, (len - sizeof(*nlh)), 0);
2659        memcpy(nlmsg_data(nlh), payload, size);
2660        return iscsi_unicast_skb(skb, portid);
2661}
2662
2663static int
2664iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
2665{
2666        struct iscsi_uevent *ev = nlmsg_data(nlh);
2667        struct iscsi_stats *stats;
2668        struct sk_buff *skbstat;
2669        struct iscsi_cls_conn *conn;
2670        struct nlmsghdr *nlhstat;
2671        struct iscsi_uevent *evstat;
2672        struct iscsi_internal *priv;
2673        int len = nlmsg_total_size(sizeof(*ev) +
2674                                   sizeof(struct iscsi_stats) +
2675                                   sizeof(struct iscsi_stats_custom) *
2676                                   ISCSI_STATS_CUSTOM_MAX);
2677        int err = 0;
2678
2679        priv = iscsi_if_transport_lookup(transport);
2680        if (!priv)
2681                return -EINVAL;
2682
2683        conn = iscsi_conn_lookup(ev->u.get_stats.sid, ev->u.get_stats.cid);
2684        if (!conn)
2685                return -EEXIST;
2686
2687        do {
2688                int actual_size;
2689
2690                skbstat = alloc_skb(len, GFP_ATOMIC);
2691                if (!skbstat) {
2692                        iscsi_cls_conn_printk(KERN_ERR, conn, "can not "
2693                                              "deliver stats: OOM\n");
2694                        return -ENOMEM;
2695                }
2696
2697                nlhstat = __nlmsg_put(skbstat, 0, 0, 0,
2698                                      (len - sizeof(*nlhstat)), 0);
2699                evstat = nlmsg_data(nlhstat);
2700                memset(evstat, 0, sizeof(*evstat));
2701                evstat->transport_handle = iscsi_handle(conn->transport);
2702                evstat->type = nlh->nlmsg_type;
2703                evstat->u.get_stats.cid =
2704                        ev->u.get_stats.cid;
2705                evstat->u.get_stats.sid =
2706                        ev->u.get_stats.sid;
2707                stats = (struct iscsi_stats *)
2708                        ((char*)evstat + sizeof(*evstat));
2709                memset(stats, 0, sizeof(*stats));
2710
2711                transport->get_stats(conn, stats);
2712                actual_size = nlmsg_total_size(sizeof(struct iscsi_uevent) +
2713                                               sizeof(struct iscsi_stats) +
2714                                               sizeof(struct iscsi_stats_custom) *
2715                                               stats->custom_length);
2716                actual_size -= sizeof(*nlhstat);
2717                actual_size = nlmsg_msg_size(actual_size);
2718                skb_trim(skbstat, NLMSG_ALIGN(actual_size));
2719                nlhstat->nlmsg_len = actual_size;
2720
2721                err = iscsi_multicast_skb(skbstat, ISCSI_NL_GRP_ISCSID,
2722                                          GFP_ATOMIC);
2723        } while (err < 0 && err != -ECONNREFUSED);
2724
2725        return err;
2726}
2727
2728/**
2729 * iscsi_session_event - send session destr. completion event
2730 * @session: iscsi class session
2731 * @event: type of event
2732 */
2733int iscsi_session_event(struct iscsi_cls_session *session,
2734                        enum iscsi_uevent_e event)
2735{
2736        struct iscsi_internal *priv;
2737        struct Scsi_Host *shost;
2738        struct iscsi_uevent *ev;
2739        struct sk_buff  *skb;
2740        struct nlmsghdr *nlh;
2741        int rc, len = nlmsg_total_size(sizeof(*ev));
2742
2743        priv = iscsi_if_transport_lookup(session->transport);
2744        if (!priv)
2745                return -EINVAL;
2746        shost = iscsi_session_to_shost(session);
2747
2748        skb = alloc_skb(len, GFP_KERNEL);
2749        if (!skb) {
2750                iscsi_cls_session_printk(KERN_ERR, session,
2751                                         "Cannot notify userspace of session "
2752                                         "event %u\n", event);
2753                return -ENOMEM;
2754        }
2755
2756        nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2757        ev = nlmsg_data(nlh);
2758        ev->transport_handle = iscsi_handle(session->transport);
2759
2760        ev->type = event;
2761        switch (event) {
2762        case ISCSI_KEVENT_DESTROY_SESSION:
2763                ev->r.d_session.host_no = shost->host_no;
2764                ev->r.d_session.sid = session->sid;
2765                break;
2766        case ISCSI_KEVENT_CREATE_SESSION:
2767                ev->r.c_session_ret.host_no = shost->host_no;
2768                ev->r.c_session_ret.sid = session->sid;
2769                break;
2770        case ISCSI_KEVENT_UNBIND_SESSION:
2771                ev->r.unbind_session.host_no = shost->host_no;
2772                ev->r.unbind_session.sid = session->sid;
2773                break;
2774        default:
2775                iscsi_cls_session_printk(KERN_ERR, session, "Invalid event "
2776                                         "%u.\n", event);
2777                kfree_skb(skb);
2778                return -EINVAL;
2779        }
2780
2781        /*
2782         * this will occur if the daemon is not up, so we just warn
2783         * the user and when the daemon is restarted it will handle it
2784         */
2785        rc = iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_KERNEL);
2786        if (rc == -ESRCH)
2787                iscsi_cls_session_printk(KERN_ERR, session,
2788                                         "Cannot notify userspace of session "
2789                                         "event %u. Check iscsi daemon\n",
2790                                         event);
2791
2792        ISCSI_DBG_TRANS_SESSION(session, "Completed handling event %d rc %d\n",
2793                                event, rc);
2794        return rc;
2795}
2796EXPORT_SYMBOL_GPL(iscsi_session_event);
2797
2798static int
2799iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_endpoint *ep,
2800                        struct iscsi_uevent *ev, pid_t pid,
2801                        uint32_t initial_cmdsn, uint16_t cmds_max,
2802                        uint16_t queue_depth)
2803{
2804        struct iscsi_transport *transport = priv->iscsi_transport;
2805        struct iscsi_cls_session *session;
2806        struct Scsi_Host *shost;
2807
2808        session = transport->create_session(ep, cmds_max, queue_depth,
2809                                            initial_cmdsn);
2810        if (!session)
2811                return -ENOMEM;
2812
2813        session->creator = pid;
2814        shost = iscsi_session_to_shost(session);
2815        ev->r.c_session_ret.host_no = shost->host_no;
2816        ev->r.c_session_ret.sid = session->sid;
2817        ISCSI_DBG_TRANS_SESSION(session,
2818                                "Completed creating transport session\n");
2819        return 0;
2820}
2821
2822static int
2823iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev)
2824{
2825        struct iscsi_cls_conn *conn;
2826        struct iscsi_cls_session *session;
2827
2828        session = iscsi_session_lookup(ev->u.c_conn.sid);
2829        if (!session) {
2830                printk(KERN_ERR "iscsi: invalid session %d.\n",
2831                       ev->u.c_conn.sid);
2832                return -EINVAL;
2833        }
2834
2835        conn = transport->create_conn(session, ev->u.c_conn.cid);
2836        if (!conn) {
2837                iscsi_cls_session_printk(KERN_ERR, session,
2838                                         "couldn't create a new connection.");
2839                return -ENOMEM;
2840        }
2841
2842        ev->r.c_conn_ret.sid = session->sid;
2843        ev->r.c_conn_ret.cid = conn->cid;
2844
2845        ISCSI_DBG_TRANS_CONN(conn, "Completed creating transport conn\n");
2846        return 0;
2847}
2848
2849static int
2850iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev)
2851{
2852        struct iscsi_cls_conn *conn;
2853        unsigned long flags;
2854
2855        conn = iscsi_conn_lookup(ev->u.d_conn.sid, ev->u.d_conn.cid);
2856        if (!conn)
2857                return -EINVAL;
2858
2859        spin_lock_irqsave(&connlock, flags);
2860        if (!list_empty(&conn->conn_list_err)) {
2861                spin_unlock_irqrestore(&connlock, flags);
2862                return -EAGAIN;
2863        }
2864        spin_unlock_irqrestore(&connlock, flags);
2865
2866        ISCSI_DBG_TRANS_CONN(conn, "Destroying transport conn\n");
2867
2868        mutex_lock(&conn_mutex);
2869        if (transport->destroy_conn)
2870                transport->destroy_conn(conn);
2871        mutex_unlock(&conn_mutex);
2872
2873        return 0;
2874}
2875
2876static int
2877iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
2878{
2879        char *data = (char*)ev + sizeof(*ev);
2880        struct iscsi_cls_conn *conn;
2881        struct iscsi_cls_session *session;
2882        int err = 0, value = 0;
2883
2884        session = iscsi_session_lookup(ev->u.set_param.sid);
2885        conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid);
2886        if (!conn || !session)
2887                return -EINVAL;
2888
2889        switch (ev->u.set_param.param) {
2890        case ISCSI_PARAM_SESS_RECOVERY_TMO:
2891                sscanf(data, "%d", &value);
2892                if (!session->recovery_tmo_sysfs_override)
2893                        session->recovery_tmo = value;
2894                break;
2895        default:
2896                err = transport->set_param(conn, ev->u.set_param.param,
2897                                           data, ev->u.set_param.len);
2898        }
2899
2900        return err;
2901}
2902
2903static int iscsi_if_ep_connect(struct iscsi_transport *transport,
2904                               struct iscsi_uevent *ev, int msg_type)
2905{
2906        struct iscsi_endpoint *ep;
2907        struct sockaddr *dst_addr;
2908        struct Scsi_Host *shost = NULL;
2909        int non_blocking, err = 0;
2910
2911        if (!transport->ep_connect)
2912                return -EINVAL;
2913
2914        if (msg_type == ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST) {
2915                shost = scsi_host_lookup(ev->u.ep_connect_through_host.host_no);
2916                if (!shost) {
2917                        printk(KERN_ERR "ep connect failed. Could not find "
2918                               "host no %u\n",
2919                               ev->u.ep_connect_through_host.host_no);
2920                        return -ENODEV;
2921                }
2922                non_blocking = ev->u.ep_connect_through_host.non_blocking;
2923        } else
2924                non_blocking = ev->u.ep_connect.non_blocking;
2925
2926        dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
2927        ep = transport->ep_connect(shost, dst_addr, non_blocking);
2928        if (IS_ERR(ep)) {
2929                err = PTR_ERR(ep);
2930                goto release_host;
2931        }
2932
2933        ev->r.ep_connect_ret.handle = ep->id;
2934release_host:
2935        if (shost)
2936                scsi_host_put(shost);
2937        return err;
2938}
2939
2940static int iscsi_if_ep_disconnect(struct iscsi_transport *transport,
2941                                  u64 ep_handle)
2942{
2943        struct iscsi_cls_conn *conn;
2944        struct iscsi_endpoint *ep;
2945
2946        if (!transport->ep_disconnect)
2947                return -EINVAL;
2948
2949        ep = iscsi_lookup_endpoint(ep_handle);
2950        if (!ep)
2951                return -EINVAL;
2952        conn = ep->conn;
2953        if (conn) {
2954                mutex_lock(&conn->ep_mutex);
2955                conn->ep = NULL;
2956                mutex_unlock(&conn->ep_mutex);
2957        }
2958
2959        transport->ep_disconnect(ep);
2960        return 0;
2961}
2962
2963static int
2964iscsi_if_transport_ep(struct iscsi_transport *transport,
2965                      struct iscsi_uevent *ev, int msg_type)
2966{
2967        struct iscsi_endpoint *ep;
2968        int rc = 0;
2969
2970        switch (msg_type) {
2971        case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST:
2972        case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
2973                rc = iscsi_if_ep_connect(transport, ev, msg_type);
2974                break;
2975        case ISCSI_UEVENT_TRANSPORT_EP_POLL:
2976                if (!transport->ep_poll)
2977                        return -EINVAL;
2978
2979                ep = iscsi_lookup_endpoint(ev->u.ep_poll.ep_handle);
2980                if (!ep)
2981                        return -EINVAL;
2982
2983                ev->r.retcode = transport->ep_poll(ep,
2984                                                   ev->u.ep_poll.timeout_ms);
2985                break;
2986        case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
2987                rc = iscsi_if_ep_disconnect(transport,
2988                                            ev->u.ep_disconnect.ep_handle);
2989                break;
2990        }
2991        return rc;
2992}
2993
2994static int
2995iscsi_tgt_dscvr(struct iscsi_transport *transport,
2996                struct iscsi_uevent *ev)
2997{
2998        struct Scsi_Host *shost;
2999        struct sockaddr *dst_addr;
3000        int err;
3001
3002        if (!transport->tgt_dscvr)
3003                return -EINVAL;
3004
3005        shost = scsi_host_lookup(ev->u.tgt_dscvr.host_no);
3006        if (!shost) {
3007                printk(KERN_ERR "target discovery could not find host no %u\n",
3008                       ev->u.tgt_dscvr.host_no);
3009                return -ENODEV;
3010        }
3011
3012
3013        dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
3014        err = transport->tgt_dscvr(shost, ev->u.tgt_dscvr.type,
3015                                   ev->u.tgt_dscvr.enable, dst_addr);
3016        scsi_host_put(shost);
3017        return err;
3018}
3019
3020static int
3021iscsi_set_host_param(struct iscsi_transport *transport,
3022                     struct iscsi_uevent *ev)
3023{
3024        char *data = (char*)ev + sizeof(*ev);
3025        struct Scsi_Host *shost;
3026        int err;
3027
3028        if (!transport->set_host_param)
3029                return -ENOSYS;
3030
3031        shost = scsi_host_lookup(ev->u.set_host_param.host_no);
3032        if (!shost) {
3033                printk(KERN_ERR "set_host_param could not find host no %u\n",
3034                       ev->u.set_host_param.host_no);
3035                return -ENODEV;
3036        }
3037
3038        err = transport->set_host_param(shost, ev->u.set_host_param.param,
3039                                        data, ev->u.set_host_param.len);
3040        scsi_host_put(shost);
3041        return err;
3042}
3043
3044static int
3045iscsi_set_path(struct iscsi_transport *transport, struct iscsi_uevent *ev)
3046{
3047        struct Scsi_Host *shost;
3048        struct iscsi_path *params;
3049        int err;
3050
3051        if (!transport->set_path)
3052                return -ENOSYS;
3053
3054        shost = scsi_host_lookup(ev->u.set_path.host_no);
3055        if (!shost) {
3056                printk(KERN_ERR "set path could not find host no %u\n",
3057                       ev->u.set_path.host_no);
3058                return -ENODEV;
3059        }
3060
3061        params = (struct iscsi_path *)((char *)ev + sizeof(*ev));
3062        err = transport->set_path(shost, params);
3063
3064        scsi_host_put(shost);
3065        return err;
3066}
3067
3068static int iscsi_session_has_conns(int sid)
3069{
3070        struct iscsi_cls_conn *conn;
3071        unsigned long flags;
3072        int found = 0;
3073
3074        spin_lock_irqsave(&connlock, flags);
3075        list_for_each_entry(conn, &connlist, conn_list) {
3076                if (iscsi_conn_get_sid(conn) == sid) {
3077                        found = 1;
3078                        break;
3079                }
3080        }
3081        spin_unlock_irqrestore(&connlock, flags);
3082
3083        return found;
3084}
3085
3086static int
3087iscsi_set_iface_params(struct iscsi_transport *transport,
3088                       struct iscsi_uevent *ev, uint32_t len)
3089{
3090        char *data = (char *)ev + sizeof(*ev);
3091        struct Scsi_Host *shost;
3092        int err;
3093
3094        if (!transport->set_iface_param)
3095                return -ENOSYS;
3096
3097        shost = scsi_host_lookup(ev->u.set_iface_params.host_no);
3098        if (!shost) {
3099                printk(KERN_ERR "set_iface_params could not find host no %u\n",
3100                       ev->u.set_iface_params.host_no);
3101                return -ENODEV;
3102        }
3103
3104        err = transport->set_iface_param(shost, data, len);
3105        scsi_host_put(shost);
3106        return err;
3107}
3108
3109static int
3110iscsi_send_ping(struct iscsi_transport *transport, struct iscsi_uevent *ev)
3111{
3112        struct Scsi_Host *shost;
3113        struct sockaddr *dst_addr;
3114        int err;
3115
3116        if (!transport->send_ping)
3117                return -ENOSYS;
3118
3119        shost = scsi_host_lookup(ev->u.iscsi_ping.host_no);
3120        if (!shost) {
3121                printk(KERN_ERR "iscsi_ping could not find host no %u\n",
3122                       ev->u.iscsi_ping.host_no);
3123                return -ENODEV;
3124        }
3125
3126        dst_addr = (struct sockaddr *)((char *)ev + sizeof(*ev));
3127        err = transport->send_ping(shost, ev->u.iscsi_ping.iface_num,
3128                                   ev->u.iscsi_ping.iface_type,
3129                                   ev->u.iscsi_ping.payload_size,
3130                                   ev->u.iscsi_ping.pid,
3131                                   dst_addr);
3132        scsi_host_put(shost);
3133        return err;
3134}
3135
3136static int
3137iscsi_get_chap(struct iscsi_transport *transport, struct nlmsghdr *nlh)
3138{
3139        struct iscsi_uevent *ev = nlmsg_data(nlh);
3140        struct Scsi_Host *shost = NULL;
3141        struct iscsi_chap_rec *chap_rec;
3142        struct iscsi_internal *priv;
3143        struct sk_buff *skbchap;
3144        struct nlmsghdr *nlhchap;
3145        struct iscsi_uevent *evchap;
3146        uint32_t chap_buf_size;
3147        int len, err = 0;
3148        char *buf;
3149
3150        if (!transport->get_chap)
3151                return -EINVAL;
3152
3153        priv = iscsi_if_transport_lookup(transport);
3154        if (!priv)
3155                return -EINVAL;
3156
3157        chap_buf_size = (ev->u.get_chap.num_entries * sizeof(*chap_rec));
3158        len = nlmsg_total_size(sizeof(*ev) + chap_buf_size);
3159
3160        shost = scsi_host_lookup(ev->u.get_chap.host_no);
3161        if (!shost) {
3162                printk(KERN_ERR "%s: failed. Could not find host no %u\n",
3163                       __func__, ev->u.get_chap.host_no);
3164                return -ENODEV;
3165        }
3166
3167        do {
3168                int actual_size;
3169
3170                skbchap = alloc_skb(len, GFP_KERNEL);
3171                if (!skbchap) {
3172                        printk(KERN_ERR "can not deliver chap: OOM\n");
3173                        err = -ENOMEM;
3174                        goto exit_get_chap;
3175                }
3176
3177                nlhchap = __nlmsg_put(skbchap, 0, 0, 0,
3178                                      (len - sizeof(*nlhchap)), 0);
3179                evchap = nlmsg_data(nlhchap);
3180                memset(evchap, 0, sizeof(*evchap));
3181                evchap->transport_handle = iscsi_handle(transport);
3182                evchap->type = nlh->nlmsg_type;
3183                evchap->u.get_chap.host_no = ev->u.get_chap.host_no;
3184                evchap->u.get_chap.chap_tbl_idx = ev->u.get_chap.chap_tbl_idx;
3185                evchap->u.get_chap.num_entries = ev->u.get_chap.num_entries;
3186                buf = (char *)evchap + sizeof(*evchap);
3187                memset(buf, 0, chap_buf_size);
3188
3189                err = transport->get_chap(shost, ev->u.get_chap.chap_tbl_idx,
3190                                    &evchap->u.get_chap.num_entries, buf);
3191
3192                actual_size = nlmsg_total_size(sizeof(*ev) + chap_buf_size);
3193                skb_trim(skbchap, NLMSG_ALIGN(actual_size));
3194                nlhchap->nlmsg_len = actual_size;
3195
3196                err = iscsi_multicast_skb(skbchap, ISCSI_NL_GRP_ISCSID,
3197                                          GFP_KERNEL);
3198        } while (err < 0 && err != -ECONNREFUSED);
3199
3200exit_get_chap:
3201        scsi_host_put(shost);
3202        return err;
3203}
3204
3205static int iscsi_set_chap(struct iscsi_transport *transport,
3206                          struct iscsi_uevent *ev, uint32_t len)
3207{
3208        char *data = (char *)ev + sizeof(*ev);
3209        struct Scsi_Host *shost;
3210        int err = 0;
3211
3212        if (!transport->set_chap)
3213                return -ENOSYS;
3214
3215        shost = scsi_host_lookup(ev->u.set_path.host_no);
3216        if (!shost) {
3217                pr_err("%s could not find host no %u\n",
3218                       __func__, ev->u.set_path.host_no);
3219                return -ENODEV;
3220        }
3221
3222        err = transport->set_chap(shost, data, len);
3223        scsi_host_put(shost);
3224        return err;
3225}
3226
3227static int iscsi_delete_chap(struct iscsi_transport *transport,
3228                             struct iscsi_uevent *ev)
3229{
3230        struct Scsi_Host *shost;
3231        int err = 0;
3232
3233        if (!transport->delete_chap)
3234                return -ENOSYS;
3235
3236        shost = scsi_host_lookup(ev->u.delete_chap.host_no);
3237        if (!shost) {
3238                printk(KERN_ERR "%s could not find host no %u\n",
3239                       __func__, ev->u.delete_chap.host_no);
3240                return -ENODEV;
3241        }
3242
3243        err = transport->delete_chap(shost, ev->u.delete_chap.chap_tbl_idx);
3244        scsi_host_put(shost);
3245        return err;
3246}
3247
3248static const struct {
3249        enum iscsi_discovery_parent_type value;
3250        char                            *name;
3251} iscsi_discovery_parent_names[] = {
3252        {ISCSI_DISC_PARENT_UNKNOWN,     "Unknown" },
3253        {ISCSI_DISC_PARENT_SENDTGT,     "Sendtarget" },
3254        {ISCSI_DISC_PARENT_ISNS,        "isns" },
3255};
3256
3257char *iscsi_get_discovery_parent_name(int parent_type)
3258{
3259        int i;
3260        char *state = "Unknown!";
3261
3262        for (i = 0; i < ARRAY_SIZE(iscsi_discovery_parent_names); i++) {
3263                if (iscsi_discovery_parent_names[i].value & parent_type) {
3264                        state = iscsi_discovery_parent_names[i].name;
3265                        break;
3266                }
3267        }
3268        return state;
3269}
3270EXPORT_SYMBOL_GPL(iscsi_get_discovery_parent_name);
3271
3272static int iscsi_set_flashnode_param(struct iscsi_transport *transport,
3273                                     struct iscsi_uevent *ev, uint32_t len)
3274{
3275        char *data = (char *)ev + sizeof(*ev);
3276        struct Scsi_Host *shost;
3277        struct iscsi_bus_flash_session *fnode_sess;
3278        struct iscsi_bus_flash_conn *fnode_conn;
3279        struct device *dev;
3280        uint32_t idx;
3281        int err = 0;
3282
3283        if (!transport->set_flashnode_param) {
3284                err = -ENOSYS;
3285                goto exit_set_fnode;
3286        }
3287
3288        shost = scsi_host_lookup(ev->u.set_flashnode.host_no);
3289        if (!shost) {
3290                pr_err("%s could not find host no %u\n",
3291                       __func__, ev->u.set_flashnode.host_no);
3292                err = -ENODEV;
3293                goto exit_set_fnode;
3294        }
3295
3296        idx = ev->u.set_flashnode.flashnode_idx;
3297        fnode_sess = iscsi_get_flashnode_by_index(shost, idx);
3298        if (!fnode_sess) {
3299                pr_err("%s could not find flashnode %u for host no %u\n",
3300                       __func__, idx, ev->u.set_flashnode.host_no);
3301                err = -ENODEV;
3302                goto put_host;
3303        }
3304
3305        dev = iscsi_find_flashnode_conn(fnode_sess);
3306        if (!dev) {
3307                err = -ENODEV;
3308                goto put_sess;
3309        }
3310
3311        fnode_conn = iscsi_dev_to_flash_conn(dev);
3312        err = transport->set_flashnode_param(fnode_sess, fnode_conn, data, len);
3313        put_device(dev);
3314
3315put_sess:
3316        put_device(&fnode_sess->dev);
3317
3318put_host:
3319        scsi_host_put(shost);
3320
3321exit_set_fnode:
3322        return err;
3323}
3324
3325static int iscsi_new_flashnode(struct iscsi_transport *transport,
3326                               struct iscsi_uevent *ev, uint32_t len)
3327{
3328        char *data = (char *)ev + sizeof(*ev);
3329        struct Scsi_Host *shost;
3330        int index;
3331        int err = 0;
3332
3333        if (!transport->new_flashnode) {
3334                err = -ENOSYS;
3335                goto exit_new_fnode;
3336        }
3337
3338        shost = scsi_host_lookup(ev->u.new_flashnode.host_no);
3339        if (!shost) {
3340                pr_err("%s could not find host no %u\n",
3341                       __func__, ev->u.new_flashnode.host_no);
3342                err = -ENODEV;
3343                goto put_host;
3344        }
3345
3346        index = transport->new_flashnode(shost, data, len);
3347
3348        if (index >= 0)
3349                ev->r.new_flashnode_ret.flashnode_idx = index;
3350        else
3351                err = -EIO;
3352
3353put_host:
3354        scsi_host_put(shost);
3355
3356exit_new_fnode:
3357        return err;
3358}
3359
3360static int iscsi_del_flashnode(struct iscsi_transport *transport,
3361                               struct iscsi_uevent *ev)
3362{
3363        struct Scsi_Host *shost;
3364        struct iscsi_bus_flash_session *fnode_sess;
3365        uint32_t idx;
3366        int err = 0;
3367
3368        if (!transport->del_flashnode) {
3369                err = -ENOSYS;
3370                goto exit_del_fnode;
3371        }
3372
3373        shost = scsi_host_lookup(ev->u.del_flashnode.host_no);
3374        if (!shost) {
3375                pr_err("%s could not find host no %u\n",
3376                       __func__, ev->u.del_flashnode.host_no);
3377                err = -ENODEV;
3378                goto put_host;
3379        }
3380
3381        idx = ev->u.del_flashnode.flashnode_idx;
3382        fnode_sess = iscsi_get_flashnode_by_index(shost, idx);
3383        if (!fnode_sess) {
3384                pr_err("%s could not find flashnode %u for host no %u\n",
3385                       __func__, idx, ev->u.del_flashnode.host_no);
3386                err = -ENODEV;
3387                goto put_host;
3388        }
3389
3390        err = transport->del_flashnode(fnode_sess);
3391        put_device(&fnode_sess->dev);
3392
3393put_host:
3394        scsi_host_put(shost);
3395
3396exit_del_fnode:
3397        return err;
3398}
3399
3400static int iscsi_login_flashnode(struct iscsi_transport *transport,
3401                                 struct iscsi_uevent *ev)
3402{
3403        struct Scsi_Host *shost;
3404        struct iscsi_bus_flash_session *fnode_sess;
3405        struct iscsi_bus_flash_conn *fnode_conn;
3406        struct device *dev;
3407        uint32_t idx;
3408        int err = 0;
3409
3410        if (!transport->login_flashnode) {
3411                err = -ENOSYS;
3412                goto exit_login_fnode;
3413        }
3414
3415        shost = scsi_host_lookup(ev->u.login_flashnode.host_no);
3416        if (!shost) {
3417                pr_err("%s could not find host no %u\n",
3418                       __func__, ev->u.login_flashnode.host_no);
3419                err = -ENODEV;
3420                goto put_host;
3421        }
3422
3423        idx = ev->u.login_flashnode.flashnode_idx;
3424        fnode_sess = iscsi_get_flashnode_by_index(shost, idx);
3425        if (!fnode_sess) {
3426                pr_err("%s could not find flashnode %u for host no %u\n",
3427                       __func__, idx, ev->u.login_flashnode.host_no);
3428                err = -ENODEV;
3429                goto put_host;
3430        }
3431
3432        dev = iscsi_find_flashnode_conn(fnode_sess);
3433        if (!dev) {
3434                err = -ENODEV;
3435                goto put_sess;
3436        }
3437
3438        fnode_conn = iscsi_dev_to_flash_conn(dev);
3439        err = transport->login_flashnode(fnode_sess, fnode_conn);
3440        put_device(dev);
3441
3442put_sess:
3443        put_device(&fnode_sess->dev);
3444
3445put_host:
3446        scsi_host_put(shost);
3447
3448exit_login_fnode:
3449        return err;
3450}
3451
3452static int iscsi_logout_flashnode(struct iscsi_transport *transport,
3453                                  struct iscsi_uevent *ev)
3454{
3455        struct Scsi_Host *shost;
3456        struct iscsi_bus_flash_session *fnode_sess;
3457        struct iscsi_bus_flash_conn *fnode_conn;
3458        struct device *dev;
3459        uint32_t idx;
3460        int err = 0;
3461
3462        if (!transport->logout_flashnode) {
3463                err = -ENOSYS;
3464                goto exit_logout_fnode;
3465        }
3466
3467        shost = scsi_host_lookup(ev->u.logout_flashnode.host_no);
3468        if (!shost) {
3469                pr_err("%s could not find host no %u\n",
3470                       __func__, ev->u.logout_flashnode.host_no);
3471                err = -ENODEV;
3472                goto put_host;
3473        }
3474
3475        idx = ev->u.logout_flashnode.flashnode_idx;
3476        fnode_sess = iscsi_get_flashnode_by_index(shost, idx);
3477        if (!fnode_sess) {
3478                pr_err("%s could not find flashnode %u for host no %u\n",
3479                       __func__, idx, ev->u.logout_flashnode.host_no);
3480                err = -ENODEV;
3481                goto put_host;
3482        }
3483
3484        dev = iscsi_find_flashnode_conn(fnode_sess);
3485        if (!dev) {
3486                err = -ENODEV;
3487                goto put_sess;
3488        }
3489
3490        fnode_conn = iscsi_dev_to_flash_conn(dev);
3491
3492        err = transport->logout_flashnode(fnode_sess, fnode_conn);
3493        put_device(dev);
3494
3495put_sess:
3496        put_device(&fnode_sess->dev);
3497
3498put_host:
3499        scsi_host_put(shost);
3500
3501exit_logout_fnode:
3502        return err;
3503}
3504
3505static int iscsi_logout_flashnode_sid(struct iscsi_transport *transport,
3506                                      struct iscsi_uevent *ev)
3507{
3508        struct Scsi_Host *shost;
3509        struct iscsi_cls_session *session;
3510        int err = 0;
3511
3512        if (!transport->logout_flashnode_sid) {
3513                err = -ENOSYS;
3514                goto exit_logout_sid;
3515        }
3516
3517        shost = scsi_host_lookup(ev->u.logout_flashnode_sid.host_no);
3518        if (!shost) {
3519                pr_err("%s could not find host no %u\n",
3520                       __func__, ev->u.logout_flashnode.host_no);
3521                err = -ENODEV;
3522                goto put_host;
3523        }
3524
3525        session = iscsi_session_lookup(ev->u.logout_flashnode_sid.sid);
3526        if (!session) {
3527                pr_err("%s could not find session id %u\n",
3528                       __func__, ev->u.logout_flashnode_sid.sid);
3529                err = -EINVAL;
3530                goto put_host;
3531        }
3532
3533        err = transport->logout_flashnode_sid(session);
3534
3535put_host:
3536        scsi_host_put(shost);
3537
3538exit_logout_sid:
3539        return err;
3540}
3541
3542static int
3543iscsi_get_host_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
3544{
3545        struct iscsi_uevent *ev = nlmsg_data(nlh);
3546        struct Scsi_Host *shost = NULL;
3547        struct iscsi_internal *priv;
3548        struct sk_buff *skbhost_stats;
3549        struct nlmsghdr *nlhhost_stats;
3550        struct iscsi_uevent *evhost_stats;
3551        int host_stats_size = 0;
3552        int len, err = 0;
3553        char *buf;
3554
3555        if (!transport->get_host_stats)
3556                return -ENOSYS;
3557
3558        priv = iscsi_if_transport_lookup(transport);
3559        if (!priv)
3560                return -EINVAL;
3561
3562        host_stats_size = sizeof(struct iscsi_offload_host_stats);
3563        len = nlmsg_total_size(sizeof(*ev) + host_stats_size);
3564
3565        shost = scsi_host_lookup(ev->u.get_host_stats.host_no);
3566        if (!shost) {
3567                pr_err("%s: failed. Could not find host no %u\n",
3568                       __func__, ev->u.get_host_stats.host_no);
3569                return -ENODEV;
3570        }
3571
3572        do {
3573                int actual_size;
3574
3575                skbhost_stats = alloc_skb(len, GFP_KERNEL);
3576                if (!skbhost_stats) {
3577                        pr_err("cannot deliver host stats: OOM\n");
3578                        err = -ENOMEM;
3579                        goto exit_host_stats;
3580                }
3581
3582                nlhhost_stats = __nlmsg_put(skbhost_stats, 0, 0, 0,
3583                                      (len - sizeof(*nlhhost_stats)), 0);
3584                evhost_stats = nlmsg_data(nlhhost_stats);
3585                memset(evhost_stats, 0, sizeof(*evhost_stats));
3586                evhost_stats->transport_handle = iscsi_handle(transport);
3587                evhost_stats->type = nlh->nlmsg_type;
3588                evhost_stats->u.get_host_stats.host_no =
3589                                        ev->u.get_host_stats.host_no;
3590                buf = (char *)evhost_stats + sizeof(*evhost_stats);
3591                memset(buf, 0, host_stats_size);
3592
3593                err = transport->get_host_stats(shost, buf, host_stats_size);
3594                if (err) {
3595                        kfree_skb(skbhost_stats);
3596                        goto exit_host_stats;
3597                }
3598
3599                actual_size = nlmsg_total_size(sizeof(*ev) + host_stats_size);
3600                skb_trim(skbhost_stats, NLMSG_ALIGN(actual_size));
3601                nlhhost_stats->nlmsg_len = actual_size;
3602
3603                err = iscsi_multicast_skb(skbhost_stats, ISCSI_NL_GRP_ISCSID,
3604                                          GFP_KERNEL);
3605        } while (err < 0 && err != -ECONNREFUSED);
3606
3607exit_host_stats:
3608        scsi_host_put(shost);
3609        return err;
3610}
3611
3612
3613static int
3614iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
3615{
3616        int err = 0;
3617        u32 portid;
3618        struct iscsi_uevent *ev = nlmsg_data(nlh);
3619        struct iscsi_transport *transport = NULL;
3620        struct iscsi_internal *priv;
3621        struct iscsi_cls_session *session;
3622        struct iscsi_cls_conn *conn;
3623        struct iscsi_endpoint *ep = NULL;
3624
3625        if (nlh->nlmsg_type == ISCSI_UEVENT_PATH_UPDATE)
3626                *group = ISCSI_NL_GRP_UIP;
3627        else
3628                *group = ISCSI_NL_GRP_ISCSID;
3629
3630        priv = iscsi_if_transport_lookup(iscsi_ptr(ev->transport_handle));
3631        if (!priv)
3632                return -EINVAL;
3633        transport = priv->iscsi_transport;
3634
3635        if (!try_module_get(transport->owner))
3636                return -EINVAL;
3637
3638        portid = NETLINK_CB(skb).portid;
3639
3640        switch (nlh->nlmsg_type) {
3641        case ISCSI_UEVENT_CREATE_SESSION:
3642                err = iscsi_if_create_session(priv, ep, ev,
3643                                              portid,
3644                                              ev->u.c_session.initial_cmdsn,
3645                                              ev->u.c_session.cmds_max,
3646                                              ev->u.c_session.queue_depth);
3647                break;
3648        case ISCSI_UEVENT_CREATE_BOUND_SESSION:
3649                ep = iscsi_lookup_endpoint(ev->u.c_bound_session.ep_handle);
3650                if (!ep) {
3651                        err = -EINVAL;
3652                        break;
3653                }
3654
3655                err = iscsi_if_create_session(priv, ep, ev,
3656                                        portid,
3657                                        ev->u.c_bound_session.initial_cmdsn,
3658                                        ev->u.c_bound_session.cmds_max,
3659                                        ev->u.c_bound_session.queue_depth);
3660                break;
3661        case ISCSI_UEVENT_DESTROY_SESSION:
3662                session = iscsi_session_lookup(ev->u.d_session.sid);
3663                if (!session)
3664                        err = -EINVAL;
3665                else if (iscsi_session_has_conns(ev->u.d_session.sid))
3666                        err = -EBUSY;
3667                else
3668                        transport->destroy_session(session);
3669                break;
3670        case ISCSI_UEVENT_DESTROY_SESSION_ASYNC:
3671                session = iscsi_session_lookup(ev->u.d_session.sid);
3672                if (!session)
3673                        err = -EINVAL;
3674                else if (iscsi_session_has_conns(ev->u.d_session.sid))
3675                        err = -EBUSY;
3676                else {
3677                        unsigned long flags;
3678
3679                        /* Prevent this session from being found again */
3680                        spin_lock_irqsave(&sesslock, flags);
3681                        list_del_init(&session->sess_list);
3682                        spin_unlock_irqrestore(&sesslock, flags);
3683
3684                        queue_work(iscsi_destroy_workq, &session->destroy_work);
3685                }
3686                break;
3687        case ISCSI_UEVENT_UNBIND_SESSION:
3688                session = iscsi_session_lookup(ev->u.d_session.sid);
3689                if (session)
3690                        scsi_queue_work(iscsi_session_to_shost(session),
3691                                        &session->unbind_work);
3692                else
3693                        err = -EINVAL;
3694                break;
3695        case ISCSI_UEVENT_CREATE_CONN:
3696                err = iscsi_if_create_conn(transport, ev);
3697                break;
3698        case ISCSI_UEVENT_DESTROY_CONN:
3699                err = iscsi_if_destroy_conn(transport, ev);
3700                break;
3701        case ISCSI_UEVENT_BIND_CONN:
3702                session = iscsi_session_lookup(ev->u.b_conn.sid);
3703                conn = iscsi_conn_lookup(ev->u.b_conn.sid, ev->u.b_conn.cid);
3704
3705                if (conn && conn->ep)
3706                        iscsi_if_ep_disconnect(transport, conn->ep->id);
3707
3708                if (!session || !conn) {
3709                        err = -EINVAL;
3710                        break;
3711                }
3712
3713                mutex_lock(&conn_mutex);
3714                ev->r.retcode = transport->bind_conn(session, conn,
3715                                                ev->u.b_conn.transport_eph,
3716                                                ev->u.b_conn.is_leading);
3717                mutex_unlock(&conn_mutex);
3718
3719                if (ev->r.retcode || !transport->ep_connect)
3720                        break;
3721
3722                ep = iscsi_lookup_endpoint(ev->u.b_conn.transport_eph);
3723                if (ep) {
3724                        ep->conn = conn;
3725
3726                        mutex_lock(&conn->ep_mutex);
3727                        conn->ep = ep;
3728                        mutex_unlock(&conn->ep_mutex);
3729                } else
3730                        iscsi_cls_conn_printk(KERN_ERR, conn,
3731                                              "Could not set ep conn "
3732                                              "binding\n");
3733                break;
3734        case ISCSI_UEVENT_SET_PARAM:
3735                err = iscsi_set_param(transport, ev);
3736                break;
3737        case ISCSI_UEVENT_START_CONN:
3738                conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid);
3739                if (conn) {
3740                        mutex_lock(&conn_mutex);
3741                        ev->r.retcode = transport->start_conn(conn);
3742                        if (!ev->r.retcode)
3743                                conn->state = ISCSI_CONN_UP;
3744                        mutex_unlock(&conn_mutex);
3745                }
3746                else
3747                        err = -EINVAL;
3748                break;
3749        case ISCSI_UEVENT_STOP_CONN:
3750                conn = iscsi_conn_lookup(ev->u.stop_conn.sid, ev->u.stop_conn.cid);
3751                if (conn)
3752                        iscsi_if_stop_conn(conn, ev->u.stop_conn.flag);
3753                else
3754                        err = -EINVAL;
3755                break;
3756        case ISCSI_UEVENT_SEND_PDU:
3757                conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid);
3758                if (conn) {
3759                        mutex_lock(&conn_mutex);
3760                        ev->r.retcode = transport->send_pdu(conn,
3761                                (struct iscsi_hdr*)((char*)ev + sizeof(*ev)),
3762                                (char*)ev + sizeof(*ev) + ev->u.send_pdu.hdr_size,
3763                                ev->u.send_pdu.data_size);
3764                        mutex_unlock(&conn_mutex);
3765                }
3766                else
3767                        err = -EINVAL;
3768                break;
3769        case ISCSI_UEVENT_GET_STATS:
3770                err = iscsi_if_get_stats(transport, nlh);
3771                break;
3772        case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
3773        case ISCSI_UEVENT_TRANSPORT_EP_POLL:
3774        case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
3775        case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST:
3776                err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type);
3777                break;
3778        case ISCSI_UEVENT_TGT_DSCVR:
3779                err = iscsi_tgt_dscvr(transport, ev);
3780                break;
3781        case ISCSI_UEVENT_SET_HOST_PARAM:
3782                err = iscsi_set_host_param(transport, ev);
3783                break;
3784        case ISCSI_UEVENT_PATH_UPDATE:
3785                err = iscsi_set_path(transport, ev);
3786                break;
3787        case ISCSI_UEVENT_SET_IFACE_PARAMS:
3788                err = iscsi_set_iface_params(transport, ev,
3789                                             nlmsg_attrlen(nlh, sizeof(*ev)));
3790                break;
3791        case ISCSI_UEVENT_PING:
3792                err = iscsi_send_ping(transport, ev);
3793                break;
3794        case ISCSI_UEVENT_GET_CHAP:
3795                err = iscsi_get_chap(transport, nlh);
3796                break;
3797        case ISCSI_UEVENT_DELETE_CHAP:
3798                err = iscsi_delete_chap(transport, ev);
3799                break;
3800        case ISCSI_UEVENT_SET_FLASHNODE_PARAMS:
3801                err = iscsi_set_flashnode_param(transport, ev,
3802                                                nlmsg_attrlen(nlh,
3803                                                              sizeof(*ev)));
3804                break;
3805        case ISCSI_UEVENT_NEW_FLASHNODE:
3806                err = iscsi_new_flashnode(transport, ev,
3807                                          nlmsg_attrlen(nlh, sizeof(*ev)));
3808                break;
3809        case ISCSI_UEVENT_DEL_FLASHNODE:
3810                err = iscsi_del_flashnode(transport, ev);
3811                break;
3812        case ISCSI_UEVENT_LOGIN_FLASHNODE:
3813                err = iscsi_login_flashnode(transport, ev);
3814                break;
3815        case ISCSI_UEVENT_LOGOUT_FLASHNODE:
3816                err = iscsi_logout_flashnode(transport, ev);
3817                break;
3818        case ISCSI_UEVENT_LOGOUT_FLASHNODE_SID:
3819                err = iscsi_logout_flashnode_sid(transport, ev);
3820                break;
3821        case ISCSI_UEVENT_SET_CHAP:
3822                err = iscsi_set_chap(transport, ev,
3823                                     nlmsg_attrlen(nlh, sizeof(*ev)));
3824                break;
3825        case ISCSI_UEVENT_GET_HOST_STATS:
3826                err = iscsi_get_host_stats(transport, nlh);
3827                break;
3828        default:
3829                err = -ENOSYS;
3830                break;
3831        }
3832
3833        module_put(transport->owner);
3834        return err;
3835}
3836
3837/*
3838 * Get message from skb.  Each message is processed by iscsi_if_recv_msg.
3839 * Malformed skbs with wrong lengths or invalid creds are not processed.
3840 */
3841static void
3842iscsi_if_rx(struct sk_buff *skb)
3843{
3844        u32 portid = NETLINK_CB(skb).portid;
3845
3846        mutex_lock(&rx_queue_mutex);
3847        while (skb->len >= NLMSG_HDRLEN) {
3848                int err;
3849                uint32_t rlen;
3850                struct nlmsghdr *nlh;
3851                struct iscsi_uevent *ev;
3852                uint32_t group;
3853                int retries = ISCSI_SEND_MAX_ALLOWED;
3854
3855                nlh = nlmsg_hdr(skb);
3856                if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) ||
3857                    skb->len < nlh->nlmsg_len) {
3858                        break;
3859                }
3860
3861                ev = nlmsg_data(nlh);
3862                rlen = NLMSG_ALIGN(nlh->nlmsg_len);
3863                if (rlen > skb->len)
3864                        rlen = skb->len;
3865
3866                err = iscsi_if_recv_msg(skb, nlh, &group);
3867                if (err) {
3868                        ev->type = ISCSI_KEVENT_IF_ERROR;
3869                        ev->iferror = err;
3870                }
3871                do {
3872                        /*
3873                         * special case for GET_STATS:
3874                         * on success - sending reply and stats from
3875                         * inside of if_recv_msg(),
3876                         * on error - fall through.
3877                         */
3878                        if (ev->type == ISCSI_UEVENT_GET_STATS && !err)
3879                                break;
3880                        if (ev->type == ISCSI_UEVENT_GET_CHAP && !err)
3881                                break;
3882                        err = iscsi_if_send_reply(portid, nlh->nlmsg_type,
3883                                                  ev, sizeof(*ev));
3884                        if (err == -EAGAIN && --retries < 0) {
3885                                printk(KERN_WARNING "Send reply failed, error %d\n", err);
3886                                break;
3887                        }
3888                } while (err < 0 && err != -ECONNREFUSED && err != -ESRCH);
3889                skb_pull(skb, rlen);
3890        }
3891        mutex_unlock(&rx_queue_mutex);
3892}
3893
3894#define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store)              \
3895struct device_attribute dev_attr_##_prefix##_##_name =  \
3896        __ATTR(_name,_mode,_show,_store)
3897
3898/*
3899 * iSCSI connection attrs
3900 */
3901#define iscsi_conn_attr_show(param)                                     \
3902static ssize_t                                                          \
3903show_conn_param_##param(struct device *dev,                             \
3904                        struct device_attribute *attr, char *buf)       \
3905{                                                                       \
3906        struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent);   \
3907        struct iscsi_transport *t = conn->transport;                    \
3908        return t->get_conn_param(conn, param, buf);                     \
3909}
3910
3911#define iscsi_conn_attr(field, param)                                   \
3912        iscsi_conn_attr_show(param)                                     \
3913static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_param_##param,  \
3914                        NULL);
3915
3916iscsi_conn_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH);
3917iscsi_conn_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH);
3918iscsi_conn_attr(header_digest, ISCSI_PARAM_HDRDGST_EN);
3919iscsi_conn_attr(data_digest, ISCSI_PARAM_DATADGST_EN);
3920iscsi_conn_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN);
3921iscsi_conn_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN);
3922iscsi_conn_attr(persistent_port, ISCSI_PARAM_PERSISTENT_PORT);
3923iscsi_conn_attr(exp_statsn, ISCSI_PARAM_EXP_STATSN);
3924iscsi_conn_attr(persistent_address, ISCSI_PARAM_PERSISTENT_ADDRESS);
3925iscsi_conn_attr(ping_tmo, ISCSI_PARAM_PING_TMO);
3926iscsi_conn_attr(recv_tmo, ISCSI_PARAM_RECV_TMO);
3927iscsi_conn_attr(local_port, ISCSI_PARAM_LOCAL_PORT);
3928iscsi_conn_attr(statsn, ISCSI_PARAM_STATSN);
3929iscsi_conn_attr(keepalive_tmo, ISCSI_PARAM_KEEPALIVE_TMO);
3930iscsi_conn_attr(max_segment_size, ISCSI_PARAM_MAX_SEGMENT_SIZE);
3931iscsi_conn_attr(tcp_timestamp_stat, ISCSI_PARAM_TCP_TIMESTAMP_STAT);
3932iscsi_conn_attr(tcp_wsf_disable, ISCSI_PARAM_TCP_WSF_DISABLE);
3933iscsi_conn_attr(tcp_nagle_disable, ISCSI_PARAM_TCP_NAGLE_DISABLE);
3934iscsi_conn_attr(tcp_timer_scale, ISCSI_PARAM_TCP_TIMER_SCALE);
3935iscsi_conn_attr(tcp_timestamp_enable, ISCSI_PARAM_TCP_TIMESTAMP_EN);
3936iscsi_conn_attr(fragment_disable, ISCSI_PARAM_IP_FRAGMENT_DISABLE);
3937iscsi_conn_attr(ipv4_tos, ISCSI_PARAM_IPV4_TOS);
3938iscsi_conn_attr(ipv6_traffic_class, ISCSI_PARAM_IPV6_TC);
3939iscsi_conn_attr(ipv6_flow_label, ISCSI_PARAM_IPV6_FLOW_LABEL);
3940iscsi_conn_attr(is_fw_assigned_ipv6, ISCSI_PARAM_IS_FW_ASSIGNED_IPV6);
3941iscsi_conn_attr(tcp_xmit_wsf, ISCSI_PARAM_TCP_XMIT_WSF);
3942iscsi_conn_attr(tcp_recv_wsf, ISCSI_PARAM_TCP_RECV_WSF);
3943iscsi_conn_attr(local_ipaddr, ISCSI_PARAM_LOCAL_IPADDR);
3944
3945static const char *const connection_state_names[] = {
3946        [ISCSI_CONN_UP] = "up",
3947        [ISCSI_CONN_DOWN] = "down",
3948        [ISCSI_CONN_FAILED] = "failed"
3949};
3950
3951static ssize_t show_conn_state(struct device *dev,
3952                               struct device_attribute *attr, char *buf)
3953{
3954        struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent);
3955        const char *state = "unknown";
3956
3957        if (conn->state >= 0 &&
3958            conn->state < ARRAY_SIZE(connection_state_names))
3959                state = connection_state_names[conn->state];
3960
3961        return sprintf(buf, "%s\n", state);
3962}
3963static ISCSI_CLASS_ATTR(conn, state, S_IRUGO, show_conn_state,
3964                        NULL);
3965
3966#define iscsi_conn_ep_attr_show(param)                                  \
3967static ssize_t show_conn_ep_param_##param(struct device *dev,           \
3968                                          struct device_attribute *attr,\
3969                                          char *buf)                    \
3970{                                                                       \
3971        struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent);   \
3972        struct iscsi_transport *t = conn->transport;                    \
3973        struct iscsi_endpoint *ep;                                      \
3974        ssize_t rc;                                                     \
3975                                                                        \
3976        /*                                                              \
3977         * Need to make sure ep_disconnect does not free the LLD's      \
3978         * interconnect resources while we are trying to read them.     \
3979         */                                                             \
3980        mutex_lock(&conn->ep_mutex);                                    \
3981        ep = conn->ep;                                                  \
3982        if (!ep && t->ep_connect) {                                     \
3983                mutex_unlock(&conn->ep_mutex);                          \
3984                return -ENOTCONN;                                       \
3985        }                                                               \
3986                                                                        \
3987        if (ep)                                                         \
3988                rc = t->get_ep_param(ep, param, buf);                   \
3989        else                                                            \
3990                rc = t->get_conn_param(conn, param, buf);               \
3991        mutex_unlock(&conn->ep_mutex);                                  \
3992        return rc;                                                      \
3993}
3994
3995#define iscsi_conn_ep_attr(field, param)                                \
3996        iscsi_conn_ep_attr_show(param)                                  \
3997static ISCSI_CLASS_ATTR(conn, field, S_IRUGO,                           \
3998                        show_conn_ep_param_##param, NULL);
3999
4000iscsi_conn_ep_attr(address, ISCSI_PARAM_CONN_ADDRESS);
4001iscsi_conn_ep_attr(port, ISCSI_PARAM_CONN_PORT);
4002
4003static struct attribute *iscsi_conn_attrs[] = {
4004        &dev_attr_conn_max_recv_dlength.attr,
4005        &dev_attr_conn_max_xmit_dlength.attr,
4006        &dev_attr_conn_header_digest.attr,
4007        &dev_attr_conn_data_digest.attr,
4008        &dev_attr_conn_ifmarker.attr,
4009        &dev_attr_conn_ofmarker.attr,
4010        &dev_attr_conn_address.attr,
4011        &dev_attr_conn_port.attr,
4012        &dev_attr_conn_exp_statsn.attr,
4013        &dev_attr_conn_persistent_address.attr,
4014        &dev_attr_conn_persistent_port.attr,
4015        &dev_attr_conn_ping_tmo.attr,
4016        &dev_attr_conn_recv_tmo.attr,
4017        &dev_attr_conn_local_port.attr,
4018        &dev_attr_conn_statsn.attr,
4019        &dev_attr_conn_keepalive_tmo.attr,
4020        &dev_attr_conn_max_segment_size.attr,
4021        &dev_attr_conn_tcp_timestamp_stat.attr,
4022        &dev_attr_conn_tcp_wsf_disable.attr,
4023        &dev_attr_conn_tcp_nagle_disable.attr,
4024        &dev_attr_conn_tcp_timer_scale.attr,
4025        &dev_attr_conn_tcp_timestamp_enable.attr,
4026        &dev_attr_conn_fragment_disable.attr,
4027        &dev_attr_conn_ipv4_tos.attr,
4028        &dev_attr_conn_ipv6_traffic_class.attr,
4029        &dev_attr_conn_ipv6_flow_label.attr,
4030        &dev_attr_conn_is_fw_assigned_ipv6.attr,
4031        &dev_attr_conn_tcp_xmit_wsf.attr,
4032        &dev_attr_conn_tcp_recv_wsf.attr,
4033        &dev_attr_conn_local_ipaddr.attr,
4034        &dev_attr_conn_state.attr,
4035        NULL,
4036};
4037
4038static umode_t iscsi_conn_attr_is_visible(struct kobject *kobj,
4039                                         struct attribute *attr, int i)
4040{
4041        struct device *cdev = container_of(kobj, struct device, kobj);
4042        struct iscsi_cls_conn *conn = transport_class_to_conn(cdev);
4043        struct iscsi_transport *t = conn->transport;
4044        int param;
4045
4046        if (attr == &dev_attr_conn_max_recv_dlength.attr)
4047                param = ISCSI_PARAM_MAX_RECV_DLENGTH;
4048        else if (attr == &dev_attr_conn_max_xmit_dlength.attr)
4049                param = ISCSI_PARAM_MAX_XMIT_DLENGTH;
4050        else if (attr == &dev_attr_conn_header_digest.attr)
4051                param = ISCSI_PARAM_HDRDGST_EN;
4052        else if (attr == &dev_attr_conn_data_digest.attr)
4053                param = ISCSI_PARAM_DATADGST_EN;
4054        else if (attr == &dev_attr_conn_ifmarker.attr)
4055                param = ISCSI_PARAM_IFMARKER_EN;
4056        else if (attr == &dev_attr_conn_ofmarker.attr)
4057                param = ISCSI_PARAM_OFMARKER_EN;
4058        else if (attr == &dev_attr_conn_address.attr)
4059                param = ISCSI_PARAM_CONN_ADDRESS;
4060        else if (attr == &dev_attr_conn_port.attr)
4061                param = ISCSI_PARAM_CONN_PORT;
4062        else if (attr == &dev_attr_conn_exp_statsn.attr)
4063                param = ISCSI_PARAM_EXP_STATSN;
4064        else if (attr == &dev_attr_conn_persistent_address.attr)
4065                param = ISCSI_PARAM_PERSISTENT_ADDRESS;
4066        else if (attr == &dev_attr_conn_persistent_port.attr)
4067                param = ISCSI_PARAM_PERSISTENT_PORT;
4068        else if (attr == &dev_attr_conn_ping_tmo.attr)
4069                param = ISCSI_PARAM_PING_TMO;
4070        else if (attr == &dev_attr_conn_recv_tmo.attr)
4071                param = ISCSI_PARAM_RECV_TMO;
4072        else if (attr == &dev_attr_conn_local_port.attr)
4073                param = ISCSI_PARAM_LOCAL_PORT;
4074        else if (attr == &dev_attr_conn_statsn.attr)
4075                param = ISCSI_PARAM_STATSN;
4076        else if (attr == &dev_attr_conn_keepalive_tmo.attr)
4077                param = ISCSI_PARAM_KEEPALIVE_TMO;
4078        else if (attr == &dev_attr_conn_max_segment_size.attr)
4079                param = ISCSI_PARAM_MAX_SEGMENT_SIZE;
4080        else if (attr == &dev_attr_conn_tcp_timestamp_stat.attr)
4081                param = ISCSI_PARAM_TCP_TIMESTAMP_STAT;
4082        else if (attr == &dev_attr_conn_tcp_wsf_disable.attr)
4083                param = ISCSI_PARAM_TCP_WSF_DISABLE;
4084        else if (attr == &dev_attr_conn_tcp_nagle_disable.attr)
4085                param = ISCSI_PARAM_TCP_NAGLE_DISABLE;
4086        else if (attr == &dev_attr_conn_tcp_timer_scale.attr)
4087                param = ISCSI_PARAM_TCP_TIMER_SCALE;
4088        else if (attr == &dev_attr_conn_tcp_timestamp_enable.attr)
4089                param = ISCSI_PARAM_TCP_TIMESTAMP_EN;
4090        else if (attr == &dev_attr_conn_fragment_disable.attr)
4091                param = ISCSI_PARAM_IP_FRAGMENT_DISABLE;
4092        else if (attr == &dev_attr_conn_ipv4_tos.attr)
4093                param = ISCSI_PARAM_IPV4_TOS;
4094        else if (attr == &dev_attr_conn_ipv6_traffic_class.attr)
4095                param = ISCSI_PARAM_IPV6_TC;
4096        else if (attr == &dev_attr_conn_ipv6_flow_label.attr)
4097                param = ISCSI_PARAM_IPV6_FLOW_LABEL;
4098        else if (attr == &dev_attr_conn_is_fw_assigned_ipv6.attr)
4099                param = ISCSI_PARAM_IS_FW_ASSIGNED_IPV6;
4100        else if (attr == &dev_attr_conn_tcp_xmit_wsf.attr)
4101                param = ISCSI_PARAM_TCP_XMIT_WSF;
4102        else if (attr == &dev_attr_conn_tcp_recv_wsf.attr)
4103                param = ISCSI_PARAM_TCP_RECV_WSF;
4104        else if (attr == &dev_attr_conn_local_ipaddr.attr)
4105                param = ISCSI_PARAM_LOCAL_IPADDR;
4106        else if (attr == &dev_attr_conn_state.attr)
4107                return S_IRUGO;
4108        else {
4109                WARN_ONCE(1, "Invalid conn attr");
4110                return 0;
4111        }
4112
4113        return t->attr_is_visible(ISCSI_PARAM, param);
4114}
4115
4116static struct attribute_group iscsi_conn_group = {
4117        .attrs = iscsi_conn_attrs,
4118        .is_visible = iscsi_conn_attr_is_visible,
4119};
4120
4121/*
4122 * iSCSI session attrs
4123 */
4124#define iscsi_session_attr_show(param, perm)                            \
4125static ssize_t                                                          \
4126show_session_param_##param(struct device *dev,                          \
4127                           struct device_attribute *attr, char *buf)    \
4128{                                                                       \
4129        struct iscsi_cls_session *session =                             \
4130                iscsi_dev_to_session(dev->parent);                      \
4131        struct iscsi_transport *t = session->transport;                 \
4132                                                                        \
4133        if (perm && !capable(CAP_SYS_ADMIN))                            \
4134                return -EACCES;                                         \
4135        return t->get_session_param(session, param, buf);               \
4136}
4137
4138#define iscsi_session_attr(field, param, perm)                          \
4139        iscsi_session_attr_show(param, perm)                            \
4140static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_param_##param, \
4141                        NULL);
4142iscsi_session_attr(targetname, ISCSI_PARAM_TARGET_NAME, 0);
4143iscsi_session_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN, 0);
4144iscsi_session_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T, 0);
4145iscsi_session_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN, 0);
4146iscsi_session_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST, 0);
4147iscsi_session_attr(max_burst_len, ISCSI_PARAM_MAX_BURST, 0);
4148iscsi_session_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN, 0);
4149iscsi_session_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN, 0);
4150iscsi_session_attr(erl, ISCSI_PARAM_ERL, 0);
4151iscsi_session_attr(tpgt, ISCSI_PARAM_TPGT, 0);
4152iscsi_session_attr(username, ISCSI_PARAM_USERNAME, 1);
4153iscsi_session_attr(username_in, ISCSI_PARAM_USERNAME_IN, 1);
4154iscsi_session_attr(password, ISCSI_PARAM_PASSWORD, 1);
4155iscsi_session_attr(password_in, ISCSI_PARAM_PASSWORD_IN, 1);
4156iscsi_session_attr(chap_out_idx, ISCSI_PARAM_CHAP_OUT_IDX, 1);
4157iscsi_session_attr(chap_in_idx, ISCSI_PARAM_CHAP_IN_IDX, 1);
4158iscsi_session_attr(fast_abort, ISCSI_PARAM_FAST_ABORT, 0);
4159iscsi_session_attr(abort_tmo, ISCSI_PARAM_ABORT_TMO, 0);
4160iscsi_session_attr(lu_reset_tmo, ISCSI_PARAM_LU_RESET_TMO, 0);
4161iscsi_session_attr(tgt_reset_tmo, ISCSI_PARAM_TGT_RESET_TMO, 0);
4162iscsi_session_attr(ifacename, ISCSI_PARAM_IFACE_NAME, 0);
4163iscsi_session_attr(initiatorname, ISCSI_PARAM_INITIATOR_NAME, 0);
4164iscsi_session_attr(targetalias, ISCSI_PARAM_TARGET_ALIAS, 0);
4165iscsi_session_attr(boot_root, ISCSI_PARAM_BOOT_ROOT, 0);
4166iscsi_session_attr(boot_nic, ISCSI_PARAM_BOOT_NIC, 0);
4167iscsi_session_attr(boot_target, ISCSI_PARAM_BOOT_TARGET, 0);
4168iscsi_session_attr(auto_snd_tgt_disable, ISCSI_PARAM_AUTO_SND_TGT_DISABLE, 0);
4169iscsi_session_attr(discovery_session, ISCSI_PARAM_DISCOVERY_SESS, 0);
4170iscsi_session_attr(portal_type, ISCSI_PARAM_PORTAL_TYPE, 0);
4171iscsi_session_attr(chap_auth, ISCSI_PARAM_CHAP_AUTH_EN, 0);
4172iscsi_session_attr(discovery_logout, ISCSI_PARAM_DISCOVERY_LOGOUT_EN, 0);
4173iscsi_session_attr(bidi_chap, ISCSI_PARAM_BIDI_CHAP_EN, 0);
4174iscsi_session_attr(discovery_auth_optional,
4175                   ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL, 0);
4176iscsi_session_attr(def_time2wait, ISCSI_PARAM_DEF_TIME2WAIT, 0);
4177iscsi_session_attr(def_time2retain, ISCSI_PARAM_DEF_TIME2RETAIN, 0);
4178iscsi_session_attr(isid, ISCSI_PARAM_ISID, 0);
4179iscsi_session_attr(tsid, ISCSI_PARAM_TSID, 0);
4180iscsi_session_attr(def_taskmgmt_tmo, ISCSI_PARAM_DEF_TASKMGMT_TMO, 0);
4181iscsi_session_attr(discovery_parent_idx, ISCSI_PARAM_DISCOVERY_PARENT_IDX, 0);
4182iscsi_session_attr(discovery_parent_type, ISCSI_PARAM_DISCOVERY_PARENT_TYPE, 0);
4183
4184static ssize_t
4185show_priv_session_state(struct device *dev, struct device_attribute *attr,
4186                        char *buf)
4187{
4188        struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
4189        return sprintf(buf, "%s\n", iscsi_session_state_name(session->state));
4190}
4191static ISCSI_CLASS_ATTR(priv_sess, state, S_IRUGO, show_priv_session_state,
4192                        NULL);
4193static ssize_t
4194show_priv_session_creator(struct device *dev, struct device_attribute *attr,
4195                        char *buf)
4196{
4197        struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
4198        return sprintf(buf, "%d\n", session->creator);
4199}
4200static ISCSI_CLASS_ATTR(priv_sess, creator, S_IRUGO, show_priv_session_creator,
4201                        NULL);
4202static ssize_t
4203show_priv_session_target_id(struct device *dev, struct device_attribute *attr,
4204                            char *buf)
4205{
4206        struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
4207        return sprintf(buf, "%d\n", session->target_id);
4208}
4209static ISCSI_CLASS_ATTR(priv_sess, target_id, S_IRUGO,
4210                        show_priv_session_target_id, NULL);
4211
4212#define iscsi_priv_session_attr_show(field, format)                     \
4213static ssize_t                                                          \
4214show_priv_session_##field(struct device *dev,                           \
4215                          struct device_attribute *attr, char *buf)     \
4216{                                                                       \
4217        struct iscsi_cls_session *session =                             \
4218                        iscsi_dev_to_session(dev->parent);              \
4219        if (session->field == -1)                                       \
4220                return sprintf(buf, "off\n");                           \
4221        return sprintf(buf, format"\n", session->field);                \
4222}
4223
4224#define iscsi_priv_session_attr_store(field)                            \
4225static ssize_t                                                          \
4226store_priv_session_##field(struct device *dev,                          \
4227                           struct device_attribute *attr,               \
4228                           const char *buf, size_t count)               \
4229{                                                                       \
4230        int val;                                                        \
4231        char *cp;                                                       \
4232        struct iscsi_cls_session *session =                             \
4233                iscsi_dev_to_session(dev->parent);                      \
4234        if ((session->state == ISCSI_SESSION_FREE) ||                   \
4235            (session->state == ISCSI_SESSION_FAILED))                   \
4236                return -EBUSY;                                          \
4237        if (strncmp(buf, "off", 3) == 0) {                              \
4238                session->field = -1;                                    \
4239                session->field##_sysfs_override = true;                 \
4240        } else {                                                        \
4241                val = simple_strtoul(buf, &cp, 0);                      \
4242                if (*cp != '\0' && *cp != '\n')                         \
4243                        return -EINVAL;                                 \
4244                session->field = val;                                   \
4245                session->field##_sysfs_override = true;                 \
4246        }                                                               \
4247        return count;                                                   \
4248}
4249
4250#define iscsi_priv_session_rw_attr(field, format)                       \
4251        iscsi_priv_session_attr_show(field, format)                     \
4252        iscsi_priv_session_attr_store(field)                            \
4253static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO | S_IWUSR,            \
4254                        show_priv_session_##field,                      \
4255                        store_priv_session_##field)
4256
4257iscsi_priv_session_rw_attr(recovery_tmo, "%d");
4258
4259static struct attribute *iscsi_session_attrs[] = {
4260        &dev_attr_sess_initial_r2t.attr,
4261        &dev_attr_sess_max_outstanding_r2t.attr,
4262        &dev_attr_sess_immediate_data.attr,
4263        &dev_attr_sess_first_burst_len.attr,
4264        &dev_attr_sess_max_burst_len.attr,
4265        &dev_attr_sess_data_pdu_in_order.attr,
4266        &dev_attr_sess_data_seq_in_order.attr,
4267        &dev_attr_sess_erl.attr,
4268        &dev_attr_sess_targetname.attr,
4269        &dev_attr_sess_tpgt.attr,
4270        &dev_attr_sess_password.attr,
4271        &dev_attr_sess_password_in.attr,
4272        &dev_attr_sess_username.attr,
4273        &dev_attr_sess_username_in.attr,
4274        &dev_attr_sess_fast_abort.attr,
4275        &dev_attr_sess_abort_tmo.attr,
4276        &dev_attr_sess_lu_reset_tmo.attr,
4277        &dev_attr_sess_tgt_reset_tmo.attr,
4278        &dev_attr_sess_ifacename.attr,
4279        &dev_attr_sess_initiatorname.attr,
4280        &dev_attr_sess_targetalias.attr,
4281        &dev_attr_sess_boot_root.attr,
4282        &dev_attr_sess_boot_nic.attr,
4283        &dev_attr_sess_boot_target.attr,
4284        &dev_attr_priv_sess_recovery_tmo.attr,
4285        &dev_attr_priv_sess_state.attr,
4286        &dev_attr_priv_sess_creator.attr,
4287        &dev_attr_sess_chap_out_idx.attr,
4288        &dev_attr_sess_chap_in_idx.attr,
4289        &dev_attr_priv_sess_target_id.attr,
4290        &dev_attr_sess_auto_snd_tgt_disable.attr,
4291        &dev_attr_sess_discovery_session.attr,
4292        &dev_attr_sess_portal_type.attr,
4293        &dev_attr_sess_chap_auth.attr,
4294        &dev_attr_sess_discovery_logout.attr,
4295        &dev_attr_sess_bidi_chap.attr,
4296        &dev_attr_sess_discovery_auth_optional.attr,
4297        &dev_attr_sess_def_time2wait.attr,
4298        &dev_attr_sess_def_time2retain.attr,
4299        &dev_attr_sess_isid.attr,
4300        &dev_attr_sess_tsid.attr,
4301        &dev_attr_sess_def_taskmgmt_tmo.attr,
4302        &dev_attr_sess_discovery_parent_idx.attr,
4303        &dev_attr_sess_discovery_parent_type.attr,
4304        NULL,
4305};
4306
4307static umode_t iscsi_session_attr_is_visible(struct kobject *kobj,
4308                                            struct attribute *attr, int i)
4309{
4310        struct device *cdev = container_of(kobj, struct device, kobj);
4311        struct iscsi_cls_session *session = transport_class_to_session(cdev);
4312        struct iscsi_transport *t = session->transport;
4313        int param;
4314
4315        if (attr == &dev_attr_sess_initial_r2t.attr)
4316                param = ISCSI_PARAM_INITIAL_R2T_EN;
4317        else if (attr == &dev_attr_sess_max_outstanding_r2t.attr)
4318                param = ISCSI_PARAM_MAX_R2T;
4319        else if (attr == &dev_attr_sess_immediate_data.attr)
4320                param = ISCSI_PARAM_IMM_DATA_EN;
4321        else if (attr == &dev_attr_sess_first_burst_len.attr)
4322                param = ISCSI_PARAM_FIRST_BURST;
4323        else if (attr == &dev_attr_sess_max_burst_len.attr)
4324                param = ISCSI_PARAM_MAX_BURST;
4325        else if (attr == &dev_attr_sess_data_pdu_in_order.attr)
4326                param = ISCSI_PARAM_PDU_INORDER_EN;
4327        else if (attr == &dev_attr_sess_data_seq_in_order.attr)
4328                param = ISCSI_PARAM_DATASEQ_INORDER_EN;
4329        else if (attr == &dev_attr_sess_erl.attr)
4330                param = ISCSI_PARAM_ERL;
4331        else if (attr == &dev_attr_sess_targetname.attr)
4332                param = ISCSI_PARAM_TARGET_NAME;
4333        else if (attr == &dev_attr_sess_tpgt.attr)
4334                param = ISCSI_PARAM_TPGT;
4335        else if (attr == &dev_attr_sess_chap_in_idx.attr)
4336                param = ISCSI_PARAM_CHAP_IN_IDX;
4337        else if (attr == &dev_attr_sess_chap_out_idx.attr)
4338                param = ISCSI_PARAM_CHAP_OUT_IDX;
4339        else if (attr == &dev_attr_sess_password.attr)
4340                param = ISCSI_PARAM_USERNAME;
4341        else if (attr == &dev_attr_sess_password_in.attr)
4342                param = ISCSI_PARAM_USERNAME_IN;
4343        else if (attr == &dev_attr_sess_username.attr)
4344                param = ISCSI_PARAM_PASSWORD;
4345        else if (attr == &dev_attr_sess_username_in.attr)
4346                param = ISCSI_PARAM_PASSWORD_IN;
4347        else if (attr == &dev_attr_sess_fast_abort.attr)
4348                param = ISCSI_PARAM_FAST_ABORT;
4349        else if (attr == &dev_attr_sess_abort_tmo.attr)
4350                param = ISCSI_PARAM_ABORT_TMO;
4351        else if (attr == &dev_attr_sess_lu_reset_tmo.attr)
4352                param = ISCSI_PARAM_LU_RESET_TMO;
4353        else if (attr == &dev_attr_sess_tgt_reset_tmo.attr)
4354                param = ISCSI_PARAM_TGT_RESET_TMO;
4355        else if (attr == &dev_attr_sess_ifacename.attr)
4356                param = ISCSI_PARAM_IFACE_NAME;
4357        else if (attr == &dev_attr_sess_initiatorname.attr)
4358                param = ISCSI_PARAM_INITIATOR_NAME;
4359        else if (attr == &dev_attr_sess_targetalias.attr)
4360                param = ISCSI_PARAM_TARGET_ALIAS;
4361        else if (attr == &dev_attr_sess_boot_root.attr)
4362                param = ISCSI_PARAM_BOOT_ROOT;
4363        else if (attr == &dev_attr_sess_boot_nic.attr)
4364                param = ISCSI_PARAM_BOOT_NIC;
4365        else if (attr == &dev_attr_sess_boot_target.attr)
4366                param = ISCSI_PARAM_BOOT_TARGET;
4367        else if (attr == &dev_attr_sess_auto_snd_tgt_disable.attr)
4368                param = ISCSI_PARAM_AUTO_SND_TGT_DISABLE;
4369        else if (attr == &dev_attr_sess_discovery_session.attr)
4370                param = ISCSI_PARAM_DISCOVERY_SESS;
4371        else if (attr == &dev_attr_sess_portal_type.attr)
4372                param = ISCSI_PARAM_PORTAL_TYPE;
4373        else if (attr == &dev_attr_sess_chap_auth.attr)
4374                param = ISCSI_PARAM_CHAP_AUTH_EN;
4375        else if (attr == &dev_attr_sess_discovery_logout.attr)
4376                param = ISCSI_PARAM_DISCOVERY_LOGOUT_EN;
4377        else if (attr == &dev_attr_sess_bidi_chap.attr)
4378                param = ISCSI_PARAM_BIDI_CHAP_EN;
4379        else if (attr == &dev_attr_sess_discovery_auth_optional.attr)
4380                param = ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL;
4381        else if (attr == &dev_attr_sess_def_time2wait.attr)
4382                param = ISCSI_PARAM_DEF_TIME2WAIT;
4383        else if (attr == &dev_attr_sess_def_time2retain.attr)
4384                param = ISCSI_PARAM_DEF_TIME2RETAIN;
4385        else if (attr == &dev_attr_sess_isid.attr)
4386                param = ISCSI_PARAM_ISID;
4387        else if (attr == &dev_attr_sess_tsid.attr)
4388                param = ISCSI_PARAM_TSID;
4389        else if (attr == &dev_attr_sess_def_taskmgmt_tmo.attr)
4390                param = ISCSI_PARAM_DEF_TASKMGMT_TMO;
4391        else if (attr == &dev_attr_sess_discovery_parent_idx.attr)
4392                param = ISCSI_PARAM_DISCOVERY_PARENT_IDX;
4393        else if (attr == &dev_attr_sess_discovery_parent_type.attr)
4394                param = ISCSI_PARAM_DISCOVERY_PARENT_TYPE;
4395        else if (attr == &dev_attr_priv_sess_recovery_tmo.attr)
4396                return S_IRUGO | S_IWUSR;
4397        else if (attr == &dev_attr_priv_sess_state.attr)
4398                return S_IRUGO;
4399        else if (attr == &dev_attr_priv_sess_creator.attr)
4400                return S_IRUGO;
4401        else if (attr == &dev_attr_priv_sess_target_id.attr)
4402                return S_IRUGO;
4403        else {
4404                WARN_ONCE(1, "Invalid session attr");
4405                return 0;
4406        }
4407
4408        return t->attr_is_visible(ISCSI_PARAM, param);
4409}
4410
4411static struct attribute_group iscsi_session_group = {
4412        .attrs = iscsi_session_attrs,
4413        .is_visible = iscsi_session_attr_is_visible,
4414};
4415
4416/*
4417 * iSCSI host attrs
4418 */
4419#define iscsi_host_attr_show(param)                                     \
4420static ssize_t                                                          \
4421show_host_param_##param(struct device *dev,                             \
4422                        struct device_attribute *attr, char *buf)       \
4423{                                                                       \
4424        struct Scsi_Host *shost = transport_class_to_shost(dev);        \
4425        struct iscsi_internal *priv = to_iscsi_internal(shost->transportt); \
4426        return priv->iscsi_transport->get_host_param(shost, param, buf); \
4427}
4428
4429#define iscsi_host_attr(field, param)                                   \
4430        iscsi_host_attr_show(param)                                     \
4431static ISCSI_CLASS_ATTR(host, field, S_IRUGO, show_host_param_##param,  \
4432                        NULL);
4433
4434iscsi_host_attr(netdev, ISCSI_HOST_PARAM_NETDEV_NAME);
4435iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS);
4436iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS);
4437iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME);
4438iscsi_host_attr(port_state, ISCSI_HOST_PARAM_PORT_STATE);
4439iscsi_host_attr(port_speed, ISCSI_HOST_PARAM_PORT_SPEED);
4440
4441static struct attribute *iscsi_host_attrs[] = {
4442        &dev_attr_host_netdev.attr,
4443        &dev_attr_host_hwaddress.attr,
4444        &dev_attr_host_ipaddress.attr,
4445        &dev_attr_host_initiatorname.attr,
4446        &dev_attr_host_port_state.attr,
4447        &dev_attr_host_port_speed.attr,
4448        NULL,
4449};
4450
4451static umode_t iscsi_host_attr_is_visible(struct kobject *kobj,
4452                                         struct attribute *attr, int i)
4453{
4454        struct device *cdev = container_of(kobj, struct device, kobj);
4455        struct Scsi_Host *shost = transport_class_to_shost(cdev);
4456        struct iscsi_internal *priv = to_iscsi_internal(shost->transportt);
4457        int param;
4458
4459        if (attr == &dev_attr_host_netdev.attr)
4460                param = ISCSI_HOST_PARAM_NETDEV_NAME;
4461        else if (attr == &dev_attr_host_hwaddress.attr)
4462                param = ISCSI_HOST_PARAM_HWADDRESS;
4463        else if (attr == &dev_attr_host_ipaddress.attr)
4464                param = ISCSI_HOST_PARAM_IPADDRESS;
4465        else if (attr == &dev_attr_host_initiatorname.attr)
4466                param = ISCSI_HOST_PARAM_INITIATOR_NAME;
4467        else if (attr == &dev_attr_host_port_state.attr)
4468                param = ISCSI_HOST_PARAM_PORT_STATE;
4469        else if (attr == &dev_attr_host_port_speed.attr)
4470                param = ISCSI_HOST_PARAM_PORT_SPEED;
4471        else {
4472                WARN_ONCE(1, "Invalid host attr");
4473                return 0;
4474        }
4475
4476        return priv->iscsi_transport->attr_is_visible(ISCSI_HOST_PARAM, param);
4477}
4478
4479static struct attribute_group iscsi_host_group = {
4480        .attrs = iscsi_host_attrs,
4481        .is_visible = iscsi_host_attr_is_visible,
4482};
4483
4484/* convert iscsi_port_speed values to ascii string name */
4485static const struct {
4486        enum iscsi_port_speed   value;
4487        char                    *name;
4488} iscsi_port_speed_names[] = {
4489        {ISCSI_PORT_SPEED_UNKNOWN,      "Unknown" },
4490        {ISCSI_PORT_SPEED_10MBPS,       "10 Mbps" },
4491        {ISCSI_PORT_SPEED_100MBPS,      "100 Mbps" },
4492        {ISCSI_PORT_SPEED_1GBPS,        "1 Gbps" },
4493        {ISCSI_PORT_SPEED_10GBPS,       "10 Gbps" },
4494        {ISCSI_PORT_SPEED_25GBPS,       "25 Gbps" },
4495        {ISCSI_PORT_SPEED_40GBPS,       "40 Gbps" },
4496};
4497
4498char *iscsi_get_port_speed_name(struct Scsi_Host *shost)
4499{
4500        int i;
4501        char *speed = "Unknown!";
4502        struct iscsi_cls_host *ihost = shost->shost_data;
4503        uint32_t port_speed = ihost->port_speed;
4504
4505        for (i = 0; i < ARRAY_SIZE(iscsi_port_speed_names); i++) {
4506                if (iscsi_port_speed_names[i].value & port_speed) {
4507                        speed = iscsi_port_speed_names[i].name;
4508                        break;
4509                }
4510        }
4511        return speed;
4512}
4513EXPORT_SYMBOL_GPL(iscsi_get_port_speed_name);
4514
4515/* convert iscsi_port_state values to ascii string name */
4516static const struct {
4517        enum iscsi_port_state   value;
4518        char                    *name;
4519} iscsi_port_state_names[] = {
4520        {ISCSI_PORT_STATE_DOWN,         "LINK DOWN" },
4521        {ISCSI_PORT_STATE_UP,           "LINK UP" },
4522};
4523
4524char *iscsi_get_port_state_name(struct Scsi_Host *shost)
4525{
4526        int i;
4527        char *state = "Unknown!";
4528        struct iscsi_cls_host *ihost = shost->shost_data;
4529        uint32_t port_state = ihost->port_state;
4530
4531        for (i = 0; i < ARRAY_SIZE(iscsi_port_state_names); i++) {
4532                if (iscsi_port_state_names[i].value & port_state) {
4533                        state = iscsi_port_state_names[i].name;
4534                        break;
4535                }
4536        }
4537        return state;
4538}
4539EXPORT_SYMBOL_GPL(iscsi_get_port_state_name);
4540
4541static int iscsi_session_match(struct attribute_container *cont,
4542                           struct device *dev)
4543{
4544        struct iscsi_cls_session *session;
4545        struct Scsi_Host *shost;
4546        struct iscsi_internal *priv;
4547
4548        if (!iscsi_is_session_dev(dev))
4549                return 0;
4550
4551        session = iscsi_dev_to_session(dev);
4552        shost = iscsi_session_to_shost(session);
4553        if (!shost->transportt)
4554                return 0;
4555
4556        priv = to_iscsi_internal(shost->transportt);
4557        if (priv->session_cont.ac.class != &iscsi_session_class.class)
4558                return 0;
4559
4560        return &priv->session_cont.ac == cont;
4561}
4562
4563static int iscsi_conn_match(struct attribute_container *cont,
4564                           struct device *dev)
4565{
4566        struct iscsi_cls_session *session;
4567        struct iscsi_cls_conn *conn;
4568        struct Scsi_Host *shost;
4569        struct iscsi_internal *priv;
4570
4571        if (!iscsi_is_conn_dev(dev))
4572                return 0;
4573
4574        conn = iscsi_dev_to_conn(dev);
4575        session = iscsi_dev_to_session(conn->dev.parent);
4576        shost = iscsi_session_to_shost(session);
4577
4578        if (!shost->transportt)
4579                return 0;
4580
4581        priv = to_iscsi_internal(shost->transportt);
4582        if (priv->conn_cont.ac.class != &iscsi_connection_class.class)
4583                return 0;
4584
4585        return &priv->conn_cont.ac == cont;
4586}
4587
4588static int iscsi_host_match(struct attribute_container *cont,
4589                            struct device *dev)
4590{
4591        struct Scsi_Host *shost;
4592        struct iscsi_internal *priv;
4593
4594        if (!scsi_is_host_device(dev))
4595                return 0;
4596
4597        shost = dev_to_shost(dev);
4598        if (!shost->transportt  ||
4599            shost->transportt->host_attrs.ac.class != &iscsi_host_class.class)
4600                return 0;
4601
4602        priv = to_iscsi_internal(shost->transportt);
4603        return &priv->t.host_attrs.ac == cont;
4604}
4605
4606struct scsi_transport_template *
4607iscsi_register_transport(struct iscsi_transport *tt)
4608{
4609        struct iscsi_internal *priv;
4610        unsigned long flags;
4611        int err;
4612
4613        BUG_ON(!tt);
4614
4615        priv = iscsi_if_transport_lookup(tt);
4616        if (priv)
4617                return NULL;
4618
4619        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
4620        if (!priv)
4621                return NULL;
4622        INIT_LIST_HEAD(&priv->list);
4623        priv->iscsi_transport = tt;
4624        priv->t.user_scan = iscsi_user_scan;
4625        priv->t.create_work_queue = 1;
4626
4627        priv->dev.class = &iscsi_transport_class;
4628        dev_set_name(&priv->dev, "%s", tt->name);
4629        err = device_register(&priv->dev);
4630        if (err)
4631                goto free_priv;
4632
4633        err = sysfs_create_group(&priv->dev.kobj, &iscsi_transport_group);
4634        if (err)
4635                goto unregister_dev;
4636
4637        /* host parameters */
4638        priv->t.host_attrs.ac.class = &iscsi_host_class.class;
4639        priv->t.host_attrs.ac.match = iscsi_host_match;
4640        priv->t.host_attrs.ac.grp = &iscsi_host_group;
4641        priv->t.host_size = sizeof(struct iscsi_cls_host);
4642        transport_container_register(&priv->t.host_attrs);
4643
4644        /* connection parameters */
4645        priv->conn_cont.ac.class = &iscsi_connection_class.class;
4646        priv->conn_cont.ac.match = iscsi_conn_match;
4647        priv->conn_cont.ac.grp = &iscsi_conn_group;
4648        transport_container_register(&priv->conn_cont);
4649
4650        /* session parameters */
4651        priv->session_cont.ac.class = &iscsi_session_class.class;
4652        priv->session_cont.ac.match = iscsi_session_match;
4653        priv->session_cont.ac.grp = &iscsi_session_group;
4654        transport_container_register(&priv->session_cont);
4655
4656        spin_lock_irqsave(&iscsi_transport_lock, flags);
4657        list_add(&priv->list, &iscsi_transports);
4658        spin_unlock_irqrestore(&iscsi_transport_lock, flags);
4659
4660        printk(KERN_NOTICE "iscsi: registered transport (%s)\n", tt->name);
4661        return &priv->t;
4662
4663unregister_dev:
4664        device_unregister(&priv->dev);
4665        return NULL;
4666free_priv:
4667        kfree(priv);
4668        return NULL;
4669}
4670EXPORT_SYMBOL_GPL(iscsi_register_transport);
4671
4672int iscsi_unregister_transport(struct iscsi_transport *tt)
4673{
4674        struct iscsi_internal *priv;
4675        unsigned long flags;
4676
4677        BUG_ON(!tt);
4678
4679        mutex_lock(&rx_queue_mutex);
4680
4681        priv = iscsi_if_transport_lookup(tt);
4682        BUG_ON (!priv);
4683
4684        spin_lock_irqsave(&iscsi_transport_lock, flags);
4685        list_del(&priv->list);
4686        spin_unlock_irqrestore(&iscsi_transport_lock, flags);
4687
4688        transport_container_unregister(&priv->conn_cont);
4689        transport_container_unregister(&priv->session_cont);
4690        transport_container_unregister(&priv->t.host_attrs);
4691
4692        sysfs_remove_group(&priv->dev.kobj, &iscsi_transport_group);
4693        device_unregister(&priv->dev);
4694        mutex_unlock(&rx_queue_mutex);
4695
4696        return 0;
4697}
4698EXPORT_SYMBOL_GPL(iscsi_unregister_transport);
4699
4700void iscsi_dbg_trace(void (*trace)(struct device *dev, struct va_format *),
4701                     struct device *dev, const char *fmt, ...)
4702{
4703        struct va_format vaf;
4704        va_list args;
4705
4706        va_start(args, fmt);
4707        vaf.fmt = fmt;
4708        vaf.va = &args;
4709        trace(dev, &vaf);
4710        va_end(args);
4711}
4712EXPORT_SYMBOL_GPL(iscsi_dbg_trace);
4713
4714static __init int iscsi_transport_init(void)
4715{
4716        int err;
4717        struct netlink_kernel_cfg cfg = {
4718                .groups = 1,
4719                .input  = iscsi_if_rx,
4720        };
4721        printk(KERN_INFO "Loading iSCSI transport class v%s.\n",
4722                ISCSI_TRANSPORT_VERSION);
4723
4724        atomic_set(&iscsi_session_nr, 0);
4725
4726        err = class_register(&iscsi_transport_class);
4727        if (err)
4728                return err;
4729
4730        err = class_register(&iscsi_endpoint_class);
4731        if (err)
4732                goto unregister_transport_class;
4733
4734        err = class_register(&iscsi_iface_class);
4735        if (err)
4736                goto unregister_endpoint_class;
4737
4738        err = transport_class_register(&iscsi_host_class);
4739        if (err)
4740                goto unregister_iface_class;
4741
4742        err = transport_class_register(&iscsi_connection_class);
4743        if (err)
4744                goto unregister_host_class;
4745
4746        err = transport_class_register(&iscsi_session_class);
4747        if (err)
4748                goto unregister_conn_class;
4749
4750        err = bus_register(&iscsi_flashnode_bus);
4751        if (err)
4752                goto unregister_session_class;
4753
4754        nls = netlink_kernel_create(&init_net, NETLINK_ISCSI, &cfg);
4755        if (!nls) {
4756                err = -ENOBUFS;
4757                goto unregister_flashnode_bus;
4758        }
4759
4760        iscsi_eh_timer_workq = alloc_workqueue("%s",
4761                        WQ_SYSFS | __WQ_LEGACY | WQ_MEM_RECLAIM | WQ_UNBOUND,
4762                        1, "iscsi_eh");
4763        if (!iscsi_eh_timer_workq) {
4764                err = -ENOMEM;
4765                goto release_nls;
4766        }
4767
4768        iscsi_destroy_workq = alloc_workqueue("%s",
4769                        WQ_SYSFS | __WQ_LEGACY | WQ_MEM_RECLAIM | WQ_UNBOUND,
4770                        1, "iscsi_destroy");
4771        if (!iscsi_destroy_workq) {
4772                err = -ENOMEM;
4773                goto destroy_wq;
4774        }
4775
4776        return 0;
4777
4778destroy_wq:
4779        destroy_workqueue(iscsi_eh_timer_workq);
4780release_nls:
4781        netlink_kernel_release(nls);
4782unregister_flashnode_bus:
4783        bus_unregister(&iscsi_flashnode_bus);
4784unregister_session_class:
4785        transport_class_unregister(&iscsi_session_class);
4786unregister_conn_class:
4787        transport_class_unregister(&iscsi_connection_class);
4788unregister_host_class:
4789        transport_class_unregister(&iscsi_host_class);
4790unregister_iface_class:
4791        class_unregister(&iscsi_iface_class);
4792unregister_endpoint_class:
4793        class_unregister(&iscsi_endpoint_class);
4794unregister_transport_class:
4795        class_unregister(&iscsi_transport_class);
4796        return err;
4797}
4798
4799static void __exit iscsi_transport_exit(void)
4800{
4801        destroy_workqueue(iscsi_destroy_workq);
4802        destroy_workqueue(iscsi_eh_timer_workq);
4803        netlink_kernel_release(nls);
4804        bus_unregister(&iscsi_flashnode_bus);
4805        transport_class_unregister(&iscsi_connection_class);
4806        transport_class_unregister(&iscsi_session_class);
4807        transport_class_unregister(&iscsi_host_class);
4808        class_unregister(&iscsi_endpoint_class);
4809        class_unregister(&iscsi_iface_class);
4810        class_unregister(&iscsi_transport_class);
4811}
4812
4813module_init(iscsi_transport_init);
4814module_exit(iscsi_transport_exit);
4815
4816MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
4817              "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
4818              "Alex Aizman <itn780@yahoo.com>");
4819MODULE_DESCRIPTION("iSCSI Transport Interface");
4820MODULE_LICENSE("GPL");
4821MODULE_VERSION(ISCSI_TRANSPORT_VERSION);
4822MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_ISCSI);
4823