diff options
author | David Teigland <teigland@redhat.com> | 2015-03-04 11:30:53 -0600 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2015-03-05 09:50:43 -0600 |
commit | 1e65fdd9ba00ab249ab07d8b5815c398ded556e3 (patch) | |
tree | 112dc2b75db551b5b747775b7ecc5c41e176c390 /lib/format1 | |
parent | c6a57dc4f3af6aa8912fc1f969937e3e3c47f725 (diff) | |
download | lvm2-1e65fdd9ba00ab249ab07d8b5815c398ded556e3.tar.gz |
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.
Diffstat (limited to 'lib/format1')
-rw-r--r-- | lib/format1/disk-rep.h | 2 | ||||
-rw-r--r-- | lib/format1/import-export.c | 16 |
2 files changed, 16 insertions, 2 deletions
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; |