From: Jason Dillaman Date: Thu, 12 Mar 2015 00:39:01 +0000 (-0400) Subject: librbd: remove usage of snapshot features X-Git-Tag: v9.0.0~37^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2e26309329454158f768da1cfb8e8cfb5551dd57;p=ceph.git librbd: remove usage of snapshot features The features for the image HEAD now apply to all snapshots within the image. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 323964ae08a2..44c6c8ded319 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -419,13 +419,12 @@ namespace librbd { } void ImageCtx::add_snap(string in_snap_name, snap_t id, uint64_t in_size, - uint64_t features, parent_info parent, - uint8_t protection_status, uint64_t flags) + parent_info parent, uint8_t protection_status, + uint64_t flags) { assert(snap_lock.is_wlocked()); snaps.push_back(id); - SnapInfo info(in_snap_name, in_size, features, parent, protection_status, - flags); + SnapInfo info(in_snap_name, in_size, parent, protection_status, flags); snap_info.insert(pair(id, info)); snap_ids.insert(pair(in_snap_name, id)); } @@ -448,27 +447,10 @@ namespace librbd { return 0; } - int ImageCtx::get_features(snap_t in_snap_id, uint64_t *out_features) const - { - assert(snap_lock.is_locked()); - if (in_snap_id == CEPH_NOSNAP) { - *out_features = features; - return 0; - } - const SnapInfo *info = get_snap_info(in_snap_id); - if (info) { - *out_features = info->features; - return 0; - } - return -ENOENT; - } - bool ImageCtx::test_features(uint64_t test_features) const { RWLock::RLocker l(snap_lock); - uint64_t snap_features = 0; - get_features(snap_id, &snap_features); - return ((snap_features & test_features) == test_features); + return ((features & test_features) == test_features); } int ImageCtx::get_flags(librados::snap_t _snap_id, uint64_t *_flags) const diff --git a/src/librbd/ImageCtx.h b/src/librbd/ImageCtx.h index 264c817dac45..dcb3fffdf735 100644 --- a/src/librbd/ImageCtx.h +++ b/src/librbd/ImageCtx.h @@ -165,12 +165,9 @@ namespace librbd { uint64_t get_stripe_period() const; void add_snap(std::string in_snap_name, librados::snap_t id, - uint64_t in_size, uint64_t features, - parent_info parent, uint8_t protection_status, - uint64_t flags); + uint64_t in_size, parent_info parent, + uint8_t protection_status, uint64_t flags); uint64_t get_image_size(librados::snap_t in_snap_id) const; - int get_features(librados::snap_t in_snap_id, - uint64_t *out_features) const; bool test_features(uint64_t test_features) const; int get_flags(librados::snap_t in_snap_id, uint64_t *flags) const; bool test_flags(uint64_t test_flags) const; diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index 142c2db84233..ab708521085a 100644 --- a/src/librbd/ImageWatcher.cc +++ b/src/librbd/ImageWatcher.cc @@ -58,9 +58,7 @@ ImageWatcher::~ImageWatcher() bool ImageWatcher::is_lock_supported() const { assert(m_image_ctx.owner_lock.is_locked()); RWLock::RLocker l(m_image_ctx.snap_lock); - uint64_t snap_features; - m_image_ctx.get_features(m_image_ctx.snap_id, &snap_features); - return ((snap_features & RBD_FEATURE_EXCLUSIVE_LOCK) != 0 && + return ((m_image_ctx.features & RBD_FEATURE_EXCLUSIVE_LOCK) != 0 && !m_image_ctx.read_only && m_image_ctx.snap_id == CEPH_NOSNAP); } diff --git a/src/librbd/ObjectMap.cc b/src/librbd/ObjectMap.cc index 20a32880c506..45247cf65a5c 100644 --- a/src/librbd/ObjectMap.cc +++ b/src/librbd/ObjectMap.cc @@ -150,9 +150,7 @@ void ObjectMap::refresh(uint64_t snap_id) assert(m_image_ctx.snap_lock.is_wlocked()); RWLock::WLocker l(m_image_ctx.object_map_lock); - uint64_t features; - m_image_ctx.get_features(snap_id, &features); - if ((features & RBD_FEATURE_OBJECT_MAP) == 0 || + if ((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) == 0 || (m_image_ctx.snap_id == snap_id && !m_image_ctx.snap_exists)) { m_object_map.clear(); m_enabled = false; @@ -198,9 +196,7 @@ void ObjectMap::rollback(uint64_t snap_id) { CephContext *cct = m_image_ctx.cct; ldout(cct, 10) << &m_image_ctx << " rollback object map" << dendl; - uint64_t features; - m_image_ctx.get_features(snap_id, &features); - if ((features & RBD_FEATURE_OBJECT_MAP) == 0) { + if ((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) == 0) { r = m_image_ctx.md_ctx.remove(oid); if (r < 0 && r != -ENOENT) { lderr(cct) << "unable to remove object map: " << cpp_strerror(r) @@ -238,9 +234,7 @@ void ObjectMap::rollback(uint64_t snap_id) { void ObjectMap::snapshot(uint64_t snap_id) { assert(m_image_ctx.snap_lock.is_wlocked()); - uint64_t features; - m_image_ctx.get_features(CEPH_NOSNAP, &features); - if ((features & RBD_FEATURE_OBJECT_MAP) == 0) { + if ((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) == 0) { return; } diff --git a/src/librbd/SnapInfo.h b/src/librbd/SnapInfo.h index a3307ff49075..4a225a4625f7 100644 --- a/src/librbd/SnapInfo.h +++ b/src/librbd/SnapInfo.h @@ -15,13 +15,12 @@ namespace librbd { struct SnapInfo { std::string name; uint64_t size; - uint64_t features; parent_info parent; uint8_t protection_status; uint64_t flags; - SnapInfo(std::string _name, uint64_t _size, uint64_t _features, - parent_info _parent, uint8_t _protection_status, uint64_t _flags) - : name(_name), size(_size), features(_features), parent(_parent), + SnapInfo(std::string _name, uint64_t _size, parent_info _parent, + uint8_t _protection_status, uint64_t _flags) + : name(_name), size(_size), parent(_parent), protection_status(_protection_status), flags(_flags) {} }; } diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 07f952a9f8af..bf2401019e2f 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -627,9 +627,7 @@ namespace librbd { RWLock::RLocker l(ictx->md_lock); RWLock::RLocker l2(ictx->snap_lock); - uint64_t features; - ictx->get_features(ictx->snap_id, &features); - if ((features & RBD_FEATURE_LAYERING) == 0) { + if ((ictx->features & RBD_FEATURE_LAYERING) == 0) { lderr(ictx->cct) << "snap_protect: image must support layering" << dendl; return -ENOSYS; @@ -670,9 +668,7 @@ namespace librbd { RWLock::RLocker l(ictx->md_lock); RWLock::RLocker l2(ictx->snap_lock); - uint64_t features; - ictx->get_features(ictx->snap_id, &features); - if ((features & RBD_FEATURE_LAYERING) == 0) { + if ((ictx->features & RBD_FEATURE_LAYERING) == 0) { lderr(ictx->cct) << "snap_unprotect: image must support layering" << dendl; return -ENOSYS; @@ -1100,7 +1096,7 @@ reprotect_and_return_err: } p_imctx->snap_lock.get_read(); - p_imctx->get_features(p_imctx->snap_id, &p_features); + p_features = p_imctx->features; size = p_imctx->get_image_size(p_imctx->snap_id); p_imctx->is_snap_protected(p_imctx->snap_id, &snap_protected); p_imctx->snap_lock.put_read(); @@ -1346,7 +1342,8 @@ reprotect_and_return_err: if (r < 0) return r; RWLock::RLocker l(ictx->snap_lock); - return ictx->get_features(ictx->snap_id, features); + *features = ictx->features; + return 0; } int get_overlap(ImageCtx *ictx, uint64_t *overlap) @@ -1923,7 +1920,6 @@ reprotect_and_return_err: bool new_snap = false; vector snap_names; vector snap_sizes; - vector snap_features; vector snap_parents; vector snap_protection; vector snap_flags; @@ -2017,8 +2013,8 @@ reprotect_and_return_err: r = cls_client::snapshot_list(&(ictx->md_ctx), ictx->header_oid, new_snapc.snaps, &snap_names, - &snap_sizes, &snap_features, - &snap_parents, &snap_protection); + &snap_sizes, &snap_parents, + &snap_protection); // -ENOENT here means we raced with snapshot deletion if (r < 0 && r != -ENOENT) { lderr(ictx->cct) << "snapc = " << new_snapc << dendl; @@ -2030,7 +2026,6 @@ reprotect_and_return_err: } for (size_t i = 0; i < new_snapc.snaps.size(); ++i) { - uint64_t features = ictx->old_format ? 0 : snap_features[i]; parent_info parent; if (!ictx->old_format) parent = snap_parents[i]; @@ -2041,7 +2036,6 @@ reprotect_and_return_err: ldout(cct, 20) << "new snapshot id=" << new_snapc.snaps[i].val << " name=" << snap_names[i] << " size=" << snap_sizes[i] - << " features=" << features << dendl; } } @@ -2050,7 +2044,6 @@ reprotect_and_return_err: ictx->snap_info.clear(); ictx->snap_ids.clear(); for (size_t i = 0; i < new_snapc.snaps.size(); ++i) { - uint64_t features = ictx->old_format ? 0 : snap_features[i]; uint64_t flags = ictx->old_format ? 0 : snap_flags[i]; uint8_t protection_status = ictx->old_format ? (uint8_t)RBD_PROTECTION_STATUS_UNPROTECTED : snap_protection[i]; @@ -2058,7 +2051,7 @@ reprotect_and_return_err: if (!ictx->old_format) parent = snap_parents[i]; ictx->add_snap(snap_names[i], new_snapc.snaps[i].val, snap_sizes[i], - features, parent, protection_status, flags); + parent, protection_status, flags); } r = refresh_parent(ictx); @@ -2208,8 +2201,7 @@ reprotect_and_return_err: int order = src->order; src->snap_lock.get_read(); - uint64_t src_features; - src->get_features(src->snap_id, &src_features); + uint64_t src_features = src->features; uint64_t src_size = src->get_image_size(src->snap_id); src->snap_lock.put_read();