From 806f6152c548f6b6050b566519978d3358f80544 Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Tue, 30 Jan 2024 13:07:38 +0000 Subject: [PATCH] os/bluestore: Fix fsck() for multi label Do not operate if bdev label is outside device size. Signed-off-by: Adam Kupczyk (cherry picked from commit 86f3aad2db49721af6ca7782e789e5861918406a) --- src/os/bluestore/BlueStore.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 7abec77f6a5ad..fac2304842f4f 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -10358,7 +10358,7 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair) if (bdev_label_multi) { for (size_t i = 0; i < bdev_label_positions.size(); i++) { uint64_t location = bdev_label_positions[i]; - if (location > bdev->get_size()) { + if (location + BDEV_LABEL_BLOCK_SIZE > bdev->get_size()) { continue; } if (std::find( @@ -10427,11 +10427,13 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair) for (size_t i = 0; i < bdev_label_positions.size(); i++) { uint64_t position = bdev_label_positions[i]; uint64_t length = std::max(BDEV_LABEL_BLOCK_SIZE, alloc_size); - apply_for_bitset_range(position, length, alloc_size, used_blocks, - [&](uint64_t pos, mempool_dynamic_bitset& bs) { - bs.set(pos); - } - ); + if (position + length <= bdev->get_size()) { + apply_for_bitset_range(position, length, alloc_size, used_blocks, + [&](uint64_t pos, mempool_dynamic_bitset& bs) { + bs.set(pos); + } + ); + } } } -- 2.39.5