diff options
author | Josh Durgin <josh.durgin@inktank.com> | 2013-05-16 15:19:46 -0700 |
---|---|---|
committer | Josh Durgin <josh.durgin@inktank.com> | 2013-05-21 14:17:40 -0700 |
commit | 9c7faf957fffb2721ccb915b68ca90ffb0d04a9f (patch) | |
tree | 1cc6b1c1dc9f12ae12ce83aa946d2d7b9cffba48 | |
parent | 4071d7a79585ee2768d0a63819d99405a083369f (diff) | |
download | ceph-9c7faf957fffb2721ccb915b68ca90ffb0d04a9f.tar.gz |
cls_rbd: make sure stripe_unit is not larger than object size
Test a few other cases too.
backport: cuttlefish, bobtail
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
(cherry picked from commit 810306a2a76eec1c232fd28ec9c351e827fa3031)
-rw-r--r-- | src/cls/rbd/cls_rbd.cc | 2 | ||||
-rw-r--r-- | src/test/cls_rbd/test_cls_rbd.cc | 9 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index 0ac889f6795..1f72d354f80 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -679,7 +679,7 @@ int set_stripe_unit_count(cls_method_context_t hctx, bufferlist *in, bufferlist CLS_ERR("failed to read the order off of disk: %s", strerror(r)); return r; } - if ((1ull << order) % stripe_unit) { + if ((1ull << order) % stripe_unit || stripe_unit > (1ull << order)) { CLS_ERR("stripe unit %llu is not a factor of the object size %llu", (unsigned long long)stripe_unit, 1ull << order); return -EINVAL; diff --git a/src/test/cls_rbd/test_cls_rbd.cc b/src/test/cls_rbd/test_cls_rbd.cc index 6308980f55f..c147b43f4cb 100644 --- a/src/test/cls_rbd/test_cls_rbd.cc +++ b/src/test/cls_rbd/test_cls_rbd.cc @@ -906,6 +906,15 @@ TEST(cls_rbd, stripingv2) ASSERT_EQ(8192ull, su); ASSERT_EQ(456ull, sc); + // su must not be larger than an object + ASSERT_EQ(-EINVAL, set_stripe_unit_count(&ioctx, "bar", 1 << 23, 1)); + // su must be a factor of object size + ASSERT_EQ(-EINVAL, set_stripe_unit_count(&ioctx, "bar", 511, 1)); + // su and sc must be non-zero + ASSERT_EQ(-EINVAL, set_stripe_unit_count(&ioctx, "bar", 0, 1)); + ASSERT_EQ(-EINVAL, set_stripe_unit_count(&ioctx, "bar", 1, 0)); + ASSERT_EQ(-EINVAL, set_stripe_unit_count(&ioctx, "bar", 0, 0)); + ioctx.close(); ASSERT_EQ(0, destroy_one_pool_pp(pool_name, rados)); } |