From 0bd2546eaca72ed0122a9c2648df4bef05b0d5d2 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 13 Sep 2018 13:31:40 -0500 Subject: [PATCH] osd/osd_types: fix pg_t::contains() to check pool id too This is used by bluestore fsck to ensure we're looking at the right collection. It needs to validate both that the pool id matches the object (including the temp objects) and that the hash matches; we were only checking the hash before. Fixes: http://tracker.ceph.com/issues/32731 Signed-off-by: Sage Weil --- src/common/hobject.h | 1 + src/osd/osd_types.h | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/common/hobject.h b/src/common/hobject.h index b9f277bc8ef27..dc40dead4d2d6 100644 --- a/src/common/hobject.h +++ b/src/common/hobject.h @@ -42,6 +42,7 @@ private: bool max; uint32_t nibblewise_key_cache; uint32_t hash_reverse_bits; +public: static const int64_t POOL_META = -1; static const int64_t POOL_TEMP_START = -2; // and then negative friend class spg_t; // for POOL_TEMP_START diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 7c28877d1c6d0..684828fcf1608 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -424,10 +424,16 @@ struct pg_t { unsigned get_split_bits(unsigned pg_num) const; bool contains(int bits, const ghobject_t& oid) { - return oid.match(bits, ps()); + return + ((int64_t)m_pool == oid.hobj.pool || + hobject_t::POOL_TEMP_START-(int64_t)m_pool == oid.hobj.pool) && + oid.match(bits, ps()); } bool contains(int bits, const hobject_t& oid) { - return oid.match(bits, ps()); + return + ((int64_t)m_pool == oid.pool || + hobject_t::POOL_TEMP_START-(int64_t)m_pool == oid.pool) && + oid.match(bits, ps()); } hobject_t get_hobj_start() const; -- 2.39.5