diff options
Diffstat (limited to 'include/target')
| -rw-r--r-- | include/target/iscsi/iscsi_transport.h | 8 | ||||
| -rw-r--r-- | include/target/target_core_backend.h | 15 | ||||
| -rw-r--r-- | include/target/target_core_base.h | 179 | ||||
| -rw-r--r-- | include/target/target_core_configfs.h | 1 | ||||
| -rw-r--r-- | include/target/target_core_fabric.h | 11 | 
5 files changed, 155 insertions, 59 deletions
diff --git a/include/target/iscsi/iscsi_transport.h b/include/target/iscsi/iscsi_transport.h index a12589c4ee9..daef9daa500 100644 --- a/include/target/iscsi/iscsi_transport.h +++ b/include/target/iscsi/iscsi_transport.h @@ -12,6 +12,7 @@ struct iscsit_transport {  	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); @@ -20,6 +21,8 @@ struct iscsit_transport {  	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) @@ -67,7 +70,8 @@ extern void iscsit_build_nopin_rsp(struct iscsi_cmd *, struct iscsi_conn *,  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 *); +				struct iscsi_text_rsp *, +				enum iscsit_transport_type);  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 *, @@ -94,7 +98,7 @@ 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 *, gfp_t); +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 *); diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h index 5ebe21cd5d1..9adc1bca117 100644 --- a/include/target/target_core_backend.h +++ b/include/target/target_core_backend.h @@ -34,8 +34,16 @@ struct se_subsystem_api {  	sense_reason_t (*parse_cdb)(struct se_cmd *cmd);  	u32 (*get_device_type)(struct se_device *);  	sector_t (*get_blocks)(struct se_device *); +	sector_t (*get_alignment_offset_lbas)(struct se_device *); +	/* lbppbe = logical blocks per physical block exponent. see SBC-3 */ +	unsigned int (*get_lbppbe)(struct se_device *); +	unsigned int (*get_io_min)(struct se_device *); +	unsigned int (*get_io_opt)(struct se_device *);  	unsigned char *(*get_sense_buffer)(struct se_cmd *);  	bool (*get_write_cache)(struct se_device *); +	int (*init_prot)(struct se_device *); +	int (*format_prot)(struct se_device *); +	void (*free_prot)(struct se_device *);  };  struct sbc_ops { @@ -51,6 +59,7 @@ int	transport_subsystem_register(struct se_subsystem_api *);  void	transport_subsystem_release(struct se_subsystem_api *);  void	target_complete_cmd(struct se_cmd *, u8); +void	target_complete_cmd_with_length(struct se_cmd *, u8, int);  sense_reason_t	spc_parse_cdb(struct se_cmd *cmd, unsigned int *size);  sense_reason_t	spc_emulate_report_luns(struct se_cmd *cmd); @@ -65,6 +74,12 @@ sense_reason_t sbc_execute_unmap(struct se_cmd *cmd,  	sense_reason_t (*do_unmap_fn)(struct se_cmd *cmd, void *priv,  				      sector_t lba, sector_t nolb),  	void *priv); +void	sbc_dif_generate(struct se_cmd *); +sense_reason_t	sbc_dif_verify_write(struct se_cmd *, sector_t, unsigned int, +				     unsigned int, struct scatterlist *, int); +sense_reason_t	sbc_dif_verify_read(struct se_cmd *, sector_t, unsigned int, +				    unsigned int, struct scatterlist *, int); +sense_reason_t	sbc_dif_read_strip(struct se_cmd *);  void	transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *);  int	transport_set_vpd_assoc(struct t10_vpd *, unsigned char *); diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 5bdb8b7d2a6..9ec9864ecf3 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -37,6 +37,9 @@  /* Used by transport_send_check_condition_and_sense() */  #define SPC_SENSE_KEY_OFFSET			2  #define SPC_ADD_SENSE_LEN_OFFSET		7 +#define SPC_DESC_TYPE_OFFSET			8 +#define SPC_ADDITIONAL_DESC_LEN_OFFSET		9 +#define SPC_VALIDITY_OFFSET			10  #define SPC_ASC_KEY_OFFSET			12  #define SPC_ASCQ_KEY_OFFSET			13  #define TRANSPORT_IQN_LEN			224 @@ -112,7 +115,7 @@  /* Queue Algorithm Modifier default for restricted reordering in control mode page */  #define DA_EMULATE_REST_REORD			0 -#define SE_INQUIRY_BUF				512 +#define SE_INQUIRY_BUF				1024  #define SE_MODE_PAGE_BUF			512  #define SE_SENSE_BUF				96 @@ -159,7 +162,7 @@ enum se_cmd_flags_table {  	SCF_SENT_CHECK_CONDITION	= 0x00000800,  	SCF_OVERFLOW_BIT		= 0x00001000,  	SCF_UNDERFLOW_BIT		= 0x00002000, -	SCF_SENT_DELAYED_TAS		= 0x00004000, +	SCF_SEND_DELAYED_TAS		= 0x00004000,  	SCF_ALUA_NON_OPTIMIZED		= 0x00008000,  	SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00020000,  	SCF_ACK_KREF			= 0x00040000, @@ -205,6 +208,9 @@ enum tcm_sense_reason_table {  	TCM_OUT_OF_RESOURCES			= R(0x12),  	TCM_PARAMETER_LIST_LENGTH_ERROR		= R(0x13),  	TCM_MISCOMPARE_VERIFY			= R(0x14), +	TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED	= R(0x15), +	TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED	= R(0x16), +	TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED	= R(0x17),  #undef R  }; @@ -227,6 +233,7 @@ enum tcm_tmreq_table {  /* fabric independent task management response values */  enum tcm_tmrsp_table { +	TMR_FUNCTION_FAILED		= 0,  	TMR_FUNCTION_COMPLETE		= 1,  	TMR_TASK_DOES_NOT_EXIST		= 2,  	TMR_LUN_DOES_NOT_EXIST		= 3, @@ -246,10 +253,28 @@ typedef enum {  struct se_cmd; +struct t10_alua_lba_map_member { +	struct list_head lba_map_mem_list; +	int lba_map_mem_alua_state; +	int lba_map_mem_alua_pg_id; +}; + +struct t10_alua_lba_map { +	u64 lba_map_first_lba; +	u64 lba_map_last_lba; +	struct list_head lba_map_list; +	struct list_head lba_map_mem_list; +}; +  struct t10_alua {  	/* ALUA Target Port Group ID */  	u16	alua_tg_pt_gps_counter;  	u32	alua_tg_pt_gps_count; +	/* Referrals support */ +	spinlock_t lba_map_lock; +	u32     lba_map_segment_size; +	u32     lba_map_segment_multiplier; +	struct list_head lba_map_list;  	spinlock_t tg_pt_gps_lock;  	struct se_device *t10_dev;  	/* Used for default ALUA Target Port Group */ @@ -282,16 +307,16 @@ struct t10_alua_lu_gp_member {  struct t10_alua_tg_pt_gp {  	u16	tg_pt_gp_id;  	int	tg_pt_gp_valid_id; +	int	tg_pt_gp_alua_supported_states; +	int	tg_pt_gp_alua_pending_state; +	int	tg_pt_gp_alua_previous_state;  	int	tg_pt_gp_alua_access_status;  	int	tg_pt_gp_alua_access_type;  	int	tg_pt_gp_nonop_delay_msecs;  	int	tg_pt_gp_trans_delay_msecs; -	int	tg_pt_gp_implict_trans_secs; +	int	tg_pt_gp_implicit_trans_secs;  	int	tg_pt_gp_pref;  	int	tg_pt_gp_write_metadata; -	/* Used by struct t10_alua_tg_pt_gp->tg_pt_gp_md_buf_len */ -#define ALUA_MD_BUF_LEN				1024 -	u32	tg_pt_gp_md_buf_len;  	u32	tg_pt_gp_members;  	atomic_t tg_pt_gp_alua_access_state;  	atomic_t tg_pt_gp_ref_cnt; @@ -301,6 +326,10 @@ struct t10_alua_tg_pt_gp {  	struct config_group tg_pt_gp_group;  	struct list_head tg_pt_gp_list;  	struct list_head tg_pt_gp_mem_list; +	struct se_port *tg_pt_gp_alua_port; +	struct se_node_acl *tg_pt_gp_alua_nacl; +	struct delayed_work tg_pt_gp_transition_work; +	struct completion *tg_pt_gp_transition_complete;  };  struct t10_alua_tg_pt_gp_member { @@ -412,6 +441,39 @@ struct se_tmr_req {  	struct list_head	tmr_list;  }; +enum target_prot_op { +	TARGET_PROT_NORMAL	= 0, +	TARGET_PROT_DIN_INSERT	= (1 << 0), +	TARGET_PROT_DOUT_INSERT	= (1 << 1), +	TARGET_PROT_DIN_STRIP	= (1 << 2), +	TARGET_PROT_DOUT_STRIP	= (1 << 3), +	TARGET_PROT_DIN_PASS	= (1 << 4), +	TARGET_PROT_DOUT_PASS	= (1 << 5), +}; + +#define TARGET_PROT_ALL	TARGET_PROT_DIN_INSERT | TARGET_PROT_DOUT_INSERT | \ +			TARGET_PROT_DIN_STRIP | TARGET_PROT_DOUT_STRIP | \ +			TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS + +enum target_prot_type { +	TARGET_DIF_TYPE0_PROT, +	TARGET_DIF_TYPE1_PROT, +	TARGET_DIF_TYPE2_PROT, +	TARGET_DIF_TYPE3_PROT, +}; + +enum target_core_dif_check { +	TARGET_DIF_CHECK_GUARD  = 0x1 << 0, +	TARGET_DIF_CHECK_APPTAG = 0x1 << 1, +	TARGET_DIF_CHECK_REFTAG = 0x1 << 2, +}; + +struct se_dif_v1_tuple { +	__be16			guard_tag; +	__be16			app_tag; +	__be32			ref_tag; +}; +  struct se_cmd {  	/* SAM response code being sent to initiator */  	u8			scsi_status; @@ -442,7 +504,6 @@ struct se_cmd {  	/* Used for sense data */  	void			*sense_buffer;  	struct list_head	se_delayed_node; -	struct list_head	se_lun_node;  	struct list_head	se_qf_node;  	struct se_device      *se_dev;  	struct se_dev_entry   *se_deve; @@ -469,16 +530,11 @@ struct se_cmd {  #define CMD_T_COMPLETE		(1 << 2)  #define CMD_T_SENT		(1 << 4)  #define CMD_T_STOP		(1 << 5) -#define CMD_T_FAILED		(1 << 6) -#define CMD_T_LUN_STOP		(1 << 7) -#define CMD_T_LUN_FE_STOP	(1 << 8) -#define CMD_T_DEV_ACTIVE	(1 << 9) -#define CMD_T_REQUEST_STOP	(1 << 10) -#define CMD_T_BUSY		(1 << 11) +#define CMD_T_DEV_ACTIVE	(1 << 7) +#define CMD_T_REQUEST_STOP	(1 << 8) +#define CMD_T_BUSY		(1 << 9)  	spinlock_t		t_state_lock;  	struct completion	t_transport_stop_comp; -	struct completion	transport_lun_fe_stop_comp; -	struct completion	transport_lun_stop_comp;  	struct work_struct	work; @@ -498,13 +554,27 @@ struct se_cmd {  	/* backend private data */  	void			*priv; + +	/* Used for lun->lun_ref counting */ +	int			lun_ref_active; + +	/* DIF related members */ +	enum target_prot_op	prot_op; +	enum target_prot_type	prot_type; +	u8			prot_checks; +	u32			prot_length; +	u32			reftag_seed; +	struct scatterlist	*t_prot_sg; +	unsigned int		t_prot_nents; +	sense_reason_t		pi_err; +	sector_t		bad_sector; +	bool			prot_pto;  };  struct se_ua {  	u8			ua_asc;  	u8			ua_ascq;  	struct se_node_acl	*ua_nacl; -	struct list_head	ua_dev_list;  	struct list_head	ua_nacl_list;  }; @@ -517,10 +587,6 @@ struct se_node_acl {  	u32			acl_index;  #define MAX_ACL_TAG_SIZE 64  	char			acl_tag[MAX_ACL_TAG_SIZE]; -	u64			num_cmds; -	u64			read_bytes; -	u64			write_bytes; -	spinlock_t		stats_lock;  	/* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */  	atomic_t		acl_pr_ref_count;  	struct se_dev_entry	**device_list; @@ -543,6 +609,7 @@ struct se_node_acl {  struct se_session {  	unsigned		sess_tearing_down:1;  	u64			sess_bin_isid; +	enum target_prot_op	sup_prot_ops;  	struct se_node_acl	*se_node_acl;  	struct se_portal_group *se_tpg;  	void			*fabric_sess_ptr; @@ -609,6 +676,9 @@ struct se_dev_attrib {  	int		emulate_tpws;  	int		emulate_caw;  	int		emulate_3pc; +	int		pi_prot_format; +	enum target_prot_type pi_prot_type; +	enum target_prot_type hw_pi_prot_type;  	int		enforce_pr_isids;  	int		is_nonrot;  	int		emulate_rest_reord; @@ -624,10 +694,39 @@ struct se_dev_attrib {  	u32		unmap_granularity;  	u32		unmap_granularity_alignment;  	u32		max_write_same_len; +	u32		max_bytes_per_io;  	struct se_device *da_dev;  	struct config_group da_group;  }; +struct se_port_stat_grps { +	struct config_group stat_group; +	struct config_group scsi_port_group; +	struct config_group scsi_tgt_port_group; +	struct config_group scsi_transport_group; +}; + +struct se_lun { +#define SE_LUN_LINK_MAGIC			0xffff7771 +	u32			lun_link_magic; +	/* See transport_lun_status_table */ +	enum transport_lun_status_table lun_status; +	u32			lun_access; +	u32			lun_flags; +	u32			unpacked_lun; +	atomic_t		lun_acl_count; +	spinlock_t		lun_acl_lock; +	spinlock_t		lun_sep_lock; +	struct completion	lun_shutdown_comp; +	struct list_head	lun_acl_list; +	struct se_device	*lun_se_dev; +	struct se_port		*lun_sep; +	struct config_group	lun_group; +	struct se_port_stat_grps port_stat_grps; +	struct completion	lun_ref_comp; +	struct percpu_ref	lun_ref; +}; +  struct se_dev_stat_grps {  	struct config_group stat_group;  	struct config_group scsi_dev_group; @@ -656,11 +755,10 @@ struct se_device {  	/* Pointer to transport specific device structure */  	u32			dev_index;  	u64			creation_time; -	u32			num_resets; -	u64			num_cmds; -	u64			read_bytes; -	u64			write_bytes; -	spinlock_t		stats_lock; +	atomic_long_t		num_resets; +	atomic_long_t		num_cmds; +	atomic_long_t		read_bytes; +	atomic_long_t		write_bytes;  	/* Active commands on this virtual SE device */  	atomic_t		simple_cmds;  	atomic_t		dev_ordered_id; @@ -711,6 +809,9 @@ struct se_device {  	struct se_subsystem_api *transport;  	/* Linked list for struct se_hba struct se_device list */  	struct list_head	dev_list; +	struct se_lun		xcopy_lun; +	/* Protection Information */ +	int			prot_length;  };  struct se_hba { @@ -730,34 +831,6 @@ struct se_hba {  	struct se_subsystem_api *transport;  }; -struct se_port_stat_grps { -	struct config_group stat_group; -	struct config_group scsi_port_group; -	struct config_group scsi_tgt_port_group; -	struct config_group scsi_transport_group; -}; - -struct se_lun { -#define SE_LUN_LINK_MAGIC			0xffff7771 -	u32			lun_link_magic; -	/* See transport_lun_status_table */ -	enum transport_lun_status_table lun_status; -	u32			lun_access; -	u32			lun_flags; -	u32			unpacked_lun; -	atomic_t		lun_acl_count; -	spinlock_t		lun_acl_lock; -	spinlock_t		lun_cmd_lock; -	spinlock_t		lun_sep_lock; -	struct completion	lun_shutdown_comp; -	struct list_head	lun_cmd_list; -	struct list_head	lun_acl_list; -	struct se_device	*lun_se_dev; -	struct se_port		*lun_sep; -	struct config_group	lun_group; -	struct se_port_stat_grps port_stat_grps; -}; -  struct scsi_port_stats {         u64     cmd_pdus;         u64     tx_data_octets; diff --git a/include/target/target_core_configfs.h b/include/target/target_core_configfs.h index 713c5004f4a..e0801386e4d 100644 --- a/include/target/target_core_configfs.h +++ b/include/target/target_core_configfs.h @@ -54,4 +54,3 @@ struct target_fabric_configfs {  	struct target_fabric_configfs_template tf_cit_tmpl;  }; -#define TF_CIT_TMPL(tf) (&(tf)->tf_cit_tmpl) diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h index 882b650e32b..22a4e98eec8 100644 --- a/include/target/target_core_fabric.h +++ b/include/target/target_core_fabric.h @@ -62,6 +62,7 @@ struct target_core_fabric_ops {  	int (*queue_data_in)(struct se_cmd *);  	int (*queue_status)(struct se_cmd *);  	void (*queue_tm_rsp)(struct se_cmd *); +	void (*aborted_task)(struct se_cmd *);  	/*  	 * fabric module calls for target_core_fabric_configfs.c  	 */ @@ -83,10 +84,11 @@ struct target_core_fabric_ops {  	void (*fabric_drop_nodeacl)(struct se_node_acl *);  }; -struct se_session *transport_init_session(void); +struct se_session *transport_init_session(enum target_prot_op);  int transport_alloc_session_tags(struct se_session *, unsigned int,  		unsigned int); -struct se_session *transport_init_session_tags(unsigned int, unsigned int); +struct se_session *transport_init_session_tags(unsigned int, unsigned int, +		enum target_prot_op);  void	__transport_register_session(struct se_portal_group *,  		struct se_node_acl *, struct se_session *, void *);  void	transport_register_session(struct se_portal_group *, @@ -105,7 +107,8 @@ sense_reason_t transport_lookup_cmd_lun(struct se_cmd *, u32);  sense_reason_t target_setup_cmd_from_cdb(struct se_cmd *, unsigned char *);  int	target_submit_cmd_map_sgls(struct se_cmd *, struct se_session *,  		unsigned char *, unsigned char *, u32, u32, int, int, int, -		struct scatterlist *, u32, struct scatterlist *, u32); +		struct scatterlist *, u32, struct scatterlist *, u32, +		struct scatterlist *, u32);  int	target_submit_cmd(struct se_cmd *, struct se_session *, unsigned char *,  		unsigned char *, u32, u32, int, int, int);  int	target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess, @@ -137,6 +140,8 @@ void	transport_generic_request_failure(struct se_cmd *, sense_reason_t);  void	__target_execute_cmd(struct se_cmd *);  int	transport_lookup_tmr_lun(struct se_cmd *, u32); +struct se_node_acl *core_tpg_get_initiator_node_acl(struct se_portal_group *tpg, +		unsigned char *);  struct se_node_acl *core_tpg_check_initiator_node_acl(struct se_portal_group *,  		unsigned char *);  void	core_tpg_clear_object_luns(struct se_portal_group *);  | 
