diff options
author | Sage Weil <sage@inktank.com> | 2013-02-25 17:48:16 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-02-25 17:48:16 -0800 |
commit | 1f1427415c24ce9943d0f18cd566d305832bf316 (patch) | |
tree | ba04e8d86977544cb0f613d54041a7793f6e81f6 | |
parent | 21471c1ef4cf02e068a6e6c49cd41e95efec952a (diff) | |
parent | c4537347b3de2220bf350951ad9da0924750ceb3 (diff) | |
download | ceph-1f1427415c24ce9943d0f18cd566d305832bf316.tar.gz |
Merge remote-tracking branch 'gh/wip-4249-master'
-rw-r--r-- | src/librbd/ImageCtx.cc | 10 | ||||
-rw-r--r-- | src/librbd/ImageCtx.h | 1 | ||||
-rw-r--r-- | src/librbd/internal.cc | 31 |
3 files changed, 15 insertions, 27 deletions
diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index f2ffd79b662..99641ad54b4 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -338,16 +338,6 @@ namespace librbd { return -ENOENT; } - int ImageCtx::get_snap_size(string in_snap_name, uint64_t *out_size) const - { - map<string, SnapInfo>::const_iterator it = snaps_by_name.find(in_snap_name); - if (it != snaps_by_name.end()) { - *out_size = it->second.size; - return 0; - } - return -ENOENT; - } - void ImageCtx::add_snap(string in_snap_name, snap_t id, uint64_t in_size, uint64_t features, parent_info parent, diff --git a/src/librbd/ImageCtx.h b/src/librbd/ImageCtx.h index 99a07a6bf1c..53f6f95e5be 100644 --- a/src/librbd/ImageCtx.h +++ b/src/librbd/ImageCtx.h @@ -103,7 +103,6 @@ namespace librbd { librados::snap_t get_snap_id(std::string in_snap_name) const; int get_snap_name(snapid_t snap_id, std::string *out_snap_name) const; int get_parent_spec(snapid_t snap_id, parent_spec *pspec); - int get_snap_size(std::string in_snap_name, uint64_t *out_size) const; int is_snap_protected(string in_snap_name, bool *is_protected) const; int is_snap_unprotected(string in_snap_name, bool *is_unprotected) const; diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index d913b314edd..9c8276fd4fd 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1736,17 +1736,23 @@ reprotect_and_return_err: return r; 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 + 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 - @@ -1754,9 +1760,6 @@ reprotect_and_return_err: // the current version, so we have to invalidate that too. ictx->invalidate_cache(); - uint64_t new_size = ictx->get_image_size(ictx->snap_id); - ictx->get_snap_size(snap_name, &new_size); - ldout(cct, 2) << "resizing to snapshot size..." << dendl; NoOpProgressContext no_op; r = resize_helper(ictx, new_size, no_op); @@ -1772,10 +1775,6 @@ reprotect_and_return_err: return r; } - snap_t new_snap_id = ictx->get_snap_id(snap_name); - ldout(cct, 20) << "snap_id is " << ictx->snap_id << " new snap_id is " - << new_snap_id << dendl; - notify_change(ictx->md_ctx, ictx->header_oid, NULL, ictx); ictx->perfcounter->inc(l_librbd_snap_rollback); |