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.
|
* Layout constants.
|
||||||
*/
|
*/
|
||||||
#define METADATA_ALIGN 4096UL
|
#define METADATA_ALIGN 4096UL
|
||||||
#define PE_ALIGN 65536UL
|
#define PE_ALIGN (65536UL / SECTOR_SIZE)
|
||||||
|
|
||||||
#define METADATA_BASE 0UL
|
#define METADATA_BASE 0UL
|
||||||
#define PV_SIZE 1024UL
|
#define PV_SIZE 1024UL
|
||||||
@ -167,6 +167,7 @@ struct disk_list {
|
|||||||
* Functions to calculate layout info.
|
* Functions to calculate layout info.
|
||||||
*/
|
*/
|
||||||
int calculate_layout(struct disk_list *dl);
|
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,
|
static int _pv_setup(struct io_space *is, struct physical_volume *pv,
|
||||||
struct volume_group *vg)
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "disk-rep.h"
|
#include "disk-rep.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "dbg_malloc.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -45,14 +46,8 @@ static int _adjust_pe_on_disk(struct pv_disk *pvd)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static void _calc_simple_layout(struct pv_disk *pvd)
|
||||||
* 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;
|
|
||||||
|
|
||||||
pvd->pv_on_disk.base = METADATA_BASE;
|
pvd->pv_on_disk.base = METADATA_BASE;
|
||||||
pvd->pv_on_disk.size = PV_SIZE;
|
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.base = _next_base(&pvd->lv_on_disk);
|
||||||
pvd->pe_on_disk.size = pvd->pe_total * sizeof(struct pe_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)) {
|
if (!_adjust_pe_on_disk(pvd)) {
|
||||||
log_err("insufficient space for metadata and PE's.");
|
log_err("insufficient space for metadata and PE's.");
|
||||||
return 0;
|
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);
|
const char *pv_name);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* fill out a pv ready for importing into
|
* Fill out a pv ready for importing into
|
||||||
* a vg.
|
* a vg. *Be careful*, this allocates
|
||||||
|
* vg_name from is->mem.
|
||||||
*/
|
*/
|
||||||
int (*pv_setup)(struct io_space *is, struct physical_volume *pv,
|
int (*pv_setup)(struct io_space *is, struct physical_volume *pv,
|
||||||
struct volume_group *vg);
|
struct volume_group *vg);
|
||||||
|
Loading…
Reference in New Issue
Block a user