[lvm-devel] [PATCH] Test that all snapshots are not open before deactivating volume.
Mike Snitzer
snitzer at redhat.com
Tue Sep 29 14:46:30 UTC 2009
Test that all snapshots are not open before deactivating volume.
This prevents very weird misbehavior when we have closed origin, open snapshot
and deactivate the origin with lvchange -an or vgchange -an command --- the
origin is closed, the snapshot remains open and cannot be deactivated.
There is still race condition if the snapshot is open immediately after the
test, but it is inevitable --- and the patch prevents misbehavior in most common
case.
Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>
Reviewed-by: Mike Snitzer <snitzer at redhat.com>
---
lib/activate/activate.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
Index: lvm2/lib/activate/activate.c
===================================================================
--- lvm2.orig/lib/activate/activate.c
+++ lvm2/lib/activate/activate.c
@@ -1001,10 +1001,28 @@ int lv_deactivate(struct cmd_context *cm
goto out;
}
- if (info.open_count && lv_is_visible(lv)) {
- log_error("LV %s/%s in use: not deactivating", lv->vg->name,
- lv->name);
- goto out;
+ if (lv_is_visible(lv)) {
+ if (info.open_count) {
+ log_error("LV %s/%s in use: not deactivating",
+ lv->vg->name, lv->name);
+ goto out;
+ }
+ if (lv_is_origin(lv)) {
+ struct lv_segment *snap_seg;
+ dm_list_iterate_items_gen(snap_seg, &lv->snapshot_segs,
+ origin_list) {
+ struct logical_volume *snap = snap_seg->cow;
+ if (!lv_info(cmd, snap, &info, 1, 0))
+ goto out;
+
+ if (info.exists && info.open_count) {
+ log_error("LV %s/%s has open snapshot %s: "
+ "not deactivating",
+ lv->vg->name, lv->name, snap->name);
+ goto out;
+ }
+ }
+ }
}
lv_calculate_readahead(lv, NULL);
More information about the lvm-devel
mailing list