mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
Initial code for read/write of thin metadata lv segments
This commit is contained in:
parent
9d32170d5c
commit
e82bd6249b
@ -318,6 +318,13 @@ struct lv_segment {
|
||||
|
||||
struct lv_segment_area *areas;
|
||||
struct lv_segment_area *meta_areas; /* For RAID */
|
||||
struct logical_volume *data_lv; /* For thin_pool */
|
||||
struct logical_volume *metadata_lv; /* For thin_pool */
|
||||
uint64_t transaction_id; /* For thin_pool */
|
||||
uint32_t zero_new_blocks; /* For thin_pool */
|
||||
struct logical_volume *thin_pool_lv; /* For thin */
|
||||
struct logical_volume *origin_lv; /* For thin */
|
||||
uint64_t device_id; /* For thin */
|
||||
|
||||
struct logical_volume *replicator;/* For replicator-devs - link to replicator LV */
|
||||
struct logical_volume *rlog_lv; /* For replicators */
|
||||
|
@ -30,20 +30,58 @@
|
||||
/* Dm kernel module name for thin provisiong */
|
||||
#define THIN_MODULE "thin-pool"
|
||||
|
||||
/*
|
||||
* Macro used as return argument - returns 0.
|
||||
* return is left to be written in the function for better readability.
|
||||
*/
|
||||
#define SEG_LOG_ERROR(t, p...) \
|
||||
log_error(t " segment %s of logical volume %s.", ## p, \
|
||||
config_parent_name(sn), seg->lv->name), 0;
|
||||
|
||||
static const char *_thin_pool_name(const struct lv_segment *seg)
|
||||
{
|
||||
return seg->segtype->name;
|
||||
}
|
||||
|
||||
|
||||
static int _thin_pool_text_import(struct lv_segment *seg, const struct config_node *sn,
|
||||
struct dm_hash_table *pv_hash __attribute__((unused)))
|
||||
{
|
||||
const struct config_node *cn;
|
||||
|
||||
if (!(cn = find_config_node(sn, "data")) ||
|
||||
!cn->v || cn->v->type != CFG_STRING)
|
||||
return SEG_LOG_ERROR("Thin pool data must be a string in");
|
||||
|
||||
if (!(seg->data_lv = find_lv(seg->lv->vg, cn->v->v.str)))
|
||||
return SEG_LOG_ERROR("Unknown pool data %s in",
|
||||
cn->v->v.str);
|
||||
|
||||
if (!(cn = find_config_node(sn, "metadata")) ||
|
||||
!cn->v || cn->v->type != CFG_STRING)
|
||||
return SEG_LOG_ERROR("Thin pool metadata must be a string in");
|
||||
|
||||
if (!(seg->metadata_lv = find_lv(seg->lv->vg, cn->v->v.str)))
|
||||
return SEG_LOG_ERROR("Unknown pool metadata %s in",
|
||||
cn->v->v.str);
|
||||
|
||||
if (!get_config_uint64(sn, "transaction_id", &seg->transaction_id))
|
||||
return SEG_LOG_ERROR("Could not read transaction_id for");
|
||||
|
||||
if (find_config_node(sn, "zero_new_blocks") &&
|
||||
!get_config_uint32(sn, "zero_new_blocks", &seg->zero_new_blocks))
|
||||
return SEG_LOG_ERROR("Could not read zero_new_blocks for");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _thin_pool_text_export(const struct lv_segment *seg, struct formatter *f)
|
||||
{
|
||||
outf(f, "data = \"%s\"", seg->data_lv->name);
|
||||
outf(f, "metadata = \"%s\"", seg->metadata_lv->name);
|
||||
outf(f, "transaction_id = %" PRIu64, seg->transaction_id);
|
||||
if (seg->zero_new_blocks)
|
||||
outf(f, "zero_new_blocks = 1");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -55,11 +93,39 @@ static const char *_thin_name(const struct lv_segment *seg)
|
||||
static int _thin_text_import(struct lv_segment *seg, const struct config_node *sn,
|
||||
struct dm_hash_table *pv_hash __attribute__((unused)))
|
||||
{
|
||||
const struct config_node *cn;
|
||||
|
||||
if (!(cn = find_config_node(sn, "thin_pool")) ||
|
||||
!cn->v || cn->v->type != CFG_STRING)
|
||||
return SEG_LOG_ERROR("Thin pool must be a string in");
|
||||
|
||||
if (!(seg->thin_pool_lv = find_lv(seg->lv->vg, cn->v->v.str)))
|
||||
return SEG_LOG_ERROR("Unknown thin pool %s in",
|
||||
cn->v->v.str);
|
||||
|
||||
if ((cn = find_config_node(sn, "origin"))) {
|
||||
if (!cn->v || cn->v->type != CFG_STRING)
|
||||
return SEG_LOG_ERROR("Thin pool origin must be a string in");
|
||||
|
||||
if (!(seg->origin_lv = find_lv(seg->lv->vg, cn->v->v.str)))
|
||||
return SEG_LOG_ERROR("Unknown origin %s in",
|
||||
cn->v->v.str);
|
||||
}
|
||||
|
||||
if (!get_config_uint64(sn, "device_id", &seg->device_id))
|
||||
return SEG_LOG_ERROR("Could not read device_id for");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _thin_text_export(const struct lv_segment *seg, struct formatter *f)
|
||||
{
|
||||
outf(f, "thin_pool = \"%s\"", seg->thin_pool_lv->name);
|
||||
outf(f, "device_id = %" PRIu64, seg->device_id);
|
||||
|
||||
if (seg->origin_lv)
|
||||
outf(f, "origin = \"%s\"", seg->origin_lv->name);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user