Commit 80161622 authored by Jim Harris's avatar Jim Harris Committed by Daniel Verkamp
Browse files

bdev: defer completion on resets



This ensures a reset is completed after any I/O completions
that may have been deferred.

Signed-off-by: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I9efe5c07435371ff8c8e0c826349e9349ade02f3

Reviewed-on: https://review.gerrithub.io/365663


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 302828bb
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -333,6 +333,11 @@ struct spdk_bdev_io {
	 */
	bool in_submit_request;

	/**
	 * Set to true when the a bdev_io's callback routine should be deferred after completion.
	 */
	bool defer_callback;

	/** Used in virtual device (e.g., RAID), indicates its parent spdk_bdev_io */
	struct spdk_bdev_io *parent;

+6 −0
Original line number Diff line number Diff line
@@ -993,6 +993,7 @@ spdk_bdev_reset(struct spdk_bdev *bdev, struct spdk_io_channel *ch,

	bdev_io->ch = channel;
	bdev_io->type = SPDK_BDEV_IO_TYPE_RESET;
	bdev_io->defer_callback = true;
	spdk_bdev_io_init(bdev_io, bdev, cb_arg, cb);

	/* First, abort all I/O queued up waiting for buffers. */
@@ -1137,10 +1138,15 @@ spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status sta
	bdev_io->status = status;

	if (bdev_io->in_submit_request) {
		bdev_io->defer_callback = true;
	}

	if (bdev_io->defer_callback) {
		/*
		 * Defer completion to avoid potential infinite recursion if the
		 * user's completion callback issues a new I/O.
		 */
		bdev_io->defer_callback = false;
		spdk_thread_send_msg(spdk_io_channel_get_thread(bdev_io->ch->channel),
				     bdev_io_deferred_completion, bdev_io);
		return;