Commit 0b45cd14 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

bdev: add spdk_bdev_io_complete_base_io_status()



This function allows virtual bdevs (i.e. those running on top of another
bdev) to complete an IO while copying error details (NVMe, SCSI, aio)
from the IO sent to the underlying bdev.

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I348db2ad5f6be56165cf232f4a6d4d8cd2894c1c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20729


Reviewed-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
parent f7239999
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1283,6 +1283,15 @@ void spdk_bdev_io_complete_scsi_status(struct spdk_bdev_io *bdev_io, enum spdk_s
 */
void spdk_bdev_io_complete_aio_status(struct spdk_bdev_io *bdev_io, int aio_result);

/**
 * Complete a bdev_io copying a status from another bdev_io.
 *
 * \param bdev_io I/O to complete.
 * \param base_io I/O from which to copy the status.
 */
void spdk_bdev_io_complete_base_io_status(struct spdk_bdev_io *bdev_io,
		const struct spdk_bdev_io *base_io);

/**
 * Get a thread that given bdev_io was submitted on.
 *
+27 −0
Original line number Diff line number Diff line
@@ -7502,6 +7502,33 @@ spdk_bdev_io_get_nvme_fused_status(const struct spdk_bdev_io *bdev_io, uint32_t
	*cdw0 = bdev_io->internal.error.nvme.cdw0;
}

void
spdk_bdev_io_complete_base_io_status(struct spdk_bdev_io *bdev_io,
				     const struct spdk_bdev_io *base_io)
{
	switch (base_io->internal.status) {
	case SPDK_BDEV_IO_STATUS_NVME_ERROR:
		spdk_bdev_io_complete_nvme_status(bdev_io,
						  base_io->internal.error.nvme.cdw0,
						  base_io->internal.error.nvme.sct,
						  base_io->internal.error.nvme.sc);
		break;
	case SPDK_BDEV_IO_STATUS_SCSI_ERROR:
		spdk_bdev_io_complete_scsi_status(bdev_io,
						  base_io->internal.error.scsi.sc,
						  base_io->internal.error.scsi.sk,
						  base_io->internal.error.scsi.asc,
						  base_io->internal.error.scsi.ascq);
		break;
	case SPDK_BDEV_IO_STATUS_AIO_ERROR:
		spdk_bdev_io_complete_aio_status(bdev_io, base_io->internal.error.aio_result);
		break;
	default:
		spdk_bdev_io_complete(bdev_io, base_io->internal.status);
		break;
	}
}

struct spdk_thread *
spdk_bdev_io_get_thread(struct spdk_bdev_io *bdev_io)
{
+2 −4
Original line number Diff line number Diff line
@@ -246,7 +246,7 @@ bdev_part_complete_io(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
	struct spdk_bdev_io *part_io = cb_arg;
	uint32_t offset, remapped_offset;
	spdk_bdev_io_completion_cb cb;
	int rc, status;
	int rc;

	switch (bdev_io->type) {
	case SPDK_BDEV_IO_TYPE_READ:
@@ -273,9 +273,7 @@ bdev_part_complete_io(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
	if (cb != NULL) {
		cb(part_io, success, NULL);
	} else {
		status = success ? SPDK_BDEV_IO_STATUS_SUCCESS : SPDK_BDEV_IO_STATUS_FAILED;

		spdk_bdev_io_complete(part_io, status);
		spdk_bdev_io_complete_base_io_status(part_io, bdev_io);
	}

	spdk_bdev_free_io(bdev_io);
+1 −0
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@
	spdk_bdev_io_complete_nvme_status;
	spdk_bdev_io_complete_scsi_status;
	spdk_bdev_io_complete_aio_status;
	spdk_bdev_io_complete_base_io_status;
	spdk_bdev_io_get_thread;
	spdk_bdev_io_get_io_channel;
	spdk_bdev_io_get_submit_tsc;