linux/include/scsi/scsi_transport_iscsi.h
<<
>>
Prefs
   1/*
   2 * iSCSI transport class definitions
   3 *
   4 * Copyright (C) IBM Corporation, 2004
   5 * Copyright (C) Mike Christie, 2004 - 2006
   6 * Copyright (C) Dmitry Yusupov, 2004 - 2005
   7 * Copyright (C) Alex Aizman, 2004 - 2005
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License as published by
  11 * the Free Software Foundation; either version 2 of the License, or
  12 * (at your option) any later version.
  13 *
  14 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 *
  19 * You should have received a copy of the GNU General Public License
  20 * along with this program; if not, write to the Free Software
  21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  22 */
  23#ifndef SCSI_TRANSPORT_ISCSI_H
  24#define SCSI_TRANSPORT_ISCSI_H
  25
  26#include <linux/device.h>
  27#include <linux/list.h>
  28#include <linux/mutex.h>
  29#include <scsi/iscsi_if.h>
  30
  31struct scsi_transport_template;
  32struct iscsi_transport;
  33struct iscsi_endpoint;
  34struct Scsi_Host;
  35struct iscsi_cls_conn;
  36struct iscsi_conn;
  37struct iscsi_task;
  38struct sockaddr;
  39
  40/**
  41 * struct iscsi_transport - iSCSI Transport template
  42 *
  43 * @name:               transport name
  44 * @caps:               iSCSI Data-Path capabilities
  45 * @create_session:     create new iSCSI session object
  46 * @destroy_session:    destroy existing iSCSI session object
  47 * @create_conn:        create new iSCSI connection
  48 * @bind_conn:          associate this connection with existing iSCSI session
  49 *                      and specified transport descriptor
  50 * @destroy_conn:       destroy inactive iSCSI connection
  51 * @set_param:          set iSCSI parameter. Return 0 on success, -ENODATA
  52 *                      when param is not supported, and a -Exx value on other
  53 *                      error.
  54 * @get_param           get iSCSI parameter. Must return number of bytes
  55 *                      copied to buffer on success, -ENODATA when param
  56 *                      is not supported, and a -Exx value on other error
  57 * @start_conn:         set connection to be operational
  58 * @stop_conn:          suspend/recover/terminate connection
  59 * @send_pdu:           send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text.
  60 * @session_recovery_timedout: notify LLD a block during recovery timed out
  61 * @init_task:          Initialize a iscsi_task and any internal structs.
  62 *                      When offloading the data path, this is called from
  63 *                      queuecommand with the session lock, or from the
  64 *                      iscsi_conn_send_pdu context with the session lock.
  65 *                      When not offloading the data path, this is called
  66 *                      from the scsi work queue without the session lock.
  67 * @xmit_task           Requests LLD to transfer cmd task. Returns 0 or the
  68 *                      the number of bytes transferred on success, and -Exyz
  69 *                      value on error. When offloading the data path, this
  70 *                      is called from queuecommand with the session lock, or
  71 *                      from the iscsi_conn_send_pdu context with the session
  72 *                      lock. When not offloading the data path, this is called
  73 *                      from the scsi work queue without the session lock.
  74 * @cleanup_task:       requests LLD to fail task. Called with session lock
  75 *                      and after the connection has been suspended and
  76 *                      terminated during recovery. If called
  77 *                      from abort task then connection is not suspended
  78 *                      or terminated but sk_callback_lock is held
  79 *
  80 * Template API provided by iSCSI Transport
  81 */
  82struct iscsi_transport {
  83        struct module *owner;
  84        char *name;
  85        unsigned int caps;
  86        /* LLD sets this to indicate what values it can export to sysfs */
  87        uint64_t param_mask;
  88        uint64_t host_param_mask;
  89        struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep,
  90                                        uint16_t cmds_max, uint16_t qdepth,
  91                                        uint32_t sn);
  92        void (*destroy_session) (struct iscsi_cls_session *session);
  93        struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,
  94                                uint32_t cid);
  95        int (*bind_conn) (struct iscsi_cls_session *session,
  96                          struct iscsi_cls_conn *cls_conn,
  97                          uint64_t transport_eph, int is_leading);
  98        int (*start_conn) (struct iscsi_cls_conn *conn);
  99        void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);
 100        void (*destroy_conn) (struct iscsi_cls_conn *conn);
 101        int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param,
 102                          char *buf, int buflen);
 103        int (*get_conn_param) (struct iscsi_cls_conn *conn,
 104                               enum iscsi_param param, char *buf);
 105        int (*get_session_param) (struct iscsi_cls_session *session,
 106                                  enum iscsi_param param, char *buf);
 107        int (*get_host_param) (struct Scsi_Host *shost,
 108                                enum iscsi_host_param param, char *buf);
 109        int (*set_host_param) (struct Scsi_Host *shost,
 110                               enum iscsi_host_param param, char *buf,
 111                               int buflen);
 112        int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
 113                         char *data, uint32_t data_size);
 114        void (*get_stats) (struct iscsi_cls_conn *conn,
 115                           struct iscsi_stats *stats);
 116
 117        int (*init_task) (struct iscsi_task *task);
 118        int (*xmit_task) (struct iscsi_task *task);
 119        void (*cleanup_task) (struct iscsi_task *task);
 120
 121        int (*alloc_pdu) (struct iscsi_task *task, uint8_t opcode);
 122        int (*xmit_pdu) (struct iscsi_task *task);
 123        int (*init_pdu) (struct iscsi_task *task, unsigned int offset,
 124                         unsigned int count);
 125        void (*parse_pdu_itt) (struct iscsi_conn *conn, itt_t itt,
 126                               int *index, int *age);
 127
 128        void (*session_recovery_timedout) (struct iscsi_cls_session *session);
 129        struct iscsi_endpoint *(*ep_connect) (struct Scsi_Host *shost,
 130                                              struct sockaddr *dst_addr,
 131                                              int non_blocking);
 132        int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms);
 133        void (*ep_disconnect) (struct iscsi_endpoint *ep);
 134        int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type,
 135                          uint32_t enable, struct sockaddr *dst_addr);
 136        int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params);
 137};
 138
 139/*
 140 * transport registration upcalls
 141 */
 142extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt);
 143extern int iscsi_unregister_transport(struct iscsi_transport *tt);
 144
 145/*
 146 * control plane upcalls
 147 */
 148extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn,
 149                                   enum iscsi_err error);
 150extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
 151                          char *data, uint32_t data_size);
 152
 153extern int iscsi_offload_mesg(struct Scsi_Host *shost,
 154                              struct iscsi_transport *transport, uint32_t type,
 155                              char *data, uint16_t data_size);
 156
 157struct iscsi_cls_conn {
 158        struct list_head conn_list;     /* item in connlist */
 159        void *dd_data;                  /* LLD private data */
 160        struct iscsi_transport *transport;
 161        uint32_t cid;                   /* connection id */
 162
 163        int active;                     /* must be accessed with the connlock */
 164        struct device dev;              /* sysfs transport/container device */
 165};
 166
 167#define iscsi_dev_to_conn(_dev) \
 168        container_of(_dev, struct iscsi_cls_conn, dev)
 169
 170#define iscsi_conn_to_session(_conn) \
 171        iscsi_dev_to_session(_conn->dev.parent)
 172
 173/* iscsi class session state */
 174enum {
 175        ISCSI_SESSION_LOGGED_IN,
 176        ISCSI_SESSION_FAILED,
 177        ISCSI_SESSION_FREE,
 178};
 179
 180#define ISCSI_MAX_TARGET -1
 181
 182struct iscsi_cls_session {
 183        struct list_head sess_list;             /* item in session_list */
 184        struct iscsi_transport *transport;
 185        spinlock_t lock;
 186        struct work_struct block_work;
 187        struct work_struct unblock_work;
 188        struct work_struct scan_work;
 189        struct work_struct unbind_work;
 190
 191        /* recovery fields */
 192        int recovery_tmo;
 193        struct delayed_work recovery_work;
 194
 195        unsigned int target_id;
 196
 197        int state;
 198        int sid;                                /* session id */
 199        void *dd_data;                          /* LLD private data */
 200        struct device dev;      /* sysfs transport/container device */
 201};
 202
 203#define iscsi_dev_to_session(_dev) \
 204        container_of(_dev, struct iscsi_cls_session, dev)
 205
 206#define iscsi_session_to_shost(_session) \
 207        dev_to_shost(_session->dev.parent)
 208
 209#define starget_to_session(_stgt) \
 210        iscsi_dev_to_session(_stgt->dev.parent)
 211
 212struct iscsi_cls_host {
 213        atomic_t nr_scans;
 214        struct mutex mutex;
 215};
 216
 217extern void iscsi_host_for_each_session(struct Scsi_Host *shost,
 218                                void (*fn)(struct iscsi_cls_session *));
 219
 220struct iscsi_endpoint {
 221        void *dd_data;                  /* LLD private data */
 222        struct device dev;
 223        uint64_t id;
 224};
 225
 226/*
 227 * session and connection functions that can be used by HW iSCSI LLDs
 228 */
 229#define iscsi_cls_session_printk(prefix, _cls_session, fmt, a...) \
 230        dev_printk(prefix, &(_cls_session)->dev, fmt, ##a)
 231
 232#define iscsi_cls_conn_printk(prefix, _cls_conn, fmt, a...) \
 233        dev_printk(prefix, &(_cls_conn)->dev, fmt, ##a)
 234
 235extern int iscsi_session_chkready(struct iscsi_cls_session *session);
 236extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,
 237                                struct iscsi_transport *transport, int dd_size);
 238extern int iscsi_add_session(struct iscsi_cls_session *session,
 239                             unsigned int target_id);
 240extern int iscsi_session_event(struct iscsi_cls_session *session,
 241                               enum iscsi_uevent_e event);
 242extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
 243                                                struct iscsi_transport *t,
 244                                                int dd_size,
 245                                                unsigned int target_id);
 246extern void iscsi_remove_session(struct iscsi_cls_session *session);
 247extern void iscsi_free_session(struct iscsi_cls_session *session);
 248extern int iscsi_destroy_session(struct iscsi_cls_session *session);
 249extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
 250                                                int dd_size, uint32_t cid);
 251extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
 252extern void iscsi_unblock_session(struct iscsi_cls_session *session);
 253extern void iscsi_block_session(struct iscsi_cls_session *session);
 254extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time);
 255extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size);
 256extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep);
 257extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle);
 258
 259#endif
 260
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.