From: Jason Dillaman Date: Sun, 25 Jan 2015 18:56:02 +0000 (-0500) Subject: cls_rbd: object_map_resize shrink protection X-Git-Tag: v0.93~143^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f4b9442a88b88c7a5437e8307e9b2c125308feca;p=ceph.git cls_rbd: object_map_resize shrink protection 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 --- diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index fdd6bba2d4e..481ca31be23 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -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; diff --git a/src/test/cls_rbd/test_cls_rbd.cc b/src/test/cls_rbd/test_cls_rbd.cc index e5f52c21ca3..3642efe2f87 100644 --- a/src/test/cls_rbd/test_cls_rbd.cc +++ b/src/test/cls_rbd/test_cls_rbd.cc @@ -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);