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:
parent
773c0f6a94
commit
825379870b
@ -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,
|
void spdk_bdev_io_get_scsi_status(const struct spdk_bdev_io *bdev_io,
|
||||||
int *sc, int *sk, int *asc, int *ascq);
|
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_ */
|
#endif /* SPDK_BDEV_H_ */
|
||||||
|
@ -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)
|
void spdk_bdev_module_list_add(struct spdk_bdev_module_if *bdev_module)
|
||||||
{
|
{
|
||||||
TAILQ_INSERT_TAIL(&spdk_bdev_module_list, bdev_module, tailq);
|
TAILQ_INSERT_TAIL(&spdk_bdev_module_list, bdev_module, tailq);
|
||||||
|
@ -1225,6 +1225,8 @@ spdk_bdev_scsi_task_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_sta
|
|||||||
void *cb_arg)
|
void *cb_arg)
|
||||||
{
|
{
|
||||||
struct spdk_scsi_task *task = cb_arg;
|
struct spdk_scsi_task *task = cb_arg;
|
||||||
|
struct iovec *iovs;
|
||||||
|
int iovcnt;
|
||||||
|
|
||||||
if (task->type == SPDK_SCSI_TASK_TYPE_CMD) {
|
if (task->type == SPDK_SCSI_TASK_TYPE_CMD) {
|
||||||
int sc, sk, asc, ascq;
|
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)
|
if (status == SPDK_BDEV_IO_STATUS_SUCCESS)
|
||||||
task->response = SPDK_SCSI_TASK_MGMT_RESP_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);
|
spdk_bdev_io_get_iovec(bdev_io, &iovs, &iovcnt);
|
||||||
memcpy(task->iovs, bdev_io->u.read.iovs, sizeof(task->iovs[0]) * task->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);
|
spdk_scsi_lun_complete_task(task->lun, task);
|
||||||
|
@ -191,6 +191,8 @@ bdevperf_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status,
|
|||||||
struct io_target *target;
|
struct io_target *target;
|
||||||
struct bdevperf_task *task = cb_arg;
|
struct bdevperf_task *task = cb_arg;
|
||||||
struct spdk_event *complete;
|
struct spdk_event *complete;
|
||||||
|
struct iovec *iovs;
|
||||||
|
int iovcnt;
|
||||||
|
|
||||||
target = task->target;
|
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;
|
g_run_failed = true;
|
||||||
}
|
}
|
||||||
} else if (g_verify || g_reset || g_unmap) {
|
} else if (g_verify || g_reset || g_unmap) {
|
||||||
assert(bdev_io->u.read.iovcnt == 1);
|
spdk_bdev_io_get_iovec(bdev_io, &iovs, &iovcnt);
|
||||||
if (memcmp(task->buf, bdev_io->u.read.iov.iov_base, g_io_size) != 0) {
|
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);
|
printf("Buffer mismatch! Disk Offset: %lu\n", task->offset);
|
||||||
target->is_draining = true;
|
target->is_draining = true;
|
||||||
g_run_failed = true;
|
g_run_failed = true;
|
||||||
|
@ -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 *
|
struct spdk_bdev_io *
|
||||||
spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
|
spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
|
||||||
void *buf, uint64_t offset, uint64_t nbytes,
|
void *buf, uint64_t offset, uint64_t nbytes,
|
||||||
|
Loading…
Reference in New Issue
Block a user