summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-02-25 17:48:16 -0800
committerSage Weil <sage@inktank.com>2013-02-25 17:48:16 -0800
commit1f1427415c24ce9943d0f18cd566d305832bf316 (patch)
treeba04e8d86977544cb0f613d54041a7793f6e81f6
parent21471c1ef4cf02e068a6e6c49cd41e95efec952a (diff)
parentc4537347b3de2220bf350951ad9da0924750ceb3 (diff)
downloadceph-1f1427415c24ce9943d0f18cd566d305832bf316.tar.gz
Merge remote-tracking branch 'gh/wip-4249-master'
-rw-r--r--src/librbd/ImageCtx.cc10
-rw-r--r--src/librbd/ImageCtx.h1
-rw-r--r--src/librbd/internal.cc31
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);