1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00

o Convert lv->id back to lv_number when writing back to disk

o Use first unused lv_number when creating new LV
o Use lv_number for refs to snapshots
o Update persistent minor logic after the lvcreate restructure
o Reset all parameters before use in lvcreate.
This commit is contained in:
Alasdair Kergon 2002-02-21 19:04:37 +00:00
parent 08442ab71e
commit 6d94578955
4 changed files with 56 additions and 33 deletions

View File

@ -418,10 +418,32 @@ static int _pv_setup(struct format_instance *fi, struct physical_volume *pv,
return 1;
}
static int _find_free_lvnum(struct logical_volume *lv)
{
int lvnum_used[MAX_LV];
int i = 0;
struct list *lvh;
struct lv_list *lvl;
memset(&lvnum_used, 0, sizeof(lvnum_used));
list_iterate(lvh, &lv->vg->lvs) {
lvl = list_item(lvh, struct lv_list);
lvnum_used[lvnum_from_id(&lvl->lv->id)] = 1;
}
while (lvnum_used[i])
i++;
return i;
}
static int _lv_setup(struct format_instance *fi, struct logical_volume *lv)
{
uint64_t max_size = UINT_MAX;
id_from_lvnum(&lv->id, _find_free_lvnum(lv));
if (lv->le_count > MAX_LE_TOTAL) {
log_error("logical volumes cannot contain more than "
"%d extents.", MAX_LE_TOTAL);

View File

@ -477,7 +477,7 @@ int export_lvs(struct disk_list *dl, struct volume_group *vg,
struct list *lvh, *sh;
struct lv_list *ll;
struct lvd_list *lvdl;
int lv_num = 0, len;
int lv_num, len;
struct hash_table *lvd_hash;
if (!(lvd_hash = hash_create(32))) {
@ -504,9 +504,8 @@ int export_lvs(struct disk_list *dl, struct volume_group *vg,
export_lv(&lvdl->lvd, vg, ll->lv, dev_dir);
/* this isn't a real dev, more of an index for
* snapshots to refer to, *HACK* */
lvdl->lvd.lv_dev = MKDEV(0, lv_num);
lv_num = lvnum_from_id(&ll->lv->id);
lvdl->lvd.lv_number = lv_num;
if (!hash_insert(lvd_hash, ll->lv->name, &lvdl->lvd)) {
@ -521,7 +520,6 @@ int export_lvs(struct disk_list *dl, struct volume_group *vg,
list_add(&dl->lvds, &lvdl->list);
dl->pvd.lv_cur++;
lv_num++;
}
/*
@ -547,7 +545,7 @@ int export_lvs(struct disk_list *dl, struct volume_group *vg,
org->lv_access |= LV_SNAPSHOT_ORG;
cow->lv_access |= LV_SNAPSHOT;
cow->lv_snapshot_minor = MINOR(org->lv_dev);
cow->lv_snapshot_minor = org->lv_number;
}
r = 1;
@ -567,10 +565,10 @@ int import_snapshots(struct pool *mem, struct volume_group *vg,
struct list *pvdh, *lvdh;
struct disk_list *dl;
struct lv_disk *lvd;
int minor;
int lvnum;
struct logical_volume *org, *cow;
/* build an array of minor->lv */
/* build an index of lv numbers */
memset(lvs, 0, sizeof(lvs));
list_iterate (pvdh, pvds) {
dl = list_item(pvdh, struct disk_list);
@ -578,16 +576,16 @@ int import_snapshots(struct pool *mem, struct volume_group *vg,
list_iterate (lvdh, &dl->lvds) {
lvd = &(list_item(lvdh, struct lvd_list)->lvd);
minor = MINOR(lvd->lv_dev);
lvnum = lvd->lv_number;
if (minor > MAX_LV) {
log_err("Logical volume minor number "
if (lvnum > MAX_LV) {
log_err("Logical volume number "
"out of bounds.");
return 0;
}
if (!lvs[minor] &&
!(lvs[minor] = find_lv(vg, lvd->lv_name))) {
if (!lvs[lvnum] &&
!(lvs[lvnum] = find_lv(vg, lvd->lv_name))) {
log_err("Couldn't find logical volume '%s'.",
lvd->lv_name);
return 0;
@ -607,8 +605,8 @@ int import_snapshots(struct pool *mem, struct volume_group *vg,
if (!(lvd->lv_access & LV_SNAPSHOT))
continue;
minor = MINOR(lvd->lv_dev);
cow = lvs[minor];
lvnum = lvd->lv_number;
cow = lvs[lvnum];
if (!(org = lvs[lvd->lv_snapshot_minor])) {
log_err("Couldn't find origin logical volume "
"for snapshot '%s'.", lvd->lv_name);
@ -654,9 +652,8 @@ int export_uuids(struct disk_list *dl, struct volume_group *vg)
}
/*
* This calculates the nasty pv_number and
* lv_number fields used by LVM1. Very
* inefficient code.
* This calculates the nasty pv_number field
* used by LVM1.
*/
void export_numbers(struct list *pvds, struct volume_group *vg)
{

View File

@ -349,7 +349,7 @@ static int lvchange_persistent(struct cmd_context *cmd,
lv->minor = -1;
log_verbose("Disabling persistent minor for \"%s\"", lv->name);
} else {
if (lv_active(lv)) {
if (lv_active(lv) > 0) {
log_error("Cannot change minor number when active");
return 0;
}

View File

@ -14,6 +14,7 @@ struct lvcreate_params {
int snapshot;
int zero;
int contiguous;
int minor;
char *origin;
char *vg_name;
@ -227,20 +228,23 @@ static int _read_params(struct lvcreate_params *lp, struct cmd_context *cmd,
else
lp->permission = LVM_READ | LVM_WRITE;
lp->minor = arg_int_value(cmd, minor_ARG, -1);
#if 0
/* persistent minor */
/* Persistent minor */
if (arg_count(cmd, persistent_ARG)) {
if (!strcmp(arg_str_value(cmd, persistent_ARG, "n"), "n"))
lv->status &= ~FIXED_MINOR;
else if (!arg_count(cmd, minor_ARG)) {
log_error("Please specify minor number with "
"--minor when using -My");
return 0;
if (!strcmp(arg_str_value(cmd, persistent_ARG, "n"), "y")) {
if (lp->minor == -1) {
log_error("Please specify minor number with "
"--minor when using -My");
return 0;
}
} else {
if (lp->minor != -1) {
log_error("--minor not possible with -Mn");
return 0;
}
}
lv->status |= FIXED_MINOR;
}
#endif
lp->pv_count = argc;
lp->pvs = argv;
@ -252,7 +256,7 @@ static int _lvcreate(struct cmd_context *cmd, struct lvcreate_params *lp,
struct logical_volume **plv)
{
uint32_t size_rest;
uint32_t status;
uint32_t status = 0;
struct volume_group *vg;
struct logical_volume *lv, *org;
struct list *pvh;
@ -362,13 +366,11 @@ static int _lvcreate(struct cmd_context *cmd, struct lvcreate_params *lp,
lv->read_ahead = lp->read_ahead;
}
#if 0
if (lp->minor >= 0) {
lv->status |= FIXED_MINOR;
lv->minor = lp->minor;
lv->status |= FIXED_MINOR;
log_verbose("Setting minor number to %d", lv->minor);
}
#endif
/* store vg on disk(s) */
if (!cmd->fid->ops->vg_write(cmd->fid, vg))
@ -430,6 +432,8 @@ int lvcreate(struct cmd_context *cmd, int argc, char **argv)
struct lvcreate_params lp;
struct logical_volume *lv;
memset(&lp, 0, sizeof(lp));
if (!_read_params(&lp, cmd, argc, argv))
return -EINVALID_CMD_LINE;