Loading include/spdk/bdev.h +9 −0 Original line number Diff line number Diff line Loading @@ -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_ */ lib/bdev/bdev.c +33 −0 Original line number Diff line number Diff line Loading @@ -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); Loading lib/scsi/scsi_bdev.c +8 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading test/lib/bdev/bdevperf/bdevperf.c +6 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading test/lib/scsi/scsi_bdev/scsi_bdev_ut.c +7 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading
include/spdk/bdev.h +9 −0 Original line number Diff line number Diff line Loading @@ -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_ */
lib/bdev/bdev.c +33 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
lib/scsi/scsi_bdev.c +8 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading
test/lib/bdev/bdevperf/bdevperf.c +6 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading
test/lib/scsi/scsi_bdev/scsi_bdev_ut.c +7 −0 Original line number Diff line number Diff line Loading @@ -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, Loading