mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
allocator: fix thin-pool allocation
When allocating thin-pool with more then 1 device - try to allocate 'metadataLV' with reuse of log-type allocation for mirror LV. It should be naturally place on other device then 'dataLV'. However due to somewhat hard to follow allocation logic code, it's been rejected allocation in cases where there was not enough space for data or metadata on single PV, thus to successed, usage of segments was mandatory. While user may use: allocation/thin_pool_metadata_require_separate_pvs=1 to enforce separe meta and data LV - on default settings, this is not enable thus segment allocation is meant to work. NOTE: As already said - the original intention of this whole 'if()' is unclear, so try to split this test into multiple more simple tests that are more readable. TODO: more validation.
This commit is contained in:
parent
c96400b6c7
commit
b697aa9646
@ -2966,12 +2966,14 @@ static int _find_some_parallel_space(struct alloc_handle *ah,
|
||||
(*(alloc_state->areas + alloc_state->num_positional_areas + ix - 1 -
|
||||
too_small_for_log_count)).used < ah->log_len)
|
||||
too_small_for_log_count++;
|
||||
ix_log_offset = alloc_state->num_positional_areas + ix - too_small_for_log_count - ah->log_area_count;
|
||||
if (ah->mirror_logs_separate && (too_small_for_log_count >= devices_needed))
|
||||
return 1;
|
||||
if ((alloc_state->num_positional_areas + ix) < (too_small_for_log_count + ah->log_area_count))
|
||||
return 1;
|
||||
ix_log_offset = alloc_state->num_positional_areas + ix - (too_small_for_log_count + ah->log_area_count);
|
||||
}
|
||||
|
||||
if (ix + alloc_state->num_positional_areas < devices_needed +
|
||||
(alloc_state->log_area_count_still_needed ? alloc_state->log_area_count_still_needed +
|
||||
too_small_for_log_count : 0))
|
||||
if (ix + alloc_state->num_positional_areas < devices_needed)
|
||||
return 1;
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user