mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 04:21:03 -04:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (57 commits) [SCSI] fix error handling in scsi_io_completion [SCSI] qla1280: fix section mismatch warnings [SCSI] mptsas: eliminate ghost devices [SCSI] qla2xxx: make some more functions static [SCSI] small whitespace cleanup for qlogic driver [SCSI] mptbase: mpt_interrupt should return IRQ_NONE [SCSI] mptsas: make two functions static [SCSI] sg.c: Fix bad error handling in [SCSI] 53c700: fix breakage caused by the autosense update [SCSI] iscsi: add async notification of session events [SCSI] iscsi: pass target nr to session creation [SCSI] iscsi: break up session creation into two stages [SCSI] iscsi: rm channel usage from iscsi [SCSI] iscsi: fix session refcouting [SCSI] iscsi: convert iscsi_tcp to new set/get param fns [SCSI] iscsi: convert iser to new set/get param fns [SCSI] iscsi: fixup set/get param functions [SCSI] iscsi: add target discvery event to transport class [SCSI] st: remove unused st_buffer.in_use [SCSI] atp870u: reduce huge stack usage ...
This commit is contained in:
@@ -47,10 +47,19 @@ enum iscsi_uevent_e {
|
||||
ISCSI_UEVENT_TRANSPORT_EP_POLL = UEVENT_BASE + 13,
|
||||
ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14,
|
||||
|
||||
ISCSI_UEVENT_TGT_DSCVR = UEVENT_BASE + 15,
|
||||
|
||||
/* up events */
|
||||
ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
|
||||
ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2,
|
||||
ISCSI_KEVENT_IF_ERROR = KEVENT_BASE + 3,
|
||||
ISCSI_KEVENT_DESTROY_SESSION = KEVENT_BASE + 4,
|
||||
};
|
||||
|
||||
enum iscsi_tgt_dscvr {
|
||||
ISCSI_TGT_DSCVR_SEND_TARGETS = 1,
|
||||
ISCSI_TGT_DSCVR_ISNS = 2,
|
||||
ISCSI_TGT_DSCVR_SLP = 3,
|
||||
};
|
||||
|
||||
struct iscsi_uevent {
|
||||
@@ -116,6 +125,17 @@ struct iscsi_uevent {
|
||||
struct msg_transport_disconnect {
|
||||
uint64_t ep_handle;
|
||||
} ep_disconnect;
|
||||
struct msg_tgt_dscvr {
|
||||
enum iscsi_tgt_dscvr type;
|
||||
uint32_t host_no;
|
||||
/*
|
||||
* enable = 1 to establish a new connection
|
||||
* with the server. enable = 0 to disconnect
|
||||
* from the server. Used primarily to switch
|
||||
* from one iSNS server to another.
|
||||
*/
|
||||
uint32_t enable;
|
||||
} tgt_dscvr;
|
||||
} u;
|
||||
union {
|
||||
/* messages k -> u */
|
||||
@@ -138,6 +158,10 @@ struct iscsi_uevent {
|
||||
uint32_t cid;
|
||||
uint32_t error; /* enum iscsi_err */
|
||||
} connerror;
|
||||
struct msg_session_destroyed {
|
||||
uint32_t host_no;
|
||||
uint32_t sid;
|
||||
} d_session;
|
||||
struct msg_transport_connect_ret {
|
||||
uint64_t handle;
|
||||
} ep_connect_ret;
|
||||
|
||||
@@ -157,6 +157,11 @@ struct iscsi_conn {
|
||||
int max_xmit_dlength; /* target_max_recv_dsl */
|
||||
int hdrdgst_en;
|
||||
int datadgst_en;
|
||||
int ifmarker_en;
|
||||
int ofmarker_en;
|
||||
/* values userspace uses to id a conn */
|
||||
int persistent_port;
|
||||
char *persistent_address;
|
||||
|
||||
/* MIB-statistics */
|
||||
uint64_t txdata_octets;
|
||||
@@ -196,8 +201,8 @@ struct iscsi_session {
|
||||
int pdu_inorder_en;
|
||||
int dataseq_inorder_en;
|
||||
int erl;
|
||||
int ifmarker_en;
|
||||
int ofmarker_en;
|
||||
int tpgt;
|
||||
char *targetname;
|
||||
|
||||
/* control data */
|
||||
struct iscsi_transport *tt;
|
||||
@@ -240,6 +245,10 @@ iscsi_session_setup(struct iscsi_transport *, struct scsi_transport_template *,
|
||||
extern void iscsi_session_teardown(struct iscsi_cls_session *);
|
||||
extern struct iscsi_session *class_to_transport_session(struct iscsi_cls_session *);
|
||||
extern void iscsi_session_recovery_timedout(struct iscsi_cls_session *);
|
||||
extern int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
|
||||
enum iscsi_param param, char *buf, int buflen);
|
||||
extern int iscsi_session_get_param(struct iscsi_cls_session *cls_session,
|
||||
enum iscsi_param param, char *buf);
|
||||
|
||||
#define session_to_cls(_sess) \
|
||||
hostdata_session(_sess->host->hostdata)
|
||||
@@ -255,6 +264,8 @@ extern void iscsi_conn_stop(struct iscsi_cls_conn *, int);
|
||||
extern int iscsi_conn_bind(struct iscsi_cls_session *, struct iscsi_cls_conn *,
|
||||
int);
|
||||
extern void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err);
|
||||
extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
|
||||
enum iscsi_param param, char *buf);
|
||||
|
||||
/*
|
||||
* pdu and task processing
|
||||
|
||||
@@ -143,7 +143,7 @@ struct scsi_cmnd {
|
||||
|
||||
extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t);
|
||||
extern void scsi_put_command(struct scsi_cmnd *);
|
||||
extern void scsi_io_completion(struct scsi_cmnd *, unsigned int, unsigned int);
|
||||
extern void scsi_io_completion(struct scsi_cmnd *, unsigned int);
|
||||
extern void scsi_finish_command(struct scsi_cmnd *cmd);
|
||||
extern void scsi_req_abort_cmd(struct scsi_cmnd *cmd);
|
||||
|
||||
|
||||
@@ -542,6 +542,9 @@ struct Scsi_Host {
|
||||
*/
|
||||
unsigned ordered_tag:1;
|
||||
|
||||
/* task mgmt function in progress */
|
||||
unsigned tmf_in_progress:1;
|
||||
|
||||
/*
|
||||
* Optional work queue to be utilized by the transport
|
||||
*/
|
||||
@@ -619,7 +622,8 @@ static inline int scsi_host_in_recovery(struct Scsi_Host *shost)
|
||||
{
|
||||
return shost->shost_state == SHOST_RECOVERY ||
|
||||
shost->shost_state == SHOST_CANCEL_RECOVERY ||
|
||||
shost->shost_state == SHOST_DEL_RECOVERY;
|
||||
shost->shost_state == SHOST_DEL_RECOVERY ||
|
||||
shost->tmf_in_progress;
|
||||
}
|
||||
|
||||
extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *);
|
||||
|
||||
@@ -34,6 +34,7 @@ struct iscsi_cls_conn;
|
||||
struct iscsi_conn;
|
||||
struct iscsi_cmd_task;
|
||||
struct iscsi_mgmt_task;
|
||||
struct sockaddr;
|
||||
|
||||
/**
|
||||
* struct iscsi_transport - iSCSI Transport template
|
||||
@@ -46,7 +47,12 @@ struct iscsi_mgmt_task;
|
||||
* @bind_conn: associate this connection with existing iSCSI session
|
||||
* and specified transport descriptor
|
||||
* @destroy_conn: destroy inactive iSCSI connection
|
||||
* @set_param: set iSCSI Data-Path operational parameter
|
||||
* @set_param: set iSCSI parameter. Return 0 on success, -ENODATA
|
||||
* when param is not supported, and a -Exx value on other
|
||||
* error.
|
||||
* @get_param get iSCSI parameter. Must return number of bytes
|
||||
* copied to buffer on success, -ENODATA when param
|
||||
* is not supported, and a -Exx value on other error
|
||||
* @start_conn: set connection to be operational
|
||||
* @stop_conn: suspend/recover/terminate connection
|
||||
* @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text.
|
||||
@@ -97,15 +103,11 @@ struct iscsi_transport {
|
||||
void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);
|
||||
void (*destroy_conn) (struct iscsi_cls_conn *conn);
|
||||
int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param,
|
||||
uint32_t value);
|
||||
char *buf, int buflen);
|
||||
int (*get_conn_param) (struct iscsi_cls_conn *conn,
|
||||
enum iscsi_param param, uint32_t *value);
|
||||
enum iscsi_param param, char *buf);
|
||||
int (*get_session_param) (struct iscsi_cls_session *session,
|
||||
enum iscsi_param param, uint32_t *value);
|
||||
int (*get_conn_str_param) (struct iscsi_cls_conn *conn,
|
||||
enum iscsi_param param, char *buf);
|
||||
int (*get_session_str_param) (struct iscsi_cls_session *session,
|
||||
enum iscsi_param param, char *buf);
|
||||
enum iscsi_param param, char *buf);
|
||||
int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
|
||||
char *data, uint32_t data_size);
|
||||
void (*get_stats) (struct iscsi_cls_conn *conn,
|
||||
@@ -127,6 +129,8 @@ struct iscsi_transport {
|
||||
uint64_t *ep_handle);
|
||||
int (*ep_poll) (uint64_t ep_handle, int timeout_ms);
|
||||
void (*ep_disconnect) (uint64_t ep_handle);
|
||||
int (*tgt_dscvr) (enum iscsi_tgt_dscvr type, uint32_t host_no,
|
||||
uint32_t enable, struct sockaddr *dst_addr);
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -155,13 +159,6 @@ struct iscsi_cls_conn {
|
||||
struct iscsi_transport *transport;
|
||||
uint32_t cid; /* connection id */
|
||||
|
||||
/* portal/group values we got during discovery */
|
||||
char *persistent_address;
|
||||
int persistent_port;
|
||||
/* portal/group values we are currently using */
|
||||
char *address;
|
||||
int port;
|
||||
|
||||
int active; /* must be accessed with the connlock */
|
||||
struct device dev; /* sysfs transport/container device */
|
||||
struct mempool_zone *z_error;
|
||||
@@ -185,16 +182,11 @@ struct iscsi_cls_session {
|
||||
struct list_head host_list;
|
||||
struct iscsi_transport *transport;
|
||||
|
||||
/* iSCSI values used as unique id by userspace. */
|
||||
char *targetname;
|
||||
int tpgt;
|
||||
|
||||
/* recovery fields */
|
||||
int recovery_tmo;
|
||||
struct work_struct recovery_work;
|
||||
|
||||
int target_id;
|
||||
int channel;
|
||||
|
||||
int sid; /* session id */
|
||||
void *dd_data; /* LLD private data */
|
||||
@@ -207,8 +199,10 @@ struct iscsi_cls_session {
|
||||
#define iscsi_session_to_shost(_session) \
|
||||
dev_to_shost(_session->dev.parent)
|
||||
|
||||
#define starget_to_session(_stgt) \
|
||||
iscsi_dev_to_session(_stgt->dev.parent)
|
||||
|
||||
struct iscsi_host {
|
||||
int next_target_id;
|
||||
struct list_head sessions;
|
||||
struct mutex mutex;
|
||||
};
|
||||
@@ -216,8 +210,17 @@ struct iscsi_host {
|
||||
/*
|
||||
* session and connection functions that can be used by HW iSCSI LLDs
|
||||
*/
|
||||
extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,
|
||||
struct iscsi_transport *transport);
|
||||
extern int iscsi_add_session(struct iscsi_cls_session *session,
|
||||
unsigned int target_id);
|
||||
extern int iscsi_if_create_session_done(struct iscsi_cls_conn *conn);
|
||||
extern int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn);
|
||||
extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
|
||||
struct iscsi_transport *t, int channel);
|
||||
struct iscsi_transport *t,
|
||||
unsigned int target_id);
|
||||
extern void iscsi_remove_session(struct iscsi_cls_session *session);
|
||||
extern void iscsi_free_session(struct iscsi_cls_session *session);
|
||||
extern int iscsi_destroy_session(struct iscsi_cls_session *session);
|
||||
extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
|
||||
uint32_t cid);
|
||||
@@ -225,4 +228,5 @@ extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
|
||||
extern void iscsi_unblock_session(struct iscsi_cls_session *session);
|
||||
extern void iscsi_block_session(struct iscsi_cls_session *session);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <linux/transport_class.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
struct scsi_transport_template;
|
||||
struct sas_rphy;
|
||||
@@ -55,7 +56,6 @@ struct sas_phy {
|
||||
enum sas_linkrate minimum_linkrate;
|
||||
enum sas_linkrate maximum_linkrate_hw;
|
||||
enum sas_linkrate maximum_linkrate;
|
||||
u8 port_identifier;
|
||||
|
||||
/* internal state */
|
||||
unsigned int local_attached : 1;
|
||||
@@ -66,8 +66,8 @@ struct sas_phy {
|
||||
u32 loss_of_dword_sync_count;
|
||||
u32 phy_reset_problem_count;
|
||||
|
||||
/* the other end of the link */
|
||||
struct sas_rphy *rphy;
|
||||
/* for the list of phys belonging to a port */
|
||||
struct list_head port_siblings;
|
||||
};
|
||||
|
||||
#define dev_to_phy(d) \
|
||||
@@ -124,6 +124,24 @@ struct sas_expander_device {
|
||||
#define rphy_to_expander_device(r) \
|
||||
container_of((r), struct sas_expander_device, rphy)
|
||||
|
||||
struct sas_port {
|
||||
struct device dev;
|
||||
|
||||
u8 port_identifier;
|
||||
int num_phys;
|
||||
|
||||
/* the other end of the link */
|
||||
struct sas_rphy *rphy;
|
||||
|
||||
struct mutex phy_list_mutex;
|
||||
struct list_head phy_list;
|
||||
};
|
||||
|
||||
#define dev_to_sas_port(d) \
|
||||
container_of((d), struct sas_port, dev)
|
||||
#define transport_class_to_sas_port(cdev) \
|
||||
dev_to_sas_port((cdev)->dev)
|
||||
|
||||
/* The functions by which the transport class and the driver communicate */
|
||||
struct sas_function_template {
|
||||
int (*get_linkerrors)(struct sas_phy *);
|
||||
@@ -133,6 +151,7 @@ struct sas_function_template {
|
||||
};
|
||||
|
||||
|
||||
void sas_remove_children(struct device *);
|
||||
extern void sas_remove_host(struct Scsi_Host *);
|
||||
|
||||
extern struct sas_phy *sas_phy_alloc(struct device *, int);
|
||||
@@ -141,13 +160,21 @@ extern int sas_phy_add(struct sas_phy *);
|
||||
extern void sas_phy_delete(struct sas_phy *);
|
||||
extern int scsi_is_sas_phy(const struct device *);
|
||||
|
||||
extern struct sas_rphy *sas_end_device_alloc(struct sas_phy *);
|
||||
extern struct sas_rphy *sas_expander_alloc(struct sas_phy *, enum sas_device_type);
|
||||
extern struct sas_rphy *sas_end_device_alloc(struct sas_port *);
|
||||
extern struct sas_rphy *sas_expander_alloc(struct sas_port *, enum sas_device_type);
|
||||
void sas_rphy_free(struct sas_rphy *);
|
||||
extern int sas_rphy_add(struct sas_rphy *);
|
||||
extern void sas_rphy_delete(struct sas_rphy *);
|
||||
extern int scsi_is_sas_rphy(const struct device *);
|
||||
|
||||
struct sas_port *sas_port_alloc(struct device *, int);
|
||||
int sas_port_add(struct sas_port *);
|
||||
void sas_port_free(struct sas_port *);
|
||||
void sas_port_delete(struct sas_port *);
|
||||
void sas_port_add_phy(struct sas_port *, struct sas_phy *);
|
||||
void sas_port_delete_phy(struct sas_port *, struct sas_phy *);
|
||||
int scsi_is_sas_port(const struct device *);
|
||||
|
||||
extern struct scsi_transport_template *
|
||||
sas_attach_transport(struct sas_function_template *);
|
||||
extern void sas_release_transport(struct scsi_transport_template *);
|
||||
|
||||
Reference in New Issue
Block a user