From: Jason Dillaman Date: Tue, 9 Jun 2015 17:20:54 +0000 (-0400) Subject: librbd: flush operations need to acquire owner lock X-Git-Tag: v9.0.2~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=adfa2e0070ccca7b6556d3bfc5fac7ce4d43a4d0;p=ceph.git librbd: flush operations need to acquire owner lock Cache writeback operations will expect the owner lock to be held. Fixes: #11938 Signed-off-by: Jason Dillaman Reviewed-by: Josh Durgin --- diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 7f74ec018693..5b6b59249e2f 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -643,6 +643,7 @@ public: } void ImageCtx::flush_cache_aio(Context *onfinish) { + assert(owner_lock.is_locked()); cache_lock.Lock(); object_cacher->flush_set(object_set, onfinish); cache_lock.Unlock(); diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index ddd499ff445d..44ecf54fcb0e 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -2752,7 +2752,8 @@ reprotect_and_return_err: if (ictx->object_cacher) { // complete pending writes before we're set to a snapshot and // get -EROFS for writes - RWLock::WLocker l(ictx->md_lock); + RWLock::RLocker owner_locker(ictx->owner_lock); + RWLock::WLocker md_locker(ictx->md_lock); ictx->flush_cache(); } int r = _snap_set(ictx, snap_name); @@ -3668,6 +3669,7 @@ reprotect_and_return_err: return; } + RWLock::RLocker owner_locker(ictx->owner_lock); ictx->user_flushed(); C_AioWrite *flush_ctx = new C_AioWrite(cct, c); @@ -3740,7 +3742,8 @@ reprotect_and_return_err: ictx->flush_async_operations(); - RWLock::WLocker l(ictx->md_lock); + RWLock::RLocker owner_locker(ictx->owner_lock); + RWLock::WLocker md_locker(ictx->md_lock); r = ictx->invalidate_cache(); return r; }