[lvm-devel] Don't allow resizing of internal logical volumes
Mikulas Patocka
mpatocka at redhat.com
Fri Mar 19 22:27:29 UTC 2010
On Fri, 19 Mar 2010, Mike Snitzer wrote:
> On Thu, Mar 18 2010 at 7:53pm -0400,
> Mikulas Patocka <mpatocka at redhat.com> wrote:
>
> > Hi
> >
> > This patch prevents resizing of internal volumes.
> >
> > BTW.: do you think that *-shared should be treated as a reseved logical
> > volume name?
> > It is really the internal volume name, but the potential problem with it
> > is that there may be some systems with existing names *-shared, and
> > reserving the name breaks those systems.
> >
> > Mikulas
> >
> > ---
> >
> > Don't allow resizing of internal logical volumes.
> >
> > This patch prevents lvresize from being able to resize internal LVs: mirror
> > legs (*_mimage_*), mirror log (*_mlog), snapshot placeholder LVs (snapshot*)
> > and others. Resizing these would leads to unexpected metadata and sometimes
> > crashes (in case of growing snapshot*).
> >
> > Note that test for VISIBLE_LV is not sufficient because snapshot0 volumes
> > have the VISIBLE_LV flag set. So we test the name instead of the flags.
>
> OK, but snapshotX volumes are part of the LVM2 snapshot "fiction". They
> never get exposed to the end user (even with lvs -a). Only the user
> facing snapshot LV name gets exposed:
> # lvs test/snapshot0
> One or more specified logical volume(s) not found.
> # lvs test/testlv1_snap
> LV VG Attr LSize Origin Snap% Move Log Copy% Convert
> testlv1_snap test swi-a- 4.00g testlv1
>
> As such we shouldn't have to worry about the user attempting to resize
> the hidden snapshotX volume. Am I still missing something?
If you do lvresize vgs/snapshot0, it allows it. If you extend it, it
crashes. Try it. snapshotX isn't visible enen with "a", but for lvresize
it exists.
> That said the LVM2 snapshot "fiction" is really unfortunate. Keeps
> getting in the way (mostly a mental barrier for me; quite unnatural).
I don't like it too. At least, if it were named "snapshot-cow" and
"snapshot" to be consistent with dm device names...
> > Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>
> >
> > ---
> > tools/lvresize.c | 5 +++++
> > 1 file changed, 5 insertions(+)
> >
> > Index: LVM2/tools/lvresize.c
> > ===================================================================
> > --- LVM2.orig/tools/lvresize.c 2010-03-19 00:25:31.000000000 +0100
> > +++ LVM2/tools/lvresize.c 2010-03-19 00:44:52.000000000 +0100
> > @@ -323,6 +323,11 @@ static int _lvresize(struct cmd_context
> >
> > lv = lvl->lv;
> >
> > + if (is_reserved_lvname(lv->name)) {
> > + log_error("Can't resize internal logical volume %s", lv->name);
> > + return ECMD_FAILED;
> > + }
> > +
> > if (lv->status & LOCKED) {
> > log_error("Can't resize locked LV %s", lv->name);
> > return ECMD_FAILED;
>
> Given my recent ACCESS_HIDDEN_LV patch here:
> http://people.redhat.com/msnitzer/patches/multisnap/lvm2/LVM2-2.02.63/lvm-shared-add-ACCESS_HIDDEN_LV-flag.patch
>
> I was thinking we'd just have something like this:
>
> diff --git a/tools/lvresize.c b/tools/lvresize.c
> index 849fd2e..f08be60 100644
> --- a/tools/lvresize.c
> +++ b/tools/lvresize.c
> @@ -323,6 +323,11 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
>
> lv = lvl->lv;
>
> + if (!lv_is_visible(lv) && !lv_is_accessible_hidden(lv)) {
> + log_error("Can't resize internal logical volume %s", lv->name);
> + return ECMD_FAILED;
> + }
> +
> if (lv->status & LOCKED) {
> log_error("Can't resize locked LV %s", lv->name);
> return ECMD_FAILED;
>
OK. It is cleaner than my patch that checks the name, so commit it (except
!lv_is_accessible_hidden(lv), because that has to wait until we commit
shared snapshots).
I tested it and it refuses "snapshotX" volumes.
Mikulas
More information about the lvm-devel
mailing list