Commit 9d4708f3 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Changpeng Liu
Browse files

bdev: Factor out queueing IO operation in _spdk_bdev_io_split



This patch factors out that operation into a function and adds
error handling to that operation to improve readability slightly.

Change-Id: Ic24df0c0a9abbebc38d30fc17779dc5a5f6138a6
Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/427026


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarPaul Luse <paul.e.luse@intel.com>
parent 9872b992
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -1076,6 +1076,23 @@ _spdk_bdev_qos_io_submit(struct spdk_bdev_channel *ch)
	}
}

static void
_spdk_bdev_queue_io_wait_with_cb(struct spdk_bdev_io *bdev_io, spdk_bdev_io_wait_cb cb_fn)
{
	int rc;

	bdev_io->internal.waitq_entry.bdev = bdev_io->bdev;
	bdev_io->internal.waitq_entry.cb_fn = cb_fn;
	bdev_io->internal.waitq_entry.cb_arg = bdev_io;
	rc = spdk_bdev_queue_io_wait(bdev_io->bdev, spdk_io_channel_from_ctx(bdev_io->internal.ch),
				     &bdev_io->internal.waitq_entry);
	if (rc != 0) {
		SPDK_ERRLOG("Queue IO failed, rc=%d\n", rc);
		bdev_io->internal.status = SPDK_BDEV_IO_STATUS_FAILED;
		bdev_io->internal.cb(bdev_io, false, bdev_io->internal.caller_ctx);
	}
}

static bool
_spdk_bdev_io_type_can_split(uint8_t type)
{
@@ -1206,11 +1223,7 @@ _spdk_bdev_io_split_with_payload(void *_bdev_io)
		bdev_io->u.bdev.split_current_offset_blocks += to_next_boundary;
		bdev_io->u.bdev.split_remaining_num_blocks -= to_next_boundary;
	} else if (rc == -ENOMEM) {
		bdev_io->internal.waitq_entry.bdev = bdev_io->bdev;
		bdev_io->internal.waitq_entry.cb_fn = _spdk_bdev_io_split_with_payload;
		bdev_io->internal.waitq_entry.cb_arg = bdev_io;
		spdk_bdev_queue_io_wait(bdev_io->bdev, spdk_io_channel_from_ctx(bdev_io->internal.ch),
					&bdev_io->internal.waitq_entry);
		_spdk_bdev_queue_io_wait_with_cb(bdev_io, _spdk_bdev_io_split_with_payload);
	} else {
		bdev_io->internal.status = SPDK_BDEV_IO_STATUS_FAILED;
		bdev_io->internal.cb(bdev_io, false, bdev_io->internal.caller_ctx);