mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
thin: fix merge of old snaphost
Fix merging of old snapshot into thinvolume origin. Add also internal error for the error case when merging requests activation of merged LV.
This commit is contained in:
parent
f33a224ef0
commit
25cea92338
@ -1,5 +1,6 @@
|
|||||||
Version 2.02.106 -
|
Version 2.02.106 -
|
||||||
====================================
|
====================================
|
||||||
|
Fix merging of old snapshot into thin volume origin.
|
||||||
Use --ignoreskippedcluster in lvm2-monitor initscript/systemd unit.
|
Use --ignoreskippedcluster in lvm2-monitor initscript/systemd unit.
|
||||||
Do not use VG read/write state for LV read/write state.
|
Do not use VG read/write state for LV read/write state.
|
||||||
Use --ignoreskippedcluster in activation systemd units if use_lvmetad=0.
|
Use --ignoreskippedcluster in activation systemd units if use_lvmetad=0.
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include "lib.h"
|
#include "lib.h"
|
||||||
#include "metadata.h"
|
#include "metadata.h"
|
||||||
|
#include "segtype.h"
|
||||||
#include "locking.h"
|
#include "locking.h"
|
||||||
#include "toolcontext.h"
|
#include "toolcontext.h"
|
||||||
#include "lv_alloc.h"
|
#include "lv_alloc.h"
|
||||||
@ -151,7 +152,7 @@ void init_snapshot_merge(struct lv_segment *snap_seg,
|
|||||||
origin->snapshot = snap_seg;
|
origin->snapshot = snap_seg;
|
||||||
origin->status |= MERGING;
|
origin->status |= MERGING;
|
||||||
|
|
||||||
if (lv_is_thin_volume(origin)) {
|
if (seg_is_thin_volume(snap_seg)) {
|
||||||
snap_seg->merge_lv = origin;
|
snap_seg->merge_lv = origin;
|
||||||
/* Making thin LV inivisible with regular log */
|
/* Making thin LV inivisible with regular log */
|
||||||
lv_set_hidden(snap_seg->lv);
|
lv_set_hidden(snap_seg->lv);
|
||||||
|
@ -542,18 +542,19 @@ static int _thin_add_target_line(struct dev_manager *dm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!laopts->no_merging) {
|
if (!laopts->no_merging) {
|
||||||
|
if (seg->merge_lv) {
|
||||||
|
log_error(INTERNAL_ERROR "Failed to add merged segment of %s.",
|
||||||
|
seg->lv->name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* merge support for thinp snapshots is implemented by
|
* merge support for thinp snapshots is implemented by
|
||||||
* simply swapping the thinp device_id of the snapshot
|
* simply swapping the thinp device_id of the snapshot
|
||||||
* and origin.
|
* and origin.
|
||||||
*/
|
*/
|
||||||
if (seg->merge_lv) {
|
if (lv_is_merging_origin(seg->lv) && seg_is_thin_volume(find_snapshot(seg->lv)))
|
||||||
/* snapshot, use merging lv's device_id */
|
|
||||||
device_id = first_seg(seg->merge_lv)->device_id;
|
|
||||||
} else if (lv_is_merging_origin(seg->lv)) {
|
|
||||||
/* origin, use merging snapshot's device_id */
|
/* origin, use merging snapshot's device_id */
|
||||||
device_id = find_snapshot(seg->lv)->device_id;
|
device_id = find_snapshot(seg->lv)->device_id;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dm_tree_node_add_thin_target(node, len, pool_dlid, device_id))
|
if (!dm_tree_node_add_thin_target(node, len, pool_dlid, device_id))
|
||||||
|
@ -13,7 +13,8 @@
|
|||||||
|
|
||||||
. lib/test
|
. lib/test
|
||||||
|
|
||||||
which mkfs.ext2 || skip
|
MKFS=mkfs.ext2
|
||||||
|
which $MKFS || skip
|
||||||
which fsck || skip
|
which fsck || skip
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -27,13 +28,13 @@ lvcreate -T -L8M $vg/pool -V10M -n $lv1
|
|||||||
lvchange --addtag tagL $vg/$lv1
|
lvchange --addtag tagL $vg/$lv1
|
||||||
|
|
||||||
mkdir mnt
|
mkdir mnt
|
||||||
mkfs.ext2 $DM_DEV_DIR/$vg/$lv1
|
$MKFS $DM_DEV_DIR/$vg/$lv1
|
||||||
mount $DM_DEV_DIR/$vg/$lv1 mnt
|
mount $DM_DEV_DIR/$vg/$lv1 mnt
|
||||||
touch mnt/test
|
touch mnt/test
|
||||||
|
|
||||||
lvcreate -K -s -n snap --addtag tagS $vg/$lv1
|
lvcreate -K -s -n snap --addtag tagS $vg/$lv1
|
||||||
mkdir mntsnap
|
mkdir mntsnap
|
||||||
mkfs.ext2 $DM_DEV_DIR/$vg/snap
|
$MKFS $DM_DEV_DIR/$vg/snap
|
||||||
mount $DM_DEV_DIR/$vg/snap mntsnap
|
mount $DM_DEV_DIR/$vg/snap mntsnap
|
||||||
touch mntsnap/test_snap
|
touch mntsnap/test_snap
|
||||||
|
|
||||||
@ -82,7 +83,7 @@ lvchange -ay $vg/$lv1
|
|||||||
check lv_exists $vg $lv1
|
check lv_exists $vg $lv1
|
||||||
check lv_field $vg/$lv1 thin_id "2"
|
check lv_field $vg/$lv1 thin_id "2"
|
||||||
check lv_field $vg/$lv1 tags "tagL"
|
check lv_field $vg/$lv1 tags "tagL"
|
||||||
not check lv_exists $vg snap
|
check lv_not_exists $vg snap
|
||||||
|
|
||||||
fsck -n $DM_DEV_DIR/$vg/$lv1
|
fsck -n $DM_DEV_DIR/$vg/$lv1
|
||||||
mount $DM_DEV_DIR/$vg/$lv1 mnt
|
mount $DM_DEV_DIR/$vg/$lv1 mnt
|
||||||
@ -97,8 +98,10 @@ lvcreate -s -n snap $vg/$lv1
|
|||||||
# Also add old snapshot to thin origin
|
# Also add old snapshot to thin origin
|
||||||
lvcreate -s -L10 -n oldsnapof_${lv1} $vg/$lv1
|
lvcreate -s -L10 -n oldsnapof_${lv1} $vg/$lv1
|
||||||
not lvconvert --merge $vg/snap
|
not lvconvert --merge $vg/snap
|
||||||
lvremove -f $vg/oldsnapof_${lv1}
|
$MKFS $DM_DEV_DIR/$vg/oldsnapof_${lv1}
|
||||||
|
lvconvert --merge $vg/oldsnapof_${lv1}
|
||||||
|
fsck -n $DM_DEV_DIR/$vg/$lv1
|
||||||
|
check lv_not_exists $vg oldsnapof_${lv1}
|
||||||
# Add old snapshot to thin snapshot
|
# Add old snapshot to thin snapshot
|
||||||
lvcreate -s -L10 -n oldsnapof_snap $vg/snap
|
lvcreate -s -L10 -n oldsnapof_snap $vg/snap
|
||||||
lvconvert --merge $vg/snap
|
lvconvert --merge $vg/snap
|
||||||
|
@ -897,7 +897,7 @@ int lvconvert_poll(struct cmd_context *cmd, struct logical_volume *lv,
|
|||||||
|
|
||||||
if (lv_is_merging_origin(lv))
|
if (lv_is_merging_origin(lv))
|
||||||
return poll_daemon(cmd, lv_full_name, uuid, background, 0,
|
return poll_daemon(cmd, lv_full_name, uuid, background, 0,
|
||||||
lv_is_thin_volume(lv) ?
|
seg_is_thin_volume(find_snapshot(lv)) ?
|
||||||
&_lvconvert_thin_merge_fns : &_lvconvert_merge_fns,
|
&_lvconvert_thin_merge_fns : &_lvconvert_merge_fns,
|
||||||
"Merged");
|
"Merged");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user