1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-03-10 16:58:47 +03:00

Start refactoring pvmove allocation code.

This commit is contained in:
Alasdair Kergon 2007-11-22 13:57:21 +00:00
parent 94e33a6ca3
commit 3da4613d7b
2 changed files with 37 additions and 23 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.29 - Version 2.02.29 -
================================== ==================================
Refactor pvmove allocation code.
Decode cluster locking state in log message. Decode cluster locking state in log message.
Change file locking state messages from debug to very verbose. Change file locking state messages from debug to very verbose.
Fix --addtag to drop @ prefix from name. Fix --addtag to drop @ prefix from name.

View File

@ -532,6 +532,37 @@ int add_mirror_layers(struct alloc_handle *ah,
return lv_add_more_mirrored_areas(lv, img_lvs, num_mirrors, 0); return lv_add_more_mirrored_areas(lv, img_lvs, num_mirrors, 0);
} }
static int _alloc_and_insert_pvmove_seg(struct logical_volume *lv_mirr,
struct lv_segment *seg, uint32_t s,
struct list *allocatable_pvs,
alloc_policy_t alloc,
const struct segment_type *segtype)
{
struct physical_volume *pv = seg_pv(seg, s);
uint32_t start_le = lv_mirr->le_count;
uint32_t pe = seg_pe(seg, s);
log_very_verbose("Moving %s:%u-%u of %s/%s", pv_dev_name(pv),
pe, pe + seg->area_len - 1,
seg->lv->vg->name, seg->lv->name);
release_lv_segment_area(seg, s, seg->area_len);
if (!lv_extend(lv_mirr, segtype, 1,
seg->area_len, 0u, seg->area_len,
pv, pe,
PVMOVE, allocatable_pvs,
alloc)) {
log_error("Unable to allocate "
"temporary LV for pvmove.");
return 0;
}
set_lv_segment_area_lv(seg, s, lv_mirr, start_le, 0);
return 1;
}
/* /*
* Replace any LV segments on given PV with temporary mirror. * Replace any LV segments on given PV with temporary mirror.
* Returns list of LVs changed. * Returns list of LVs changed.
@ -547,10 +578,8 @@ int insert_pvmove_mirrors(struct cmd_context *cmd,
struct lv_segment *seg; struct lv_segment *seg;
struct lv_list *lvl; struct lv_list *lvl;
struct pv_list *pvl; struct pv_list *pvl;
struct physical_volume *pv;
uint32_t pe;
int lv_used = 0; int lv_used = 0;
uint32_t s, start_le, extent_count = 0u; uint32_t s, extent_count = 0u;
const struct segment_type *segtype; const struct segment_type *segtype;
struct pe_range *per; struct pe_range *per;
uint32_t pe_start, pe_end, per_end, stripe_multiplier; uint32_t pe_start, pe_end, per_end, stripe_multiplier;
@ -648,27 +677,11 @@ int insert_pvmove_mirrors(struct cmd_context *cmd,
lv_used = 1; lv_used = 1;
} }
pv = seg_pv(seg, s); if (!_alloc_and_insert_pvmove_seg(lv_mirr, seg, s,
pe = seg_pe(seg, s); allocatable_pvs,
log_very_verbose("Moving %s:%u-%u of %s/%s", alloc, segtype))
pv_dev_name(pvl->pv), return_0;
pe, pe + seg->area_len - 1,
lv->vg->name, lv->name);
start_le = lv_mirr->le_count;
/* FIXME Clean this up */
release_lv_segment_area(seg, s, seg->area_len);
if (!lv_extend(lv_mirr, segtype, 1,
seg->area_len, 0u, seg->area_len,
pv, pe,
PVMOVE, allocatable_pvs,
alloc)) {
log_error("Unable to allocate "
"temporary LV for pvmove.");
return 0;
}
set_lv_segment_area_lv(seg, s, lv_mirr, start_le, 0);
extent_count += seg->area_len; extent_count += seg->area_len;
lv->status |= LOCKED; lv->status |= LOCKED;