Test that all snapshots are not open before we deactivate 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 immediatelly after the test, but it is inevitable --- and the patch prevents misbehavior in most common case. Signed-off-by: Mikulas Patocka --- lib/activate/activate.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) Index: LVM2.2.02.48/lib/activate/activate.c =================================================================== --- LVM2.2.02.48.orig/lib/activate/activate.c 2009-06-01 14:43:32.000000000 +0200 +++ LVM2.2.02.48/lib/activate/activate.c 2009-07-08 17:37:47.000000000 +0200 @@ -1001,10 +1001,25 @@ 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);