scsi: only set SPDK_SCSI_STATUS_GOOD on bdev callback

Previously when IO was sent to bdev, even without callback yet,
status for task was set to SPDK_SCSI_STATUS_GOOD.

This patch changes it so that it is only set when callback actually
comesback from bdev via spdk_bdev_io_get_scsi_status().

Change-Id: I4a36ec345608257123e1036d31540f5f1090a23b
Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-on: https://review.gerrithub.io/417708
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Seth Howell <seth.howell5141@gmail.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Tomasz Zawadzki 2018-07-03 09:02:19 -04:00 committed by Jim Harris
parent 0cd2f86977
commit bcfd6d0fb4
2 changed files with 12 additions and 14 deletions

View File

@ -1327,8 +1327,6 @@ spdk_bdev_scsi_read(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
}
task->data_transferred = nbytes;
task->status = SPDK_SCSI_STATUS_GOOD;
return SPDK_SCSI_TASK_PENDING;
}
@ -1379,7 +1377,6 @@ spdk_bdev_scsi_write(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
(uint64_t)task->length, nbytes);
task->data_transferred = task->length;
task->status = SPDK_SCSI_STATUS_GOOD;
return SPDK_SCSI_TASK_PENDING;
}
@ -1419,7 +1416,6 @@ spdk_bdev_scsi_sync(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
return SPDK_SCSI_TASK_COMPLETE;
}
task->data_transferred = 0;
task->status = SPDK_SCSI_STATUS_GOOD;
return SPDK_SCSI_TASK_PENDING;
}
@ -1553,6 +1549,8 @@ spdk_bdev_scsi_unmap(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
int data_len;
int rc;
assert(task->status == SPDK_SCSI_STATUS_GOOD);
ctx = calloc(1, sizeof(*ctx));
if (!ctx) {
spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
@ -1586,12 +1584,6 @@ spdk_bdev_scsi_unmap(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
return SPDK_SCSI_TASK_COMPLETE;
}
/* Before we submit commands, set the status to success */
spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_GOOD,
SPDK_SCSI_SENSE_NO_SENSE,
SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
for (i = 0; i < desc_count; i++) {
struct spdk_scsi_unmap_bdesc *desc;
uint64_t offset_blocks;

View File

@ -678,9 +678,10 @@ lba_range_test(void)
task.transfer_len = 1 * 512;
rc = spdk_bdev_scsi_execute(&task);
CU_ASSERT(rc == SPDK_SCSI_TASK_PENDING);
CU_ASSERT(task.status == SPDK_SCSI_STATUS_GOOD);
CU_ASSERT(task.status == 0xFF);
SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&g_bdev_io_queue));
ut_bdev_io_flush();
CU_ASSERT(task.status == SPDK_SCSI_STATUS_GOOD);
CU_ASSERT(g_scsi_cb_called == 1);
g_scsi_cb_called = 0;
@ -698,11 +699,13 @@ lba_range_test(void)
to_be64(&cdb[2], 0); /* LBA */
to_be32(&cdb[10], 4); /* transfer length */
task.transfer_len = 4 * 512;
task.status = 0xFF;
rc = spdk_bdev_scsi_execute(&task);
CU_ASSERT(rc == SPDK_SCSI_TASK_PENDING);
CU_ASSERT(task.status == SPDK_SCSI_STATUS_GOOD);
CU_ASSERT(task.status == 0xFF);
SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&g_bdev_io_queue));
ut_bdev_io_flush();
CU_ASSERT(task.status == SPDK_SCSI_STATUS_GOOD);
CU_ASSERT(g_scsi_cb_called == 1);
g_scsi_cb_called = 0;
@ -746,9 +749,10 @@ xfer_len_test(void)
task.transfer_len = 1 * 512;
rc = spdk_bdev_scsi_execute(&task);
CU_ASSERT(rc == SPDK_SCSI_TASK_PENDING);
CU_ASSERT(task.status == SPDK_SCSI_STATUS_GOOD);
CU_ASSERT(task.status == 0xFF);
SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&g_bdev_io_queue));
ut_bdev_io_flush();
CU_ASSERT(task.status == SPDK_SCSI_STATUS_GOOD);
CU_ASSERT(g_scsi_cb_called == 1);
g_scsi_cb_called = 0;
@ -756,11 +760,13 @@ xfer_len_test(void)
to_be64(&cdb[2], 0); /* LBA */
to_be32(&cdb[10], SPDK_WORK_BLOCK_SIZE / 512); /* transfer length */
task.transfer_len = SPDK_WORK_BLOCK_SIZE;
task.status = 0xFF;
rc = spdk_bdev_scsi_execute(&task);
CU_ASSERT(rc == SPDK_SCSI_TASK_PENDING);
CU_ASSERT(task.status == SPDK_SCSI_STATUS_GOOD);
CU_ASSERT(task.status == 0xFF);
SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&g_bdev_io_queue));
ut_bdev_io_flush();
CU_ASSERT(task.status == SPDK_SCSI_STATUS_GOOD);
CU_ASSERT(g_scsi_cb_called == 1);
g_scsi_cb_called = 0;