mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-26 06:33:19 -04:00
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull SCSI target updates from Nicholas Bellinger: "The highlights this round include: - add support for SCSI Referrals (Hannes) - add support for T10 DIF into target core (nab + mkp) - add support for T10 DIF emulation in FILEIO + RAMDISK backends (Sagi + nab) - add support for T10 DIF -> bio_integrity passthrough in IBLOCK backend (nab) - prep changes to iser-target for >= v3.15 T10 DIF support (Sagi) - add support for qla2xxx N_Port ID Virtualization - NPIV (Saurav + Quinn) - allow percpu_ida_alloc() to receive task state bitmask (Kent) - fix >= v3.12 iscsi-target session reset hung task regression (nab) - fix >= v3.13 percpu_ref se_lun->lun_ref_active race (nab) - fix a long-standing network portal creation race (Andy)" * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (51 commits) target: Fix percpu_ref_put race in transport_lun_remove_cmd target/iscsi: Fix network portal creation race target: Report bad sector in sense data for DIF errors iscsi-target: Convert gfp_t parameter to task state bitmask iscsi-target: Fix connection reset hang with percpu_ida_alloc percpu_ida: Make percpu_ida_alloc + callers accept task state bitmask iscsi-target: Pre-allocate more tags to avoid ack starvation qla2xxx: Configure NPIV fc_vport via tcm_qla2xxx_npiv_make_lport qla2xxx: Enhancements to enable NPIV support for QLOGIC ISPs with TCM/LIO. qla2xxx: Fix scsi_host leak on qlt_lport_register callback failure IB/isert: pass scatterlist instead of cmd to fast_reg_mr routine IB/isert: Move fastreg descriptor creation to a function IB/isert: Avoid frwr notation, user fastreg IB/isert: seperate connection protection domains and dma MRs tcm_loop: Enable DIF/DIX modes in SCSI host LLD target/rd: Add DIF protection into rd_execute_rw target/rd: Add support for protection SGL setup + release target/rd: Refactor rd_build_device_space + rd_release_device_space target/file: Add DIF protection support to fd_execute_rw target/file: Add DIF protection init/format support ...
This commit is contained in:
commit
4e13c5d021
43 changed files with 2300 additions and 505 deletions
|
|
@ -4,6 +4,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/spinlock_types.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/cpumask.h>
|
||||
|
|
@ -61,7 +62,7 @@ struct percpu_ida {
|
|||
/* Max size of percpu freelist, */
|
||||
#define IDA_DEFAULT_PCPU_SIZE ((IDA_DEFAULT_PCPU_BATCH_MOVE * 3) / 2)
|
||||
|
||||
int percpu_ida_alloc(struct percpu_ida *pool, gfp_t gfp);
|
||||
int percpu_ida_alloc(struct percpu_ida *pool, int state);
|
||||
void percpu_ida_free(struct percpu_ida *pool, unsigned tag);
|
||||
|
||||
void percpu_ida_destroy(struct percpu_ida *pool);
|
||||
|
|
|
|||
|
|
@ -155,6 +155,7 @@ enum scsi_timeouts {
|
|||
/* values for service action in */
|
||||
#define SAI_READ_CAPACITY_16 0x10
|
||||
#define SAI_GET_LBA_STATUS 0x12
|
||||
#define SAI_REPORT_REFERRALS 0x13
|
||||
/* values for VARIABLE_LENGTH_CMD service action codes
|
||||
* see spc4r17 Section D.3.5, table D.7 and D.8 */
|
||||
#define VLC_SA_RECEIVE_CREDENTIAL 0x1800
|
||||
|
|
|
|||
|
|
@ -94,7 +94,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 *);
|
||||
|
|
|
|||
|
|
@ -41,6 +41,9 @@ struct se_subsystem_api {
|
|||
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 {
|
||||
|
|
@ -70,6 +73,10 @@ 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);
|
||||
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);
|
||||
|
||||
void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *);
|
||||
int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
@ -247,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 */
|
||||
|
|
@ -284,6 +308,8 @@ 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;
|
||||
|
|
@ -291,9 +317,6 @@ struct t10_alua_tg_pt_gp {
|
|||
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;
|
||||
|
|
@ -303,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 {
|
||||
|
|
@ -414,6 +441,34 @@ struct se_tmr_req {
|
|||
struct list_head tmr_list;
|
||||
};
|
||||
|
||||
enum target_prot_op {
|
||||
TARGET_PROT_NORMAL = 0,
|
||||
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_ho {
|
||||
PROT_SEPERATED,
|
||||
PROT_INTERLEAVED,
|
||||
};
|
||||
|
||||
enum target_prot_type {
|
||||
TARGET_DIF_TYPE0_PROT,
|
||||
TARGET_DIF_TYPE1_PROT,
|
||||
TARGET_DIF_TYPE2_PROT,
|
||||
TARGET_DIF_TYPE3_PROT,
|
||||
};
|
||||
|
||||
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;
|
||||
|
|
@ -497,14 +552,24 @@ struct se_cmd {
|
|||
void *priv;
|
||||
|
||||
/* Used for lun->lun_ref counting */
|
||||
bool lun_ref_active;
|
||||
int lun_ref_active;
|
||||
|
||||
/* DIF related members */
|
||||
enum target_prot_op prot_op;
|
||||
enum target_prot_type prot_type;
|
||||
u32 prot_length;
|
||||
u32 reftag_seed;
|
||||
struct scatterlist *t_prot_sg;
|
||||
unsigned int t_prot_nents;
|
||||
enum target_prot_ho prot_handover;
|
||||
sense_reason_t pi_err;
|
||||
sector_t bad_sector;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
|
|
@ -605,6 +670,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;
|
||||
|
|
@ -736,6 +804,8 @@ struct se_device {
|
|||
/* 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 {
|
||||
|
|
|
|||
|
|
@ -105,7 +105,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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue