diff options
24 files changed, 180 insertions, 287 deletions
diff --git a/Documentation/target/tcmu-design.txt b/Documentation/target/tcmu-design.txt index 43e94ea6d2ca..263b907517ac 100644 --- a/Documentation/target/tcmu-design.txt +++ b/Documentation/target/tcmu-design.txt | |||
| @@ -15,8 +15,7 @@ Contents: | |||
| 15 | a) Discovering and configuring TCMU uio devices | 15 | a) Discovering and configuring TCMU uio devices |
| 16 | b) Waiting for events on the device(s) | 16 | b) Waiting for events on the device(s) |
| 17 | c) Managing the command ring | 17 | c) Managing the command ring |
| 18 | 3) Command filtering and pass_level | 18 | 3) A final note |
| 19 | 4) A final note | ||
| 20 | 19 | ||
| 21 | 20 | ||
| 22 | TCM Userspace Design | 21 | TCM Userspace Design |
| @@ -324,7 +323,7 @@ int handle_device_events(int fd, void *map) | |||
| 324 | /* Process events from cmd ring until we catch up with cmd_head */ | 323 | /* Process events from cmd ring until we catch up with cmd_head */ |
| 325 | while (ent != (void *)mb + mb->cmdr_off + mb->cmd_head) { | 324 | while (ent != (void *)mb + mb->cmdr_off + mb->cmd_head) { |
| 326 | 325 | ||
| 327 | if (tcmu_hdr_get_op(&ent->hdr) == TCMU_OP_CMD) { | 326 | if (tcmu_hdr_get_op(ent->hdr.len_op) == TCMU_OP_CMD) { |
| 328 | uint8_t *cdb = (void *)mb + ent->req.cdb_off; | 327 | uint8_t *cdb = (void *)mb + ent->req.cdb_off; |
| 329 | bool success = true; | 328 | bool success = true; |
| 330 | 329 | ||
| @@ -339,8 +338,12 @@ int handle_device_events(int fd, void *map) | |||
| 339 | ent->rsp.scsi_status = SCSI_CHECK_CONDITION; | 338 | ent->rsp.scsi_status = SCSI_CHECK_CONDITION; |
| 340 | } | 339 | } |
| 341 | } | 340 | } |
| 341 | else if (tcmu_hdr_get_op(ent->hdr.len_op) != TCMU_OP_PAD) { | ||
| 342 | /* Tell the kernel we didn't handle unknown opcodes */ | ||
| 343 | ent->hdr.uflags |= TCMU_UFLAG_UNKNOWN_OP; | ||
| 344 | } | ||
| 342 | else { | 345 | else { |
| 343 | /* Do nothing for PAD entries */ | 346 | /* Do nothing for PAD entries except update cmd_tail */ |
| 344 | } | 347 | } |
| 345 | 348 | ||
| 346 | /* update cmd_tail */ | 349 | /* update cmd_tail */ |
| @@ -360,28 +363,6 @@ int handle_device_events(int fd, void *map) | |||
| 360 | } | 363 | } |
| 361 | 364 | ||
| 362 | 365 | ||
| 363 | Command filtering and pass_level | ||
| 364 | -------------------------------- | ||
| 365 | |||
| 366 | TCMU supports a "pass_level" option with valid values of 0 or 1. When | ||
| 367 | the value is 0 (the default), nearly all SCSI commands received for | ||
| 368 | the device are passed through to the handler. This allows maximum | ||
| 369 | flexibility but increases the amount of code required by the handler, | ||
| 370 | to support all mandatory SCSI commands. If pass_level is set to 1, | ||
| 371 | then only IO-related commands are presented, and the rest are handled | ||
| 372 | by LIO's in-kernel command emulation. The commands presented at level | ||
| 373 | 1 include all versions of: | ||
| 374 | |||
| 375 | READ | ||
| 376 | WRITE | ||
| 377 | WRITE_VERIFY | ||
| 378 | XDWRITEREAD | ||
| 379 | WRITE_SAME | ||
| 380 | COMPARE_AND_WRITE | ||
| 381 | SYNCHRONIZE_CACHE | ||
| 382 | UNMAP | ||
| 383 | |||
| 384 | |||
| 385 | A final note | 366 | A final note |
| 386 | ------------ | 367 | ------------ |
| 387 | 368 | ||
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index 327529ee85eb..3f40319a55da 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c | |||
| @@ -547,11 +547,11 @@ isert_create_pi_ctx(struct fast_reg_descriptor *desc, | |||
| 547 | return 0; | 547 | return 0; |
| 548 | 548 | ||
| 549 | err_prot_mr: | 549 | err_prot_mr: |
| 550 | ib_dereg_mr(desc->pi_ctx->prot_mr); | 550 | ib_dereg_mr(pi_ctx->prot_mr); |
| 551 | err_prot_frpl: | 551 | err_prot_frpl: |
| 552 | ib_free_fast_reg_page_list(desc->pi_ctx->prot_frpl); | 552 | ib_free_fast_reg_page_list(pi_ctx->prot_frpl); |
| 553 | err_pi_ctx: | 553 | err_pi_ctx: |
| 554 | kfree(desc->pi_ctx); | 554 | kfree(pi_ctx); |
| 555 | 555 | ||
| 556 | return ret; | 556 | return ret; |
| 557 | } | 557 | } |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index 68c2002e78bf..5c9e680aa375 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | |||
| @@ -1020,8 +1020,7 @@ static void tcm_qla2xxx_depend_tpg(struct work_struct *work) | |||
| 1020 | struct se_portal_group *se_tpg = &base_tpg->se_tpg; | 1020 | struct se_portal_group *se_tpg = &base_tpg->se_tpg; |
| 1021 | struct scsi_qla_host *base_vha = base_tpg->lport->qla_vha; | 1021 | struct scsi_qla_host *base_vha = base_tpg->lport->qla_vha; |
| 1022 | 1022 | ||
| 1023 | if (!configfs_depend_item(se_tpg->se_tpg_tfo->tf_subsys, | 1023 | if (!target_depend_item(&se_tpg->tpg_group.cg_item)) { |
| 1024 | &se_tpg->tpg_group.cg_item)) { | ||
| 1025 | atomic_set(&base_tpg->lport_tpg_enabled, 1); | 1024 | atomic_set(&base_tpg->lport_tpg_enabled, 1); |
| 1026 | qlt_enable_vha(base_vha); | 1025 | qlt_enable_vha(base_vha); |
| 1027 | } | 1026 | } |
| @@ -1037,8 +1036,7 @@ static void tcm_qla2xxx_undepend_tpg(struct work_struct *work) | |||
| 1037 | 1036 | ||
| 1038 | if (!qlt_stop_phase1(base_vha->vha_tgt.qla_tgt)) { | 1037 | if (!qlt_stop_phase1(base_vha->vha_tgt.qla_tgt)) { |
| 1039 | atomic_set(&base_tpg->lport_tpg_enabled, 0); | 1038 | atomic_set(&base_tpg->lport_tpg_enabled, 0); |
| 1040 | configfs_undepend_item(se_tpg->se_tpg_tfo->tf_subsys, | 1039 | target_undepend_item(&se_tpg->tpg_group.cg_item); |
| 1041 | &se_tpg->tpg_group.cg_item); | ||
| 1042 | } | 1040 | } |
| 1043 | complete(&base_tpg->tpg_base_comp); | 1041 | complete(&base_tpg->tpg_base_comp); |
| 1044 | } | 1042 | } |
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 34871a628b11..74e6114ff18f 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
| @@ -230,7 +230,7 @@ int iscsit_access_np(struct iscsi_np *np, struct iscsi_portal_group *tpg) | |||
| 230 | * Here we serialize access across the TIQN+TPG Tuple. | 230 | * Here we serialize access across the TIQN+TPG Tuple. |
| 231 | */ | 231 | */ |
| 232 | ret = down_interruptible(&tpg->np_login_sem); | 232 | ret = down_interruptible(&tpg->np_login_sem); |
| 233 | if ((ret != 0) || signal_pending(current)) | 233 | if (ret != 0) |
| 234 | return -1; | 234 | return -1; |
| 235 | 235 | ||
| 236 | spin_lock_bh(&tpg->tpg_state_lock); | 236 | spin_lock_bh(&tpg->tpg_state_lock); |
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index 8ce94ff744e6..70d799dfab03 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c | |||
| @@ -346,6 +346,7 @@ static int iscsi_login_zero_tsih_s1( | |||
| 346 | if (IS_ERR(sess->se_sess)) { | 346 | if (IS_ERR(sess->se_sess)) { |
| 347 | iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, | 347 | iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, |
| 348 | ISCSI_LOGIN_STATUS_NO_RESOURCES); | 348 | ISCSI_LOGIN_STATUS_NO_RESOURCES); |
| 349 | kfree(sess->sess_ops); | ||
| 349 | kfree(sess); | 350 | kfree(sess); |
| 350 | return -ENOMEM; | 351 | return -ENOMEM; |
| 351 | } | 352 | } |
diff --git a/drivers/target/iscsi/iscsi_target_tpg.c b/drivers/target/iscsi/iscsi_target_tpg.c index e8a240818353..5e3295fe404d 100644 --- a/drivers/target/iscsi/iscsi_target_tpg.c +++ b/drivers/target/iscsi/iscsi_target_tpg.c | |||
| @@ -161,10 +161,7 @@ struct iscsi_portal_group *iscsit_get_tpg_from_np( | |||
| 161 | int iscsit_get_tpg( | 161 | int iscsit_get_tpg( |
| 162 | struct iscsi_portal_group *tpg) | 162 | struct iscsi_portal_group *tpg) |
| 163 | { | 163 | { |
