#include <linux/types.h>
#include <linux/kfifo.h>
#include <linux/delay.h>
#include <linux/log2.h>
#include <linux/slab.h>
#include <linux/sched/signal.h>
#include <linux/module.h>
#include <asm/unaligned.h>
#include <net/tcp.h>
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_eh.h>
#include <scsi/scsi_tcq.h>
#include <scsi/scsi_host.h>
#include <scsi/scsi.h>
#include <scsi/iscsi_proto.h>
#include <scsi/scsi_transport.h>
#include <scsi/scsi_transport_iscsi.h>
#include <scsi/libiscsi.h>
#include <trace/events/iscsi.h>
static int iscsi_dbg_lib_conn;
module_param_named(debug_libiscsi_conn, iscsi_dbg_lib_conn, int,
S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(…) …;
static int iscsi_dbg_lib_session;
module_param_named(debug_libiscsi_session, iscsi_dbg_lib_session, int,
S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(…) …;
static int iscsi_dbg_lib_eh;
module_param_named(debug_libiscsi_eh, iscsi_dbg_lib_eh, int,
S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(…) …;
#define ISCSI_DBG_CONN(_conn, dbg_fmt, arg...) …
#define ISCSI_DBG_SESSION(_session, dbg_fmt, arg...) …
#define ISCSI_DBG_EH(_session, dbg_fmt, arg...) …
#define ISCSI_CMD_COMPL_WAIT …
inline void iscsi_conn_queue_xmit(struct iscsi_conn *conn)
{ … }
EXPORT_SYMBOL_GPL(…);
inline void iscsi_conn_queue_recv(struct iscsi_conn *conn)
{ … }
EXPORT_SYMBOL_GPL(…);
static void __iscsi_update_cmdsn(struct iscsi_session *session,
uint32_t exp_cmdsn, uint32_t max_cmdsn)
{ … }
void iscsi_update_cmdsn(struct iscsi_session *session, struct iscsi_nopin *hdr)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_prep_data_out_pdu(struct iscsi_task *task, struct iscsi_r2t_info *r2t,
struct iscsi_data *hdr)
{ … }
EXPORT_SYMBOL_GPL(…);
static int iscsi_add_hdr(struct iscsi_task *task, unsigned len)
{ … }
static int iscsi_prep_ecdb_ahs(struct iscsi_task *task)
{ … }
static int iscsi_check_tmf_restrictions(struct iscsi_task *task, int opcode)
{ … }
static int iscsi_prep_scsi_cmd_pdu(struct iscsi_task *task)
{ … }
static void iscsi_free_task(struct iscsi_task *task)
{ … }
bool iscsi_get_task(struct iscsi_task *task)
{ … }
EXPORT_SYMBOL_GPL(…);
void __iscsi_put_task(struct iscsi_task *task)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_put_task(struct iscsi_task *task)
{ … }
EXPORT_SYMBOL_GPL(…);
static void iscsi_complete_task(struct iscsi_task *task, int state)
{ … }
void iscsi_complete_scsi_task(struct iscsi_task *task,
uint32_t exp_cmdsn, uint32_t max_cmdsn)
{ … }
EXPORT_SYMBOL_GPL(…);
static bool cleanup_queued_task(struct iscsi_task *task)
{ … }
static void __fail_scsi_task(struct iscsi_task *task, int err)
{ … }
static void fail_scsi_task(struct iscsi_task *task, int err)
{ … }
static int iscsi_prep_mgmt_task(struct iscsi_conn *conn,
struct iscsi_task *task)
{ … }
static struct iscsi_task *
iscsi_alloc_mgmt_task(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
char *data, uint32_t data_size)
{ … }
static int iscsi_send_mgmt_task(struct iscsi_task *task)
{ … }
static int __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
char *data, uint32_t data_size)
{ … }
int iscsi_conn_send_pdu(struct iscsi_cls_conn *cls_conn, struct iscsi_hdr *hdr,
char *data, uint32_t data_size)
{ … }
EXPORT_SYMBOL_GPL(…);
static void iscsi_scsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
struct iscsi_task *task, char *data,
int datalen)
{ … }
static void
iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
struct iscsi_task *task)
{ … }
static void iscsi_tmf_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr)
{ … }
static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)
{ … }
static int iscsi_nop_out_rsp(struct iscsi_task *task,
struct iscsi_nopin *nop, char *data, int datalen)
{ … }
static int iscsi_handle_reject(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
char *data, int datalen)
{ … }
struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *conn, itt_t itt)
{ … }
EXPORT_SYMBOL_GPL(…);
int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
char *data, int datalen)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
char *data, int datalen)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_verify_itt(struct iscsi_conn *conn, itt_t itt)
{ … }
EXPORT_SYMBOL_GPL(…);
struct iscsi_task *iscsi_itt_to_ctask(struct iscsi_conn *conn, itt_t itt)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_session_failure(struct iscsi_session *session,
enum iscsi_err err)
{ … }
EXPORT_SYMBOL_GPL(…);
static bool iscsi_set_conn_failed(struct iscsi_conn *conn)
{ … }
void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err)
{ … }
EXPORT_SYMBOL_GPL(…);
static int iscsi_check_cmdsn_window_closed(struct iscsi_conn *conn)
{ … }
static int iscsi_xmit_task(struct iscsi_conn *conn, struct iscsi_task *task,
bool was_requeue)
{ … }
void iscsi_requeue_task(struct iscsi_task *task)
{ … }
EXPORT_SYMBOL_GPL(…);
static int iscsi_data_xmit(struct iscsi_conn *conn)
{ … }
static void iscsi_xmitworker(struct work_struct *work)
{ … }
static inline struct iscsi_task *iscsi_alloc_task(struct iscsi_conn *conn,
struct scsi_cmnd *sc)
{ … }
enum { … };
int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_target_alloc(struct scsi_target *starget)
{ … }
EXPORT_SYMBOL_GPL(…);
static void iscsi_tmf_timedout(struct timer_list *t)
{ … }
static int iscsi_exec_task_mgmt_fn(struct iscsi_conn *conn,
struct iscsi_tm *hdr, int age,
int timeout)
__must_hold(&session->frwd_lock)
{ … }
static void fail_scsi_tasks(struct iscsi_conn *conn, u64 lun, int error)
{ … }
void iscsi_suspend_queue(struct iscsi_conn *conn)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_suspend_tx(struct iscsi_conn *conn)
{ … }
EXPORT_SYMBOL_GPL(…);
static void iscsi_start_tx(struct iscsi_conn *conn)
{ … }
void iscsi_suspend_rx(struct iscsi_conn *conn)
{ … }
EXPORT_SYMBOL_GPL(…);
static int iscsi_has_ping_timed_out(struct iscsi_conn *conn)
{ … }
enum scsi_timeout_action iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
{ … }
EXPORT_SYMBOL_GPL(…);
static void iscsi_check_transport_timeouts(struct timer_list *t)
{ … }
void iscsi_conn_unbind(struct iscsi_cls_conn *cls_conn, bool is_active)
{ … }
EXPORT_SYMBOL_GPL(…);
static void iscsi_prep_abort_task_pdu(struct iscsi_task *task,
struct iscsi_tm *hdr)
{ … }
int iscsi_eh_abort(struct scsi_cmnd *sc)
{ … }
EXPORT_SYMBOL_GPL(…);
static void iscsi_prep_lun_reset_pdu(struct scsi_cmnd *sc, struct iscsi_tm *hdr)
{ … }
int iscsi_eh_device_reset(struct scsi_cmnd *sc)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_session_recovery_timedout(struct iscsi_cls_session *cls_session)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_eh_session_reset(struct scsi_cmnd *sc)
{ … }
EXPORT_SYMBOL_GPL(…);
static void iscsi_prep_tgt_reset_pdu(struct scsi_cmnd *sc, struct iscsi_tm *hdr)
{ … }
static int iscsi_eh_target_reset(struct scsi_cmnd *sc)
{ … }
int iscsi_eh_recover_target(struct scsi_cmnd *sc)
{ … }
EXPORT_SYMBOL_GPL(…);
int
iscsi_pool_init(struct iscsi_pool *q, int max, void ***items, int item_size)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_pool_free(struct iscsi_pool *q)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_host_get_max_scsi_cmds(struct Scsi_Host *shost,
uint16_t requested_cmds_max)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_host_add(struct Scsi_Host *shost, struct device *pdev)
{ … }
EXPORT_SYMBOL_GPL(…);
struct Scsi_Host *iscsi_host_alloc(const struct scsi_host_template *sht,
int dd_data_size, bool xmit_can_sleep)
{ … }
EXPORT_SYMBOL_GPL(…);
static void iscsi_notify_host_removed(struct iscsi_cls_session *cls_session)
{ … }
void iscsi_host_remove(struct Scsi_Host *shost, bool is_shutdown)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_host_free(struct Scsi_Host *shost)
{ … }
EXPORT_SYMBOL_GPL(…);
static void iscsi_host_dec_session_cnt(struct Scsi_Host *shost)
{ … }
struct iscsi_cls_session *
iscsi_session_setup(struct iscsi_transport *iscsit, struct Scsi_Host *shost,
uint16_t cmds_max, int dd_size, int cmd_task_size,
uint32_t initial_cmdsn, unsigned int id)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_session_remove(struct iscsi_cls_session *cls_session)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_session_free(struct iscsi_cls_session *cls_session)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
{ … }
EXPORT_SYMBOL_GPL(…);
struct iscsi_cls_conn *
iscsi_conn_setup(struct iscsi_cls_session *cls_session, int dd_size,
uint32_t conn_idx)
{ … }
EXPORT_SYMBOL_GPL(…);
void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_conn_start(struct iscsi_cls_conn *cls_conn)
{ … }
EXPORT_SYMBOL_GPL(…);
static void
fail_mgmt_tasks(struct iscsi_session *session, struct iscsi_conn *conn)
{ … }
void iscsi_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_conn_bind(struct iscsi_cls_session *cls_session,
struct iscsi_cls_conn *cls_conn, int is_leading)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_switch_str_param(char **param, char *new_val_buf)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
enum iscsi_param param, char *buf, int buflen)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_session_get_param(struct iscsi_cls_session *cls_session,
enum iscsi_param param, char *buf)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_conn_get_addr_param(struct sockaddr_storage *addr,
enum iscsi_param param, char *buf)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
enum iscsi_param param, char *buf)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_host_get_param(struct Scsi_Host *shost, enum iscsi_host_param param,
char *buf)
{ … }
EXPORT_SYMBOL_GPL(…);
int iscsi_host_set_param(struct Scsi_Host *shost, enum iscsi_host_param param,
char *buf, int buflen)
{ … }
EXPORT_SYMBOL_GPL(…);
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;