|
|
@@ -1143,14 +1143,16 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry *
|
|
|
struct se_cmd *se_cmd = cmd->se_cmd;
|
|
|
struct tcmu_dev *udev = cmd->tcmu_dev;
|
|
|
bool read_len_valid = false;
|
|
|
- uint32_t read_len = se_cmd->data_length;
|
|
|
+ uint32_t read_len;
|
|
|
|
|
|
/*
|
|
|
* cmd has been completed already from timeout, just reclaim
|
|
|
* data area space and free cmd
|
|
|
*/
|
|
|
- if (test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags))
|
|
|
+ if (test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) {
|
|
|
+ WARN_ON_ONCE(se_cmd);
|
|
|
goto out;
|
|
|
+ }
|
|
|
|
|
|
list_del_init(&cmd->queue_entry);
|
|
|
|
|
|
@@ -1163,6 +1165,7 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry *
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
+ read_len = se_cmd->data_length;
|
|
|
if (se_cmd->data_direction == DMA_FROM_DEVICE &&
|
|
|
(entry->hdr.uflags & TCMU_UFLAG_READ_LEN) && entry->rsp.read_len) {
|
|
|
read_len_valid = true;
|
|
|
@@ -1318,6 +1321,7 @@ static int tcmu_check_expired_cmd(int id, void *p, void *data)
|
|
|
*/
|
|
|
scsi_status = SAM_STAT_CHECK_CONDITION;
|
|
|
list_del_init(&cmd->queue_entry);
|
|
|
+ cmd->se_cmd = NULL;
|
|
|
} else {
|
|
|
list_del_init(&cmd->queue_entry);
|
|
|
idr_remove(&udev->commands, id);
|
|
|
@@ -2036,6 +2040,7 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level)
|
|
|
|
|
|
idr_remove(&udev->commands, i);
|
|
|
if (!test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) {
|
|
|
+ WARN_ON(!cmd->se_cmd);
|
|
|
list_del_init(&cmd->queue_entry);
|
|
|
if (err_level == 1) {
|
|
|
/*
|