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, uint32_t *hn);
  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        int (*init_task) (struct iscsi_task *task);
 117        int (*xmit_task) (struct iscsi_task *task);
 118        void (*cleanup_task) (struct iscsi_conn *conn,
 119                                  struct iscsi_task *task);
 120        void (*session_recovery_timedout) (struct iscsi_cls_session *session);
 121        struct iscsi_endpoint *(*ep_connect) (struct sockaddr *dst_addr,
 122                                              int non_blocking);
 123        int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms);
 124        void (*ep_disconnect) (struct iscsi_endpoint *ep);
 125        int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type,
 126                          uint32_t enable, struct sockaddr *dst_addr);
 127};
 128
 129/*
 130 * transport registration upcalls
 131 */
 132extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt);
 133extern int iscsi_unregister_transport(struct iscsi_transport *tt);
 134
 135/*
 136 * control plane upcalls
 137 */
 138extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn,
 139                                   enum iscsi_err error);
 140extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
 141                          char *data, uint32_t data_size);
 142
 143struct iscsi_cls_conn {
 144        struct list_head conn_list;     /* item in connlist */
 145        void *dd_data;                  /* LLD private data */
 146        struct iscsi_transport *transport;
 147        uint32_t cid;                   /* connection id */
 148
 149        int active;                     /* must be accessed with the connlock */
 150        struct device dev;              /* sysfs transport/container device */
 151};
 152
 153#define iscsi_dev_to_conn(_dev) \
 154        container_of(_dev, struct iscsi_cls_conn, dev)
 155
 156#define iscsi_conn_to_session(_conn) \
 157        iscsi_dev_to_session(_conn->dev.parent)
 158
 159/* iscsi class session state */
 160enum {
 161        ISCSI_SESSION_LOGGED_IN,
 162        ISCSI_SESSION_FAILED,
 163        ISCSI_SESSION_FREE,
 164};
 165
 166#define ISCSI_MAX_TARGET -1
 167
 168struct iscsi_cls_session {
 169        struct list_head sess_list;             /* item in session_list */
 170        struct iscsi_transport *transport;
 171        spinlock_t lock;
 172        struct work_struct block_work;
 173        struct work_struct unblock_work;
 174        struct work_struct scan_work;
 175        struct work_struct unbind_work;
 176
 177        /* recovery fields */
 178        int recovery_tmo;
 179        struct delayed_work recovery_work;
 180
 181        unsigned int target_id;
 182
 183        int state;
 184        int sid;                                /* session id */
 185        void *dd_data;                          /* LLD private data */
 186        struct device dev;      /* sysfs transport/container device */
 187};
 188
 189#define iscsi_dev_to_session(_dev) \
 190        container_of(_dev, struct iscsi_cls_session, dev)
 191
 192#define iscsi_session_to_shost(_session) \
 193        dev_to_shost(_session->dev.parent)
 194
 195#define starget_to_session(_stgt) \
 196        iscsi_dev_to_session(_stgt->dev.parent)
 197
 198struct iscsi_cls_host {
 199        atomic_t nr_scans;
 200        struct mutex mutex;
 201        struct workqueue_struct *scan_workq;
 202        char scan_workq_name[20];
 203};
 204
 205extern void iscsi_host_for_each_session(struct Scsi_Host *shost,
 206                                void (*fn)(struct iscsi_cls_session *));
 207
 208struct iscsi_endpoint {
 209        void *dd_data;                  /* LLD private data */
 210        struct device dev;
 211        uint64_t id;
 212};
 213
 214/*
 215 * session and connection functions that can be used by HW iSCSI LLDs
 216 */
 217#define iscsi_cls_session_printk(prefix, _cls_session, fmt, a...) \
 218        dev_printk(prefix, &(_cls_session)->dev, fmt, ##a)
 219
 220#define iscsi_cls_conn_printk(prefix, _cls_conn, fmt, a...) \
 221        dev_printk(prefix, &(_cls_conn)->dev, fmt, ##a)
 222
 223extern int iscsi_session_chkready(struct iscsi_cls_session *session);
 224extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,
 225                                struct iscsi_transport *transport, int dd_size);
 226extern int iscsi_add_session(struct iscsi_cls_session *session,
 227                             unsigned int target_id);
 228extern int iscsi_session_event(struct iscsi_cls_session *session,
 229                               enum iscsi_uevent_e event);
 230extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
 231                                                struct iscsi_transport *t,
 232                                                int dd_size,
 233                                                unsigned int target_id);
 234extern void iscsi_remove_session(struct iscsi_cls_session *session);
 235extern void iscsi_free_session(struct iscsi_cls_session *session);
 236extern int iscsi_destroy_session(struct iscsi_cls_session *session);
 237extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
 238                                                int dd_size, uint32_t cid);
 239extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
 240extern void iscsi_unblock_session(struct iscsi_cls_session *session);
 241extern void iscsi_block_session(struct iscsi_cls_session *session);
 242extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time);
 243extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size);
 244extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep);
 245extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle);
 246
 247#endif
 248
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.