diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-31 18:31:23 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-31 18:31:23 -0500 |
| commit | 4e13c5d0212f25d69a97606b9d5a85edb52a7737 (patch) | |
| tree | 002f59b9151f42a6388656762f0e7963d08b89ef /include | |
| parent | deb2a1d29bf0168ff2575e714e5c1f156be663fb (diff) | |
| parent | 5259a06ef97068b710f45d092a587e8d740f750f (diff) | |
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
...
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/percpu_ida.h | 3 | ||||
| -rw-r--r-- | include/scsi/scsi.h | 1 | ||||
| -rw-r--r-- | include/target/iscsi/iscsi_transport.h | 2 | ||||
| -rw-r--r-- | include/target/target_core_backend.h | 7 | ||||
| -rw-r--r-- | include/target/target_core_base.h | 82 | ||||
| -rw-r--r-- | include/target/target_core_fabric.h | 3 |
6 files changed, 89 insertions, 9 deletions
diff --git a/include/linux/percpu_ida.h b/include/linux/percpu_ida.h index 1900bd0fa639..f5cfdd6a5539 100644 --- a/include/linux/percpu_ida.h +++ b/include/linux/percpu_ida.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
| 5 | #include <linux/bitops.h> | 5 | #include <linux/bitops.h> |
| 6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
| 7 | #include <linux/sched.h> | ||
| 7 | #include <linux/spinlock_types.h> | 8 | #include <linux/spinlock_types.h> |
| 8 | #include <linux/wait.h> | 9 | #include <linux/wait.h> |
| 9 | #include <linux/cpumask.h> | 10 | #include <linux/cpumask.h> |
| @@ -61,7 +62,7 @@ struct percpu_ida { | |||
| 61 | /* Max size of percpu freelist, */ | 62 | /* Max size of percpu freelist, */ |
| 62 | #define IDA_DEFAULT_PCPU_SIZE ((IDA_DEFAULT_PCPU_BATCH_MOVE * 3) / 2) | 63 | #define IDA_DEFAULT_PCPU_SIZE ((IDA_DEFAULT_PCPU_BATCH_MOVE * 3) / 2) |
| 63 | 64 | ||
| 64 | int percpu_ida_alloc(struct percpu_ida *pool, gfp_t gfp); | 65 | int percpu_ida_alloc(struct percpu_ida *pool, int state); |
| 65 | void percpu_ida_free(struct percpu_ida *pool, unsigned tag); | 66 | void percpu_ida_free(struct percpu_ida *pool, unsigned tag); |
| 66 | 67 | ||
| 67 | void percpu_ida_destroy(struct percpu_ida *pool); | 68 | void percpu_ida_destroy(struct percpu_ida *pool); |
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h index 66d42edfb3fc..0a4edfe8af51 100644 --- a/include/scsi/scsi.h +++ b/include/scsi/scsi.h | |||
| @@ -155,6 +155,7 @@ enum scsi_timeouts { | |||
| 155 | /* values for service action in */ | 155 | /* values for service action in */ |
| 156 | #define SAI_READ_CAPACITY_16 0x10 | 156 | #define SAI_READ_CAPACITY_16 0x10 |
| 157 | #define SAI_GET_LBA_STATUS 0x12 | 157 | #define SAI_GET_LBA_STATUS 0x12 |
| 158 | #define SAI_REPORT_REFERRALS 0x13 | ||
| 158 | /* values for VARIABLE_LENGTH_CMD service action codes | 159 | /* values for VARIABLE_LENGTH_CMD service action codes |
| 159 | * see spc4r17 Section D.3.5, table D.7 and D.8 */ | 160 | * see spc4r17 Section D.3.5, table D.7 and D.8 */ |
| 160 | #define VLC_SA_RECEIVE_CREDENTIAL 0x1800 | 161 | #define VLC_SA_RECEIVE_CREDENTIAL 0x1800 |
diff --git a/include/target/iscsi/iscsi_transport.h b/include/target/iscsi/iscsi_transport.h index a12589c4ee92..ae5a17111968 100644 --- a/include/target/iscsi/iscsi_transport.h +++ b/include/target/iscsi/iscsi_transport.h | |||
| @@ -94,7 +94,7 @@ extern int iscsit_tmr_post_handler(struct iscsi_cmd *, struct iscsi_conn *); | |||
| 94 | /* | 94 | /* |
| 95 | * From iscsi_target_util.c | 95 | * From iscsi_target_util.c |
| 96 | */ | 96 | */ |
| 97 | extern struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *, gfp_t); | 97 | extern struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *, int); |
| 98 | extern int iscsit_sequence_cmd(struct iscsi_conn *, struct iscsi_cmd *, | 98 | extern int iscsit_sequence_cmd(struct iscsi_conn *, struct iscsi_cmd *, |
| 99 | unsigned char *, __be32); | 99 | unsigned char *, __be32); |
| 100 | extern void iscsit_release_cmd(struct iscsi_cmd *); | 100 | extern void iscsit_release_cmd(struct iscsi_cmd *); |
diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h index 39e0114d70c5..7020e33e742e 100644 --- a/include/target/target_core_backend.h +++ b/include/target/target_core_backend.h | |||
| @@ -41,6 +41,9 @@ struct se_subsystem_api { | |||
| 41 | unsigned int (*get_io_opt)(struct se_device *); | 41 | unsigned int (*get_io_opt)(struct se_device *); |
| 42 | unsigned char *(*get_sense_buffer)(struct se_cmd *); | 42 | unsigned char *(*get_sense_buffer)(struct se_cmd *); |
| 43 | bool (*get_write_cache)(struct se_device *); | 43 | bool (*get_write_cache)(struct se_device *); |
| 44 | int (*init_prot)(struct se_device *); | ||
| 45 | int (*format_prot)(struct se_device *); | ||
| 46 | void (*free_prot)(struct se_device *); | ||
| 44 | }; | 47 | }; |
| 45 | 48 | ||
| 46 | struct sbc_ops { | 49 | struct sbc_ops { |
| @@ -70,6 +73,10 @@ sense_reason_t sbc_execute_unmap(struct se_cmd *cmd, | |||
| 70 | sense_reason_t (*do_unmap_fn)(struct se_cmd *cmd, void *priv, | 73 | sense_reason_t (*do_unmap_fn)(struct se_cmd *cmd, void *priv, |
| 71 | sector_t lba, sector_t nolb), | 74 | sector_t lba, sector_t nolb), |
| 72 | void *priv); | 75 | void *priv); |
| 76 | sense_reason_t sbc_dif_verify_write(struct se_cmd *, sector_t, unsigned int, | ||
| 77 | unsigned int, struct scatterlist *, int); | ||
| 78 | sense_reason_t sbc_dif_verify_read(struct se_cmd *, sector_t, unsigned int, | ||
| 79 | unsigned int, struct scatterlist *, int); | ||
| 73 | 80 | ||
| 74 | void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *); | 81 | void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *); |
| 75 | int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *); | 82 | int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *); |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 321301c0a643..c9c791209cd1 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
| @@ -37,6 +37,9 @@ | |||
| 37 | /* Used by transport_send_check_condition_and_sense() */ | 37 | /* Used by transport_send_check_condition_and_sense() */ |
| 38 | #define SPC_SENSE_KEY_OFFSET 2 | 38 | #define SPC_SENSE_KEY_OFFSET 2 |
| 39 | #define SPC_ADD_SENSE_LEN_OFFSET 7 | 39 | #define SPC_ADD_SENSE_LEN_OFFSET 7 |
| 40 | #define SPC_DESC_TYPE_OFFSET 8 | ||
| 41 | #define SPC_ADDITIONAL_DESC_LEN_OFFSET 9 | ||
| 42 | #define SPC_VALIDITY_OFFSET 10 | ||
| 40 | #define SPC_ASC_KEY_OFFSET 12 | 43 | #define SPC_ASC_KEY_OFFSET 12 |
| 41 | #define SPC_ASCQ_KEY_OFFSET 13 | 44 | #define SPC_ASCQ_KEY_OFFSET 13 |
| 42 | #define TRANSPORT_IQN_LEN 224 | 45 | #define TRANSPORT_IQN_LEN 224 |
| @@ -112,7 +115,7 @@ | |||
| 112 | /* Queue Algorithm Modifier default for restricted reordering in control mode page */ | 115 | /* Queue Algorithm Modifier default for restricted reordering in control mode page */ |
| 113 | #define DA_EMULATE_REST_REORD 0 | 116 | #define DA_EMULATE_REST_REORD 0 |
| 114 | 117 | ||
| 115 | #define SE_INQUIRY_BUF 512 | 118 | #define SE_INQUIRY_BUF 1024 |
| 116 | #define SE_MODE_PAGE_BUF 512 | 119 | #define SE_MODE_PAGE_BUF 512 |
| 117 | #define SE_SENSE_BUF 96 | 120 | #define SE_SENSE_BUF 96 |
| 118 | 121 | ||
| @@ -205,6 +208,9 @@ enum tcm_sense_reason_table { | |||
| 205 | TCM_OUT_OF_RESOURCES = R(0x12), | 208 | TCM_OUT_OF_RESOURCES = R(0x12), |
| 206 | TCM_PARAMETER_LIST_LENGTH_ERROR = R(0x13), | 209 | TCM_PARAMETER_LIST_LENGTH_ERROR = R(0x13), |
| 207 | TCM_MISCOMPARE_VERIFY = R(0x14), | 210 | TCM_MISCOMPARE_VERIFY = R(0x14), |
| 211 | TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED = R(0x15), | ||
| 212 | TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED = R(0x16), | ||
| 213 | TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED = R(0x17), | ||
| 208 | #undef R | 214 | #undef R |
| 209 | }; | 215 | }; |
| 210 | 216 | ||
| @@ -247,10 +253,28 @@ typedef enum { | |||
| 247 | 253 | ||
| 248 | struct se_cmd; | 254 | struct se_cmd; |
| 249 | 255 | ||
| 256 | struct t10_alua_lba_map_member { | ||
| 257 | struct list_head lba_map_mem_list; | ||
| 258 | int lba_map_mem_alua_state; | ||
| 259 | int lba_map_mem_alua_pg_id; | ||
| 260 | }; | ||
| 261 | |||
| 262 | struct t10_alua_lba_map { | ||
| 263 | u64 lba_map_first_lba; | ||
| 264 | u64 lba_map_last_lba; | ||
| 265 | struct list_head lba_map_list; | ||
| 266 | struct list_head lba_map_mem_list; | ||
| 267 | }; | ||
| 268 | |||
| 250 | struct t10_alua { | 269 | struct t10_alua { |
| 251 | /* ALUA Target Port Group ID */ | 270 | /* ALUA Target Port Group ID */ |
| 252 | u16 alua_tg_pt_gps_counter; | 271 | u16 alua_tg_pt_gps_counter; |
| 253 | u32 alua_tg_pt_gps_count; | 272 | u32 alua_tg_pt_gps_count; |
| 273 | /* Referrals support */ | ||
| 274 | spinlock_t lba_map_lock; | ||
| 275 | u32 lba_map_segment_size; | ||
| 276 | u32 lba_map_segment_multiplier; | ||
| 277 | struct list_head lba_map_list; | ||
| 254 | spinlock_t tg_pt_gps_lock; | 278 | spinlock_t tg_pt_gps_lock; |
| 255 | struct se_device *t10_dev; | 279 | struct se_device *t10_dev; |
| 256 | /* Used for default ALUA Target Port Group */ | 280 | /* Used for default ALUA Target Port Group */ |
| @@ -284,6 +308,8 @@ struct t10_alua_tg_pt_gp { | |||
| 284 | u16 tg_pt_gp_id; | 308 | u16 tg_pt_gp_id; |
| 285 | int tg_pt_gp_valid_id; | 309 | int tg_pt_gp_valid_id; |
| 286 | int tg_pt_gp_alua_supported_states; | 310 | int tg_pt_gp_alua_supported_states; |
| 311 | int tg_pt_gp_alua_pending_state; | ||
| 312 | int tg_pt_gp_alua_previous_state; | ||
| 287 | int tg_pt_gp_alua_access_status; | 313 | int tg_pt_gp_alua_access_status; |
| 288 | int tg_pt_gp_alua_access_type; | 314 | int tg_pt_gp_alua_access_type; |
| 289 | int tg_pt_gp_nonop_delay_msecs; | 315 | int tg_pt_gp_nonop_delay_msecs; |
| @@ -291,9 +317,6 @@ struct t10_alua_tg_pt_gp { | |||
| 291 | int tg_pt_gp_implicit_trans_secs; | 317 | int tg_pt_gp_implicit_trans_secs; |
| 292 | int tg_pt_gp_pref; | 318 | int tg_pt_gp_pref; |
| 293 | int tg_pt_gp_write_metadata; | 319 | int tg_pt_gp_write_metadata; |
| 294 | /* Used by struct t10_alua_tg_pt_gp->tg_pt_gp_md_buf_len */ | ||
| 295 | #define ALUA_MD_BUF_LEN 1024 | ||
| 296 | u32 tg_pt_gp_md_buf_len; | ||
| 297 | u32 tg_pt_gp_members; | 320 | u32 tg_pt_gp_members; |
| 298 | atomic_t tg_pt_gp_alua_access_state; | 321 | atomic_t tg_pt_gp_alua_access_state; |
| 299 | atomic_t tg_pt_gp_ref_cnt; | 322 | atomic_t tg_pt_gp_ref_cnt; |
| @@ -303,6 +326,10 @@ struct t10_alua_tg_pt_gp { | |||
| 303 | struct config_group tg_pt_gp_group; | 326 | struct config_group tg_pt_gp_group; |
| 304 | struct list_head tg_pt_gp_list; | 327 | struct list_head tg_pt_gp_list; |
| 305 | struct list_head tg_pt_gp_mem_list; | 328 | struct list_head tg_pt_gp_mem_list; |
| 329 | struct se_port *tg_pt_gp_alua_port; | ||
| 330 | struct se_node_acl *tg_pt_gp_alua_nacl; | ||
| 331 | struct delayed_work tg_pt_gp_transition_work; | ||
| 332 | struct completion *tg_pt_gp_transition_complete; | ||
| 306 | }; | 333 | }; |
| 307 | 334 | ||
| 308 | struct t10_alua_tg_pt_gp_member { | 335 | struct t10_alua_tg_pt_gp_member { |
| @@ -414,6 +441,34 @@ struct se_tmr_req { | |||
| 414 | struct list_head tmr_list; | 441 | struct list_head tmr_list; |
| 415 | }; | 442 | }; |
| 416 | 443 | ||
| 444 | enum target_prot_op { | ||
| 445 | TARGET_PROT_NORMAL = 0, | ||
| 446 | TARGET_PROT_DIN_INSERT, | ||
| 447 | TARGET_PROT_DOUT_INSERT, | ||
| 448 | TARGET_PROT_DIN_STRIP, | ||
| 449 | TARGET_PROT_DOUT_STRIP, | ||
| 450 | TARGET_PROT_DIN_PASS, | ||
| 451 | TARGET_PROT_DOUT_PASS, | ||
| 452 | }; | ||
| 453 | |||
| 454 | enum target_prot_ho { | ||
| 455 | PROT_SEPERATED, | ||
| 456 | PROT_INTERLEAVED, | ||
| 457 | }; | ||
| 458 | |||
| 459 | enum target_prot_type { | ||
| 460 | TARGET_DIF_TYPE0_PROT, | ||
| 461 | TARGET_DIF_TYPE1_PROT, | ||
| 462 | TARGET_DIF_TYPE2_PROT, | ||
| 463 | TARGET_DIF_TYPE3_PROT, | ||
| 464 | }; | ||
| 465 | |||
| 466 | struct se_dif_v1_tuple { | ||
| 467 | __be16 guard_tag; | ||
| 468 | __be16 app_tag; | ||
| 469 | __be32 ref_tag; | ||
| 470 | }; | ||
| 471 | |||
| 417 | struct se_cmd { | 472 | struct se_cmd { |
| 418 | /* SAM response code being sent to initiator */ | 473 | /* SAM response code being sent to initiator */ |
| 419 | u8 scsi_status; | 474 | u8 scsi_status; |
| @@ -497,14 +552,24 @@ struct se_cmd { | |||
| 497 | void *priv; | 552 | void *priv; |
| 498 | 553 | ||
| 499 | /* Used for lun->lun_ref counting */ | 554 | /* Used for lun->lun_ref counting */ |
| 500 | bool lun_ref_active; | 555 | int lun_ref_active; |
| 556 | |||
| 557 | /* DIF related members */ | ||
| 558 | enum target_prot_op prot_op; | ||
| 559 | enum target_prot_type prot_type; | ||
| 560 | u32 prot_length; | ||
| 561 | u32 reftag_seed; | ||
| 562 | struct scatterlist *t_prot_sg; | ||
| 563 | unsigned int t_prot_nents; | ||
| 564 | enum target_prot_ho prot_handover; | ||
| 565 | sense_reason_t pi_err; | ||
| 566 | sector_t bad_sector; | ||
| 501 | }; | 567 | }; |
| 502 | 568 | ||
| 503 | struct se_ua { | 569 | struct se_ua { |
| 504 | u8 ua_asc; | 570 | u8 ua_asc; |
| 505 | u8 ua_ascq; | 571 | u8 ua_ascq; |
| 506 | struct se_node_acl *ua_nacl; | 572 | struct se_node_acl *ua_nacl; |
| 507 | struct list_head ua_dev_list; | ||
| 508 | struct list_head ua_nacl_list; | 573 | struct list_head ua_nacl_list; |
| 509 | }; | 574 | }; |
| 510 | 575 | ||
| @@ -605,6 +670,9 @@ struct se_dev_attrib { | |||
| 605 | int emulate_tpws; | 670 | int emulate_tpws; |
| 606 | int emulate_caw; | 671 | int emulate_caw; |
| 607 | int emulate_3pc; | 672 | int emulate_3pc; |
| 673 | int pi_prot_format; | ||
| 674 | enum target_prot_type pi_prot_type; | ||
| 675 | enum target_prot_type hw_pi_prot_type; | ||
| 608 | int enforce_pr_isids; | 676 | int enforce_pr_isids; |
| 609 | int is_nonrot; | 677 | int is_nonrot; |
| 610 | int emulate_rest_reord; | 678 | int emulate_rest_reord; |
| @@ -736,6 +804,8 @@ struct se_device { | |||
| 736 | /* Linked list for struct se_hba struct se_device list */ | 804 | /* Linked list for struct se_hba struct se_device list */ |
| 737 | struct list_head dev_list; | 805 | struct list_head dev_list; |
| 738 | struct se_lun xcopy_lun; | 806 | struct se_lun xcopy_lun; |
| 807 | /* Protection Information */ | ||
| 808 | int prot_length; | ||
| 739 | }; | 809 | }; |
| 740 | 810 | ||
| 741 | struct se_hba { | 811 | struct se_hba { |
diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h index 4cf4fda404a3..0218d689b3d7 100644 --- a/include/target/target_core_fabric.h +++ b/include/target/target_core_fabric.h | |||
| @@ -105,7 +105,8 @@ sense_reason_t transport_lookup_cmd_lun(struct se_cmd *, u32); | |||
| 105 | sense_reason_t target_setup_cmd_from_cdb(struct se_cmd *, unsigned char *); | 105 | sense_reason_t target_setup_cmd_from_cdb(struct se_cmd *, unsigned char *); |
| 106 | int target_submit_cmd_map_sgls(struct se_cmd *, struct se_session *, | 106 | int target_submit_cmd_map_sgls(struct se_cmd *, struct se_session *, |
| 107 | unsigned char *, unsigned char *, u32, u32, int, int, int, | 107 | unsigned char *, unsigned char *, u32, u32, int, int, int, |
| 108 | struct scatterlist *, u32, struct scatterlist *, u32); | 108 | struct scatterlist *, u32, struct scatterlist *, u32, |
| 109 | struct scatterlist *, u32); | ||
| 109 | int target_submit_cmd(struct se_cmd *, struct se_session *, unsigned char *, | 110 | int target_submit_cmd(struct se_cmd *, struct se_session *, unsigned char *, |
| 110 | unsigned char *, u32, u32, int, int, int); | 111 | unsigned char *, u32, u32, int, int, int); |
| 111 | int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess, | 112 | int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess, |
