From: Jason Dillaman Date: Wed, 18 Nov 2015 19:51:31 +0000 (-0500) Subject: librbd: owner_lock should be held while opening parent image X-Git-Tag: v10.0.2~193^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aa02a07e49006702a8d8bfd485ec6f45339b8a99;p=ceph.git librbd: owner_lock should be held while opening parent image Signed-off-by: Jason Dillaman --- 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; }