mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-03 05:18:29 +03:00
o dm->active_list now filled in, ATM this is based on the layer name rather
than the uuid.
This commit is contained in:
parent
fd6932b18b
commit
323a167b49
@ -90,6 +90,7 @@ struct dev_manager {
|
|||||||
|
|
||||||
char *vg_name;
|
char *vg_name;
|
||||||
struct list active_list;
|
struct list active_list;
|
||||||
|
struct list remove_list;
|
||||||
|
|
||||||
struct hash_table *layers;
|
struct hash_table *layers;
|
||||||
};
|
};
|
||||||
@ -525,6 +526,7 @@ struct dev_manager *dev_manager_create(const char *vg_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
list_init(&dm->active_list);
|
list_init(&dm->active_list);
|
||||||
|
list_init(&dm->remove_list);
|
||||||
|
|
||||||
return dm;
|
return dm;
|
||||||
|
|
||||||
@ -694,7 +696,6 @@ static int _expand_origin_real(struct dev_manager *dm,
|
|||||||
|
|
||||||
static int _expand_origin(struct dev_manager *dm, struct logical_volume *lv)
|
static int _expand_origin(struct dev_manager *dm, struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
struct logical_volume *active;
|
struct logical_volume *active;
|
||||||
struct snapshot *s;
|
struct snapshot *s;
|
||||||
struct list *sh;
|
struct list *sh;
|
||||||
@ -710,9 +711,6 @@ static int _expand_origin(struct dev_manager *dm, struct logical_volume *lv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return _expand_vanilla(dm, lv);
|
return _expand_vanilla(dm, lv);
|
||||||
#else
|
|
||||||
return _expand_origin_real(dm, lv);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _expand_snapshot(struct dev_manager *dm, struct logical_volume *lv,
|
static int _expand_snapshot(struct dev_manager *dm, struct logical_volume *lv,
|
||||||
@ -1067,25 +1065,6 @@ static int _execute(struct dev_manager *dm, struct logical_volume *lv,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dev_manager_activate(struct dev_manager *dm, struct logical_volume *lv)
|
|
||||||
{
|
|
||||||
if (!_execute(dm, lv, _create_rec)) {
|
|
||||||
stack;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int dev_manager_deactivate(struct dev_manager *dm, struct logical_volume *lv)
|
|
||||||
{
|
|
||||||
if (!_execute(dm, lv, _remove_rec)) {
|
|
||||||
stack;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1106,6 +1085,8 @@ static int _add_existing_layer(struct dev_manager *dm, const char *name)
|
|||||||
struct dev_layer *new;
|
struct dev_layer *new;
|
||||||
char *copy;
|
char *copy;
|
||||||
|
|
||||||
|
log_verbose("Found layer '%s'", name);
|
||||||
|
|
||||||
if (!(copy = pool_strdup(dm->mem, name))) {
|
if (!(copy = pool_strdup(dm->mem, name))) {
|
||||||
stack;
|
stack;
|
||||||
return 0;
|
return 0;
|
||||||
@ -1180,3 +1161,81 @@ static int _scan_existing_devices(struct dev_manager *dm)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _add_active(struct dev_manager *dm, struct logical_volume *lv)
|
||||||
|
{
|
||||||
|
struct lv_list *lvl;
|
||||||
|
|
||||||
|
if (!(lvl = pool_alloc(dm->mem, sizeof(*lvl)))) {
|
||||||
|
stack;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
lvl->lv = lv;
|
||||||
|
list_add(&dm->active_list, &lvl->list);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _fill_in_active_list(struct dev_manager *dm,
|
||||||
|
struct volume_group *vg)
|
||||||
|
{
|
||||||
|
int found;
|
||||||
|
char *name;
|
||||||
|
struct list *lvh;
|
||||||
|
struct logical_volume *lv;
|
||||||
|
|
||||||
|
list_iterate (lvh, &vg->lvs) {
|
||||||
|
lv = list_item(lvh, struct lv_list)->lv;
|
||||||
|
|
||||||
|
name = _build_name(dm->mem, dm->vg_name, lv->name, "");
|
||||||
|
if (!name) {
|
||||||
|
stack;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
found = hash_lookup(dm->layers, name) ? 1 : 0;
|
||||||
|
pool_free(dm->mem, name);
|
||||||
|
|
||||||
|
if (found && !_add_active(dm, lv)) {
|
||||||
|
stack;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dev_manager_activate(struct dev_manager *dm, struct logical_volume *lv)
|
||||||
|
{
|
||||||
|
if (!_scan_existing_devices(dm)) {
|
||||||
|
stack;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_fill_in_active_list(dm, lv->vg)) {
|
||||||
|
stack;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_add_active(dm, lv)) {
|
||||||
|
stack;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_execute(dm, lv, _create_rec)) {
|
||||||
|
stack;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dev_manager_deactivate(struct dev_manager *dm, struct logical_volume *lv)
|
||||||
|
{
|
||||||
|
if (!_execute(dm, lv, _remove_rec)) {
|
||||||
|
stack;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user