mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-03 05:18:29 +03:00
o pv_Read works
This commit is contained in:
parent
4c9c080e07
commit
47bd29840d
@ -2,7 +2,6 @@
|
|||||||
* Copyright (C) 2001 Sistina Software (UK) Limited.
|
* Copyright (C) 2001 Sistina Software (UK) Limited.
|
||||||
*
|
*
|
||||||
* This file is released under the GPL.
|
* This file is released under the GPL.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "disk-rep.h"
|
#include "disk-rep.h"
|
||||||
|
@ -50,45 +50,53 @@ static int _import_vg(struct pool *mem,
|
|||||||
return first ? 1 : 0;
|
return first ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _import_pv(struct pool *mem,
|
||||||
|
struct disk_list *dl, struct physical_volume *pv)
|
||||||
|
{
|
||||||
|
memset(pv, 0, sizeof(*pv));
|
||||||
|
memcpy(&pv->id, &dl->pv.pv_uuid, ID_LEN);
|
||||||
|
|
||||||
|
pv->dev = dl->dev;
|
||||||
|
pv->vg_name = pool_strdup(mem, dl->pv.vg_name);
|
||||||
|
|
||||||
|
if (!pv->vg_name) {
|
||||||
|
stack;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: finish
|
||||||
|
//pv->exported = ??;
|
||||||
|
pv->status = dl->pv.pv_status;
|
||||||
|
pv->size = dl->pv.pv_size;
|
||||||
|
pv->pe_size = dl->pv.pv_size;
|
||||||
|
pv->pe_start = dl->pv.pe_start;
|
||||||
|
pv->pe_count = dl->pv.pe_total;
|
||||||
|
pv->pe_allocated = dl->pv.pe_allocated;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int _import_pvs(struct pool *mem, struct list_head *pvs,
|
static int _import_pvs(struct pool *mem, struct list_head *pvs,
|
||||||
struct list_head *results, int *count)
|
struct list_head *results, int *count)
|
||||||
{
|
{
|
||||||
struct list_head *tmp;
|
struct list_head *tmp;
|
||||||
struct disk_list *dl;
|
struct disk_list *dl;
|
||||||
struct pv_list *pvl;
|
struct pv_list *pvl;
|
||||||
struct physical_volume *pv;
|
|
||||||
|
|
||||||
*count = 0;
|
*count = 0;
|
||||||
list_for_each(tmp, pvs) {
|
list_for_each(tmp, pvs) {
|
||||||
dl = list_entry(tmp, struct disk_list, list);
|
dl = list_entry(tmp, struct disk_list, list);
|
||||||
pvl = pool_alloc(mem, sizeof(*pvl));
|
pvl = pool_alloc(mem, sizeof(*pvl));
|
||||||
memset(pvl, 0, sizeof(*pvl));
|
|
||||||
|
|
||||||
if (!pvl) {
|
if (!pvl) {
|
||||||
stack;
|
stack;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pv = &pvl->pv;
|
if (!_import_pv(mem, dl, &pvl->pv)) {
|
||||||
memcpy(&pv->id, &dl->pv.pv_uuid, ID_LEN);
|
|
||||||
|
|
||||||
pv->dev = dl->dev;
|
|
||||||
pv->vg_name = pool_strdup(mem, dl->pv.vg_name);
|
|
||||||
|
|
||||||
if (!pv->vg_name) {
|
|
||||||
stack;
|
stack;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: finish
|
|
||||||
//pv->exported = ??;
|
|
||||||
pv->status = dl->pv.pv_status;
|
|
||||||
pv->size = dl->pv.pv_size;
|
|
||||||
pv->pe_size = dl->pv.pv_size;
|
|
||||||
pv->pe_start = dl->pv.pe_start;
|
|
||||||
pv->pe_count = dl->pv.pe_total;
|
|
||||||
pv->pe_allocated = dl->pv.pe_allocated;
|
|
||||||
|
|
||||||
list_add(&pvl->list, results);
|
list_add(&pvl->list, results);
|
||||||
(*count)++;
|
(*count)++;
|
||||||
}
|
}
|
||||||
@ -362,6 +370,41 @@ static int _vg_write(struct io_space *is, struct volume_group *vg)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static struct physical_volume *_pv_read(struct io_space *is,
|
||||||
|
struct device *dev)
|
||||||
|
{
|
||||||
|
struct pool *mem = pool_create(1024);
|
||||||
|
struct physical_volume *pv;
|
||||||
|
struct disk_list *dl;
|
||||||
|
|
||||||
|
if (!mem) {
|
||||||
|
stack;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dl = read_pv(dev, mem, NULL))) {
|
||||||
|
stack;
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(pv = pool_alloc(is->mem, sizeof(*pv)))) {
|
||||||
|
stack;
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_import_pv(is->mem, dl, pv)) {
|
||||||
|
stack;
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
|
||||||
|
pool_destroy(mem);
|
||||||
|
return pv;
|
||||||
|
|
||||||
|
bad:
|
||||||
|
pool_destroy(mem);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static struct list_head *_get_pvs(struct io_space *is)
|
static struct list_head *_get_pvs(struct io_space *is)
|
||||||
{
|
{
|
||||||
struct pool *mem = pool_create(1024 * 10);
|
struct pool *mem = pool_create(1024 * 10);
|
||||||
@ -413,7 +456,7 @@ struct io_space *create_lvm1_format(const char *prefix, struct pool *mem,
|
|||||||
|
|
||||||
ios->get_vgs = NULL;
|
ios->get_vgs = NULL;
|
||||||
ios->get_pvs = _get_pvs;
|
ios->get_pvs = _get_pvs;
|
||||||
ios->pv_read = NULL;
|
ios->pv_read = _pv_read;
|
||||||
ios->pv_write = NULL;
|
ios->pv_write = NULL;
|
||||||
ios->vg_read = _vg_read;
|
ios->vg_read = _vg_read;
|
||||||
ios->vg_write = NULL;
|
ios->vg_write = NULL;
|
||||||
|
@ -133,7 +133,7 @@ struct io_space {
|
|||||||
/* Return PV with given name (may be full
|
/* Return PV with given name (may be full
|
||||||
or relative path) */
|
or relative path) */
|
||||||
struct physical_volume *(*pv_read)(struct io_space *is,
|
struct physical_volume *(*pv_read)(struct io_space *is,
|
||||||
const char *pv_name);
|
struct device *dev);
|
||||||
|
|
||||||
/* Write a PV structure to disk. */
|
/* Write a PV structure to disk. */
|
||||||
/* Fails if the PV is in a VG ie
|
/* Fails if the PV is in a VG ie
|
||||||
|
@ -11,11 +11,13 @@ VPATH = @srcdir@
|
|||||||
SOURCES=\
|
SOURCES=\
|
||||||
read_vg_t.c \
|
read_vg_t.c \
|
||||||
pretty_print.c \
|
pretty_print.c \
|
||||||
get_pvs_t.c
|
get_pvs_t.c \
|
||||||
|
read_pv_t.c
|
||||||
|
|
||||||
TARGETS=\
|
TARGETS=\
|
||||||
read_vg_t \
|
read_vg_t \
|
||||||
get_pvs_t
|
get_pvs_t \
|
||||||
|
read_pv_t
|
||||||
|
|
||||||
include ../../make.tmpl
|
include ../../make.tmpl
|
||||||
|
|
||||||
@ -25,3 +27,6 @@ read_vg_t: read_vg_t.o pretty_print.o $(top_srcdir)/lib/liblvm.a
|
|||||||
get_pvs_t: get_pvs_t.o pretty_print.o $(top_srcdir)/lib/liblvm.a
|
get_pvs_t: get_pvs_t.o pretty_print.o $(top_srcdir)/lib/liblvm.a
|
||||||
$(CC) -o get_pvs_t get_pvs_t.o pretty_print.o -L$(top_srcdir)/lib -llvm
|
$(CC) -o get_pvs_t get_pvs_t.o pretty_print.o -L$(top_srcdir)/lib -llvm
|
||||||
|
|
||||||
|
read_pv_t: read_pv_t.o pretty_print.o $(top_srcdir)/lib/liblvm.a
|
||||||
|
$(CC) -o read_pv_t read_pv_t.o pretty_print.o -L$(top_srcdir)/lib -llvm
|
||||||
|
|
||||||
|
73
old-tests/format1/read_pv_t.c
Normal file
73
old-tests/format1/read_pv_t.c
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2001 Sistina Software (UK) Limited.
|
||||||
|
*
|
||||||
|
* This file is released under the GPL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
#include "format1.h"
|
||||||
|
#include "dbg_malloc.h"
|
||||||
|
#include "pool.h"
|
||||||
|
#include "pretty_print.h"
|
||||||
|
#include "list.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct io_space *ios;
|
||||||
|
struct physical_volume *pv;
|
||||||
|
struct pool *mem;
|
||||||
|
struct device *dev;
|
||||||
|
|
||||||
|
if (argc != 2) {
|
||||||
|
fprintf(stderr, "usage: read_pv_t <device>\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
init_log(stderr);
|
||||||
|
init_debug(_LOG_INFO);
|
||||||
|
|
||||||
|
if (!dev_cache_init()) {
|
||||||
|
fprintf(stderr, "init of dev-cache failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dev_cache_add_dir("/dev/loop")) {
|
||||||
|
fprintf(stderr, "couldn't add /dev to dir-cache\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(mem = pool_create(10 * 1024))) {
|
||||||
|
fprintf(stderr, "couldn't create pool\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ios = create_lvm1_format("/dev", mem, NULL);
|
||||||
|
|
||||||
|
if (!ios) {
|
||||||
|
fprintf(stderr, "failed to create io_space for format1\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dev = dev_cache_get(argv[1], NULL))) {
|
||||||
|
fprintf(stderr, "couldn't get device %s\n", argv[1]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pv = ios->pv_read(ios, dev);
|
||||||
|
|
||||||
|
if (!pv) {
|
||||||
|
fprintf(stderr, "couldn't read pv %s\n", dev->name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
dump_pv(pv, stdout);
|
||||||
|
ios->destroy(ios);
|
||||||
|
|
||||||
|
pool_destroy(mem);
|
||||||
|
dev_cache_exit();
|
||||||
|
dump_memory();
|
||||||
|
fin_log();
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user