1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00

Fix log allocation segfault (fix previous commits).

If there is no free area for log, code should break the loop.
(Otherwise it uses uninitializes areas later.)

Easily reproducible using lvconvert --repair
 - kill device with log
 - run lvconvert --repair vg/lv (with no PV usable for log)
This commit is contained in:
Milan Broz 2009-06-01 14:23:38 +00:00
parent c1fdeec999
commit 59d06d4dc7

View File

@ -1124,6 +1124,13 @@ static int _find_parallel_space(struct alloc_handle *ah, alloc_policy_t alloc,
if ((contiguous || cling) && (preferred_count < ix_offset)) if ((contiguous || cling) && (preferred_count < ix_offset))
break; break;
log_needs_allocating = (ah->log_count && !ah->log_area.len) ?
1 : 0;
if (ix + ix_offset < ah->area_count +
(log_needs_allocating ? ah->log_count : 0))
break;
/* sort the areas so we allocate from the biggest */ /* sort the areas so we allocate from the biggest */
if (ix > 1) if (ix > 1)
qsort(areas + ix_offset, ix, sizeof(*areas), qsort(areas + ix_offset, ix, sizeof(*areas),
@ -1136,9 +1143,6 @@ static int _find_parallel_space(struct alloc_handle *ah, alloc_policy_t alloc,
* FIXME decide which PV to use at top of function instead * FIXME decide which PV to use at top of function instead
*/ */
log_needs_allocating = (ah->log_count && !ah->log_area.len) ?
1 : 0;
too_small_for_log_count = 0; too_small_for_log_count = 0;
if (!log_needs_allocating) { if (!log_needs_allocating) {