From: Adam Kupczyk Date: Tue, 15 Oct 2024 12:41:22 +0000 (+0000) Subject: os/bluestore: Fix repair of multilabel when collides with BlueFS X-Git-Tag: testing/wip-vshankar-testing-20241106.074359-squid-debug~61^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=7570b3423b472f109910bc05baf9864180856240;p=ceph-ci.git os/bluestore: Fix repair of multilabel when collides with BlueFS The problem was that BDEV_FIRST_LABEL_POSITION was removed from bdev_label_valid_locations set. Now, if label at BDEV_FIRST_LABEL_POSITION is valid, it is in the set. Fixes: https://tracker.ceph.com/issues/68558 Signed-off-by: Adam Kupczyk (cherry picked from commit 7343be720870d4a5f82b55beee4685457a003067) --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index c883f6fb7db..206faa7bf85 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -6738,9 +6738,8 @@ void BlueStore::_main_bdev_label_try_reserve() vector candidate_positions; vector accepted_positions; uint64_t lsize = std::max(BDEV_LABEL_BLOCK_SIZE, min_alloc_size); - for (size_t i = 1; i < bdev_label_positions.size(); i++) { - uint64_t location = bdev_label_positions[i]; - if (location + lsize <= bdev->get_size()) { + for (uint64_t location : bdev_label_valid_locations) { + if (location != BDEV_FIRST_LABEL_POSITION) { candidate_positions.push_back(location); } } @@ -11226,9 +11225,7 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair) string p = path + "/block"; _write_bdev_label(cct, bdev, p, bdev_label, bdev_labels_in_repair); for (uint64_t pos : bdev_labels_in_repair) { - if (pos != BDEV_FIRST_LABEL_POSITION) { - bdev_label_valid_locations.push_back(pos); - } + bdev_label_valid_locations.push_back(pos); } repaired += bdev_labels_in_repair.size(); }