--- lib/metadata/lv_alloc.h | 3 ++- lib/metadata/lv_manip.c | 6 ++++-- lib/metadata/metadata-exported.h | 1 + lib/metadata/snapshot_manip.c | 10 ++++------ lib/multisnapshot/multisnapshot.c | 2 +- tools/lvcreate.c | 3 ++- 6 files changed, 14 insertions(+), 11 deletions(-) Index: LVM2.2.02.45/lib/metadata/lv_alloc.h =================================================================== --- LVM2.2.02.45.orig/lib/metadata/lv_alloc.h 2009-05-19 21:19:01.000000000 +0200 +++ LVM2.2.02.45/lib/metadata/lv_alloc.h 2009-05-19 21:19:03.000000000 +0200 @@ -29,7 +29,8 @@ struct lv_segment *alloc_lv_segment(stru uint32_t extents_copied); struct lv_segment *alloc_snapshot_seg(struct logical_volume *lv, - uint32_t status, uint32_t old_le_count); + uint32_t status, uint32_t old_le_count, + uint32_t snapshot_flags); int set_lv_segment_area_pv(struct lv_segment *seg, uint32_t area_num, struct physical_volume *pv, uint32_t pe); Index: LVM2.2.02.45/lib/metadata/lv_manip.c =================================================================== --- LVM2.2.02.45.orig/lib/metadata/lv_manip.c 2009-05-19 21:19:01.000000000 +0200 +++ LVM2.2.02.45/lib/metadata/lv_manip.c 2009-05-19 21:19:03.000000000 +0200 @@ -212,12 +212,14 @@ struct lv_segment *alloc_lv_segment(stru } struct lv_segment *alloc_snapshot_seg(struct logical_volume *lv, - uint32_t status, uint32_t old_le_count) + uint32_t status, uint32_t old_le_count, + uint32_t snapshot_flags) { struct lv_segment *seg; const struct segment_type *segtype; - segtype = get_segtype_from_string(lv->vg->cmd, "snapshot"); + segtype = get_segtype_from_string(lv->vg->cmd, + snapshot_flags & SNAPSHOT_SHARED ? "multisnapshot" : "snapshot"); if (!segtype) { log_error("Failed to find snapshot segtype"); return NULL; Index: LVM2.2.02.45/lib/metadata/metadata-exported.h =================================================================== --- LVM2.2.02.45.orig/lib/metadata/metadata-exported.h 2009-05-19 21:19:01.000000000 +0200 +++ LVM2.2.02.45/lib/metadata/metadata-exported.h 2009-05-19 21:19:03.000000000 +0200 @@ -72,6 +72,7 @@ struct pv_segment; #define CONVERTING 0x00400000U /* LV */ #define SNAPSHOT_MERGE 0x00800000U /* SEG */ #define SNAPSHOT_MERGE_ON_ACT 0x01000000U /* SEG */ +#define SNAPSHOT_SHARED 0x02000000U /* SEG */ #define MISSING_PV 0x00800000U /* PV */ #define PARTIAL_LV 0x01000000U /* LV - derived flag, not Index: LVM2.2.02.45/lib/metadata/snapshot_manip.c =================================================================== --- LVM2.2.02.45.orig/lib/metadata/snapshot_manip.c 2009-05-19 21:19:01.000000000 +0200 +++ LVM2.2.02.45/lib/metadata/snapshot_manip.c 2009-05-19 21:19:03.000000000 +0200 @@ -89,19 +89,17 @@ int vg_add_snapshot(const char *name, st snap->le_count = extent_count; - if (!(seg = alloc_snapshot_seg(snap, 0, 0))) + if (!(seg = alloc_snapshot_seg(snap, 0, 0, snapshot_flags))) return_0; seg->chunk_size = chunk_size; seg->origin = origin; seg->cow = cow; seg->lv->status |= SNAPSHOT; - if (snapshot_flags & SNAPSHOT_MERGE) { - seg->status |= SNAPSHOT_MERGE; + if (snapshot_flags & SNAPSHOT_MERGE) origin->merging_snapshot = seg; - } - if (snapshot_flags & SNAPSHOT_MERGE_ON_ACT) - seg->status |= SNAPSHOT_MERGE_ON_ACT; + seg->status |= snapshot_flags & + (SNAPSHOT_MERGE | SNAPSHOT_MERGE_ON_ACT | SNAPSHOT_SHARED); origin->origin_count++; origin->vg->snapshot_count++; Index: LVM2.2.02.45/tools/lvcreate.c =================================================================== --- LVM2.2.02.45.orig/tools/lvcreate.c 2009-05-19 21:19:01.000000000 +0200 +++ LVM2.2.02.45/tools/lvcreate.c 2009-05-19 21:19:03.000000000 +0200 @@ -855,7 +855,8 @@ static int _lvcreate(struct cmd_context /* cow LV remains active and becomes snapshot LV */ if (!vg_add_snapshot(NULL, org, lv, NULL, - org->le_count, lp->chunk_size, 0)) { + org->le_count, lp->chunk_size, + lp->shared_store ? SNAPSHOT_SHARED : 0)) { log_error("Couldn't create snapshot."); return 0; } Index: LVM2.2.02.45/lib/multisnapshot/multisnapshot.c =================================================================== --- LVM2.2.02.45.orig/lib/multisnapshot/multisnapshot.c 2009-05-19 21:19:01.000000000 +0200 +++ LVM2.2.02.45/lib/multisnapshot/multisnapshot.c 2009-05-19 21:19:03.000000000 +0200 @@ -75,7 +75,7 @@ static int _snap_text_import(struct lv_s if (!vg_add_snapshot(seg->lv->name, org, cow, &seg->lv->lvid, seg->len, chunk_size, - 0)) + SNAPSHOT_SHARED)) return_0; return 1;