From: Igor Fedotov Date: Wed, 18 Mar 2020 11:35:55 +0000 (+0300) Subject: os/bluestore: fix extent leak after main device expand. X-Git-Tag: v16.0.0~13^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=85abb02ad7d1a7c51e4fc2560eef1b528230c2fc;p=ceph-ci.git os/bluestore: fix extent leak after main device expand. To reproduce the issue one can expand device of 3,147,480,064 bytes to 4,147,480,064 using bluefs-bdev-expand command. Subsequent fsck will detect the leakage. Signed-off-by: Igor Fedotov --- diff --git a/src/os/bluestore/BitmapFreelistManager.cc b/src/os/bluestore/BitmapFreelistManager.cc index 7dcef4384ad..13c60b4962e 100644 --- a/src/os/bluestore/BitmapFreelistManager.cc +++ b/src/os/bluestore/BitmapFreelistManager.cc @@ -111,11 +111,11 @@ int BitmapFreelistManager::expand(uint64_t new_size, KeyValueDB::Transaction txn uint64_t blocks0 = size / bytes_per_block; if (blocks0 / blocks_per_key * blocks_per_key != blocks0) { - blocks0 = (blocks / blocks_per_key + 1) * blocks_per_key; + blocks0 = (blocks0 / blocks_per_key + 1) * blocks_per_key; dout(10) << __func__ << " rounding blocks up from 0x" << std::hex << size << " to 0x" << (blocks0 * bytes_per_block) << " (0x" << blocks0 << " blocks)" << std::dec << dendl; - // reset past-eof blocks to unallocated + // reset previous past-eof blocks to unallocated _xor(size, blocks0 * bytes_per_block - size, txn); }