bdev: add accessor function to get an I/O's iovec

Change-Id: I09321abe93303d6225fbcce4065b0024dd541b19
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Daniel Verkamp 2017-05-04 13:57:07 -07:00 committed by Ben Walker
parent 773c0f6a94
commit 825379870b
5 changed files with 63 additions and 5 deletions

View File

@ -389,4 +389,13 @@ void spdk_bdev_io_get_nvme_status(const struct spdk_bdev_io *bdev_io, int *sct,
void spdk_bdev_io_get_scsi_status(const struct spdk_bdev_io *bdev_io,
int *sc, int *sk, int *asc, int *ascq);
/**
* Get the iovec describing the data buffer of a bdev_io.
*
* \param bdev_io I/O to describe with iovec.
* \param iovp Pointer to be filled with iovec.
* \param iovcntp Pointer to be filled with number of iovec entries.
*/
void spdk_bdev_io_get_iovec(struct spdk_bdev_io *bdev_io, struct iovec **iovp, int *iovcntp);
#endif /* SPDK_BDEV_H_ */

View File

@ -1105,6 +1105,39 @@ spdk_bdev_io_get_rbuf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_rbuf_cb cb)
}
}
void
spdk_bdev_io_get_iovec(struct spdk_bdev_io *bdev_io, struct iovec **iovp, int *iovcntp)
{
struct iovec *iovs;
int iovcnt;
if (bdev_io == NULL) {
return;
}
switch (bdev_io->type) {
case SPDK_BDEV_IO_TYPE_READ:
iovs = bdev_io->u.read.iovs;
iovcnt = bdev_io->u.read.iovcnt;
break;
case SPDK_BDEV_IO_TYPE_WRITE:
iovs = bdev_io->u.write.iovs;
iovcnt = bdev_io->u.write.iovcnt;
break;
default:
iovs = NULL;
iovcnt = 0;
break;
}
if (iovp) {
*iovp = iovs;
}
if (iovcntp) {
*iovcntp = iovcnt;
}
}
void spdk_bdev_module_list_add(struct spdk_bdev_module_if *bdev_module)
{
TAILQ_INSERT_TAIL(&spdk_bdev_module_list, bdev_module, tailq);

View File

@ -1225,6 +1225,8 @@ spdk_bdev_scsi_task_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_sta
void *cb_arg)
{
struct spdk_scsi_task *task = cb_arg;
struct iovec *iovs;
int iovcnt;
if (task->type == SPDK_SCSI_TASK_TYPE_CMD) {
int sc, sk, asc, ascq;
@ -1235,9 +1237,12 @@ spdk_bdev_scsi_task_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_sta
if (status == SPDK_BDEV_IO_STATUS_SUCCESS)
task->response = SPDK_SCSI_TASK_MGMT_RESP_SUCCESS;
}
if (bdev_io->type == SPDK_BDEV_IO_TYPE_READ && task->iovs != bdev_io->u.read.iovs) {
assert(task->iovcnt == bdev_io->u.read.iovcnt);
memcpy(task->iovs, bdev_io->u.read.iovs, sizeof(task->iovs[0]) * task->iovcnt);
spdk_bdev_io_get_iovec(bdev_io, &iovs, &iovcnt);
if (task->dxfer_dir == SPDK_SCSI_DIR_FROM_DEV && task->iovs != iovs) {
assert(iovs != NULL);
assert(task->iovcnt == iovcnt);
memcpy(task->iovs, iovs, sizeof(task->iovs[0]) * task->iovcnt);
}
spdk_scsi_lun_complete_task(task->lun, task);

View File

@ -191,6 +191,8 @@ bdevperf_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status,
struct io_target *target;
struct bdevperf_task *task = cb_arg;
struct spdk_event *complete;
struct iovec *iovs;
int iovcnt;
target = task->target;
@ -200,8 +202,10 @@ bdevperf_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status,
g_run_failed = true;
}
} else if (g_verify || g_reset || g_unmap) {
assert(bdev_io->u.read.iovcnt == 1);
if (memcmp(task->buf, bdev_io->u.read.iov.iov_base, g_io_size) != 0) {
spdk_bdev_io_get_iovec(bdev_io, &iovs, &iovcnt);
assert(iovcnt == 1);
assert(iovs != NULL);
if (memcmp(task->buf, iovs[0].iov_base, g_io_size) != 0) {
printf("Buffer mismatch! Disk Offset: %lu\n", task->offset);
target->is_draining = true;
g_run_failed = true;

View File

@ -133,6 +133,13 @@ spdk_bdev_io_get_scsi_status(const struct spdk_bdev_io *bdev_io,
}
}
void
spdk_bdev_io_get_iovec(struct spdk_bdev_io *bdev_io, struct iovec **iovp, int *iovcntp)
{
*iovp = NULL;
*iovcntp = 0;
}
struct spdk_bdev_io *
spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
void *buf, uint64_t offset, uint64_t nbytes,