From 1e65fdd9ba00ab249ab07d8b5815c398ded556e3 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Wed, 4 Mar 2015 11:30:53 -0600 Subject: system_id: make new VGs read-only for old lvm versions Previous versions of lvm will not obey the restrictions imposed by the new system_id, and would allow such a VG to be written. So, a VG with a new system_id is further changed to force previous lvm versions to treat it as read-only. This is done by removing the WRITE flag from the metadata status line of these VGs, and putting a new WRITE_LOCKED flag in the flags line of the metadata. Versions of lvm that recognize WRITE_LOCKED, also obey the new system_id. For these lvm versions, WRITE_LOCKED is identical to WRITE, and the rules associated with matching system_id's are imposed. A new VG lock_type field is also added that causes the same WRITE/WRITE_LOCKED transformation when set. A previous version of lvm will also see a VG with lock_type as read-only. Versions of lvm that recognize WRITE_LOCKED, must also obey the lock_type setting. Until the lock_type feature is added, lvm will fail to read any VG with lock_type set and report an error about an unsupported lock_type. Once the lock_type feature is added, lvm will allow VGs with lock_type to be used according to the rules imposed by the lock_type. When both system_id and lock_type settings are removed, a VG is written with the old WRITE status flag, and without the new WRITE_LOCKED flag. This allows old versions of lvm to use the VG as before. --- lib/format1/disk-rep.h | 2 ++ lib/format1/import-export.c | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) (limited to 'lib/format1') diff --git a/lib/format1/disk-rep.h b/lib/format1/disk-rep.h index 9d1c8a5cc..37f728255 100644 --- a/lib/format1/disk-rep.h +++ b/lib/format1/disk-rep.h @@ -41,6 +41,7 @@ #define VG_WRITE 0x02 /* " */ #define VG_CLUSTERED 0x04 /* " */ #define VG_SHARED 0x08 /* " */ +#define VG_WRITE_LOCKED 0x10 /* " */ /* logical volume */ #define LV_ACTIVE 0x01 /* lv_status */ @@ -51,6 +52,7 @@ #define LV_WRITE 0x02 /* " */ #define LV_SNAPSHOT 0x04 /* " */ #define LV_SNAPSHOT_ORG 0x08 /* " */ +#define LV_WRITE_LOCKED 0x10 /* " */ #define LV_BADBLOCK_ON 0x01 /* lv_badblock */ diff --git a/lib/format1/import-export.c b/lib/format1/import-export.c index 9b387e2a1..b898e65b6 100644 --- a/lib/format1/import-export.c +++ b/lib/format1/import-export.c @@ -242,6 +242,9 @@ int import_vg(struct dm_pool *mem, if (vgd->vg_access & VG_WRITE) vg->status |= LVM_WRITE; + if (vgd->vg_access & VG_WRITE_LOCKED) + vg->status |= LVM_WRITE; + if (vgd->vg_access & VG_CLUSTERED) vg->status |= CLUSTERED; @@ -266,9 +269,12 @@ int export_vg(struct vg_disk *vgd, struct volume_group *vg) if (vg->status & LVM_READ) vgd->vg_access |= VG_READ; - if (vg->status & LVM_WRITE) + if ((vg->status & LVM_WRITE) && !vg_flag_write_locked(vg)) vgd->vg_access |= VG_WRITE; + if ((vg->status & LVM_WRITE) && vg_flag_write_locked(vg)) + vgd->vg_access |= VG_WRITE_LOCKED; + if (vg_is_clustered(vg)) vgd->vg_access |= VG_CLUSTERED; @@ -320,6 +326,9 @@ int import_lv(struct cmd_context *cmd, struct dm_pool *mem, if (lvd->lv_access & LV_WRITE) lv->status |= LVM_WRITE; + if (lvd->lv_access & LV_WRITE_LOCKED) + lv->status |= LVM_WRITE; + if (lvd->lv_badblock) lv->status |= BADBLOCK_ON; @@ -352,9 +361,12 @@ static void _export_lv(struct lv_disk *lvd, struct volume_group *vg, if (lv->status & LVM_READ) lvd->lv_access |= LV_READ; - if (lv->status & LVM_WRITE) + if ((lv->status & LVM_WRITE) && !vg_flag_write_locked(vg)) lvd->lv_access |= LV_WRITE; + if ((lv->status & LVM_WRITE) && vg_flag_write_locked(vg)) + lvd->lv_access |= LV_WRITE_LOCKED; + if (lv->status & SPINDOWN_LV) lvd->lv_status |= LV_SPINDOWN; -- cgit v1.2.1