From aa02a07e49006702a8d8bfd485ec6f45339b8a99 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 18 Nov 2015 14:51:31 -0500 Subject: [PATCH] librbd: owner_lock should be held while opening parent image Signed-off-by: Jason Dillaman --- src/librbd/internal.cc | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 76b5fee1133..9c25ba3add7 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1889,32 +1889,30 @@ int invoke_async_request(ImageCtx *ictx, const std::string& request_type, return r; } - ictx->parent->cache_lock.Lock(); - ictx->parent->snap_lock.get_write(); - r = ictx->parent->get_snap_name(parent_snap_id, &ictx->parent->snap_name); - if (r < 0) { - lderr(ictx->cct) << "parent snapshot does not exist" << dendl; - ictx->parent->snap_lock.put_write(); - ictx->parent->cache_lock.Unlock(); - close_parent(ictx); - return r; + { + RWLock::RLocker owner_locker(ictx->parent->owner_lock); + Mutex::Locker cache_locker(ictx->parent->cache_lock); + RWLock::WLocker snap_locker(ictx->parent->snap_lock); + r = ictx->parent->get_snap_name(parent_snap_id, &ictx->parent->snap_name); + if (r < 0) { + lderr(ictx->cct) << "parent snapshot does not exist" << dendl; + } else { + ictx->parent->snap_set(ictx->parent->snap_name); + + RWLock::WLocker parent_locker(ictx->parent->parent_lock); + r = refresh_parent(ictx->parent); + if (r < 0) { + lderr(ictx->cct) << "error refreshing parent snapshot " + << ictx->parent->id << " " + << ictx->parent->snap_name << dendl; + } + } } - ictx->parent->snap_set(ictx->parent->snap_name); - ictx->parent->parent_lock.get_write(); - r = refresh_parent(ictx->parent); + if (r < 0) { - lderr(ictx->cct) << "error refreshing parent snapshot " - << ictx->parent->id << " " - << ictx->parent->snap_name << dendl; - ictx->parent->parent_lock.put_write(); - ictx->parent->snap_lock.put_write(); - ictx->parent->cache_lock.Unlock(); close_parent(ictx); return r; } - ictx->parent->parent_lock.put_write(); - ictx->parent->snap_lock.put_write(); - ictx->parent->cache_lock.Unlock(); return 0; } -- 2.47.3