Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull SCSI target updates from Nicholas Bellinger: "Lots of activity in target land the last months. The highlights include: - Convert fabric drivers tree-wide to target_register_template() (hch + bart) - iser-target hardening fixes + v1.0 improvements (sagi) - Convert iscsi_thread_set usage to kthread.h + kill iscsi_target_tq.c (sagi + nab) - Add support for T10-PI WRITE_STRIP + READ_INSERT operation (mkp + sagi + nab) - DIF fixes for CONFIG_DEBUG_SG=y + UNMAP file emulation (akinobu + sagi + mkp) - Extended TCMU ABI v2 for future BIDI + DIF support (andy + ilias) - Fix COMPARE_AND_WRITE handling for NO_ALLLOC drivers (hch + nab) Thanks to everyone who contributed this round with new features, bug-reports, fixes, cleanups and improvements. Looking forward, it's currently shaping up to be a busy v4.2 as well" * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (69 commits) target: Put TCMU under a new config option target: Version 2 of TCMU ABI target: fix tcm_mod_builder.py target/file: Fix UNMAP with DIF protection support target/file: Fix SG table for prot_buf initialization target/file: Fix BUG() when CONFIG_DEBUG_SG=y and DIF protection enabled target: Make core_tmr_abort_task() skip TMFs target/sbc: Update sbc_dif_generate pr_debug output target/sbc: Make internal DIF emulation honor ->prot_checks target/sbc: Return INVALID_CDB_FIELD if DIF + sess_prot_type disabled target: Ensure sess_prot_type is saved across session restart target/rd: Don't pass incomplete scatterlist entries to sbc_dif_verify_* target: Remove the unused flag SCF_ACK_KREF target: Fix two sparse warnings target: Fix COMPARE_AND_WRITE with SG_TO_MEM_NOALLOC handling target: simplify the target template registration API target: simplify target_xcopy_init_pt_lun target: remove the unused SCF_CMD_XCOPY_PASSTHROUGH flag target/rd: reduce code duplication in rd_execute_rw() tcm_loop: fixup tpgt string to integer conversion ...
This commit is contained in:
@@ -20,6 +20,8 @@
|
||||
#define ISCSIT_MIN_TAGS 16
|
||||
#define ISCSIT_EXTRA_TAGS 8
|
||||
#define ISCSIT_TCP_BACKLOG 256
|
||||
#define ISCSI_RX_THREAD_NAME "iscsi_trx"
|
||||
#define ISCSI_TX_THREAD_NAME "iscsi_ttx"
|
||||
|
||||
/* struct iscsi_node_attrib sanity values */
|
||||
#define NA_DATAOUT_TIMEOUT 3
|
||||
@@ -60,6 +62,7 @@
|
||||
#define TA_CACHE_CORE_NPS 0
|
||||
/* T10 protection information disabled by default */
|
||||
#define TA_DEFAULT_T10_PI 0
|
||||
#define TA_DEFAULT_FABRIC_PROT_TYPE 0
|
||||
|
||||
#define ISCSI_IOV_DATA_BUFFER 5
|
||||
|
||||
@@ -600,8 +603,11 @@ struct iscsi_conn {
|
||||
struct iscsi_tpg_np *tpg_np;
|
||||
/* Pointer to parent session */
|
||||
struct iscsi_session *sess;
|
||||
/* Pointer to thread_set in use for this conn's threads */
|
||||
struct iscsi_thread_set *thread_set;
|
||||
int bitmap_id;
|
||||
int rx_thread_active;
|
||||
struct task_struct *rx_thread;
|
||||
int tx_thread_active;
|
||||
struct task_struct *tx_thread;
|
||||
/* list_head for session connection list */
|
||||
struct list_head conn_list;
|
||||
} ____cacheline_aligned;
|
||||
@@ -767,6 +773,7 @@ struct iscsi_tpg_attrib {
|
||||
u32 demo_mode_discovery;
|
||||
u32 default_erl;
|
||||
u8 t10_pi;
|
||||
u32 fabric_prot_type;
|
||||
struct iscsi_portal_group *tpg;
|
||||
};
|
||||
|
||||
@@ -871,10 +878,10 @@ struct iscsit_global {
|
||||
/* Unique identifier used for the authentication daemon */
|
||||
u32 auth_id;
|
||||
u32 inactive_ts;
|
||||
/* Thread Set bitmap count */
|
||||
int ts_bitmap_count;
|
||||
#define ISCSIT_BITMAP_BITS 262144
|
||||
/* Thread Set bitmap pointer */
|
||||
unsigned long *ts_bitmap;
|
||||
spinlock_t ts_bitmap_lock;
|
||||
/* Used for iSCSI discovery session authentication */
|
||||
struct iscsi_node_acl discovery_acl;
|
||||
struct iscsi_portal_group *discovery_tpg;
|
||||
|
@@ -165,10 +165,8 @@ enum se_cmd_flags_table {
|
||||
SCF_SEND_DELAYED_TAS = 0x00004000,
|
||||
SCF_ALUA_NON_OPTIMIZED = 0x00008000,
|
||||
SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00020000,
|
||||
SCF_ACK_KREF = 0x00040000,
|
||||
SCF_COMPARE_AND_WRITE = 0x00080000,
|
||||
SCF_COMPARE_AND_WRITE_POST = 0x00100000,
|
||||
SCF_CMD_XCOPY_PASSTHROUGH = 0x00200000,
|
||||
};
|
||||
|
||||
/* struct se_dev_entry->lun_flags and struct se_lun->lun_access */
|
||||
@@ -520,11 +518,11 @@ struct se_cmd {
|
||||
struct list_head se_cmd_list;
|
||||
struct completion cmd_wait_comp;
|
||||
struct kref cmd_kref;
|
||||
struct target_core_fabric_ops *se_tfo;
|
||||
const struct target_core_fabric_ops *se_tfo;
|
||||
sense_reason_t (*execute_cmd)(struct se_cmd *);
|
||||
sense_reason_t (*execute_rw)(struct se_cmd *, struct scatterlist *,
|
||||
u32, enum dma_data_direction);
|
||||
sense_reason_t (*transport_complete_callback)(struct se_cmd *);
|
||||
sense_reason_t (*transport_complete_callback)(struct se_cmd *, bool);
|
||||
|
||||
unsigned char *t_task_cdb;
|
||||
unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE];
|
||||
@@ -591,6 +589,7 @@ struct se_node_acl {
|
||||
bool acl_stop:1;
|
||||
u32 queue_depth;
|
||||
u32 acl_index;
|
||||
enum target_prot_type saved_prot_type;
|
||||
#define MAX_ACL_TAG_SIZE 64
|
||||
char acl_tag[MAX_ACL_TAG_SIZE];
|
||||
/* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
|
||||
@@ -616,6 +615,7 @@ struct se_session {
|
||||
unsigned sess_tearing_down:1;
|
||||
u64 sess_bin_isid;
|
||||
enum target_prot_op sup_prot_ops;
|
||||
enum target_prot_type sess_prot_type;
|
||||
struct se_node_acl *se_node_acl;
|
||||
struct se_portal_group *se_tpg;
|
||||
void *fabric_sess_ptr;
|
||||
@@ -890,7 +890,7 @@ struct se_portal_group {
|
||||
/* List of TCM sessions associated wth this TPG */
|
||||
struct list_head tpg_sess_list;
|
||||
/* Pointer to $FABRIC_MOD dependent code */
|
||||
struct target_core_fabric_ops *se_tpg_tfo;
|
||||
const struct target_core_fabric_ops *se_tpg_tfo;
|
||||
struct se_wwn *se_tpg_wwn;
|
||||
struct config_group tpg_group;
|
||||
struct config_group *tpg_default_groups[7];
|
||||
|
@@ -5,12 +5,6 @@
|
||||
#define TARGET_CORE_NAME_MAX_LEN 64
|
||||
#define TARGET_FABRIC_NAME_SIZE 32
|
||||
|
||||
extern struct target_fabric_configfs *target_fabric_configfs_init(
|
||||
struct module *, const char *);
|
||||
extern void target_fabric_configfs_free(struct target_fabric_configfs *);
|
||||
extern int target_fabric_configfs_register(struct target_fabric_configfs *);
|
||||
extern void target_fabric_configfs_deregister(struct target_fabric_configfs *);
|
||||
|
||||
struct target_fabric_configfs_template {
|
||||
struct config_item_type tfc_discovery_cit;
|
||||
struct config_item_type tfc_wwn_cit;
|
||||
|
@@ -2,6 +2,8 @@
|
||||
#define TARGET_CORE_FABRIC_H
|
||||
|
||||
struct target_core_fabric_ops {
|
||||
struct module *module;
|
||||
const char *name;
|
||||
struct configfs_subsystem *tf_subsys;
|
||||
char *(*get_fabric_name)(void);
|
||||
u8 (*get_fabric_proto_ident)(struct se_portal_group *);
|
||||
@@ -27,6 +29,14 @@ struct target_core_fabric_ops {
|
||||
* inquiry response
|
||||
*/
|
||||
int (*tpg_check_demo_mode_login_only)(struct se_portal_group *);
|
||||
/*
|
||||
* Optionally used as a configfs tunable to determine when
|
||||
* target-core should signal the PROTECT=1 feature bit for
|
||||
* backends that don't support T10-PI, so that either fabric
|
||||
* HW offload or target-core emulation performs the associated
|
||||
* WRITE_STRIP and READ_INSERT operations.
|
||||
*/
|
||||
int (*tpg_check_prot_fabric_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 *,
|
||||
@@ -82,8 +92,23 @@ struct target_core_fabric_ops {
|
||||
struct se_node_acl *(*fabric_make_nodeacl)(struct se_portal_group *,
|
||||
struct config_group *, const char *);
|
||||
void (*fabric_drop_nodeacl)(struct se_node_acl *);
|
||||
|
||||
struct configfs_attribute **tfc_discovery_attrs;
|
||||
struct configfs_attribute **tfc_wwn_attrs;
|
||||
struct configfs_attribute **tfc_tpg_base_attrs;
|
||||
struct configfs_attribute **tfc_tpg_np_base_attrs;
|
||||
struct configfs_attribute **tfc_tpg_attrib_attrs;
|
||||
struct configfs_attribute **tfc_tpg_auth_attrs;
|
||||
struct configfs_attribute **tfc_tpg_param_attrs;
|
||||
struct configfs_attribute **tfc_tpg_nacl_base_attrs;
|
||||
struct configfs_attribute **tfc_tpg_nacl_attrib_attrs;
|
||||
struct configfs_attribute **tfc_tpg_nacl_auth_attrs;
|
||||
struct configfs_attribute **tfc_tpg_nacl_param_attrs;
|
||||
};
|
||||
|
||||
int target_register_template(const struct target_core_fabric_ops *fo);
|
||||
void target_unregister_template(const struct target_core_fabric_ops *fo);
|
||||
|
||||
struct se_session *transport_init_session(enum target_prot_op);
|
||||
int transport_alloc_session_tags(struct se_session *, unsigned int,
|
||||
unsigned int);
|
||||
@@ -95,13 +120,15 @@ void transport_register_session(struct se_portal_group *,
|
||||
struct se_node_acl *, struct se_session *, void *);
|
||||
void target_get_session(struct se_session *);
|
||||
void target_put_session(struct se_session *);
|
||||
ssize_t target_show_dynamic_sessions(struct se_portal_group *, char *);
|
||||
void transport_free_session(struct se_session *);
|
||||
void target_put_nacl(struct se_node_acl *);
|
||||
void transport_deregister_session_configfs(struct se_session *);
|
||||
void transport_deregister_session(struct se_session *);
|
||||
|
||||
|
||||
void transport_init_se_cmd(struct se_cmd *, struct target_core_fabric_ops *,
|
||||
void transport_init_se_cmd(struct se_cmd *,
|
||||
const struct target_core_fabric_ops *,
|
||||
struct se_session *, u32, int, int, 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 *);
|
||||
@@ -153,8 +180,8 @@ 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_register(const struct target_core_fabric_ops *,
|
||||
struct se_wwn *, struct se_portal_group *, void *, int);
|
||||
int core_tpg_deregister(struct se_portal_group *);
|
||||
|
||||
/* SAS helpers */
|
||||
|
@@ -90,6 +90,11 @@ static struct target_fabric_tpg_attribute _fabric##_tpg_##_name = \
|
||||
_fabric##_tpg_store_##_name);
|
||||
|
||||
|
||||
#define TF_TPG_BASE_ATTR_RO(_fabric, _name) \
|
||||
static struct target_fabric_tpg_attribute _fabric##_tpg_##_name = \
|
||||
__CONFIGFS_EATTR_RO(_name, \
|
||||
_fabric##_tpg_show_##_name);
|
||||
|
||||
CONFIGFS_EATTR_STRUCT(target_fabric_wwn, target_fabric_configfs);
|
||||
#define TF_WWN_ATTR(_fabric, _name, _mode) \
|
||||
static struct target_fabric_wwn_attribute _fabric##_wwn_##_name = \
|
||||
|
Reference in New Issue
Block a user