1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-03 05:18:29 +03:00

Attempt to fix non-ALLOC_ANYWHERE allocation code after recent changes broke

The preference given to the PVs with the largest free areas.
This commit is contained in:
Alasdair Kergon 2010-03-31 20:26:04 +00:00
parent d7cbaae1fd
commit bce2869d92

View File

@ -877,8 +877,8 @@ static int _for_each_pv(struct cmd_context *cmd, struct logical_volume *lv,
static int _comp_area(const void *l, const void *r) static int _comp_area(const void *l, const void *r)
{ {
const struct pv_area_used *lhs = *((const struct pv_area_used * const *) l); const struct pv_area_used *lhs = (const struct pv_area_used *) l;
const struct pv_area_used *rhs = *((const struct pv_area_used * const *) r); const struct pv_area_used *rhs = (const struct pv_area_used *) r;
if (lhs->used < rhs->used) if (lhs->used < rhs->used)
return 1; return 1;
@ -1166,10 +1166,7 @@ static int _find_parallel_space(struct alloc_handle *ah, alloc_policy_t alloc,
already_found_one = 1; already_found_one = 1;
} }
if (ix + ix_offset - 1 < ah->area_count)
required = (max_parallel - *allocated) / ah->area_multiple; required = (max_parallel - *allocated) / ah->area_multiple;
else
required = ah->log_len;
if (alloc == ALLOC_ANYWHERE) { if (alloc == ALLOC_ANYWHERE) {
/* /*
@ -1177,6 +1174,8 @@ static int _find_parallel_space(struct alloc_handle *ah, alloc_policy_t alloc,
* into two or more parts. If the whole stripe doesn't fit, * into two or more parts. If the whole stripe doesn't fit,
* reduce amount we're looking for. * reduce amount we're looking for.
*/ */
if (ix + ix_offset - 1 >= ah->area_count)
required = ah->log_len;
if (required >= pva->unreserved) { if (required >= pva->unreserved) {
required = pva->unreserved; required = pva->unreserved;
pva->unreserved = 0; pva->unreserved = 0;
@ -1200,7 +1199,8 @@ static int _find_parallel_space(struct alloc_handle *ah, alloc_policy_t alloc,
(alloc == ALLOC_ANYWHERE) ? pva->unreserved : pva->count - required); (alloc == ALLOC_ANYWHERE) ? pva->unreserved : pva->count - required);
} }
next_pv: next_pv:
if (ix + ix_offset >= ah->area_count + (log_needs_allocating ? ah->log_area_count : 0)) if (alloc == ALLOC_ANYWHERE &&
ix + ix_offset >= ah->area_count + (log_needs_allocating ? ah->log_area_count : 0))
break; break;
} }
} while (alloc == ALLOC_ANYWHERE && last_ix != ix && ix < ah->area_count + (log_needs_allocating ? ah->log_area_count : 0)); } while (alloc == ALLOC_ANYWHERE && last_ix != ix && ix < ah->area_count + (log_needs_allocating ? ah->log_area_count : 0));