diff --git a/WHATS_NEW b/WHATS_NEW index 07c3e3843..43b14f6ac 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.48 - =============================== + Fix rename of active snapshot with virtual origin. Fix convert polling to ignore LV with different UUID. Cache underlying device readahead only before activation calls. Fix segfault when calculating readahead on missing device in vgreduce. diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index fcfd30d15..e4f1ad1bb 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -1765,6 +1765,8 @@ int lv_rename(struct cmd_context *cmd, struct logical_volume *lv, { struct volume_group *vg = lv->vg; struct lv_names lv_names; + DM_LIST_INIT(lvs_changed); + struct lv_list lvl, lvl2; int r = 0; /* rename is not allowed on sub LVs */ @@ -1799,22 +1801,27 @@ int lv_rename(struct cmd_context *cmd, struct logical_volume *lv, return 0; } + lvl.lv = lv; + dm_list_add(&lvs_changed, &lvl.list); + + /* rename active virtual origin too */ + if (lv_is_cow(lv) && lv_is_virtual_origin(lvl2.lv = origin_from_cow(lv))) + dm_list_add(&lvs_changed, &lvl2.list); + log_verbose("Writing out updated volume group"); if (!vg_write(vg)) return 0; - if (!suspend_lv(cmd, lv)) { + + if (!suspend_lvs(cmd, &lvs_changed)) { vg_revert(vg); goto_out; } - if (!vg_commit(vg)) { - resume_lv(cmd, lv); - goto_out; - } + if (!(r = vg_commit(vg))) + stack; - resume_lv(cmd, lv); - r = 1; + resume_lvs(cmd, &lvs_changed); out: backup(vg); return r; diff --git a/test/t-lvcreate-usage.sh b/test/t-lvcreate-usage.sh index 43cf71672..d947023ce 100755 --- a/test/t-lvcreate-usage.sh +++ b/test/t-lvcreate-usage.sh @@ -116,3 +116,10 @@ lvcreate -L 32M -n $lv --regionsize 4M -m 1 $vg check_lv_field_ $vg/$lv regionsize "4.00M" lvremove -ff $vg +# snapshot with virtual origin works +lvcreate -s --virtualoriginsize 64M -L 32M -n $lv1 $vg +lvrename $vg/$lv1 $vg/$lv2 +lvcreate -s --virtualoriginsize 64M -L 32M -n $lv1 $vg +lvchange -a n $vg/$lv1 +lvremove $vg/$lv1 +lvremove -ff $vg