[lvm-devel] [PATCH 5/7] Introduce lv_set_visible & lv_set_hidden and use lv_is_visible always.
Petr Rockai
prockai at redhat.com
Sun May 10 19:23:20 UTC 2009
This patch does improve upon the previous one with regards to the consistency
of lv_count handling (to the point of addressing most of my concerns with
previous).
Milan Broz <mbroz at redhat.com> writes:
> The vg->lv_count parameter now includes always number of visible logical
> volumes.
The patch does as advertised.
> Note that virtual snapshot volume (snapshotX) is never visible,
> but it is stored in metadata with visible flag, so code
> use exception here.
The & SNAPSHOT logic is a little dubious, but seems to be a sufficient solution
to the issue at hand.
Overall, seems good enough to me,
Acked-By: Petr Rockai <prockai at redhat.com>
> diff --git a/lib/metadata/snapshot_manip.c b/lib/metadata/snapshot_manip.c
> index cc57aeb..852ad76 100644
> --- a/lib/metadata/snapshot_manip.c
> +++ b/lib/metadata/snapshot_manip.c
> @@ -30,8 +30,11 @@ int lv_is_cow(const struct logical_volume *lv)
>
> int lv_is_visible(const struct logical_volume *lv)
> {
> + if (lv->status & SNAPSHOT)
> + return 0;
> +
> if (lv_is_cow(lv))
> - return lv_is_visible(find_cow(lv)->lv);
> + return lv_is_visible(origin_from_cow(lv));
>
> return lv->status & VISIBLE_LV ? 1 : 0;
> }
Why is the latter change included here? Doesn't seem to be directly related to
the rest of the patch (although I might just be missing something).
> /* FIXME Assumes an invisible origin belongs to a sparse device */
> - if (!lv_is_visible(origin))
> + if (!lv_is_visible(origin)) {
> + origin->vg->lv_count--;
> origin->status |= VIRTUAL_ORIGIN;
> + }
>
> dm_list_add(&origin->snapshot_segs, &seg->origin_list);
>
> @@ -130,10 +133,15 @@ int vg_remove_snapshot(struct logical_volume *cow)
> return 0;
> }
>
> - cow->snapshot = NULL;
> + /*
> + * Virtual snapshot volume was removed
> + * LV count must be fixed...
> + */
> + if (!lv_is_virtual_origin(cow->snapshot->origin))
> + cow->vg->lv_count--;
These two are ugly hacks again, and spill the lv_count manipulation (and
knowledge) out of the supposed keeper functions (set visible/hidden, vg
add/remove). Nevertheless, it's hard to tell how to fix this more cleanly.
> diff --git a/lib/snapshot/snapshot.c b/lib/snapshot/snapshot.c
> index ad5d158..4dc7111 100644
> --- a/lib/snapshot/snapshot.c
> +++ b/lib/snapshot/snapshot.c
> @@ -78,17 +78,14 @@ static int _snap_text_import(struct lv_segment *seg, const struct config_node *s
> seg->origin = org;
> seg->cow = cow;
>
> - // FIXME: direct count manipulation to be removed later
> - cow->status &= ~VISIBLE_LV;
> - cow->vg->lv_count--;
> cow->snapshot = seg;
> -
> org->origin_count++;
> - org->vg->lv_count--;
>
> /* FIXME Assumes an invisible origin belongs to a sparse device */
> - if (!lv_is_visible(org))
> + if (!lv_is_visible(org)) {
> + org->vg->lv_count--;
Same as above.
> org->status |= VIRTUAL_ORIGIN;
> + }
Yours,
Petr.
--
Peter Rockai | me()mornfall!net | prockai()redhat!com
http://blog.mornfall.net | http://web.mornfall.net
"In My Egotistical Opinion, most people's C programs should be
indented six feet downward and covered with dirt."
-- Blair P. Houghton on the subject of C program indentation
More information about the lvm-devel
mailing list