[lvm-devel] [PATCH 2 of 5] LVM: New function - lv_is_on_pv

Jonathan Brassow jbrassow at redhat.com
Wed Aug 3 14:50:55 UTC 2011


forgive the mistake.  I had originally called the function lv_is_on_pv, but
changed it to pv_is_in_lv to match the existing function pv_is_in_vg...

The header and subject should have said 'pv_is_in_lv'.
 brassow

On Aug 3, 2011, at 9:43 AM, Jonathan Brassow wrote:

> lv_is_on_pv - A useful function when devices are specified for removal from RAID
> 
> This function should also be useful for mirror down-converting.
> 
> Signed-off-by: Jonathan Brassow <jbrassow at redhat.com>
> 
> Index: LVM2/lib/metadata/lv_manip.c
> ===================================================================
> --- LVM2.orig/lib/metadata/lv_manip.c
> +++ LVM2/lib/metadata/lv_manip.c
> @@ -3513,6 +3513,61 @@ static int _match_seg_area_to_pe_range(s
> }
> 
> /*
> + * pv_is_in_lv
> + * @lv:
> + * @pv:
> + *
> + * If any of the component devices of the LV are on the given PV, 1
> + * is returned; otherwise 0.  For example if one of the images of a mirror
> + * (or its log) is on the PV, 1 would be returned for the top-level LV.
> + * If you wish to check the images themselves, you should pass them.
> + */
> +int pv_is_in_lv(struct logical_volume *lv, struct physical_volume *pv)
> +{
> +	uint32_t s;
> +	struct physical_volume *pv2;
> +	struct lv_segment *seg;
> +
> +	if (!lv)
> +		return 0;
> +
> +	seg = first_seg(lv);
> +	if (!seg)
> +		return 0;
> +
> +	/* Check mirror log */
> +	if (pv_is_in_lv(seg->log_lv, pv))
> +		return 1;
> +
> +	/* Check stack of LVs */
> +	dm_list_iterate_items(seg, &lv->segments) {
> +		for (s = 0; s < seg->area_count; s++) {
> +			if (seg_type(seg, s) == AREA_PV) {
> +				pv2 = seg_pv(seg, s);
> +				if (id_equal(&pv->id, &pv2->id))
> +					return 1;
> +				if (pv->dev && pv2->dev &&
> +				    (pv->dev->dev == pv2->dev->dev))
> +					return 1;
> +			}
> +
> +			if ((seg_type(seg, s) == AREA_LV) &&
> +			    pv_is_in_lv(seg_lv(seg, s), pv))
> +				return 1;
> +
> +			if (!seg_is_raid(seg))
> +				continue;
> +
> +			/* This is RAID, so we know the meta_area is AREA_LV */
> +			if (pv_is_in_lv(seg_metalv(seg, s), pv))
> +				return 1;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
> +/*
>  * For each segment in lv_where that uses a PV in pvl directly,
>  * split the segment if it spans more than one underlying PV.
>  */
> Index: LVM2/lib/metadata/metadata-exported.h
> ===================================================================
> --- LVM2.orig/lib/metadata/metadata-exported.h
> +++ LVM2/lib/metadata/metadata-exported.h
> @@ -645,6 +645,7 @@ int lv_is_merging_cow(const struct logic
> int lv_is_visible(const struct logical_volume *lv);
> 
> int pv_is_in_vg(struct volume_group *vg, struct physical_volume *pv);
> +int pv_is_in_lv(struct logical_volume *lv, struct physical_volume *pv);
> 
> struct lv_segment *find_merging_cow(const struct logical_volume *origin);
> 
> 
> 
> 
> --
> lvm-devel mailing list
> lvm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/lvm-devel





More information about the lvm-devel mailing list