Commit 021ff6ed authored by Liu Xiaodong's avatar Liu Xiaodong Committed by Jim Harris
Browse files

bdev: add function to return aio's errno



This helps user to locate whether bdev_io fails in
spdk bdev layer or inside Linux AIO.
SPDK_BDEV_IO_STATUS_AIO_ERROR indicates bdev_io fails
due to Linux AIO or its lower layer's failure.

New functions spdk_bdev_io_complete_aio_status and
spdk_bdev_io_get_aio_status can be used to report out
the errno from Linux AIO.

Change-Id: I32640e4a0459cca057278c02ea5a7522f3408a02
Signed-off-by: default avatarLiu Xiaodong <xiaodong.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5690


Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent bf102998
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -15,6 +15,11 @@ examine process. Along with corresponding `bdev_wait_for_examine` RPC, which
is now always called during `spdk_bdev_subsystem_config_json` making sure
every bdev is ready to be used.

A new API `spdk_bdev_io_get_aio_status` was added for getting the status of
bdev_io as Linux AIO errno. Also `spdk_bdev_io_complete_aio_status` function
and `SPDK_BDEV_IO_STATUS_AIO_ERROR` were added for bdev module to complete
a bdev_io with Linux AIO errno.

### blob

An `opts_size` element was added in the `spdk_bs_opts` structure to solve the
+8 −0
Original line number Diff line number Diff line
@@ -1678,6 +1678,14 @@ void spdk_bdev_io_get_nvme_fused_status(const struct spdk_bdev_io *bdev_io, uint
void spdk_bdev_io_get_scsi_status(const struct spdk_bdev_io *bdev_io,
				  int *sc, int *sk, int *asc, int *ascq);

/**
 * Get the status of bdev_io as aio errno.
 *
 * \param bdev_io I/O to get the status from.
 * \param aio_result Negative errno returned from AIO.
 */
void spdk_bdev_io_get_aio_status(const struct spdk_bdev_io *bdev_io, int *aio_result);

/**
 * Get the iovec describing the data buffer of a bdev_io.
 *
+11 −0
Original line number Diff line number Diff line
@@ -226,6 +226,7 @@ struct spdk_bdev_fn_table {

/** bdev I/O completion status */
enum spdk_bdev_io_status {
	SPDK_BDEV_IO_STATUS_AIO_ERROR = -8,
	SPDK_BDEV_IO_STATUS_ABORTED = -7,
	SPDK_BDEV_IO_STATUS_FIRST_FUSED_FAILED = -6,
	SPDK_BDEV_IO_STATUS_MISCOMPARE = -5,
@@ -643,6 +644,8 @@ struct spdk_bdev_io {
				/** SCSI additional sense code qualifier */
				uint8_t ascq;
			} scsi;
			/** Only valid when status is SPDK_BDEV_IO_STATUS_AIO_ERROR */
			int aio_result;
		} error;

		/**
@@ -934,6 +937,14 @@ void spdk_bdev_io_complete_nvme_status(struct spdk_bdev_io *bdev_io, uint32_t cd
void spdk_bdev_io_complete_scsi_status(struct spdk_bdev_io *bdev_io, enum spdk_scsi_status sc,
				       enum spdk_scsi_sense sk, uint8_t asc, uint8_t ascq);

/**
 * Complete a bdev_io with AIO errno.
 *
 * \param bdev_io I/O to complete.
 * \param aio_result Negative errno returned from AIO.
 */
void spdk_bdev_io_complete_aio_status(struct spdk_bdev_io *bdev_io, int aio_result);

/**
 * Get a thread that given bdev_io was submitted on.
 *
+28 −0
Original line number Diff line number Diff line
@@ -5278,6 +5278,34 @@ spdk_bdev_io_get_scsi_status(const struct spdk_bdev_io *bdev_io,
	}
}

void
spdk_bdev_io_complete_aio_status(struct spdk_bdev_io *bdev_io, int aio_result)
{
	if (aio_result == 0) {
		bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
	} else {
		bdev_io->internal.status = SPDK_BDEV_IO_STATUS_AIO_ERROR;
	}

	bdev_io->internal.error.aio_result = aio_result;

	spdk_bdev_io_complete(bdev_io, bdev_io->internal.status);
}

void
spdk_bdev_io_get_aio_status(const struct spdk_bdev_io *bdev_io, int *aio_result)
{
	assert(aio_result != NULL);

	if (bdev_io->internal.status == SPDK_BDEV_IO_STATUS_AIO_ERROR) {
		*aio_result = bdev_io->internal.error.aio_result;
	} else if (bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS) {
		*aio_result = 0;
	} else {
		*aio_result = -EIO;
	}
}

void
spdk_bdev_io_complete_nvme_status(struct spdk_bdev_io *bdev_io, uint32_t cdw0, int sct, int sc)
{
+2 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@
	spdk_bdev_io_get_nvme_status;
	spdk_bdev_io_get_nvme_fused_status;
	spdk_bdev_io_get_scsi_status;
	spdk_bdev_io_get_aio_status;
	spdk_bdev_io_get_iovec;
	spdk_bdev_io_get_md_buf;
	spdk_bdev_io_get_cb_arg;
@@ -116,6 +117,7 @@
	spdk_bdev_io_complete;
	spdk_bdev_io_complete_nvme_status;
	spdk_bdev_io_complete_scsi_status;
	spdk_bdev_io_complete_aio_status;
	spdk_bdev_io_get_thread;
	spdk_bdev_io_get_io_channel;
	spdk_bdev_notify_blockcnt_change;
Loading