diff options
| -rw-r--r-- | drivers/target/target_core_sbc.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index 1393d0ed746a..4714c6f8da4b 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
| @@ -372,7 +372,7 @@ static sense_reason_t compare_and_write_callback(struct se_cmd *cmd) | |||
| 372 | { | 372 | { |
| 373 | struct se_device *dev = cmd->se_dev; | 373 | struct se_device *dev = cmd->se_dev; |
| 374 | struct scatterlist *write_sg = NULL, *sg; | 374 | struct scatterlist *write_sg = NULL, *sg; |
| 375 | unsigned char *buf, *addr; | 375 | unsigned char *buf = NULL, *addr; |
| 376 | struct sg_mapping_iter m; | 376 | struct sg_mapping_iter m; |
| 377 | unsigned int offset = 0, len; | 377 | unsigned int offset = 0, len; |
| 378 | unsigned int nlbas = cmd->t_task_nolb; | 378 | unsigned int nlbas = cmd->t_task_nolb; |
| @@ -387,6 +387,15 @@ static sense_reason_t compare_and_write_callback(struct se_cmd *cmd) | |||
| 387 | */ | 387 | */ |
| 388 | if (!cmd->t_data_sg || !cmd->t_bidi_data_sg) | 388 | if (!cmd->t_data_sg || !cmd->t_bidi_data_sg) |
| 389 | return TCM_NO_SENSE; | 389 | return TCM_NO_SENSE; |
| 390 | /* | ||
| 391 | * Immediately exit + release dev->caw_sem if command has already | ||
| 392 | * been failed with a non-zero SCSI status. | ||
| 393 | */ | ||
| 394 | if (cmd->scsi_status) { | ||
| 395 | pr_err("compare_and_write_callback: non zero scsi_status:" | ||
| 396 | " 0x%02x\n", cmd->scsi_status); | ||
| 397 | goto out; | ||
| 398 | } | ||
| 390 | 399 | ||
| 391 | buf = kzalloc(cmd->data_length, GFP_KERNEL); | 400 | buf = kzalloc(cmd->data_length, GFP_KERNEL); |
| 392 | if (!buf) { | 401 | if (!buf) { |
