diff options
author | Adam Kupczyk <akupczyk@ibm.com> | 2025-01-17 09:31:15 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-17 09:31:15 +0100 |
commit | 91591a65ee3cec9774f6934516b7e80eba8afa07 (patch) | |
tree | ea96ca85390e54f8a587d954cdb2694d2a1a1ce9 /src | |
parent | Merge pull request #61369 from laimis9133/patch-2 (diff) | |
parent | os/bluestore: Fix CBT bluefs-bdev-expand (diff) | |
download | ceph-91591a65ee3cec9774f6934516b7e80eba8afa07.tar.xz ceph-91591a65ee3cec9774f6934516b7e80eba8afa07.zip |
Merge pull request #60363 from aclamk/wip-aclamk-fix-bluefs-bdev-expand
os/bluestore: Create additional bdev labels when expanding block device.
Diffstat (limited to 'src')
-rw-r--r-- | src/os/bluestore/BlueStore.cc | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 25e6c4fe596..8f1d995fa8d 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -6930,8 +6930,19 @@ int BlueStore::_check_main_bdev_label() return -EIO; } if (bluestore_bdev_label_require_all && r != 0) { - derr << __func__ << " not all labels read properly" << dendl; - return -EIO; + // We are about to complain that some labels failed. + // But in case if we expanded block device some labels will not be good. + uint64_t lsize = std::max(BDEV_LABEL_BLOCK_SIZE, min_alloc_size); + uint32_t valid_locations = 0; + for (uint64_t loc : bdev_label_positions) { + if (loc + lsize <= bdev_label.size) { + ++valid_locations; + } + } + if (valid_locations != bdev_label_valid_locations.size()) { + derr << __func__ << " not all labels read properly" << dendl; + return -EIO; + } } return 0; } @@ -8967,11 +8978,25 @@ int BlueStore::expand_devices(ostream& out) _close_db_and_around(); // mount in read/write to sync expansion changes + if (bdev_label_multi) { + // We need not do fsck, because we can be broken - size is increased, + // but we might not have labels set. + cct->_conf.set_val_or_die("bluestore_fsck_on_mount", "false"); + } r = _mount(); ceph_assert(r == 0); if (fm && fm->is_null_manager()) { // we grow the allocation range, must reflect it in the allocation file alloc->init_add_free(size0, size - size0); + if (bdev_label_multi) { + uint64_t lsize = std::max(BDEV_LABEL_BLOCK_SIZE, min_alloc_size); + for (uint64_t loc : bdev_label_positions) { + if ((loc >= size0) && (loc + lsize <= size)) { + bdev_label_valid_locations.push_back(loc); + } + } + _write_bdev_label(cct, bdev, path + "/block", bdev_label, bdev_label_valid_locations); + } need_to_destage_allocation_file = true; } umount(); |