test/scsi_bdev: add read LBA range tests
Change-Id: If0cc8f970c20c4a398882183de9e7b066753f030 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
19a9871495
commit
658f816344
@ -42,6 +42,9 @@ SPDK_LOG_REGISTER_TRACE_FLAG("scsi", SPDK_TRACE_SCSI)
|
|||||||
|
|
||||||
struct spdk_scsi_globals g_spdk_scsi;
|
struct spdk_scsi_globals g_spdk_scsi;
|
||||||
|
|
||||||
|
static uint64_t g_test_bdev_num_blocks;
|
||||||
|
static struct spdk_bdev_io g_test_bdev_io;
|
||||||
|
|
||||||
void *
|
void *
|
||||||
spdk_malloc(size_t size, size_t align, uint64_t *phys_addr)
|
spdk_malloc(size_t size, size_t align, uint64_t *phys_addr)
|
||||||
{
|
{
|
||||||
@ -97,7 +100,7 @@ spdk_bdev_get_block_size(const struct spdk_bdev *bdev)
|
|||||||
uint64_t
|
uint64_t
|
||||||
spdk_bdev_get_num_blocks(const struct spdk_bdev *bdev)
|
spdk_bdev_get_num_blocks(const struct spdk_bdev *bdev)
|
||||||
{
|
{
|
||||||
return 0;
|
return g_test_bdev_num_blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
@ -188,7 +191,7 @@ spdk_bdev_readv(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
|
|||||||
struct iovec *iov, int iovcnt, uint64_t offset, uint64_t nbytes,
|
struct iovec *iov, int iovcnt, uint64_t offset, uint64_t nbytes,
|
||||||
spdk_bdev_io_completion_cb cb, void *cb_arg)
|
spdk_bdev_io_completion_cb cb, void *cb_arg)
|
||||||
{
|
{
|
||||||
return NULL;
|
return &g_test_bdev_io;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct spdk_bdev_io *
|
struct spdk_bdev_io *
|
||||||
@ -570,6 +573,60 @@ task_complete_test(void)
|
|||||||
spdk_put_task(&task);
|
spdk_put_task(&task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
lba_range_test(void)
|
||||||
|
{
|
||||||
|
struct spdk_bdev bdev;
|
||||||
|
struct spdk_scsi_task task;
|
||||||
|
uint8_t cdb[16];
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
spdk_init_task(&task);
|
||||||
|
task.cdb = cdb;
|
||||||
|
|
||||||
|
memset(cdb, 0, sizeof(cdb));
|
||||||
|
cdb[0] = 0x88; /* READ (16) */
|
||||||
|
|
||||||
|
/* Test block device size of 4 blocks */
|
||||||
|
g_test_bdev_num_blocks = 4;
|
||||||
|
|
||||||
|
/* LBA = 0, length = 1 (in range) */
|
||||||
|
to_be64(&cdb[2], 0); /* LBA */
|
||||||
|
to_be32(&cdb[10], 1); /* transfer length */
|
||||||
|
task.transfer_len = 1 * 512;
|
||||||
|
rc = spdk_bdev_scsi_execute(&bdev, &task);
|
||||||
|
CU_ASSERT(rc == SPDK_SCSI_TASK_PENDING);
|
||||||
|
CU_ASSERT(task.status == SPDK_SCSI_STATUS_GOOD);
|
||||||
|
|
||||||
|
/* LBA = 4, length = 1 (LBA out of range) */
|
||||||
|
to_be64(&cdb[2], 4); /* LBA */
|
||||||
|
to_be32(&cdb[10], 1); /* transfer length */
|
||||||
|
task.transfer_len = 1 * 512;
|
||||||
|
rc = spdk_bdev_scsi_execute(&bdev, &task);
|
||||||
|
CU_ASSERT(rc == SPDK_SCSI_TASK_COMPLETE);
|
||||||
|
CU_ASSERT(task.status == SPDK_SCSI_STATUS_CHECK_CONDITION);
|
||||||
|
CU_ASSERT(task.sense_data[12] == SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
|
||||||
|
|
||||||
|
/* LBA = 0, length = 4 (in range, max valid size) */
|
||||||
|
to_be64(&cdb[2], 0); /* LBA */
|
||||||
|
to_be32(&cdb[10], 4); /* transfer length */
|
||||||
|
task.transfer_len = 4 * 512;
|
||||||
|
rc = spdk_bdev_scsi_execute(&bdev, &task);
|
||||||
|
CU_ASSERT(rc == SPDK_SCSI_TASK_PENDING);
|
||||||
|
CU_ASSERT(task.status == SPDK_SCSI_STATUS_GOOD);
|
||||||
|
|
||||||
|
/* LBA = 0, length = 5 (LBA in range, length beyond end of bdev) */
|
||||||
|
to_be64(&cdb[2], 0); /* LBA */
|
||||||
|
to_be32(&cdb[10], 5); /* transfer length */
|
||||||
|
task.transfer_len = 5 * 512;
|
||||||
|
rc = spdk_bdev_scsi_execute(&bdev, &task);
|
||||||
|
CU_ASSERT(rc == SPDK_SCSI_TASK_COMPLETE);
|
||||||
|
CU_ASSERT(task.status == SPDK_SCSI_STATUS_CHECK_CONDITION);
|
||||||
|
CU_ASSERT(task.sense_data[12] == SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
|
||||||
|
|
||||||
|
spdk_put_task(&task);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -595,6 +652,7 @@ main(int argc, char **argv)
|
|||||||
|| CU_add_test(suite, "inquiry standard test", inquiry_standard_test) == NULL
|
|| CU_add_test(suite, "inquiry standard test", inquiry_standard_test) == NULL
|
||||||
|| CU_add_test(suite, "inquiry overflow test", inquiry_overflow_test) == NULL
|
|| CU_add_test(suite, "inquiry overflow test", inquiry_overflow_test) == NULL
|
||||||
|| CU_add_test(suite, "task complete test", task_complete_test) == NULL
|
|| CU_add_test(suite, "task complete test", task_complete_test) == NULL
|
||||||
|
|| CU_add_test(suite, "LBA range test", lba_range_test) == NULL
|
||||||
) {
|
) {
|
||||||
CU_cleanup_registry();
|
CU_cleanup_registry();
|
||||||
return CU_get_error();
|
return CU_get_error();
|
||||||
|
Loading…
Reference in New Issue
Block a user