From: Josh Durgin Date: Mon, 25 Feb 2013 20:05:16 +0000 (-0800) Subject: Merge branch 'wip-4249' into wip-4249-master X-Git-Tag: v0.59~115^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=db5fc2270f91aae220fc3c97b0c62e92e263527b;p=ceph.git Merge branch 'wip-4249' into wip-4249-master Make snap_rollback() only take a read lock on snap_lock, since it does not modify snapshot-related fields. Conflicts: src/librbd/internal.cc --- db5fc2270f91aae220fc3c97b0c62e92e263527b diff --cc src/librbd/internal.cc index d913b314edd4,a4c25dfaa524..9c8276fd4fd5 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@@ -1735,18 -1748,24 +1735,24 @@@ reprotect_and_return_err if (r < 0) return r; - Mutex::Locker l(ictx->md_lock); + RWLock::WLocker l(ictx->md_lock); - RWLock::WLocker l2(ictx->snap_lock); - if (!ictx->snap_exists) - return -ENOENT; + snap_t snap_id; + uint64_t new_size; + { + // need to drop snap_lock before invalidating cache - Mutex::Locker l2(ictx->snap_lock); ++ RWLock::RLocker l2(ictx->snap_lock); + if (!ictx->snap_exists) + return -ENOENT; - if (ictx->snap_id != CEPH_NOSNAP || ictx->read_only) - return -EROFS; + if (ictx->snap_id != CEPH_NOSNAP || ictx->read_only) + return -EROFS; - snap_t snap_id = ictx->get_snap_id(snap_name); - if (snap_id == CEPH_NOSNAP) { - lderr(cct) << "No such snapshot found." << dendl; - return -ENOENT; + snap_id = ictx->get_snap_id(snap_name); + if (snap_id == CEPH_NOSNAP) { + lderr(cct) << "No such snapshot found." << dendl; + return -ENOENT; + } + new_size = ictx->get_image_size(ictx->snap_id); } // need to flush any pending writes before resizing and rolling back -