diff options
author | Alasdair Kergon <agk@redhat.com> | 2011-09-27 17:09:42 +0000 |
---|---|---|
committer | Alasdair Kergon <agk@redhat.com> | 2011-09-27 17:09:42 +0000 |
commit | 1c26860d825bd9293b146739b37a7461864ed68b (patch) | |
tree | 36bf3eb1afbc983f0f9cd87bdf2ba161db5e476d /lib | |
parent | 0ed2af7fb1fe458c545d775a5a13d779f2e69361 (diff) | |
download | lvm2-1c26860d825bd9293b146739b37a7461864ed68b.tar.gz lvm2-1c26860d825bd9293b146739b37a7461864ed68b.tar.xz lvm2-1c26860d825bd9293b146739b37a7461864ed68b.zip |
Abort if _finish_pvmove suspend_lvs fails instead of cleaning up incompletely.
Change suspend_lvs to call vg_revert internally.
Change vg_revert to void and remove superfluous calls after failed vg_commit.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/locking/locking.c | 11 | ||||
-rw-r--r-- | lib/locking/locking.h | 4 | ||||
-rw-r--r-- | lib/metadata/lv_manip.c | 5 | ||||
-rw-r--r-- | lib/metadata/metadata-exported.h | 2 | ||||
-rw-r--r-- | lib/metadata/metadata.c | 4 |
5 files changed, 15 insertions, 11 deletions
diff --git a/lib/locking/locking.c b/lib/locking/locking.c index ec8c0838..17fa3a8c 100644 --- a/lib/locking/locking.c +++ b/lib/locking/locking.c @@ -493,8 +493,13 @@ int resume_lvs(struct cmd_context *cmd, struct dm_list *lvs) return r; } -/* Lock a list of LVs */ -int suspend_lvs(struct cmd_context *cmd, struct dm_list *lvs) +/* + * Lock a list of LVs. + * On failure to lock any LV, calls vg_revert() if vg_to_revert is set and + * then unlocks any LVs on the list already successfully locked. + */ +int suspend_lvs(struct cmd_context *cmd, struct dm_list *lvs, + struct volume_group *vg_to_revert) { struct dm_list *lvh; struct lv_list *lvl; @@ -502,6 +507,8 @@ int suspend_lvs(struct cmd_context *cmd, struct dm_list *lvs) dm_list_iterate_items(lvl, lvs) { if (!suspend_lv(cmd, lvl->lv)) { log_error("Failed to suspend %s", lvl->lv->name); + if (vg_to_revert) + vg_revert(vg_to_revert); dm_list_uniterate(lvh, lvs, &lvl->list) { lvl = dm_list_item(lvh, struct lv_list); if (!resume_lv(cmd, lvl->lv)) diff --git a/lib/locking/locking.h b/lib/locking/locking.h index f8a2c251..69b31ee0 100644 --- a/lib/locking/locking.h +++ b/lib/locking/locking.h @@ -187,7 +187,9 @@ int sync_local_dev_names(struct cmd_context* cmd); int sync_dev_names(struct cmd_context* cmd); /* Process list of LVs */ -int suspend_lvs(struct cmd_context *cmd, struct dm_list *lvs); +struct volume_group; +int suspend_lvs(struct cmd_context *cmd, struct dm_list *lvs, + struct volume_group *vg_to_revert); int resume_lvs(struct cmd_context *cmd, struct dm_list *lvs); int activate_lvs(struct cmd_context *cmd, struct dm_list *lvs, unsigned exclusive); diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 06d809be..85241e7d 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -2793,11 +2793,8 @@ int lv_rename(struct cmd_context *cmd, struct logical_volume *lv, if (!vg_write(vg)) return 0; - - if (!suspend_lvs(cmd, &lvs_changed)) { - vg_revert(vg); + if (!suspend_lvs(cmd, &lvs_changed, vg)) goto_out; - } if (!(r = vg_commit(vg))) stack; diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index 2a10ef58..fe51e73a 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -400,7 +400,7 @@ void pvcreate_params_set_defaults(struct pvcreate_params *pp); */ int vg_write(struct volume_group *vg); int vg_commit(struct volume_group *vg); -int vg_revert(struct volume_group *vg); +void vg_revert(struct volume_group *vg); struct volume_group *vg_read_internal(struct cmd_context *cmd, const char *vg_name, const char *vgid, int warnings, int *consistent); struct physical_volume *pv_read(struct cmd_context *cmd, const char *pv_name, diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index cc920eee..e9894c5b 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -2685,7 +2685,7 @@ int vg_commit(struct volume_group *vg) } /* Don't commit any pending changes */ -int vg_revert(struct volume_group *vg) +void vg_revert(struct volume_group *vg) { struct metadata_area *mda; @@ -2701,8 +2701,6 @@ int vg_revert(struct volume_group *vg) "after reverted update for VG %s.", vg->name); remote_revert_cached_metadata(vg); - - return 1; } /* Make orphan PVs look like a VG */ |