2001-11-05 19:41:38 +03:00
/*
2004-03-30 23:35:44 +04:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-21 00:55:30 +04:00
* Copyright ( C ) 2004 - 2006 Red Hat , Inc . All rights reserved .
2001-11-05 19:41:38 +03:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2007-08-21 00:55:30 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2004-03-30 23:35:44 +04:00
*
2007-08-21 00:55:30 +04:00
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 23:35:44 +04:00
* along with this program ; if not , write to the Free Software Foundation ,
2016-01-21 13:49:46 +03:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2001-11-05 19:41:38 +03:00
*/
# ifndef _LVM_PV_MAP_H
# define _LVM_PV_MAP_H
2018-05-14 12:30:20 +03:00
# include "lib/metadata/metadata.h"
2001-11-05 19:41:38 +03:00
/*
* The in core rep . only stores a mapping from
* logical extents to physical extents against an
* lv . Sometimes , when allocating a new lv for
* instance , it is useful to have the inverse
* mapping available .
*/
struct pv_area {
2001-11-29 21:45:35 +03:00
struct pv_map * map ;
2001-11-05 19:41:38 +03:00
uint32_t start ;
uint32_t count ;
2012-02-01 06:10:45 +04:00
/* Number of extents unreserved during a single allocation pass. */
2010-03-26 00:19:26 +03:00
uint32_t unreserved ;
2008-11-04 01:14:30 +03:00
struct dm_list list ; /* pv_map.areas */
2001-11-05 19:41:38 +03:00
} ;
2010-03-25 05:31:48 +03:00
/*
* When building up a potential group of " parallel " extent ranges during
* an allocation attempt , track the maximum number of extents that may
* need to be used as a particular parallel area . Several of these
* structs may reference the same pv_area , but ' used ' may differ between
2010-03-25 05:40:09 +03:00
* them . The sum of all the ' used ' variables referring to the same
* pv_area may not exceed that area ' s count , so we cannot allocate the
* same extents twice .
2010-03-25 05:31:48 +03:00
*/
struct pv_area_used {
struct pv_area * pva ;
uint32_t used ;
} ;
2001-11-05 19:41:38 +03:00
struct pv_map {
2005-05-11 19:02:49 +04:00
struct physical_volume * pv ;
2008-11-04 01:14:30 +03:00
struct dm_list areas ; /* struct pv_areas */
2006-10-23 19:54:51 +04:00
uint32_t pe_count ; /* Total number of PEs */
2001-11-05 19:41:38 +03:00
2008-11-04 01:14:30 +03:00
struct dm_list list ;
2001-11-05 19:41:38 +03:00
} ;
2005-05-11 19:02:49 +04:00
/*
* Find intersection between available_pvs and free space in VG
*/
2008-11-04 01:14:30 +03:00
struct dm_list * create_pv_maps ( struct dm_pool * mem , struct volume_group * vg ,
struct dm_list * allocatable_pvs ) ;
2001-11-05 19:41:38 +03:00
2017-07-20 20:13:32 +03:00
void consume_pv_area ( struct pv_area * pva , uint32_t to_go ) ;
2012-02-01 06:10:45 +04:00
void reinsert_changed_pv_area ( struct pv_area * pva ) ;
2001-11-29 21:45:35 +03:00
2008-11-04 01:14:30 +03:00
uint32_t pv_maps_size ( struct dm_list * pvms ) ;
2006-10-23 19:54:51 +04:00
2001-11-05 19:41:38 +03:00
# endif