mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-07 21:18:59 +03:00
o pv_setup for format1, this is the last one !
This commit is contained in:
parent
13c7b701b7
commit
88835ab641
@ -156,7 +156,7 @@ struct disk_list {
|
||||
* Layout constants.
|
||||
*/
|
||||
#define METADATA_ALIGN 4096UL
|
||||
#define PE_ALIGN 65536UL
|
||||
#define PE_ALIGN (65536UL / SECTOR_SIZE)
|
||||
|
||||
#define METADATA_BASE 0UL
|
||||
#define PV_SIZE 1024UL
|
||||
@ -167,6 +167,7 @@ struct disk_list {
|
||||
* Functions to calculate layout info.
|
||||
*/
|
||||
int calculate_layout(struct disk_list *dl);
|
||||
int calculate_extent_count(struct physical_volume *pv);
|
||||
|
||||
|
||||
/*
|
||||
|
@ -308,7 +308,32 @@ static struct list_head *_get_vgs(struct io_space *is)
|
||||
static int _pv_setup(struct io_space *is, struct physical_volume *pv,
|
||||
struct volume_group *vg)
|
||||
{
|
||||
log_err("format1:pv_setup not implemented.");
|
||||
if (!(pv->vg_name = pool_strdup(is->mem, vg->name))) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
pv->exported = NULL;
|
||||
|
||||
pv->status = ACTIVE;
|
||||
|
||||
if (!dev_get_size(pv->dev, &pv->size)) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
pv->pe_size = vg->extent_size;
|
||||
|
||||
/*
|
||||
* This works out pe_start and pe_count.
|
||||
*/
|
||||
if (!calculate_extent_count(pv)) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
pv->pe_allocated = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
#include "disk-rep.h"
|
||||
#include "log.h"
|
||||
#include "dbg_malloc.h"
|
||||
|
||||
|
||||
/*
|
||||
@ -45,14 +46,8 @@ static int _adjust_pe_on_disk(struct pv_disk *pvd)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* This assumes pe_count and pe_start have already
|
||||
* been calculated correctly.
|
||||
*/
|
||||
int calculate_layout(struct disk_list *dl)
|
||||
static void _calc_simple_layout(struct pv_disk *pvd)
|
||||
{
|
||||
struct pv_disk *pvd = &dl->pv;
|
||||
|
||||
pvd->pv_on_disk.base = METADATA_BASE;
|
||||
pvd->pv_on_disk.size = PV_SIZE;
|
||||
|
||||
@ -67,7 +62,17 @@ int calculate_layout(struct disk_list *dl)
|
||||
|
||||
pvd->pe_on_disk.base = _next_base(&pvd->lv_on_disk);
|
||||
pvd->pe_on_disk.size = pvd->pe_total * sizeof(struct pe_disk);
|
||||
}
|
||||
|
||||
/*
|
||||
* This assumes pe_count and pe_start have already
|
||||
* been calculated correctly.
|
||||
*/
|
||||
int calculate_layout(struct disk_list *dl)
|
||||
{
|
||||
struct pv_disk *pvd = &dl->pv;
|
||||
|
||||
_calc_simple_layout(pvd);
|
||||
if (!_adjust_pe_on_disk(pvd)) {
|
||||
log_err("insufficient space for metadata and PE's.");
|
||||
return 0;
|
||||
@ -77,3 +82,42 @@ int calculate_layout(struct disk_list *dl)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* It may seem strange to have a struct
|
||||
* physical_volume in here, but the number of
|
||||
* extents that can fit on a disk *is* metadata
|
||||
* format dependant.
|
||||
*/
|
||||
int calculate_extent_count(struct physical_volume *pv)
|
||||
{
|
||||
struct pv_disk *pvd = dbg_malloc(sizeof(*pvd));
|
||||
uint32_t end;
|
||||
|
||||
if (!pvd) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Guess how many extents will fit,
|
||||
* bearing in mind that one is going to be
|
||||
* knocked off at the start of the next
|
||||
* loop.
|
||||
*/
|
||||
pvd->pe_total = (pv->size / pv->pe_size);
|
||||
|
||||
do {
|
||||
pvd->pe_total--;
|
||||
_calc_simple_layout(pvd);
|
||||
end = ((pvd->pe_on_disk.base + pvd->pe_on_disk.size) /
|
||||
SECTOR_SIZE);
|
||||
|
||||
pvd->pe_start = _round_up(end, PE_ALIGN);
|
||||
|
||||
} while((pvd->pe_start + (pvd->pe_total * pv->pe_size)) > pv->size);
|
||||
|
||||
pv->pe_count = pvd->pe_total;
|
||||
pv->pe_start = pvd->pe_start;
|
||||
dbg_free(pvd);
|
||||
return 1;
|
||||
}
|
||||
|
@ -140,8 +140,9 @@ struct io_space {
|
||||
const char *pv_name);
|
||||
|
||||
/*
|
||||
* fill out a pv ready for importing into
|
||||
* a vg.
|
||||
* Fill out a pv ready for importing into
|
||||
* a vg. *Be careful*, this allocates
|
||||
* vg_name from is->mem.
|
||||
*/
|
||||
int (*pv_setup)(struct io_space *is, struct physical_volume *pv,
|
||||
struct volume_group *vg);
|
||||
|
Loading…
Reference in New Issue
Block a user