[lvm-devel] LVM2/lib/metadata lv_manip.c
Zdenek Kabelac
zkabelac at redhat.com
Fri Mar 25 22:10:38 UTC 2011
Dne 25.3.2011 23:02, jbrassow at sourceware.org napsal(a):
> CVSROOT: /cvs/lvm2
> Module name: LVM2
> Changes by: jbrassow at sourceware.org 2011-03-25 22:02:27
>
> Modified files:
> lib/metadata : lv_manip.c
>
> Log message:
> Fix unhandled condition in _move_lv_segments
>
> If _move_lv_segments is passed a 'lv_from' that does not yet
> have any segments, it will screw things up because the code
> that does the segment copy assumes there is at least one
> segment. See copy code here:
> lv_to->segments = lv_from->segments;
> lv_to->segments.n->p = &lv_to->segments;
> lv_to->segments.p->n = &lv_to->segments;
>
> If 'segments' is an empty list, the first statement copies over
> the values, but the next two reset those values to point to the
> other LV's list structure. 'lv_to' now appears to have one
> segment, but it is really an ill-set pointer.
>
> Patches:
> http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/lv_manip.c.diff?cvsroot=lvm2&r1=1.251&r2=1.252
>
> --- LVM2/lib/metadata/lv_manip.c 2011/02/28 19:53:03 1.251
> +++ LVM2/lib/metadata/lv_manip.c 2011/03/25 22:02:27 1.252
> @@ -2950,7 +2950,8 @@
> }
> }
>
> - lv_to->segments = lv_from->segments;
> + if (!dm_list_empty(&lv_from->segments))
> + lv_to->segments = lv_from->segments;
> lv_to->segments.n->p = &lv_to->segments;
> lv_to->segments.p->n = &lv_to->segments;
>
Sounds like you actually want to use:
dm_list_splice(&lv_to->segments, &lv_from->segments);
(there are probably more area where splice should be use for move operations
in the code).
Zdenek
More information about the lvm-devel
mailing list