diff options
author | Alasdair Kergon <agk@redhat.com> | 2008-04-08 12:49:21 +0000 |
---|---|---|
committer | Alasdair Kergon <agk@redhat.com> | 2008-04-08 12:49:21 +0000 |
commit | 6eb44b50913ae83449fef735dd9f356de2cb710a (patch) | |
tree | 4344136298268095e8e8c729c43fceb8f28a7440 /tools | |
parent | ad607a23f16ceda1824ed12462ccc557c85085e5 (diff) | |
download | lvm2-6eb44b50913ae83449fef735dd9f356de2cb710a.tar.gz lvm2-6eb44b50913ae83449fef735dd9f356de2cb710a.tar.xz lvm2-6eb44b50913ae83449fef735dd9f356de2cb710a.zip |
Fix vgreduce to use vg_split_mdas to check sufficient mdas remain.
Add (empty) orphan VGs to lvmcache during initialisation.
Fix orphan VG name used for format_pool.
Diffstat (limited to 'tools')
-rw-r--r-- | tools/lvmcmdline.c | 2 | ||||
-rw-r--r-- | tools/pvcreate.c | 2 | ||||
-rw-r--r-- | tools/pvscan.c | 2 | ||||
-rw-r--r-- | tools/vgreduce.c | 29 | ||||
-rw-r--r-- | tools/vgrename.c | 2 | ||||
-rw-r--r-- | tools/vgscan.c | 2 |
6 files changed, 33 insertions, 6 deletions
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c index 95dbae03..bb3fdaec 100644 --- a/tools/lvmcmdline.c +++ b/tools/lvmcmdline.c @@ -938,7 +938,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv) out: if (test_mode()) { log_verbose("Test mode: Wiping internal cache"); - lvmcache_destroy(); + lvmcache_destroy(cmd, 1); } if (cmd->cft_override) { diff --git a/tools/pvcreate.c b/tools/pvcreate.c index 1a5baef0..5661e2ee 100644 --- a/tools/pvcreate.c +++ b/tools/pvcreate.c @@ -81,7 +81,7 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name) unlock_vg(cmd, VG_ORPHANS); persistent_filter_wipe(cmd->filter); - lvmcache_destroy(); + lvmcache_destroy(cmd, 1); init_md_filtering(0); if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) { diff --git a/tools/pvscan.c b/tools/pvscan.c index bbe606c1..519720fc 100644 --- a/tools/pvscan.c +++ b/tools/pvscan.c @@ -130,7 +130,7 @@ int pvscan(struct cmd_context *cmd, int argc __attribute((unused)), } persistent_filter_wipe(cmd->filter); - lvmcache_destroy(); + lvmcache_destroy(cmd, 1); log_verbose("Walking through all physical volumes"); if (!(pvslist = get_pvs(cmd))) { diff --git a/tools/vgreduce.c b/tools/vgreduce.c index ccda5d96..5e613824 100644 --- a/tools/vgreduce.c +++ b/tools/vgreduce.c @@ -353,6 +353,8 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg, void *handle __attribute((unused))) { struct pv_list *pvl; + struct volume_group *orphan_vg; + int consistent = 1; const char *name = pv_dev_name(pv); if (pv_pe_alloc_count(pv)) { @@ -366,10 +368,17 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg, return ECMD_FAILED; } + if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE | LCK_NONBLOCK)) { + log_error("Can't get lock for orphan PVs"); + return ECMD_FAILED; + } + pvl = find_pv_in_vg(vg, name); - if (!archive(vg)) + if (!archive(vg)) { + unlock_vg(cmd, VG_ORPHANS); return ECMD_FAILED; + } log_verbose("Removing \"%s\" from volume group \"%s\"", name, vg->name); @@ -381,6 +390,7 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg, if (!dev_get_size(pv_dev(pv), &pv->size)) { log_error("%s: Couldn't get size.", pv_dev_name(pv)); + unlock_vg(cmd, VG_ORPHANS); return ECMD_FAILED; } @@ -388,9 +398,24 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg, vg->free_count -= pv_pe_count(pv) - pv_pe_alloc_count(pv); vg->extent_count -= pv_pe_count(pv); + if(!(orphan_vg = vg_read(cmd, vg->fid->fmt->orphan_vg_name, NULL, &consistent)) || + !consistent) { + log_error("Unable to read existing orphan PVs"); + unlock_vg(cmd, VG_ORPHANS); + return ECMD_FAILED; + } + + if (!vg_split_mdas(cmd, vg, orphan_vg) || !vg->pv_count) { + log_error("Cannot remove final metadata area on \"%s\" from \"%s\"", + name, vg->name); + unlock_vg(cmd, VG_ORPHANS); + return ECMD_FAILED; + } + if (!vg_write(vg) || !vg_commit(vg)) { log_error("Removal of physical volume \"%s\" from " "\"%s\" failed", name, vg->name); + unlock_vg(cmd, VG_ORPHANS); return ECMD_FAILED; } @@ -398,9 +423,11 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg, log_error("Failed to clear metadata from physical " "volume \"%s\" " "after removal from \"%s\"", name, vg->name); + unlock_vg(cmd, VG_ORPHANS); return ECMD_FAILED; } + unlock_vg(cmd, VG_ORPHANS); backup(vg); log_print("Removed \"%s\" from volume group \"%s\"", name, vg->name); diff --git a/tools/vgrename.c b/tools/vgrename.c index 6cdfaf2a..03acbee0 100644 --- a/tools/vgrename.c +++ b/tools/vgrename.c @@ -151,7 +151,7 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path, /* FIXME lvmcache corruption - vginfo duplicated instead of renamed */ persistent_filter_wipe(cmd->filter); - lvmcache_destroy(); + lvmcache_destroy(cmd, 1); return 1; diff --git a/tools/vgscan.c b/tools/vgscan.c index e444e8d0..3a0258c2 100644 --- a/tools/vgscan.c +++ b/tools/vgscan.c @@ -57,7 +57,7 @@ int vgscan(struct cmd_context *cmd, int argc, char **argv) } persistent_filter_wipe(cmd->filter); - lvmcache_destroy(); + lvmcache_destroy(cmd, 1); log_print("Reading all physical volumes. This may take a while..."); |