Commit bcfd6d0f authored by Tomasz Zawadzki's avatar Tomasz Zawadzki Committed by Jim Harris
Browse files

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: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-on: https://review.gerrithub.io/417708


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarSeth Howell <seth.howell5141@gmail.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 0cd2f869
Loading
Loading
Loading
Loading
+2 −10
Original line number Diff line number Diff line
@@ -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;
+10 −4
Original line number Diff line number Diff line
@@ -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;