Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (62 commits) target: Fix compile warning w/ missing module.h include target: Remove legacy se_task->task_timer and associated logic target: Fix incorrect transport_sent usage target: re-use the command S/G list for single-task commands target: Fix BIDI t_task_cdb handling in transport_generic_new_cmd target: remove transport_allocate_tasks target: merge transport_new_cmd_obj into transport_generic_new_cmd target: remove the task_sg_bidi field se_task and pSCSI BIDI support target: transport_subsystem_check_init cleanups target: use a workqueue for I/O completions target: remove unused TRANSPORT_ states target: remove TRANSPORT_DEFERRED_CMD state target: remove the TRANSPORT_REMOVE state target: move depth_left manipulation out of transport_generic_request_failure target: stop task timers earlier target: remove TF_TIMER_STOP target: factor some duplicate code for stopping a task target: fix list walking in transport_free_dev_tasks target: use transport_cmd_check_stop_to_fabric consistently target: do not pass the queue object to transport_remove_cmd_from_queue ...
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 *);
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
@@ -235,18 +220,6 @@ struct se_subsystem_api {
|
||||
* Used for global se_subsystem_api list_head
|
||||
*/
|
||||
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():
|
||||
*/
|
||||
@@ -274,22 +247,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():
|
||||
*
|
||||
@@ -330,10 +287,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():
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user