diff options
Diffstat (limited to 'include/target')
| -rw-r--r-- | include/target/configfs_macros.h | 4 | ||||
| -rw-r--r-- | include/target/target_core_base.h | 71 | ||||
| -rw-r--r-- | include/target/target_core_fabric_ops.h | 6 | ||||
| -rw-r--r-- | include/target/target_core_tmr.h | 2 | ||||
| -rw-r--r-- | include/target/target_core_transport.h | 75 | 
5 files changed, 44 insertions, 114 deletions
diff --git a/include/target/configfs_macros.h b/include/target/configfs_macros.h index 7fe74608b43..a0fc85bbe2d 100644 --- a/include/target/configfs_macros.h +++ b/include/target/configfs_macros.h @@ -30,8 +30,8 @@   * Added CONFIGFS_EATTR() macros from original configfs.h macros   * Copright (C) 2008-2009 Nicholas A. Bellinger <nab@linux-iscsi.org>   * - * Please read Documentation/filesystems/configfs.txt before using the - * configfs interface, ESPECIALLY the parts about reference counts and + * Please read Documentation/filesystems/configfs/configfs.txt before using + * the configfs interface, ESPECIALLY the parts about reference counts and   * item destructors.   */ diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 27040653005..35aa786f93d 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -10,10 +10,7 @@  #include <net/tcp.h>  #define TARGET_CORE_MOD_VERSION		"v4.1.0-rc1-ml" -#define SHUTDOWN_SIGS	(sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGABRT)) -/* Used by transport_generic_allocate_iovecs() */ -#define TRANSPORT_IOV_DATA_BUFFER		5  /* Maximum Number of LUNs per Target Portal Group */  /* Don't raise above 511 or REPORT_LUNS needs to handle >1 page */  #define TRANSPORT_MAX_LUNS_PER_TPG		256 @@ -75,32 +72,26 @@ enum transport_tpg_type_table {  };  /* Used for generate timer flags */ -enum timer_flags_table { -	TF_RUNNING	= 0x01, -	TF_STOP		= 0x02, +enum se_task_flags { +	TF_ACTIVE		= (1 << 0), +	TF_SENT			= (1 << 1), +	TF_REQUEST_STOP		= (1 << 2),  };  /* Special transport agnostic struct se_cmd->t_states */  enum transport_state_table {  	TRANSPORT_NO_STATE	= 0,  	TRANSPORT_NEW_CMD	= 1, -	TRANSPORT_DEFERRED_CMD	= 2,  	TRANSPORT_WRITE_PENDING	= 3,  	TRANSPORT_PROCESS_WRITE	= 4,  	TRANSPORT_PROCESSING	= 5, -	TRANSPORT_COMPLETE_OK	= 6, -	TRANSPORT_COMPLETE_FAILURE = 7, -	TRANSPORT_COMPLETE_TIMEOUT = 8, +	TRANSPORT_COMPLETE	= 6,  	TRANSPORT_PROCESS_TMR	= 9, -	TRANSPORT_TMR_COMPLETE	= 10,  	TRANSPORT_ISTATE_PROCESSING = 11, -	TRANSPORT_ISTATE_PROCESSED = 12, -	TRANSPORT_KILL		= 13, -	TRANSPORT_REMOVE	= 14, -	TRANSPORT_FREE		= 15,  	TRANSPORT_NEW_CMD_MAP	= 16,  	TRANSPORT_FREE_CMD_INTR = 17,  	TRANSPORT_COMPLETE_QF_WP = 18, +	TRANSPORT_COMPLETE_QF_OK = 19,  };  /* Used for struct se_cmd->se_cmd_flags */ @@ -125,7 +116,6 @@ enum se_cmd_flags_table {  	SCF_UNUSED			= 0x00100000,  	SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00400000,  	SCF_EMULATE_CDB_ASYNC		= 0x01000000, -	SCF_EMULATE_QUEUE_FULL		= 0x02000000,  };  /* struct se_dev_entry->lun_flags and struct se_lun->lun_access */ @@ -401,34 +391,22 @@ struct se_queue_obj {  } ____cacheline_aligned;  struct se_task { -	unsigned char	task_sense; -	struct scatterlist *task_sg; -	u32		task_sg_nents; -	struct scatterlist *task_sg_bidi; -	u8		task_scsi_status; -	u8		task_flags; -	int		task_error_status; -	int		task_state_flags; -	bool		task_padded_sg;  	unsigned long long	task_lba; -	u32		task_no; -	u32		task_sectors; -	u32		task_size; +	u32			task_sectors; +	u32			task_size; +	struct se_cmd		*task_se_cmd; +	struct scatterlist	*task_sg; +	u32			task_sg_nents; +	u16			task_flags; +	u8			task_sense; +	u8			task_scsi_status; +	int			task_error_status;  	enum dma_data_direction	task_data_direction; -	struct se_cmd *task_se_cmd; -	struct se_device	*se_dev; +	atomic_t		task_state_active; +	struct list_head	t_list; +	struct list_head	t_execute_list; +	struct list_head	t_state_list;  	struct completion	task_stop_comp; -	atomic_t	task_active; -	atomic_t	task_execute_queue; -	atomic_t	task_timeout; -	atomic_t	task_sent; -	atomic_t	task_stop; -	atomic_t	task_state_active; -	struct timer_list	task_timer; -	struct se_device *se_obj_ptr; -	struct list_head t_list; -	struct list_head t_execute_list; -	struct list_head t_state_list;  } ____cacheline_aligned;  struct se_cmd { @@ -446,8 +424,6 @@ struct se_cmd {  	int			sam_task_attr;  	/* Transport protocol dependent state, see transport_state_table */  	enum transport_state_table t_state; -	/* Transport protocol dependent state for out of order CmdSNs */ -	int			deferred_t_state;  	/* Transport specific error status */  	int			transport_error_status;  	/* See se_cmd_flags_table */ @@ -461,7 +437,6 @@ struct se_cmd {  	u32			orig_fe_lun;  	/* Persistent Reservation key */  	u64			pr_res_key; -	atomic_t                transport_sent;  	/* Used for sense data */  	void			*sense_buffer;  	struct list_head	se_delayed_node; @@ -479,10 +454,7 @@ struct se_cmd {  	struct list_head	se_queue_node;  	struct target_core_fabric_ops *se_tfo;  	int (*transport_emulate_cdb)(struct se_cmd *); -	void (*transport_split_cdb)(unsigned long long, u32, unsigned char *); -	void (*transport_wait_for_tasks)(struct se_cmd *, int, int);  	void (*transport_complete_callback)(struct se_cmd *); -	int (*transport_qf_callback)(struct se_cmd *);  	unsigned char		*t_task_cdb;  	unsigned char		__t_task_cdb[TCM_MAX_COMMAND_SIZE]; @@ -495,7 +467,6 @@ struct se_cmd {  	atomic_t		t_se_count;  	atomic_t		t_task_cdbs_left;  	atomic_t		t_task_cdbs_ex_left; -	atomic_t		t_task_cdbs_timeout_left;  	atomic_t		t_task_cdbs_sent;  	atomic_t		t_transport_aborted;  	atomic_t		t_transport_active; @@ -503,7 +474,6 @@ struct se_cmd {  	atomic_t		t_transport_queue_active;  	atomic_t		t_transport_sent;  	atomic_t		t_transport_stop; -	atomic_t		t_transport_timeout;  	atomic_t		transport_dev_active;  	atomic_t		transport_lun_active;  	atomic_t		transport_lun_fe_stop; @@ -514,6 +484,8 @@ struct se_cmd {  	struct completion	transport_lun_stop_comp;  	struct scatterlist	*t_tasks_sg_chained; +	struct work_struct	work; +  	/*  	 * Used for pre-registered fabric SGL passthrough WRITE and READ  	 * with the special SCF_PASSTHROUGH_CONTIG_TO_SG case for TCM_Loop @@ -670,7 +642,6 @@ struct se_dev_attrib {  	u32		optimal_sectors;  	u32		hw_queue_depth;  	u32		queue_depth; -	u32		task_timeout;  	u32		max_unmap_lba_count;  	u32		max_unmap_block_desc_count;  	u32		unmap_granularity; diff --git a/include/target/target_core_fabric_ops.h b/include/target/target_core_fabric_ops.h index 2de8fe90759..126c675f4f1 100644 --- a/include/target/target_core_fabric_ops.h +++ b/include/target/target_core_fabric_ops.h @@ -27,6 +27,12 @@ struct target_core_fabric_ops {  	int (*tpg_check_demo_mode_cache)(struct se_portal_group *);  	int (*tpg_check_demo_mode_write_protect)(struct se_portal_group *);  	int (*tpg_check_prod_mode_write_protect)(struct se_portal_group *); +	/* +	 * Optionally used by fabrics to allow demo-mode login, but not +	 * expose any TPG LUNs, and return 'not connected' in standard +	 * inquiry response +	 */ +	int (*tpg_check_demo_mode_login_only)(struct se_portal_group *);  	struct se_node_acl *(*tpg_alloc_fabric_acl)(  					struct se_portal_group *);  	void (*tpg_release_fabric_acl)(struct se_portal_group *, diff --git a/include/target/target_core_tmr.h b/include/target/target_core_tmr.h index bd559680747..d5876e17d3f 100644 --- a/include/target/target_core_tmr.h +++ b/include/target/target_core_tmr.h @@ -27,7 +27,7 @@ enum tcm_tmrsp_table {  extern struct kmem_cache *se_tmr_req_cache; -extern struct se_tmr_req *core_tmr_alloc_req(struct se_cmd *, void *, u8); +extern struct se_tmr_req *core_tmr_alloc_req(struct se_cmd *, void *, u8, gfp_t);  extern void core_tmr_release_req(struct se_tmr_req *);  extern int core_tmr_lun_reset(struct se_device *, struct se_tmr_req *,  				struct list_head *, struct se_cmd *); diff --git a/include/target/target_core_transport.h b/include/target/target_core_transport.h index 46aae4f94ed..a037a1a6fbb 100644 --- a/include/target/target_core_transport.h +++ b/include/target/target_core_transport.h @@ -22,10 +22,9 @@  #define PYX_TRANSPORT_LU_COMM_FAILURE		-7  #define PYX_TRANSPORT_UNKNOWN_MODE_PAGE		-8  #define PYX_TRANSPORT_WRITE_PROTECTED		-9 -#define PYX_TRANSPORT_TASK_TIMEOUT		-10 -#define PYX_TRANSPORT_RESERVATION_CONFLICT	-11 -#define PYX_TRANSPORT_ILLEGAL_REQUEST		-12 -#define PYX_TRANSPORT_USE_SENSE_REASON		-13 +#define PYX_TRANSPORT_RESERVATION_CONFLICT	-10 +#define PYX_TRANSPORT_ILLEGAL_REQUEST		-11 +#define PYX_TRANSPORT_USE_SENSE_REASON		-12  #ifndef SAM_STAT_RESERVATION_CONFLICT  #define SAM_STAT_RESERVATION_CONFLICT		0x18 @@ -38,16 +37,6 @@  #define TRANSPORT_PLUGIN_VHBA_PDEV		2  #define TRANSPORT_PLUGIN_VHBA_VDEV		3 -/* For SE OBJ Plugins, in seconds */ -#define TRANSPORT_TIMEOUT_TUR			10 -#define TRANSPORT_TIMEOUT_TYPE_DISK		60 -#define TRANSPORT_TIMEOUT_TYPE_ROM		120 -#define TRANSPORT_TIMEOUT_TYPE_TAPE		600 -#define TRANSPORT_TIMEOUT_TYPE_OTHER		300 - -/* For se_task->task_state_flags */ -#define TSF_EXCEPTION_CLEARED			0x01 -  /*   * struct se_subsystem_dev->su_dev_flags  */ @@ -64,8 +53,6 @@  #define DF_SPC2_RESERVATIONS_WITH_ISID		0x00000004  /* struct se_dev_attrib sanity values */ -/* 10 Minutes */ -#define DA_TASK_TIMEOUT_MAX			600  /* Default max_unmap_lba_count */  #define DA_MAX_UNMAP_LBA_COUNT			0  /* Default max_unmap_block_desc_count */ @@ -110,16 +97,13 @@  #define MOD_MAX_SECTORS(ms, bs)			(ms % (PAGE_SIZE / bs)) -struct se_mem;  struct se_subsystem_api; -extern struct kmem_cache *se_mem_cache; -  extern int init_se_kmem_caches(void);  extern void release_se_kmem_caches(void);  extern u32 scsi_get_new_index(scsi_index_t);  extern void transport_init_queue_obj(struct se_queue_obj *); -extern int transport_subsystem_check_init(void); +extern void transport_subsystem_check_init(void);  extern int transport_subsystem_register(struct se_subsystem_api *);  extern void transport_subsystem_release(struct se_subsystem_api *);  extern void transport_load_plugins(void); @@ -134,7 +118,6 @@ extern void transport_free_session(struct se_session *);  extern void transport_deregister_session_configfs(struct se_session *);  extern void transport_deregister_session(struct se_session *);  extern void transport_cmd_finish_abort(struct se_cmd *, int); -extern void transport_cmd_finish_abort_tmr(struct se_cmd *);  extern void transport_complete_sync_cache(struct se_cmd *, int);  extern void transport_complete_task(struct se_task *, int);  extern void transport_add_task_to_execute_queue(struct se_task *, @@ -142,6 +125,8 @@ extern void transport_add_task_to_execute_queue(struct se_task *,  						struct se_device *);  extern void transport_remove_task_from_execute_queue(struct se_task *,  						struct se_device *); +extern void __transport_remove_task_from_execute_queue(struct se_task *, +						struct se_device *);  unsigned char *transport_dump_cmd_direction(struct se_cmd *);  extern void transport_dump_dev_state(struct se_device *, char *, int *);  extern void transport_dump_dev_info(struct se_device *, struct se_lun *, @@ -169,29 +154,24 @@ extern void transport_init_se_cmd(struct se_cmd *,  					unsigned char *);  void *transport_kmap_first_data_page(struct se_cmd *cmd);  void transport_kunmap_first_data_page(struct se_cmd *cmd); -extern void transport_free_se_cmd(struct se_cmd *);  extern int transport_generic_allocate_tasks(struct se_cmd *, unsigned char *); -extern int transport_generic_handle_cdb(struct se_cmd *);  extern int transport_handle_cdb_direct(struct se_cmd *);  extern int transport_generic_handle_cdb_map(struct se_cmd *);  extern int transport_generic_handle_data(struct se_cmd *);  extern void transport_new_cmd_failure(struct se_cmd *);  extern int transport_generic_handle_tmr(struct se_cmd *);  extern void transport_generic_free_cmd_intr(struct se_cmd *); -extern void __transport_stop_task_timer(struct se_task *, unsigned long *); +extern bool target_stop_task(struct se_task *task, unsigned long *flags);  extern int transport_generic_map_mem_to_cmd(struct se_cmd *cmd, struct scatterlist *, u32,  				struct scatterlist *, u32);  extern int transport_clear_lun_from_sessions(struct se_lun *); +extern void transport_wait_for_tasks(struct se_cmd *);  extern int transport_check_aborted_status(struct se_cmd *, int);  extern int transport_send_check_condition_and_sense(struct se_cmd *, u8, int);  extern void transport_send_task_abort(struct se_cmd *);  extern void transport_release_cmd(struct se_cmd *); -extern void transport_generic_free_cmd(struct se_cmd *, int, int); +extern void transport_generic_free_cmd(struct se_cmd *, int);  extern void transport_generic_wait_for_cmds(struct se_cmd *, int); -extern int transport_init_task_sg(struct se_task *, struct se_mem *, u32); -extern int transport_map_mem_to_sg(struct se_task *, struct list_head *, -					struct scatterlist *, struct se_mem *, -					struct se_mem **, u32 *, u32 *);  extern void transport_do_task_sg_chain(struct se_cmd *);  extern void transport_generic_process_write(struct se_cmd *);  extern int transport_generic_new_cmd(struct se_cmd *); @@ -200,6 +180,7 @@ extern int transport_generic_do_tmr(struct se_cmd *);  extern int core_alua_check_nonop_delay(struct se_cmd *);  /* From target_core_cdb.c */  extern int transport_emulate_control_cdb(struct se_task *); +extern void target_get_task_cdb(struct se_task *task, unsigned char *cdb);  /*   * Each se_transport_task_t can have N number of possible struct se_task's @@ -227,6 +208,10 @@ struct se_subsystem_api {  	 * Transport Type.  	 */  	u8 transport_type; + +	unsigned int fua_write_emulated : 1; +	unsigned int write_cache_emulated : 1; +  	/*  	 * struct module for struct se_hba references  	 */ @@ -236,18 +221,6 @@ struct se_subsystem_api {  	 */  	struct list_head sub_api_list;  	/* -	 * For SCF_SCSI_NON_DATA_CDB -	 */ -	int (*cdb_none)(struct se_task *); -	/* -	 * For SCF_SCSI_DATA_SG_IO_CDB -	 */ -	int (*map_data_SG)(struct se_task *); -	/* -	 * For SCF_SCSI_CONTROL_SG_IO_CDB -	 */ -	int (*map_control_SG)(struct se_task *); -	/*  	 * attach_hba():  	 */  	int (*attach_hba)(struct se_hba *, u32); @@ -275,22 +248,6 @@ struct se_subsystem_api {  	void (*free_device)(void *);  	/* -	 * dpo_emulated(): -	 */ -	int (*dpo_emulated)(struct se_device *); -	/* -	 * fua_write_emulated(): -	 */ -	int (*fua_write_emulated)(struct se_device *); -	/* -	 * fua_read_emulated(): -	 */ -	int (*fua_read_emulated)(struct se_device *); -	/* -	 * write_cache_emulated(): -	 */ -	int (*write_cache_emulated)(struct se_device *); -	/*  	 * transport_complete():  	 *  	 * Use transport_generic_complete() for majority of DAS transport @@ -331,10 +288,6 @@ struct se_subsystem_api {  	ssize_t (*show_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *,  						char *);  	/* -	 * get_cdb(): -	 */ -	unsigned char *(*get_cdb)(struct se_task *); -	/*  	 * get_device_rev():  	 */  	u32 (*get_device_rev)(struct se_device *);  |