mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-29 06:50:38 +03:00
Merge lv_is_displayable and lv_is_visible.
Displayable and visible is the same thing. volumes_count(vg) is now vg_visible_lvs() and always returns number of LVs from user perspective.
This commit is contained in:
parent
59d8429cb3
commit
afd9ba98c1
@ -1,5 +1,6 @@
|
||||
Version 2.02.46 -
|
||||
================================
|
||||
Merge lv_is_displayable and lv_is_visible functions.
|
||||
Introduce lv_set_visible & lv_set_invisible functions.
|
||||
Fix lv_is_visible to handle virtual origin.
|
||||
Introduce link_lv_to_vg and unlink_lv_from_vg functions.
|
||||
|
@ -673,7 +673,7 @@ int lvs_in_vg_opened(const struct volume_group *vg)
|
||||
return 0;
|
||||
|
||||
dm_list_iterate_items(lvl, &vg->lvs) {
|
||||
if (lv_is_displayable(lvl->lv))
|
||||
if (lv_is_visible(lvl->lv))
|
||||
count += (_lv_open_count(vg->cmd, lvl->lv) > 0);
|
||||
}
|
||||
|
||||
|
@ -606,7 +606,7 @@ void vgdisplay_full(const struct volume_group *vg)
|
||||
}
|
||||
|
||||
log_print("MAX LV %u", vg->max_lv);
|
||||
log_print("Cur LV %u", displayable_lvs_in_vg(vg));
|
||||
log_print("Cur LV %u", vg_visible_lvs(vg));
|
||||
log_print("Open LV %u", lvs_in_vg_opened(vg));
|
||||
/****** FIXME Max LV Size
|
||||
log_print ( "MAX LV Size %s",
|
||||
@ -681,7 +681,7 @@ void vgdisplay_colons(const struct volume_group *vg)
|
||||
vg->status,
|
||||
/* internal volume group number; obsolete */
|
||||
vg->max_lv,
|
||||
displayable_lvs_in_vg(vg),
|
||||
vg_visible_lvs(vg),
|
||||
lvs_in_vg_opened(vg),
|
||||
/* FIXME: maximum logical volume size */
|
||||
vg->max_pv,
|
||||
|
@ -282,7 +282,7 @@ int export_vg(struct vg_disk *vgd, struct volume_group *vg)
|
||||
vgd->vg_status |= VG_EXTENDABLE;
|
||||
|
||||
vgd->lv_max = vg->max_lv;
|
||||
vgd->lv_cur = volumes_count(vg) + snapshot_count(vg);
|
||||
vgd->lv_cur = vg_visible_lvs(vg) + snapshot_count(vg);
|
||||
|
||||
vgd->pv_max = vg->max_pv;
|
||||
vgd->pv_cur = vg->pv_count;
|
||||
|
@ -592,14 +592,14 @@ static int _print_lvs(struct formatter *f, struct volume_group *vg)
|
||||
* Write visible LVs first
|
||||
*/
|
||||
dm_list_iterate_items(lvl, &vg->lvs) {
|
||||
if (!(lv_is_displayable(lvl->lv)))
|
||||
if (!(lv_is_visible(lvl->lv)))
|
||||
continue;
|
||||
if (!_print_lv(f, lvl->lv))
|
||||
return_0;
|
||||
}
|
||||
|
||||
dm_list_iterate_items(lvl, &vg->lvs) {
|
||||
if ((lv_is_displayable(lvl->lv)))
|
||||
if ((lv_is_visible(lvl->lv)))
|
||||
continue;
|
||||
if (!_print_lv(f, lvl->lv))
|
||||
return_0;
|
||||
|
@ -1732,7 +1732,7 @@ int lv_rename(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
int r = 0;
|
||||
|
||||
/* rename is not allowed on sub LVs */
|
||||
if (!lv_is_displayable(lv)) {
|
||||
if (!lv_is_visible(lv)) {
|
||||
log_error("Cannot rename internal LV \"%s\".", lv->name);
|
||||
return 0;
|
||||
}
|
||||
@ -1818,7 +1818,7 @@ struct logical_volume *lv_create_empty(const char *name,
|
||||
struct logical_volume *lv;
|
||||
char dname[NAME_LEN];
|
||||
|
||||
if (vg->max_lv && (vg->max_lv == volumes_count(vg))) {
|
||||
if (vg->max_lv && (vg->max_lv == vg_visible_lvs(vg))) {
|
||||
log_error("Maximum number of logical volumes (%u) reached "
|
||||
"in volume group %s", vg->max_lv, vg->name);
|
||||
return NULL;
|
||||
|
@ -238,18 +238,16 @@ struct volume_group {
|
||||
/*
|
||||
* logical volumes
|
||||
* The following relationship should always hold:
|
||||
* dm_list_size(lvs) = lv_count + 2 * snapshot_count
|
||||
* dm_list_size(lvs) = user visible lv_count + snapshot_count + other invisible LVs
|
||||
*
|
||||
* Snapshots consist of 2 instances of "struct logical_volume":
|
||||
* - cow (lv_name is visible to the user)
|
||||
* - snapshot (lv_name is 'snapshotN')
|
||||
* Neither of these instances is reflected in lv_count.
|
||||
*
|
||||
* Mirrors consist of multiple instances of "struct logical_volume":
|
||||
* - one for the mirror log
|
||||
* - one for each mirror leg
|
||||
* - one for the user-visible mirror LV
|
||||
* all of the instances are reflected in lv_count.
|
||||
*/
|
||||
struct dm_list lvs;
|
||||
|
||||
@ -539,10 +537,9 @@ struct lv_segment *first_seg(const struct logical_volume *lv);
|
||||
int lv_is_origin(const struct logical_volume *lv);
|
||||
int lv_is_virtual_origin(const struct logical_volume *lv);
|
||||
int lv_is_cow(const struct logical_volume *lv);
|
||||
int lv_is_visible(const struct logical_volume *lv);
|
||||
|
||||
/* Test if given LV is visible from user's perspective */
|
||||
int lv_is_displayable(const struct logical_volume *lv);
|
||||
int lv_is_visible(const struct logical_volume *lv);
|
||||
|
||||
int pv_is_in_vg(struct volume_group *vg, struct physical_volume *pv);
|
||||
|
||||
@ -563,7 +560,10 @@ int vg_remove_snapshot(struct logical_volume *cow);
|
||||
|
||||
int vg_check_status(const struct volume_group *vg, uint32_t status);
|
||||
|
||||
unsigned volumes_count(const struct volume_group *vg);
|
||||
/*
|
||||
* Returns visible LV count - number of LVs from user perspective
|
||||
*/
|
||||
unsigned vg_visible_lvs(const struct volume_group *vg);
|
||||
|
||||
/*
|
||||
* Mirroring functions
|
||||
|
@ -376,7 +376,7 @@ int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
|
||||
if (!vg_check_status(vg, EXPORTED_VG))
|
||||
return 0;
|
||||
|
||||
lv_count = displayable_lvs_in_vg(vg);
|
||||
lv_count = vg_visible_lvs(vg);
|
||||
|
||||
if (lv_count) {
|
||||
if ((force == PROMPT) &&
|
||||
@ -391,8 +391,8 @@ int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
|
||||
return 0;
|
||||
}
|
||||
|
||||
lv_count = displayable_lvs_in_vg(vg);
|
||||
|
||||
lv_count = vg_visible_lvs(vg);
|
||||
|
||||
if (lv_count) {
|
||||
log_error("Volume group \"%s\" still contains %u "
|
||||
"logical volume(s)", vg_name, lv_count);
|
||||
@ -1140,18 +1140,6 @@ int vg_remove(struct volume_group *vg)
|
||||
return 1;
|
||||
}
|
||||
|
||||
unsigned displayable_lvs_in_vg(const struct volume_group *vg)
|
||||
{
|
||||
struct lv_list *lvl;
|
||||
unsigned lv_count = 0;
|
||||
|
||||
dm_list_iterate_items(lvl, &vg->lvs)
|
||||
if (lv_is_displayable(lvl->lv))
|
||||
lv_count++;
|
||||
|
||||
return lv_count;
|
||||
}
|
||||
|
||||
unsigned snapshot_count(const struct volume_group *vg)
|
||||
{
|
||||
struct lv_list *lvl;
|
||||
@ -1164,17 +1152,14 @@ unsigned snapshot_count(const struct volume_group *vg)
|
||||
return num_snapshots;
|
||||
}
|
||||
|
||||
unsigned volumes_count(const struct volume_group *vg)
|
||||
unsigned vg_visible_lvs(const struct volume_group *vg)
|
||||
{
|
||||
struct lv_list *lvl;
|
||||
unsigned lv_count = 0;
|
||||
|
||||
dm_list_iterate_items(lvl, &vg->lvs) {
|
||||
if (lv_is_cow(lvl->lv))
|
||||
continue;
|
||||
if (lvl->lv->status & SNAPSHOT)
|
||||
continue;
|
||||
lv_count++;
|
||||
if (lv_is_visible(lvl->lv))
|
||||
lv_count++;
|
||||
}
|
||||
|
||||
return lv_count;
|
||||
@ -1214,7 +1199,7 @@ int vgs_are_compatible(struct cmd_context *cmd __attribute((unused)),
|
||||
}
|
||||
|
||||
if (vg_to->max_lv &&
|
||||
(vg_to->max_lv < volumes_count(vg_to) + volumes_count(vg_from))) {
|
||||
(vg_to->max_lv < vg_visible_lvs(vg_to) + vg_visible_lvs(vg_from))) {
|
||||
log_error("Maximum number of logical volumes (%d) exceeded "
|
||||
" for \"%s\" and \"%s\"", vg_to->max_lv, vg_to->name,
|
||||
vg_from->name);
|
||||
@ -1469,12 +1454,38 @@ int vg_validate(struct volume_group *vg)
|
||||
r = 0;
|
||||
}
|
||||
|
||||
if ((lv_count = (uint32_t) dm_list_size(&vg->lvs)) !=
|
||||
volumes_count(vg) + 2 * snapshot_count(vg)) {
|
||||
/*
|
||||
* Count all non-snapshot invisible LVs
|
||||
*/
|
||||
lv_count = 0;
|
||||
dm_list_iterate_items(lvl, &vg->lvs) {
|
||||
if (lvl->lv->status & VISIBLE_LV)
|
||||
continue;
|
||||
|
||||
/* snapshots */
|
||||
if (lv_is_cow(lvl->lv) || lv_is_origin(lvl->lv))
|
||||
continue;
|
||||
|
||||
/* count other non-snapshot invisible volumes */
|
||||
lv_count++;
|
||||
|
||||
/*
|
||||
* FIXME: add check for unreferenced invisible LVs
|
||||
* - snapshot cow & origin
|
||||
* - mirror log & images
|
||||
* - mirror conversion volumes (_mimagetmp*)
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
* all volumes = visible LVs + snapshot_cows + invisible LVs
|
||||
*/
|
||||
if (((uint32_t) dm_list_size(&vg->lvs)) !=
|
||||
vg_visible_lvs(vg) + snapshot_count(vg) + lv_count) {
|
||||
log_error("Internal error: #internal LVs (%u) != #LVs (%"
|
||||
PRIu32 ") + 2 * #snapshots (%" PRIu32 ") in VG %s",
|
||||
dm_list_size(&vg->lvs), volumes_count(vg),
|
||||
snapshot_count(vg), vg->name);
|
||||
PRIu32 ") + #snapshots (%" PRIu32 ") + #invisible LVs %u in VG %s",
|
||||
dm_list_size(&vg->lvs), vg_visible_lvs(vg),
|
||||
snapshot_count(vg), lv_count, vg->name);
|
||||
r = 0;
|
||||
}
|
||||
|
||||
@ -1517,10 +1528,10 @@ int vg_validate(struct volume_group *vg)
|
||||
r = 0;
|
||||
}
|
||||
|
||||
if (vg->max_lv && (vg->max_lv < volumes_count(vg))) {
|
||||
if (vg->max_lv && (vg->max_lv < vg_visible_lvs(vg))) {
|
||||
log_error("Internal error: Volume group %s contains %u volumes"
|
||||
" but the limit is set to %u.",
|
||||
vg->name, volumes_count(vg), vg->max_lv);
|
||||
vg->name, vg_visible_lvs(vg), vg->max_lv);
|
||||
r = 0;
|
||||
}
|
||||
|
||||
|
@ -339,11 +339,6 @@ int add_seg_to_segs_using_this_lv(struct logical_volume *lv, struct lv_segment *
|
||||
int remove_seg_from_segs_using_this_lv(struct logical_volume *lv, struct lv_segment *seg);
|
||||
struct lv_segment *get_only_segment_using_this_lv(struct logical_volume *lv);
|
||||
|
||||
/*
|
||||
* Count LVs that are visible from user's perspective.
|
||||
*/
|
||||
unsigned displayable_lvs_in_vg(const struct volume_group *vg);
|
||||
|
||||
/*
|
||||
* Count snapshot LVs.
|
||||
*/
|
||||
|
@ -43,14 +43,6 @@ int lv_is_visible(const struct logical_volume *lv)
|
||||
return lv->status & VISIBLE_LV ? 1 : 0;
|
||||
}
|
||||
|
||||
int lv_is_displayable(const struct logical_volume *lv)
|
||||
{
|
||||
if (lv->status & SNAPSHOT)
|
||||
return 0;
|
||||
|
||||
return (lv->status & VISIBLE_LV) || lv_is_cow(lv) ? 1 : 0;
|
||||
}
|
||||
|
||||
int lv_is_virtual_origin(const struct logical_volume *lv)
|
||||
{
|
||||
return (lv->status & VIRTUAL_ORIGIN) ? 1 : 0;
|
||||
|
@ -497,7 +497,7 @@ static int _lvname_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||
char *repstr, *lvname;
|
||||
size_t len;
|
||||
|
||||
if (lv_is_displayable(lv)) {
|
||||
if (lv_is_visible(lv)) {
|
||||
repstr = lv->name;
|
||||
return dm_report_field_string(rh, field, (const char **) &repstr);
|
||||
}
|
||||
@ -974,7 +974,7 @@ static int _lvcount_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||
const struct volume_group *vg = (const struct volume_group *) data;
|
||||
uint32_t count;
|
||||
|
||||
count = displayable_lvs_in_vg(vg);
|
||||
count = vg_visible_lvs(vg);
|
||||
|
||||
return _uint32_disp(rh, mem, field, &count, private);
|
||||
}
|
||||
|
@ -584,7 +584,7 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
|
||||
if (!(lv_is_displayable(lv))) {
|
||||
if (!(lv_is_visible(lv))) {
|
||||
log_error("Unable to change internal LV %s directly",
|
||||
lv->name);
|
||||
return ECMD_FAILED;
|
||||
|
@ -18,7 +18,7 @@
|
||||
static int _lvdisplay_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
void *handle)
|
||||
{
|
||||
if (!arg_count(cmd, all_ARG) && !lv_is_displayable(lv))
|
||||
if (!arg_count(cmd, all_ARG) && !lv_is_visible(lv))
|
||||
return ECMD_PROCESSED;
|
||||
|
||||
if (arg_count(cmd, colon_ARG))
|
||||
|
@ -27,7 +27,7 @@ static int lvscan_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
|
||||
const char *active_str, *snapshot_str;
|
||||
|
||||
if (!arg_count(cmd, all_ARG) && !lv_is_displayable(lv))
|
||||
if (!arg_count(cmd, all_ARG) && !lv_is_visible(lv))
|
||||
return ECMD_PROCESSED;
|
||||
|
||||
inkernel = lv_info(cmd, lv, &info, 1, 0) && info.exists;
|
||||
|
@ -36,7 +36,7 @@ static int _vgs_single(struct cmd_context *cmd __attribute((unused)),
|
||||
static int _lvs_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
void *handle)
|
||||
{
|
||||
if (!arg_count(cmd, all_ARG) && !lv_is_displayable(lv))
|
||||
if (!arg_count(cmd, all_ARG) && !lv_is_visible(lv))
|
||||
return ECMD_PROCESSED;
|
||||
|
||||
if (!report_object(handle, lv->vg, lv, NULL, NULL, NULL))
|
||||
@ -113,7 +113,7 @@ static int _pvsegs_sub_single(struct cmd_context *cmd,
|
||||
static int _lvsegs_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
void *handle)
|
||||
{
|
||||
if (!arg_count(cmd, all_ARG) && !lv_is_displayable(lv))
|
||||
if (!arg_count(cmd, all_ARG) && !lv_is_visible(lv))
|
||||
return ECMD_PROCESSED;
|
||||
|
||||
return process_each_segment_in_lv(cmd, lv, handle, _segs_single);
|
||||
|
@ -308,9 +308,9 @@ static int _vgchange_logicalvolume(struct cmd_context *cmd,
|
||||
}
|
||||
}
|
||||
|
||||
if (max_lv && max_lv < volumes_count(vg)) {
|
||||
if (max_lv && max_lv < vg_visible_lvs(vg)) {
|
||||
log_error("MaxLogicalVolume is less than the current number "
|
||||
"%d of LVs for %s", volumes_count(vg),
|
||||
"%d of LVs for %s", vg_visible_lvs(vg),
|
||||
vg->name);
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user