bdev: defer completion on resets
This ensures a reset is completed after any I/O completions that may have been deferred. Signed-off-by: Jim Harris <james.r.harris@intel.com> Change-Id: I9efe5c07435371ff8c8e0c826349e9349ade02f3 Reviewed-on: https://review.gerrithub.io/365663 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
302828bb5b
commit
80161622b8
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user