]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: remove usage of snapshot features
authorJason Dillaman <dillaman@redhat.com>
Thu, 12 Mar 2015 00:39:01 +0000 (20:39 -0400)
committerJason Dillaman <dillaman@redhat.com>
Mon, 6 Apr 2015 17:14:34 +0000 (13:14 -0400)
The features for the image HEAD now apply to all
snapshots within the image.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h
src/librbd/ImageWatcher.cc
src/librbd/ObjectMap.cc
src/librbd/SnapInfo.h
src/librbd/internal.cc

index 323964ae08a268fc86bcacf42138215a1e0c93e1..44c6c8ded3194ca430d98bc4035a978d04ab256b 100644 (file)
@@ -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<snap_t, SnapInfo>(id, info));
     snap_ids.insert(pair<string, snap_t>(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
index 264c817dac451e52c8aa9039885a1b4100299782..dcb3fffdf73589ddb82854085d17e21e2e34c3d0 100644 (file)
@@ -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;
index 142c2db84233df8693bcb4cd10bf49d415b033e6..ab708521085a05f8f14e370eb69c90f2f8a2f30b 100644 (file)
@@ -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);
 }
 
index 20a32880c50668dc6661b653b85208f59419e9f3..45247cf65a5c2ddea8d54de95afba75255bb8fdb 100644 (file)
@@ -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;
   }
 
index a3307ff49075a6172bda7339860f3482c1a8d7bb..4a225a4625f7a539a03affc87c12e6e3d420293c 100644 (file)
@@ -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) {}
   };
 }
index 07f952a9f8af0c92d7f4df329ccf5ec63c87b258..bf2401019e2ff7ee34943bb4b9f624b4a9a3cee5 100644 (file)
@@ -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<string> snap_names;
     vector<uint64_t> snap_sizes;
-    vector<uint64_t> snap_features;
     vector<parent_info> snap_parents;
     vector<uint8_t> snap_protection;
     vector<uint64_t> 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();