diff options
author | Alasdair Kergon <agk@redhat.com> | 2002-02-11 15:42:34 +0000 |
---|---|---|
committer | Alasdair Kergon <agk@redhat.com> | 2002-02-11 15:42:34 +0000 |
commit | 7d0e6e800e41fd13a5dc51ef05de8298b30b7432 (patch) | |
tree | 51be3b97d6a751fed2fc643ce52dac6ad91f50ec /tools/vgmerge.c | |
parent | 713599407cc26d5e60889e828b923ed06f156ca0 (diff) | |
download | lvm2-7d0e6e800e41fd13a5dc51ef05de8298b30b7432.tar.gz lvm2-7d0e6e800e41fd13a5dc51ef05de8298b30b7432.tar.xz lvm2-7d0e6e800e41fd13a5dc51ef05de8298b30b7432.zip |
o Support locking with local lock files
o Disable control-c during updates (except if blocked waiting for a lock)
Diffstat (limited to 'tools/vgmerge.c')
-rw-r--r-- | tools/vgmerge.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/tools/vgmerge.c b/tools/vgmerge.c index eefa4f87..9c134f0e 100644 --- a/tools/vgmerge.c +++ b/tools/vgmerge.c @@ -58,41 +58,55 @@ int vgmerge_single(const char *vg_name_to, const char *vg_name_from) } log_verbose("Checking for volume group \"%s\"", vg_name_to); + if (!lock_vol(vg_name_to, LCK_VG | LCK_WRITE)) { + log_error("Can't get lock for %s", vg_name_to); + return ECMD_FAILED; + } + if (!(vg_to = fid->ops->vg_read(fid, vg_name_to))) { log_error("Volume group \"%s\" doesn't exist", vg_name_to); + lock_vol(vg_name_to, LCK_VG | LCK_NONE); return ECMD_FAILED; } if (vg_to->status & EXPORTED_VG) { log_error("Volume group \"%s\" is exported", vg_to->name); + lock_vol(vg_name_to, LCK_VG | LCK_NONE); return ECMD_FAILED; } if (!(vg_to->status & LVM_WRITE)) { log_error("Volume group \"%s\" is read-only", vg_to->name); + lock_vol(vg_name_to, LCK_VG | LCK_NONE); return ECMD_FAILED; } log_verbose("Checking for volume group \"%s\"", vg_name_from); + if (!lock_vol(vg_name_from, LCK_VG | LCK_WRITE | LCK_NONBLOCK)) { + log_error("Can't get lock for %s", vg_name_from); + lock_vol(vg_name_to, LCK_VG | LCK_NONE); + return ECMD_FAILED; + } + if (!(vg_from = fid->ops->vg_read(fid, vg_name_from))) { log_error("Volume group \"%s\" doesn't exist", vg_name_from); - return ECMD_FAILED; + goto error; } if (vg_from->status & EXPORTED_VG) { log_error("Volume group \"%s\" is exported", vg_from->name); - return ECMD_FAILED; + goto error; } if (!(vg_from->status & LVM_WRITE)) { log_error("Volume group \"%s\" is read-only", vg_from->name); - return ECMD_FAILED; + goto error; } if ((active = lvs_in_vg_activated(vg_from))) { log_error("Logical volumes in \"%s\" must be inactive", vg_name_from); - return ECMD_FAILED; + goto error; } /* Check compatibility */ @@ -100,21 +114,21 @@ int vgmerge_single(const char *vg_name_to, const char *vg_name_from) log_error("Extent sizes differ: %d (%s) and %d (%s)", vg_to->extent_size, vg_to->name, vg_from->extent_size, vg_from->name); - return ECMD_FAILED; + goto error; } if (vg_to->max_pv < vg_to->pv_count + vg_from->pv_count) { log_error("Maximum number of physical volumes (%d) exceeded " " for \"%s\" and \"%s\"", vg_to->max_pv, vg_to->name, vg_from->name); - return ECMD_FAILED; + goto error; } if (vg_to->max_lv < vg_to->lv_count + vg_from->lv_count) { log_error("Maximum number of logical volumes (%d) exceeded " " for \"%s\" and \"%s\"", vg_to->max_lv, vg_to->name, vg_from->name); - return ECMD_FAILED; + goto error; } /* Check no conflicts with LV names */ @@ -131,7 +145,7 @@ int vgmerge_single(const char *vg_name_to, const char *vg_name_from) "in \"%s\" and \"%s\"", name1, vg_to->name, vg_from->name); - return ECMD_FAILED; + goto error; } } } @@ -139,7 +153,7 @@ int vgmerge_single(const char *vg_name_to, const char *vg_name_from) /* FIXME List arg: vg_show_with_pv_and_lv(vg_to); */ if (!archive(vg_from) || !archive(vg_to)) - return ECMD_FAILED; + goto error; /* Merge volume groups */ while (!list_empty(&vg_from->pvs)) { @@ -168,14 +182,22 @@ int vgmerge_single(const char *vg_name_to, const char *vg_name_from) /* store it on disks */ log_verbose("Writing out updated volume group"); if (!(fid->ops->vg_write(fid, vg_to))) { - return ECMD_FAILED; + goto error; } /* FIXME Remove /dev/vgfrom */ backup(vg_to); + lock_vol(vg_name_from, LCK_VG | LCK_NONE); + lock_vol(vg_name_to, LCK_VG | LCK_NONE); + log_print("Volume group \"%s\" successfully merged into \"%s\"", vg_from->name, vg_to->name); return 0; + + error: + lock_vol(vg_name_from, LCK_VG | LCK_NONE); + lock_vol(vg_name_to, LCK_VG | LCK_NONE); + return ECMD_FAILED; } |