From b220b2a5a6eb79f560a24801e44910394223a5b5 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Sat, 14 Feb 2015 01:24:44 -0500 Subject: [PATCH] librbd: enforce write ordering with snapshot The md_lock is now held for reading when scheduling write/discards. Since snap_create now holds the lock for writing and flushes all pending IO, write/discard operations will now be consistent for a given request across objects. Signed-off-by: Jason Dillaman --- src/librbd/AioRequest.cc | 3 --- src/librbd/AioRequest.h | 2 -- src/librbd/internal.cc | 8 ++++++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/librbd/AioRequest.cc b/src/librbd/AioRequest.cc index 35ba2e6bd8968..ceacc6f0e8a6e 100644 --- a/src/librbd/AioRequest.cc +++ b/src/librbd/AioRequest.cc @@ -246,9 +246,6 @@ namespace librbd { m_state(LIBRBD_AIO_WRITE_FLAT), m_snap_seq(snapc.seq.val), m_entire_object(NULL) { - m_io_ctx.dup(ictx->data_ctx); - m_io_ctx.snap_set_read(CEPH_NOSNAP); - m_object_image_extents = objectx; m_parent_overlap = object_overlap; } diff --git a/src/librbd/AioRequest.h b/src/librbd/AioRequest.h index a5da41edbefd5..ae8c855038a6b 100644 --- a/src/librbd/AioRequest.h +++ b/src/librbd/AioRequest.h @@ -192,8 +192,6 @@ namespace librbd { } private: - librados::IoCtx m_io_ctx; - bool send_pre(); bool send_post(); void send_write(); diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 7d6593bb01c1d..542ad434dc358 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -3264,6 +3264,9 @@ reprotect_and_return_err: return r; } + RWLock::RLocker owner_locker(ictx->owner_lock); + RWLock::RLocker md_locker(ictx->md_lock); + ictx->snap_lock.get_read(); snapid_t snap_id = ictx->snap_id; ::SnapContext snapc = ictx->snapc; @@ -3282,7 +3285,6 @@ reprotect_and_return_err: c->get(); c->init_time(ictx, AIO_TYPE_WRITE); - RWLock::RLocker l(ictx->owner_lock); if (ictx->image_watcher->is_lock_supported() && !ictx->image_watcher->is_lock_owner()) { c->put(); @@ -3358,6 +3360,9 @@ reprotect_and_return_err: return r; } + RWLock::RLocker owner_locker(ictx->owner_lock); + RWLock::RLocker md_locker(ictx->md_lock); + // TODO: check for snap ictx->snap_lock.get_read(); snapid_t snap_id = ictx->snap_id; @@ -3375,7 +3380,6 @@ reprotect_and_return_err: c->get(); c->init_time(ictx, AIO_TYPE_DISCARD); - RWLock::RLocker l(ictx->owner_lock); if (ictx->image_watcher->is_lock_supported() && !ictx->image_watcher->is_lock_owner()) { c->put(); -- 2.39.5