]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: object_map_resize shrink protection
authorJason Dillaman <dillaman@redhat.com>
Sun, 25 Jan 2015 18:56:02 +0000 (13:56 -0500)
committerJason Dillaman <dillaman@redhat.com>
Thu, 29 Jan 2015 02:12:53 +0000 (21:12 -0500)
When shrinking an object map, object_map_resize now ensures
that the objects being removed are initialized to default
state to protect against losing track of in-use objects.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/cls/rbd/cls_rbd.cc
src/test/cls_rbd/test_cls_rbd.cc

index fdd6bba2d4e09a2d8e8f485c11c43e77c49355de..481ca31be23177ab9daa24660749e6e1809c6144 100644 (file)
@@ -1972,7 +1972,14 @@ int object_map_resize(cls_method_context_t hctx, bufferlist *in, bufferlist *out
   }
 
   size_t orig_object_map_size = object_map.size();
-  if (orig_object_map_size != object_count) {
+  if (object_count < orig_object_map_size) {
+    for (uint64_t i = object_count; i < orig_object_map_size; ++i) {
+      if (object_map[i] != default_state) {
+       return -ESTALE;
+      }
+    }
+    object_map.resize(object_count);
+  } else if (object_count > orig_object_map_size) {
     object_map.resize(object_count);
     for (uint64_t i = orig_object_map_size; i < object_count; ++i) {
       object_map[i] = default_state;
index e5f52c21ca39d126a3a6f6e51550fcd65dfffe4b..3642efe2f876cc5d4d9f962c7eb5bf3caa0db1c7 100644 (file)
@@ -960,11 +960,16 @@ TEST_F(TestClsRbd, object_map_resize)
   ASSERT_EQ(0, object_map_load(&ioctx, oid, &osd_bit_vector));
   ASSERT_EQ(ref_bit_vector, osd_bit_vector);
 
-  ref_bit_vector.resize(16);
+  ref_bit_vector.resize(32);
 
   librados::ObjectWriteOperation op3;
   object_map_resize(&op3, ref_bit_vector.size(), 1);
-  ASSERT_EQ(0, ioctx.operate(oid, &op3));
+  ASSERT_EQ(-ESTALE, ioctx.operate(oid, &op3));
+
+  librados::ObjectWriteOperation op4;
+  object_map_resize(&op4, ref_bit_vector.size(), 2);
+  ASSERT_EQ(0, ioctx.operate(oid, &op4));
+
   ASSERT_EQ(0, object_map_load(&ioctx, oid, &osd_bit_vector));
   ASSERT_EQ(ref_bit_vector, osd_bit_vector);