e70beee783
In order to support local WRITE_INSERT + READ_STRIP operations for non PI enabled fabrics, the fabric driver needs to be able signal what protection offload operations are supported. This is done at session initialization time so the modes can be signaled by individual se_wwn + se_portal_group endpoints, as well as optionally across different transports on the same endpoint. For iser-target, set TARGET_PROT_ALL if the underlying ib_device has already signaled PI offload support, and allow this to be exposed via a new iscsit_transport->iscsit_get_sup_prot_ops() callback. For loopback, set TARGET_PROT_ALL to signal SCSI initiator mode operation. For all other drivers, set TARGET_PROT_NORMAL to disable fabric level PI. Cc: Martin K. Petersen <martin.petersen@oracle.com> Cc: Sagi Grimberg <sagig@mellanox.com> Cc: Or Gerlitz <ogerlitz@mellanox.com> Cc: Quinn Tran <quinn.tran@qlogic.com> Cc: Giridhar Malavali <giridhar.malavali@qlogic.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
103 lines
4.1 KiB
C
103 lines
4.1 KiB
C
#include <linux/module.h>
|
|
#include <linux/list.h>
|
|
#include "../../../drivers/target/iscsi/iscsi_target_core.h"
|
|
|
|
struct iscsit_transport {
|
|
#define ISCSIT_TRANSPORT_NAME 16
|
|
char name[ISCSIT_TRANSPORT_NAME];
|
|
int transport_type;
|
|
int priv_size;
|
|
struct module *owner;
|
|
struct list_head t_node;
|
|
int (*iscsit_setup_np)(struct iscsi_np *, struct __kernel_sockaddr_storage *);
|
|
int (*iscsit_accept_np)(struct iscsi_np *, struct iscsi_conn *);
|
|
void (*iscsit_free_np)(struct iscsi_np *);
|
|
void (*iscsit_wait_conn)(struct iscsi_conn *);
|
|
void (*iscsit_free_conn)(struct iscsi_conn *);
|
|
int (*iscsit_get_login_rx)(struct iscsi_conn *, struct iscsi_login *);
|
|
int (*iscsit_put_login_tx)(struct iscsi_conn *, struct iscsi_login *, u32);
|
|
int (*iscsit_immediate_queue)(struct iscsi_conn *, struct iscsi_cmd *, int);
|
|
int (*iscsit_response_queue)(struct iscsi_conn *, struct iscsi_cmd *, int);
|
|
int (*iscsit_get_dataout)(struct iscsi_conn *, struct iscsi_cmd *, bool);
|
|
int (*iscsit_queue_data_in)(struct iscsi_conn *, struct iscsi_cmd *);
|
|
int (*iscsit_queue_status)(struct iscsi_conn *, struct iscsi_cmd *);
|
|
void (*iscsit_aborted_task)(struct iscsi_conn *, struct iscsi_cmd *);
|
|
enum target_prot_op (*iscsit_get_sup_prot_ops)(struct iscsi_conn *);
|
|
};
|
|
|
|
static inline void *iscsit_priv_cmd(struct iscsi_cmd *cmd)
|
|
{
|
|
return (void *)(cmd + 1);
|
|
}
|
|
|
|
/*
|
|
* From iscsi_target_transport.c
|
|
*/
|
|
|
|
extern int iscsit_register_transport(struct iscsit_transport *);
|
|
extern void iscsit_unregister_transport(struct iscsit_transport *);
|
|
extern struct iscsit_transport *iscsit_get_transport(int);
|
|
extern void iscsit_put_transport(struct iscsit_transport *);
|
|
|
|
/*
|
|
* From iscsi_target.c
|
|
*/
|
|
extern int iscsit_setup_scsi_cmd(struct iscsi_conn *, struct iscsi_cmd *,
|
|
unsigned char *);
|
|
extern void iscsit_set_unsoliticed_dataout(struct iscsi_cmd *);
|
|
extern int iscsit_process_scsi_cmd(struct iscsi_conn *, struct iscsi_cmd *,
|
|
struct iscsi_scsi_req *);
|
|
extern int iscsit_check_dataout_hdr(struct iscsi_conn *, unsigned char *,
|
|
struct iscsi_cmd **);
|
|
extern int iscsit_check_dataout_payload(struct iscsi_cmd *, struct iscsi_data *,
|
|
bool);
|
|
extern int iscsit_setup_nop_out(struct iscsi_conn *, struct iscsi_cmd *,
|
|
struct iscsi_nopout *);
|
|
extern int iscsit_process_nop_out(struct iscsi_conn *, struct iscsi_cmd *,
|
|
struct iscsi_nopout *);
|
|
extern int iscsit_handle_logout_cmd(struct iscsi_conn *, struct iscsi_cmd *,
|
|
unsigned char *);
|
|
extern int iscsit_handle_task_mgt_cmd(struct iscsi_conn *, struct iscsi_cmd *,
|
|
unsigned char *);
|
|
extern int iscsit_setup_text_cmd(struct iscsi_conn *, struct iscsi_cmd *,
|
|
struct iscsi_text *);
|
|
extern int iscsit_process_text_cmd(struct iscsi_conn *, struct iscsi_cmd *,
|
|
struct iscsi_text *);
|
|
extern void iscsit_build_rsp_pdu(struct iscsi_cmd *, struct iscsi_conn *,
|
|
bool, struct iscsi_scsi_rsp *);
|
|
extern void iscsit_build_nopin_rsp(struct iscsi_cmd *, struct iscsi_conn *,
|
|
struct iscsi_nopin *, bool);
|
|
extern void iscsit_build_task_mgt_rsp(struct iscsi_cmd *, struct iscsi_conn *,
|
|
struct iscsi_tm_rsp *);
|
|
extern int iscsit_build_text_rsp(struct iscsi_cmd *, struct iscsi_conn *,
|
|
struct iscsi_text_rsp *);
|
|
extern void iscsit_build_reject(struct iscsi_cmd *, struct iscsi_conn *,
|
|
struct iscsi_reject *);
|
|
extern int iscsit_build_logout_rsp(struct iscsi_cmd *, struct iscsi_conn *,
|
|
struct iscsi_logout_rsp *);
|
|
extern int iscsit_logout_post_handler(struct iscsi_cmd *, struct iscsi_conn *);
|
|
/*
|
|
* From iscsi_target_device.c
|
|
*/
|
|
extern void iscsit_increment_maxcmdsn(struct iscsi_cmd *, struct iscsi_session *);
|
|
/*
|
|
* From iscsi_target_erl0.c
|
|
*/
|
|
extern void iscsit_cause_connection_reinstatement(struct iscsi_conn *, int);
|
|
/*
|
|
* From iscsi_target_erl1.c
|
|
*/
|
|
extern void iscsit_stop_dataout_timer(struct iscsi_cmd *);
|
|
|
|
/*
|
|
* From iscsi_target_tmr.c
|
|
*/
|
|
extern int iscsit_tmr_post_handler(struct iscsi_cmd *, struct iscsi_conn *);
|
|
|
|
/*
|
|
* From iscsi_target_util.c
|
|
*/
|
|
extern struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *, int);
|
|
extern int iscsit_sequence_cmd(struct iscsi_conn *, struct iscsi_cmd *,
|
|
unsigned char *, __be32);
|
|
extern void iscsit_release_cmd(struct iscsi_cmd *);
|