Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull target updates from Nicholas Bellinger:
"It has been a very busy development cycle this time around in target
land, with the highlights including:
- Kill struct se_subsystem_dev, in favor of direct se_device usage
(hch)
- Simplify reservations code by combining SPC-3 + SCSI-2 support for
virtual backends only (hch)
- Simplify ALUA code for virtual only backends, and remove left over
abstractions (hch)
- Pass sense_reason_t as return value for I/O submission path (hch)
- Refactor MODE_SENSE emulation to allow for easier addition of new
mode pages. (roland)
- Add emulation of MODE_SELECT (roland)
- Fix bug in handling of ExpStatSN wrap-around (steve)
- Fix bug in TMR ABORT_TASK lookup in qla2xxx target (steve)
- Add WRITE_SAME w/ UNMAP=0 support for IBLOCK backends (nab)
- Convert ib_srpt to use modern target_submit_cmd caller + drop
legacy ioctx->kref usage (nab)
- Convert ib_srpt to use modern target_submit_tmr caller (nab)
- Add link_magic for fabric allow_link destination target_items for
symlinks within target_core_fabric_configfs.c code (nab)
- Allocate pointers in instead of full structs for
config_group->default_groups (sebastian)
- Fix 32-bit highmem breakage for FILEIO (sebastian)
All told, hch was able to shave off another ~1K LOC by killing the
se_subsystem_dev abstraction, along with a number of PR + ALUA
simplifications. Also, a nice patch by Roland is the refactoring of
MODE_SENSE handling, along with the addition of initial MODE_SELECT
emulation support for virtual backends.
Sebastian found a long-standing issue wrt to allocation of full
config_group instead of pointers for config_group->default_group[]
setup in a number of areas, which ends up saving memory with big
configurations. He also managed to fix another long-standing BUG wrt
to broken 32-bit highmem support within the FILEIO backend driver.
Thank you again to everyone who contributed this round!"
* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (50 commits)
target/iscsi_target: Add NodeACL tags for initiator group support
target/tcm_fc: fix the lockdep warning due to inconsistent lock state
sbp-target: fix error path in sbp_make_tpg()
sbp-target: use simple assignment in tgt_agent_rw_agent_state()
iscsi-target: use kstrdup() for iscsi_param
target/file: merge fd_do_readv() and fd_do_writev()
target/file: Fix 32-bit highmem breakage for SGL -> iovec mapping
target: Add link_magic for fabric allow_link destination target_items
ib_srpt: Convert TMR path to target_submit_tmr
ib_srpt: Convert I/O path to target_submit_cmd + drop legacy ioctx->kref
target: Make spc_get_write_same_sectors return sector_t
target/configfs: use kmalloc() instead of kzalloc() for default groups
target/configfs: allocate only 6 slots for dev_cg->default_groups
target/configfs: allocate pointers instead of full struct for default_groups
target: update error handling for sbc_setup_write_same()
iscsit: use GFP_ATOMIC under spin lock
iscsi_target: Remove redundant null check before kfree
target/iblock: Forward declare bio helpers
target: Clean up flow in transport_check_aborted_status()
target: Clean up logic in transport_put_cmd()
...
This commit is contained in:
@@ -9,6 +9,8 @@ struct se_subsystem_api {
|
||||
struct list_head sub_api_list;
|
||||
|
||||
char name[16];
|
||||
char inquiry_prod[16];
|
||||
char inquiry_rev[4];
|
||||
struct module *owner;
|
||||
|
||||
u8 transport_type;
|
||||
@@ -16,46 +18,45 @@ struct se_subsystem_api {
|
||||
int (*attach_hba)(struct se_hba *, u32);
|
||||
void (*detach_hba)(struct se_hba *);
|
||||
int (*pmode_enable_hba)(struct se_hba *, unsigned long);
|
||||
void *(*allocate_virtdevice)(struct se_hba *, const char *);
|
||||
struct se_device *(*create_virtdevice)(struct se_hba *,
|
||||
struct se_subsystem_dev *, void *);
|
||||
void (*free_device)(void *);
|
||||
|
||||
struct se_device *(*alloc_device)(struct se_hba *, const char *);
|
||||
int (*configure_device)(struct se_device *);
|
||||
void (*free_device)(struct se_device *device);
|
||||
|
||||
ssize_t (*set_configfs_dev_params)(struct se_device *,
|
||||
const char *, ssize_t);
|
||||
ssize_t (*show_configfs_dev_params)(struct se_device *, char *);
|
||||
|
||||
void (*transport_complete)(struct se_cmd *cmd,
|
||||
struct scatterlist *,
|
||||
unsigned char *);
|
||||
|
||||
int (*parse_cdb)(struct se_cmd *cmd);
|
||||
ssize_t (*check_configfs_dev_params)(struct se_hba *,
|
||||
struct se_subsystem_dev *);
|
||||
ssize_t (*set_configfs_dev_params)(struct se_hba *,
|
||||
struct se_subsystem_dev *, const char *, ssize_t);
|
||||
ssize_t (*show_configfs_dev_params)(struct se_hba *,
|
||||
struct se_subsystem_dev *, char *);
|
||||
u32 (*get_device_rev)(struct se_device *);
|
||||
sense_reason_t (*parse_cdb)(struct se_cmd *cmd);
|
||||
u32 (*get_device_type)(struct se_device *);
|
||||
sector_t (*get_blocks)(struct se_device *);
|
||||
unsigned char *(*get_sense_buffer)(struct se_cmd *);
|
||||
};
|
||||
|
||||
struct spc_ops {
|
||||
int (*execute_rw)(struct se_cmd *cmd);
|
||||
int (*execute_sync_cache)(struct se_cmd *cmd);
|
||||
int (*execute_write_same)(struct se_cmd *cmd);
|
||||
int (*execute_unmap)(struct se_cmd *cmd);
|
||||
struct sbc_ops {
|
||||
sense_reason_t (*execute_rw)(struct se_cmd *cmd);
|
||||
sense_reason_t (*execute_sync_cache)(struct se_cmd *cmd);
|
||||
sense_reason_t (*execute_write_same)(struct se_cmd *cmd);
|
||||
sense_reason_t (*execute_write_same_unmap)(struct se_cmd *cmd);
|
||||
sense_reason_t (*execute_unmap)(struct se_cmd *cmd);
|
||||
};
|
||||
|
||||
int transport_subsystem_register(struct se_subsystem_api *);
|
||||
void transport_subsystem_release(struct se_subsystem_api *);
|
||||
|
||||
struct se_device *transport_add_device_to_core_hba(struct se_hba *,
|
||||
struct se_subsystem_api *, struct se_subsystem_dev *, u32,
|
||||
void *, struct se_dev_limits *, const char *, const char *);
|
||||
|
||||
void target_complete_cmd(struct se_cmd *, u8);
|
||||
|
||||
int sbc_parse_cdb(struct se_cmd *cmd, struct spc_ops *ops);
|
||||
int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size);
|
||||
int spc_get_write_same_sectors(struct se_cmd *cmd);
|
||||
sense_reason_t spc_parse_cdb(struct se_cmd *cmd, unsigned int *size);
|
||||
sense_reason_t spc_emulate_report_luns(struct se_cmd *cmd);
|
||||
sector_t spc_get_write_same_sectors(struct se_cmd *cmd);
|
||||
|
||||
sense_reason_t sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops);
|
||||
u32 sbc_get_device_rev(struct se_device *dev);
|
||||
u32 sbc_get_device_type(struct se_device *dev);
|
||||
|
||||
void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *);
|
||||
int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *);
|
||||
|
||||
@@ -62,20 +62,6 @@
|
||||
|
||||
#define PYX_TRANSPORT_STATUS_INTERVAL 5 /* In seconds */
|
||||
|
||||
/*
|
||||
* struct se_subsystem_dev->su_dev_flags
|
||||
*/
|
||||
#define SDF_FIRMWARE_VPD_UNIT_SERIAL 0x00000001
|
||||
#define SDF_EMULATED_VPD_UNIT_SERIAL 0x00000002
|
||||
#define SDF_USING_UDEV_PATH 0x00000004
|
||||
#define SDF_USING_ALIAS 0x00000008
|
||||
|
||||
/*
|
||||
* struct se_device->dev_flags
|
||||
*/
|
||||
#define DF_SPC2_RESERVATIONS 0x00000001
|
||||
#define DF_SPC2_RESERVATIONS_WITH_ISID 0x00000002
|
||||
|
||||
/* struct se_dev_attrib sanity values */
|
||||
/* Default max_unmap_lba_count */
|
||||
#define DA_MAX_UNMAP_LBA_COUNT 0
|
||||
@@ -85,6 +71,8 @@
|
||||
#define DA_UNMAP_GRANULARITY_DEFAULT 0
|
||||
/* Default unmap_granularity_alignment */
|
||||
#define DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT 0
|
||||
/* Default max_write_same_len, disabled by default */
|
||||
#define DA_MAX_WRITE_SAME_LEN 0
|
||||
/* Default max transfer length */
|
||||
#define DA_FABRIC_MAX_SECTORS 8192
|
||||
/* Emulation for Direct Page Out */
|
||||
@@ -107,8 +95,6 @@
|
||||
*/
|
||||
#define DA_EMULATE_TPWS 0
|
||||
/* No Emulation for PSCSI by default */
|
||||
#define DA_EMULATE_RESERVATIONS 0
|
||||
/* No Emulation for PSCSI by default */
|
||||
#define DA_EMULATE_ALUA 0
|
||||
/* Enforce SCSI Initiator Port TransportID with 'ISID' for PR */
|
||||
#define DA_ENFORCE_PR_ISIDS 1
|
||||
@@ -160,8 +146,6 @@ enum se_cmd_flags_table {
|
||||
SCF_EMULATED_TASK_SENSE = 0x00000004,
|
||||
SCF_SCSI_DATA_CDB = 0x00000008,
|
||||
SCF_SCSI_TMR_CDB = 0x00000010,
|
||||
SCF_SCSI_CDB_EXCEPTION = 0x00000020,
|
||||
SCF_SCSI_RESERVATION_CONFLICT = 0x00000040,
|
||||
SCF_FUA = 0x00000080,
|
||||
SCF_SE_LUN_CMD = 0x00000100,
|
||||
SCF_BIDI = 0x00000400,
|
||||
@@ -182,38 +166,33 @@ enum transport_lunflags_table {
|
||||
TRANSPORT_LUNFLAGS_READ_WRITE = 0x04,
|
||||
};
|
||||
|
||||
/* struct se_device->dev_status */
|
||||
enum transport_device_status_table {
|
||||
TRANSPORT_DEVICE_ACTIVATED = 0x01,
|
||||
TRANSPORT_DEVICE_DEACTIVATED = 0x02,
|
||||
TRANSPORT_DEVICE_QUEUE_FULL = 0x04,
|
||||
TRANSPORT_DEVICE_SHUTDOWN = 0x08,
|
||||
TRANSPORT_DEVICE_OFFLINE_ACTIVATED = 0x10,
|
||||
TRANSPORT_DEVICE_OFFLINE_DEACTIVATED = 0x20,
|
||||
};
|
||||
|
||||
/*
|
||||
* Used by transport_send_check_condition_and_sense() and se_cmd->scsi_sense_reason
|
||||
* Used by transport_send_check_condition_and_sense()
|
||||
* to signal which ASC/ASCQ sense payload should be built.
|
||||
*/
|
||||
typedef unsigned __bitwise__ sense_reason_t;
|
||||
|
||||
enum tcm_sense_reason_table {
|
||||
TCM_NON_EXISTENT_LUN = 0x01,
|
||||
TCM_UNSUPPORTED_SCSI_OPCODE = 0x02,
|
||||
TCM_INCORRECT_AMOUNT_OF_DATA = 0x03,
|
||||
TCM_UNEXPECTED_UNSOLICITED_DATA = 0x04,
|
||||
TCM_SERVICE_CRC_ERROR = 0x05,
|
||||
TCM_SNACK_REJECTED = 0x06,
|
||||
TCM_SECTOR_COUNT_TOO_MANY = 0x07,
|
||||
TCM_INVALID_CDB_FIELD = 0x08,
|
||||
TCM_INVALID_PARAMETER_LIST = 0x09,
|
||||
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE = 0x0a,
|
||||
TCM_UNKNOWN_MODE_PAGE = 0x0b,
|
||||
TCM_WRITE_PROTECTED = 0x0c,
|
||||
TCM_CHECK_CONDITION_ABORT_CMD = 0x0d,
|
||||
TCM_CHECK_CONDITION_UNIT_ATTENTION = 0x0e,
|
||||
TCM_CHECK_CONDITION_NOT_READY = 0x0f,
|
||||
TCM_RESERVATION_CONFLICT = 0x10,
|
||||
TCM_ADDRESS_OUT_OF_RANGE = 0x11,
|
||||
#define R(x) (__force sense_reason_t )(x)
|
||||
TCM_NON_EXISTENT_LUN = R(0x01),
|
||||
TCM_UNSUPPORTED_SCSI_OPCODE = R(0x02),
|
||||
TCM_INCORRECT_AMOUNT_OF_DATA = R(0x03),
|
||||
TCM_UNEXPECTED_UNSOLICITED_DATA = R(0x04),
|
||||
TCM_SERVICE_CRC_ERROR = R(0x05),
|
||||
TCM_SNACK_REJECTED = R(0x06),
|
||||
TCM_SECTOR_COUNT_TOO_MANY = R(0x07),
|
||||
TCM_INVALID_CDB_FIELD = R(0x08),
|
||||
TCM_INVALID_PARAMETER_LIST = R(0x09),
|
||||
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE = R(0x0a),
|
||||
TCM_UNKNOWN_MODE_PAGE = R(0x0b),
|
||||
TCM_WRITE_PROTECTED = R(0x0c),
|
||||
TCM_CHECK_CONDITION_ABORT_CMD = R(0x0d),
|
||||
TCM_CHECK_CONDITION_UNIT_ATTENTION = R(0x0e),
|
||||
TCM_CHECK_CONDITION_NOT_READY = R(0x0f),
|
||||
TCM_RESERVATION_CONFLICT = R(0x10),
|
||||
TCM_ADDRESS_OUT_OF_RANGE = R(0x11),
|
||||
TCM_OUT_OF_RESOURCES = R(0x12),
|
||||
#undef R
|
||||
};
|
||||
|
||||
enum target_sc_flags_table {
|
||||
@@ -246,30 +225,6 @@ enum tcm_tmrsp_table {
|
||||
TMR_FUNCTION_REJECTED = 255,
|
||||
};
|
||||
|
||||
struct se_obj {
|
||||
atomic_t obj_access_count;
|
||||
};
|
||||
|
||||
/*
|
||||
* Used by TCM Core internally to signal if ALUA emulation is enabled or
|
||||
* disabled, or running in with TCM/pSCSI passthrough mode
|
||||
*/
|
||||
typedef enum {
|
||||
SPC_ALUA_PASSTHROUGH,
|
||||
SPC2_ALUA_DISABLED,
|
||||
SPC3_ALUA_EMULATED
|
||||
} t10_alua_index_t;
|
||||
|
||||
/*
|
||||
* Used by TCM Core internally to signal if SAM Task Attribute emulation
|
||||
* is enabled or disabled, or running in with TCM/pSCSI passthrough mode
|
||||
*/
|
||||
typedef enum {
|
||||
SAM_TASK_ATTR_PASSTHROUGH,
|
||||
SAM_TASK_ATTR_UNTAGGED,
|
||||
SAM_TASK_ATTR_EMULATED
|
||||
} t10_task_attr_index_t;
|
||||
|
||||
/*
|
||||
* Used for target SCSI statistics
|
||||
*/
|
||||
@@ -283,17 +238,15 @@ typedef enum {
|
||||
struct se_cmd;
|
||||
|
||||
struct t10_alua {
|
||||
t10_alua_index_t alua_type;
|
||||
/* ALUA Target Port Group ID */
|
||||
u16 alua_tg_pt_gps_counter;
|
||||
u32 alua_tg_pt_gps_count;
|
||||
spinlock_t tg_pt_gps_lock;
|
||||
struct se_subsystem_dev *t10_sub_dev;
|
||||
struct se_device *t10_dev;
|
||||
/* Used for default ALUA Target Port Group */
|
||||
struct t10_alua_tg_pt_gp *default_tg_pt_gp;
|
||||
/* Used for default ALUA Target Port Group ConfigFS group */
|
||||
struct config_group alua_tg_pt_gps_group;
|
||||
int (*alua_state_check)(struct se_cmd *, unsigned char *, u8 *);
|
||||
struct list_head tg_pt_gps_list;
|
||||
};
|
||||
|
||||
@@ -335,7 +288,7 @@ struct t10_alua_tg_pt_gp {
|
||||
atomic_t tg_pt_gp_ref_cnt;
|
||||
spinlock_t tg_pt_gp_lock;
|
||||
struct mutex tg_pt_gp_md_mutex;
|
||||
struct se_subsystem_dev *tg_pt_gp_su_dev;
|
||||
struct se_device *tg_pt_gp_dev;
|
||||
struct config_group tg_pt_gp_group;
|
||||
struct list_head tg_pt_gp_list;
|
||||
struct list_head tg_pt_gp_mem_list;
|
||||
@@ -366,23 +319,11 @@ struct t10_wwn {
|
||||
char revision[4];
|
||||
char unit_serial[INQUIRY_VPD_SERIAL_LEN];
|
||||
spinlock_t t10_vpd_lock;
|
||||
struct se_subsystem_dev *t10_sub_dev;
|
||||
struct se_device *t10_dev;
|
||||
struct config_group t10_wwn_group;
|
||||
struct list_head t10_vpd_list;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Used by TCM Core internally to signal if >= SPC-3 persistent reservations
|
||||
* emulation is enabled or disabled, or running in with TCM/pSCSI passthrough
|
||||
* mode
|
||||
*/
|
||||
typedef enum {
|
||||
SPC_PASSTHROUGH,
|
||||
SPC2_RESERVATIONS,
|
||||
SPC3_PERSISTENT_RESERVATIONS
|
||||
} t10_reservations_index_t;
|
||||
|
||||
struct t10_pr_registration {
|
||||
/* Used for fabrics that contain WWN+ISID */
|
||||
#define PR_REG_ISID_LEN 16
|
||||
@@ -424,18 +365,6 @@ struct t10_pr_registration {
|
||||
struct list_head pr_reg_atp_mem_list;
|
||||
};
|
||||
|
||||
/*
|
||||
* This set of function pointer ops is set based upon SPC3_PERSISTENT_RESERVATIONS,
|
||||
* SPC2_RESERVATIONS or SPC_PASSTHROUGH in drivers/target/target_core_pr.c:
|
||||
* core_setup_reservations()
|
||||
*/
|
||||
struct t10_reservation_ops {
|
||||
int (*t10_reservation_check)(struct se_cmd *, u32 *);
|
||||
int (*t10_seq_non_holder)(struct se_cmd *, unsigned char *, u32);
|
||||
int (*t10_pr_register)(struct se_cmd *);
|
||||
int (*t10_pr_clear)(struct se_cmd *);
|
||||
};
|
||||
|
||||
struct t10_reservation {
|
||||
/* Reservation effects all target ports */
|
||||
int pr_all_tg_pt;
|
||||
@@ -446,7 +375,6 @@ struct t10_reservation {
|
||||
#define PR_APTPL_BUF_LEN 8192
|
||||
u32 pr_aptpl_buf_len;
|
||||
u32 pr_generation;
|
||||
t10_reservations_index_t res_type;
|
||||
spinlock_t registration_lock;
|
||||
spinlock_t aptpl_reg_lock;
|
||||
/*
|
||||
@@ -462,7 +390,6 @@ struct t10_reservation {
|
||||
struct se_node_acl *pr_res_holder;
|
||||
struct list_head registration_list;
|
||||
struct list_head aptpl_reg_list;
|
||||
struct t10_reservation_ops pr_ops;
|
||||
};
|
||||
|
||||
struct se_tmr_req {
|
||||
@@ -485,7 +412,6 @@ struct se_cmd {
|
||||
u8 scsi_status;
|
||||
u8 scsi_asc;
|
||||
u8 scsi_ascq;
|
||||
u8 scsi_sense_reason;
|
||||
u16 scsi_sense_length;
|
||||
/* Delay for ALUA Active/NonOptimized state access in milliseconds */
|
||||
int alua_nonop_delay;
|
||||
@@ -523,7 +449,7 @@ struct se_cmd {
|
||||
struct completion cmd_wait_comp;
|
||||
struct kref cmd_kref;
|
||||
struct target_core_fabric_ops *se_tfo;
|
||||
int (*execute_cmd)(struct se_cmd *);
|
||||
sense_reason_t (*execute_cmd)(struct se_cmd *);
|
||||
void (*transport_complete_callback)(struct se_cmd *);
|
||||
|
||||
unsigned char *t_task_cdb;
|
||||
@@ -581,6 +507,8 @@ struct se_node_acl {
|
||||
bool acl_stop:1;
|
||||
u32 queue_depth;
|
||||
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;
|
||||
@@ -662,15 +590,6 @@ struct se_dev_entry {
|
||||
struct list_head ua_list;
|
||||
};
|
||||
|
||||
struct se_dev_limits {
|
||||
/* Max supported HW queue depth */
|
||||
u32 hw_queue_depth;
|
||||
/* Max supported virtual queue depth */
|
||||
u32 queue_depth;
|
||||
/* From include/linux/blkdev.h for the other HW/SW limits. */
|
||||
struct queue_limits limits;
|
||||
};
|
||||
|
||||
struct se_dev_attrib {
|
||||
int emulate_dpo;
|
||||
int emulate_fua_write;
|
||||
@@ -680,8 +599,6 @@ struct se_dev_attrib {
|
||||
int emulate_tas;
|
||||
int emulate_tpu;
|
||||
int emulate_tpws;
|
||||
int emulate_reservations;
|
||||
int emulate_alua;
|
||||
int enforce_pr_isids;
|
||||
int is_nonrot;
|
||||
int emulate_rest_reord;
|
||||
@@ -696,7 +613,8 @@ struct se_dev_attrib {
|
||||
u32 max_unmap_block_desc_count;
|
||||
u32 unmap_granularity;
|
||||
u32 unmap_granularity_alignment;
|
||||
struct se_subsystem_dev *da_sub_dev;
|
||||
u32 max_write_same_len;
|
||||
struct se_device *da_dev;
|
||||
struct config_group da_group;
|
||||
};
|
||||
|
||||
@@ -707,48 +625,25 @@ struct se_dev_stat_grps {
|
||||
struct config_group scsi_lu_group;
|
||||
};
|
||||
|
||||
struct se_subsystem_dev {
|
||||
/* Used for struct se_subsystem_dev-->se_dev_alias, must be less than PAGE_SIZE */
|
||||
#define SE_DEV_ALIAS_LEN 512
|
||||
unsigned char se_dev_alias[SE_DEV_ALIAS_LEN];
|
||||
/* Used for struct se_subsystem_dev->se_dev_udev_path[], must be less than PAGE_SIZE */
|
||||
#define SE_UDEV_PATH_LEN 512
|
||||
unsigned char se_dev_udev_path[SE_UDEV_PATH_LEN];
|
||||
u32 su_dev_flags;
|
||||
struct se_hba *se_dev_hba;
|
||||
struct se_device *se_dev_ptr;
|
||||
struct se_dev_attrib se_dev_attrib;
|
||||
/* T10 Asymmetric Logical Unit Assignment for Target Ports */
|
||||
struct t10_alua t10_alua;
|
||||
/* T10 Inquiry and VPD WWN Information */
|
||||
struct t10_wwn t10_wwn;
|
||||
/* T10 SPC-2 + SPC-3 Reservations */
|
||||
struct t10_reservation t10_pr;
|
||||
spinlock_t se_dev_lock;
|
||||
void *se_dev_su_ptr;
|
||||
struct config_group se_dev_group;
|
||||
/* For T10 Reservations */
|
||||
struct config_group se_dev_pr_group;
|
||||
/* For target_core_stat.c groups */
|
||||
struct se_dev_stat_grps dev_stat_grps;
|
||||
};
|
||||
|
||||
struct se_device {
|
||||
#define SE_DEV_LINK_MAGIC 0xfeeddeef
|
||||
u32 dev_link_magic;
|
||||
/* RELATIVE TARGET PORT IDENTIFER Counter */
|
||||
u16 dev_rpti_counter;
|
||||
/* Used for SAM Task Attribute ordering */
|
||||
u32 dev_cur_ordered_id;
|
||||
u32 dev_flags;
|
||||
#define DF_CONFIGURED 0x00000001
|
||||
#define DF_FIRMWARE_VPD_UNIT_SERIAL 0x00000002
|
||||
#define DF_EMULATED_VPD_UNIT_SERIAL 0x00000004
|
||||
#define DF_USING_UDEV_PATH 0x00000008
|
||||
#define DF_USING_ALIAS 0x00000010
|
||||
u32 dev_port_count;
|
||||
/* See transport_device_status_table */
|
||||
u32 dev_status;
|
||||
/* Physical device queue depth */
|
||||
u32 queue_depth;
|
||||
/* Used for SPC-2 reservations enforce of ISIDs */
|
||||
u64 dev_res_bin_isid;
|
||||
t10_task_attr_index_t dev_task_attr_type;
|
||||
/* Pointer to transport specific device structure */
|
||||
void *dev_ptr;
|
||||
u32 dev_index;
|
||||
u64 creation_time;
|
||||
u32 num_resets;
|
||||
@@ -761,13 +656,13 @@ struct se_device {
|
||||
atomic_t dev_ordered_id;
|
||||
atomic_t dev_ordered_sync;
|
||||
atomic_t dev_qf_count;
|
||||
struct se_obj dev_obj;
|
||||
struct se_obj dev_access_obj;
|
||||
struct se_obj dev_export_obj;
|
||||
int export_count;
|
||||
spinlock_t delayed_cmd_lock;
|
||||
spinlock_t execute_task_lock;
|
||||
spinlock_t dev_reservation_lock;
|
||||
spinlock_t dev_status_lock;
|
||||
unsigned int dev_reservation_flags;
|
||||
#define DRF_SPC2_RESERVATIONS 0x00000001
|
||||
#define DRF_SPC2_RESERVATIONS_WITH_ISID 0x00000002
|
||||
spinlock_t se_port_lock;
|
||||
spinlock_t se_tmr_lock;
|
||||
spinlock_t qf_cmd_lock;
|
||||
@@ -786,7 +681,20 @@ struct se_device {
|
||||
struct list_head qf_cmd_list;
|
||||
/* Pointer to associated SE HBA */
|
||||
struct se_hba *se_hba;
|
||||
struct se_subsystem_dev *se_sub_dev;
|
||||
/* T10 Inquiry and VPD WWN Information */
|
||||
struct t10_wwn t10_wwn;
|
||||
/* T10 Asymmetric Logical Unit Assignment for Target Ports */
|
||||
struct t10_alua t10_alua;
|
||||
/* T10 SPC-2 + SPC-3 Reservations */
|
||||
struct t10_reservation t10_pr;
|
||||
struct se_dev_attrib dev_attrib;
|
||||
struct config_group dev_group;
|
||||
struct config_group dev_pr_group;
|
||||
struct se_dev_stat_grps dev_stat_grps;
|
||||
#define SE_DEV_ALIAS_LEN 512 /* must be less than PAGE_SIZE */
|
||||
unsigned char dev_alias[SE_DEV_ALIAS_LEN];
|
||||
#define SE_UDEV_PATH_LEN 512 /* must be less than PAGE_SIZE */
|
||||
unsigned char udev_path[SE_UDEV_PATH_LEN];
|
||||
/* Pointer to template of function pointers for transport */
|
||||
struct se_subsystem_api *transport;
|
||||
/* Linked list for struct se_hba struct se_device list */
|
||||
@@ -803,8 +711,6 @@ struct se_hba {
|
||||
u32 hba_index;
|
||||
/* Pointer to transport specific host structure. */
|
||||
void *hba_ptr;
|
||||
/* Linked list for struct se_device */
|
||||
struct list_head hba_dev_list;
|
||||
struct list_head hba_node;
|
||||
spinlock_t device_lock;
|
||||
struct config_group hba_group;
|
||||
@@ -820,6 +726,8 @@ struct se_port_stat_grps {
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
@@ -98,8 +98,8 @@ void transport_deregister_session(struct se_session *);
|
||||
|
||||
void transport_init_se_cmd(struct se_cmd *, struct target_core_fabric_ops *,
|
||||
struct se_session *, u32, int, int, unsigned char *);
|
||||
int transport_lookup_cmd_lun(struct se_cmd *, u32);
|
||||
int target_setup_cmd_from_cdb(struct se_cmd *, unsigned char *);
|
||||
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);
|
||||
@@ -110,9 +110,7 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess,
|
||||
void *fabric_tmr_ptr, unsigned char tm_type,
|
||||
gfp_t, unsigned int, int);
|
||||
int transport_handle_cdb_direct(struct se_cmd *);
|
||||
int transport_generic_map_mem_to_cmd(struct se_cmd *cmd,
|
||||
struct scatterlist *, u32, struct scatterlist *, u32);
|
||||
int transport_generic_new_cmd(struct se_cmd *);
|
||||
sense_reason_t transport_generic_new_cmd(struct se_cmd *);
|
||||
|
||||
void target_execute_cmd(struct se_cmd *cmd);
|
||||
|
||||
@@ -120,7 +118,8 @@ void transport_generic_free_cmd(struct se_cmd *, int);
|
||||
|
||||
bool transport_wait_for_tasks(struct se_cmd *);
|
||||
int transport_check_aborted_status(struct se_cmd *, int);
|
||||
int transport_send_check_condition_and_sense(struct se_cmd *, u8, int);
|
||||
int transport_send_check_condition_and_sense(struct se_cmd *,
|
||||
sense_reason_t, int);
|
||||
|
||||
int target_put_sess_cmd(struct se_session *, struct se_cmd *);
|
||||
void target_sess_cmd_list_set_waiting(struct se_session *);
|
||||
@@ -131,7 +130,7 @@ int core_alua_check_nonop_delay(struct se_cmd *);
|
||||
int core_tmr_alloc_req(struct se_cmd *, void *, u8, gfp_t);
|
||||
void core_tmr_release_req(struct se_tmr_req *);
|
||||
int transport_generic_handle_tmr(struct se_cmd *);
|
||||
void transport_generic_request_failure(struct se_cmd *);
|
||||
void transport_generic_request_failure(struct se_cmd *, sense_reason_t);
|
||||
int transport_lookup_tmr_lun(struct se_cmd *, u32);
|
||||
|
||||
struct se_node_acl *core_tpg_check_initiator_node_acl(struct se_portal_group *,
|
||||
@@ -143,6 +142,8 @@ int core_tpg_del_initiator_node_acl(struct se_portal_group *,
|
||||
struct se_node_acl *, int);
|
||||
int core_tpg_set_initiator_node_queue_depth(struct se_portal_group *,
|
||||
unsigned char *, u32, int);
|
||||
int core_tpg_set_initiator_node_tag(struct se_portal_group *,
|
||||
struct se_node_acl *, const char *);
|
||||
int core_tpg_register(struct target_core_fabric_ops *, struct se_wwn *,
|
||||
struct se_portal_group *, void *, int);
|
||||
int core_tpg_deregister(struct se_portal_group *);
|
||||
|
||||
Reference in New Issue
Block a user