diff options
Diffstat (limited to 'drivers/target/loopback')
| -rw-r--r-- | drivers/target/loopback/tcm_loop.c | 41 |
1 files changed, 10 insertions, 31 deletions
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c index 3df1c9b8ae6b..81d5832fbbd5 100644 --- a/drivers/target/loopback/tcm_loop.c +++ b/drivers/target/loopback/tcm_loop.c | |||
| @@ -113,11 +113,9 @@ static struct se_cmd *tcm_loop_allocate_core_cmd( | |||
| 113 | scsi_bufflen(sc), sc->sc_data_direction, sam_task_attr, | 113 | scsi_bufflen(sc), sc->sc_data_direction, sam_task_attr, |
| 114 | &tl_cmd->tl_sense_buf[0]); | 114 | &tl_cmd->tl_sense_buf[0]); |
| 115 | 115 | ||
| 116 | /* | ||
| 117 | * Signal BIDI usage with T_TASK(cmd)->t_tasks_bidi | ||
| 118 | */ | ||
| 119 | if (scsi_bidi_cmnd(sc)) | 116 | if (scsi_bidi_cmnd(sc)) |
| 120 | se_cmd->t_tasks_bidi = 1; | 117 | se_cmd->se_cmd_flags |= SCF_BIDI; |
| 118 | |||
| 121 | /* | 119 | /* |
| 122 | * Locate the struct se_lun pointer and attach it to struct se_cmd | 120 | * Locate the struct se_lun pointer and attach it to struct se_cmd |
| 123 | */ | 121 | */ |
| @@ -148,27 +146,13 @@ static int tcm_loop_new_cmd_map(struct se_cmd *se_cmd) | |||
| 148 | * Allocate the necessary tasks to complete the received CDB+data | 146 | * Allocate the necessary tasks to complete the received CDB+data |
| 149 | */ | 147 | */ |
| 150 | ret = transport_generic_allocate_tasks(se_cmd, sc->cmnd); | 148 | ret = transport_generic_allocate_tasks(se_cmd, sc->cmnd); |
| 151 | if (ret == -ENOMEM) { | 149 | if (ret != 0) |
| 152 | /* Out of Resources */ | 150 | return ret; |
| 153 | return PYX_TRANSPORT_LU_COMM_FAILURE; | ||
| 154 | } else if (ret == -EINVAL) { | ||
| 155 | /* | ||
| 156 | * Handle case for SAM_STAT_RESERVATION_CONFLICT | ||
| 157 | */ | ||
| 158 | if (se_cmd->se_cmd_flags & SCF_SCSI_RESERVATION_CONFLICT) | ||
| 159 | return PYX_TRANSPORT_RESERVATION_CONFLICT; | ||
| 160 | /* | ||
| 161 | * Otherwise, return SAM_STAT_CHECK_CONDITION and return | ||
| 162 | * sense data. | ||
| 163 | */ | ||
| 164 | return PYX_TRANSPORT_USE_SENSE_REASON; | ||
| 165 | } | ||
| 166 | |||
| 167 | /* | 151 | /* |
| 168 | * For BIDI commands, pass in the extra READ buffer | 152 | * For BIDI commands, pass in the extra READ buffer |
| 169 | * to transport_generic_map_mem_to_cmd() below.. | 153 | * to transport_generic_map_mem_to_cmd() below.. |
| 170 | */ | 154 | */ |
| 171 | if (se_cmd->t_tasks_bidi) { | 155 | if (se_cmd->se_cmd_flags & SCF_BIDI) { |
| 172 | struct scsi_data_buffer *sdb = scsi_in(sc); | 156 | struct scsi_data_buffer *sdb = scsi_in(sc); |
| 173 | 157 | ||
| 174 | sgl_bidi = sdb->table.sgl; | 158 | sgl_bidi = sdb->table.sgl; |
| @@ -194,12 +178,8 @@ static int tcm_loop_new_cmd_map(struct se_cmd *se_cmd) | |||
| 194 | } | 178 | } |
| 195 | 179 | ||
| 196 | /* Tell the core about our preallocated memory */ | 180 | /* Tell the core about our preallocated memory */ |
| 197 | ret = transport_generic_map_mem_to_cmd(se_cmd, scsi_sglist(sc), | 181 | return transport_generic_map_mem_to_cmd(se_cmd, scsi_sglist(sc), |
| 198 | scsi_sg_count(sc), sgl_bidi, sgl_bidi_count); | 182 | scsi_sg_count(sc), sgl_bidi, sgl_bidi_count); |
| 199 | if (ret < 0) | ||
| 200 | return PYX_TRANSPORT_LU_COMM_FAILURE; | ||
| 201 | |||
| 202 | return 0; | ||
| 203 | } | 183 | } |
| 204 | 184 | ||
| 205 | /* | 185 | /* |
| @@ -1360,17 +1340,16 @@ void tcm_loop_drop_scsi_hba( | |||
| 1360 | { | 1340 | { |
| 1361 | struct tcm_loop_hba *tl_hba = container_of(wwn, | 1341 | struct tcm_loop_hba *tl_hba = container_of(wwn, |
| 1362 | struct tcm_loop_hba, tl_hba_wwn); | 1342 | struct tcm_loop_hba, tl_hba_wwn); |
| 1363 | int host_no = tl_hba->sh->host_no; | 1343 | |
| 1344 | pr_debug("TCM_Loop_ConfigFS: Deallocating emulated Target" | ||
| 1345 | " SAS Address: %s at Linux/SCSI Host ID: %d\n", | ||
| 1346 | tl_hba->tl_wwn_address, tl_hba->sh->host_no); | ||
| 1364 | /* | 1347 | /* |
| 1365 | * Call device_unregister() on the original tl_hba->dev. | 1348 | * Call device_unregister() on the original tl_hba->dev. |
| 1366 | * tcm_loop_fabric_scsi.c:tcm_loop_release_adapter() will | 1349 | * tcm_loop_fabric_scsi.c:tcm_loop_release_adapter() will |
| 1367 | * release *tl_hba; | 1350 | * release *tl_hba; |
| 1368 | */ | 1351 | */ |
| 1369 | device_unregister(&tl_hba->dev); | 1352 | device_unregister(&tl_hba->dev); |
| 1370 | |||
| 1371 | pr_debug("TCM_Loop_ConfigFS: Deallocated emulated Target" | ||
| 1372 | " SAS Address: %s at Linux/SCSI Host ID: %d\n", | ||
| 1373 | config_item_name(&wwn->wwn_group.cg_item), host_no); | ||
| 1374 | } | 1353 | } |
| 1375 | 1354 | ||
| 1376 | /* Start items for tcm_loop_cit */ | 1355 | /* Start items for tcm_loop_cit */ |
