From b0b4ba269808cb151c037b920b6c2ffe6c7725dd Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 17 Sep 2020 09:51:49 -0400 Subject: [PATCH] librbd: assign a unique flush source to each internal component This will allow improved tracking and bypassing of a flush request that might cause IO deadlocks in dispatch layers. Signed-off-by: Jason Dillaman --- src/librbd/exclusive_lock/ImageDispatch.cc | 2 +- src/librbd/image/CloseRequest.cc | 2 +- src/librbd/image/RefreshRequest.cc | 4 ++-- src/librbd/io/Types.h | 6 +++++- src/librbd/io/WriteBlockImageDispatch.cc | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/librbd/exclusive_lock/ImageDispatch.cc b/src/librbd/exclusive_lock/ImageDispatch.cc index 87007c60a73fe..fe3ab14bace24 100644 --- a/src/librbd/exclusive_lock/ImageDispatch.cc +++ b/src/librbd/exclusive_lock/ImageDispatch.cc @@ -72,7 +72,7 @@ void ImageDispatch::set_require_lock(io::Direction direction, on_finish, util::get_image_ctx(m_image_ctx), io::AIO_TYPE_FLUSH); auto req = io::ImageDispatchSpec::create_flush( *m_image_ctx, io::IMAGE_DISPATCH_LAYER_EXCLUSIVE_LOCK, aio_comp, - io::FLUSH_SOURCE_INTERNAL, {}); + io::FLUSH_SOURCE_EXCLUSIVE_LOCK, {}); req->send(); } diff --git a/src/librbd/image/CloseRequest.cc b/src/librbd/image/CloseRequest.cc index 04f8b6f630b5f..7293687f5b81c 100644 --- a/src/librbd/image/CloseRequest.cc +++ b/src/librbd/image/CloseRequest.cc @@ -105,7 +105,7 @@ void CloseRequest::send_flush() { io::AIO_TYPE_FLUSH); auto req = io::ImageDispatchSpec::create_flush( *m_image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, aio_comp, - io::FLUSH_SOURCE_INTERNAL, {}); + io::FLUSH_SOURCE_SHUTDOWN, {}); req->send(); } diff --git a/src/librbd/image/RefreshRequest.cc b/src/librbd/image/RefreshRequest.cc index 735d701b61a1c..b66f375315f14 100644 --- a/src/librbd/image/RefreshRequest.cc +++ b/src/librbd/image/RefreshRequest.cc @@ -1246,8 +1246,8 @@ Context *RefreshRequest::send_flush_aio() { auto aio_comp = io::AioCompletion::create_and_start( ctx, util::get_image_ctx(&m_image_ctx), io::AIO_TYPE_FLUSH); auto req = io::ImageDispatchSpec::create_flush( - m_image_ctx, io::IMAGE_DISPATCH_LAYER_INTERNAL_START, aio_comp, - io::FLUSH_SOURCE_INTERNAL, {}); + m_image_ctx, io::IMAGE_DISPATCH_LAYER_REFRESH, aio_comp, + io::FLUSH_SOURCE_REFRESH, {}); req->send(); return nullptr; } else if (m_error_result < 0) { diff --git a/src/librbd/io/Types.h b/src/librbd/io/Types.h index 66a7635cd5321..6193e2f5a0987 100644 --- a/src/librbd/io/Types.h +++ b/src/librbd/io/Types.h @@ -31,7 +31,11 @@ enum FlushSource { FLUSH_SOURCE_USER, FLUSH_SOURCE_INTERNAL, FLUSH_SOURCE_SHUTDOWN, - FLUSH_SOURCE_WRITEBACK + FLUSH_SOURCE_EXCLUSIVE_LOCK, + FLUSH_SOURCE_EXCLUSIVE_LOCK_SKIP_REFRESH, + FLUSH_SOURCE_REFRESH, + FLUSH_SOURCE_WRITEBACK, + FLUSH_SOURCE_WRITE_BLOCK, }; enum Direction { diff --git a/src/librbd/io/WriteBlockImageDispatch.cc b/src/librbd/io/WriteBlockImageDispatch.cc index e489524995da3..729ecc5e60041 100644 --- a/src/librbd/io/WriteBlockImageDispatch.cc +++ b/src/librbd/io/WriteBlockImageDispatch.cc @@ -254,7 +254,7 @@ void WriteBlockImageDispatch::flush_io(Context* on_finish) { on_finish, util::get_image_ctx(m_image_ctx), librbd::io::AIO_TYPE_FLUSH); auto req = ImageDispatchSpec::create_flush( *m_image_ctx, IMAGE_DISPATCH_LAYER_WRITE_BLOCK, aio_comp, - FLUSH_SOURCE_INTERNAL, {}); + FLUSH_SOURCE_WRITE_BLOCK, {}); req->send(); } -- 2.39.5