]> sourceware.org Git - lvm2.git/commitdiff
Added displayable_lvs_in_vg and lv_is_displayable functions to deal with
authorprajnoha <prajnoha>
Thu, 4 Dec 2008 15:54:26 +0000 (15:54 +0000)
committerprajnoha <prajnoha>
Thu, 4 Dec 2008 15:54:26 +0000 (15:54 +0000)
the counts of visible LVs from user's perspective consistently throughout
the code.

14 files changed:
WHATS_NEW
lib/activate/activate.c
lib/display/display.c
lib/format_text/export.c
lib/metadata/lv_manip.c
lib/metadata/metadata-exported.h
lib/metadata/metadata.c
lib/metadata/metadata.h
lib/metadata/snapshot_manip.c
lib/report/report.c
tools/lvchange.c
tools/lvdisplay.c
tools/lvscan.c
tools/reporter.c

index e1eaade9d9c9cd149587770f295f276efaaecfba..e8dfbced8dafccf3a4a6892c8cf51dd4502853dd 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.44 - 
 ====================================
+  Use displayable_lvs_in_vg and lv_is_displayable for consistency throughout.
   Fix race in vgcreate that would result in second caller overwriting first.
   Fix uninitialised lv_count in vgdisplay -c.
   Don't skip updating pvid hash when lvmcache_info struct got swapped.
index 95b812a8a32e585b195d38b5bc4fa3d593946823..c970da40b31a9fc7e95ac7dc0b9e4258339ad32e 100644 (file)
@@ -666,7 +666,7 @@ int lvs_in_vg_opened(const struct volume_group *vg)
                return 0;
 
        dm_list_iterate_items(lvl, &vg->lvs) {
-               if (lvl->lv->status & VISIBLE_LV)
+               if (lv_is_displayable(lvl->lv))
                        count += (_lv_open_count(vg->cmd, lvl->lv) > 0);
        }
 
index 8a672f386f785be5cc40569044022e35bbcfd392..c1ae8dbab4d27904e5d9d6108bd33ffc1640a707 100644 (file)
@@ -574,8 +574,6 @@ void vgdisplay_full(const struct volume_group *vg)
 {
        uint32_t access_str;
        uint32_t active_pvs;
-       uint32_t lv_count = 0;
-       struct lv_list *lvl;
        char uuid[64] __attribute((aligned(8)));
 
        active_pvs = vg->pv_count - vg_missing_pv_count(vg);
@@ -607,12 +605,8 @@ void vgdisplay_full(const struct volume_group *vg)
                          vg->status & SHARED ? "yes" : "no");
        }
 
-       dm_list_iterate_items(lvl, &vg->lvs)
-               if (lv_is_visible(lvl->lv) && !(lvl->lv->status & SNAPSHOT))
-                       lv_count++;
-
        log_print("MAX LV                %u", vg->max_lv);
-       log_print("Cur LV                %u", lv_count);
+       log_print("Cur LV                %u", displayable_lvs_in_vg(vg));
        log_print("Open LV               %u", lvs_in_vg_opened(vg));
 /****** FIXME Max LV Size
       log_print ( "MAX LV Size           %s",
@@ -656,17 +650,11 @@ void vgdisplay_full(const struct volume_group *vg)
 void vgdisplay_colons(const struct volume_group *vg)
 {
        uint32_t active_pvs;
-       uint32_t lv_count = 0;
-       struct lv_list *lvl;
        const char *access_str;
        char uuid[64] __attribute((aligned(8)));
 
        active_pvs = vg->pv_count - vg_missing_pv_count(vg);
 
-       dm_list_iterate_items(lvl, &vg->lvs)
-               if (lv_is_visible(lvl->lv) && !(lvl->lv->status & SNAPSHOT))
-                       lv_count++;
-
        switch (vg->status & (LVM_READ | LVM_WRITE)) {
                case LVM_READ | LVM_WRITE:
                        access_str = "r/w";
@@ -693,7 +681,7 @@ void vgdisplay_colons(const struct volume_group *vg)
                vg->status,
                /* internal volume group number; obsolete */
                vg->max_lv,
-               vg->lv_count,
+               displayable_lvs_in_vg(vg),
                lvs_in_vg_opened(vg),
                /* FIXME: maximum logical volume size */
                vg->max_pv,
index 16279ef7d515d0931a138d4741d57e79daf1591c..6f16143d77d4d7a27013e612f0c1ee4a464ac9cc 100644 (file)
@@ -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 (!(lvl->lv->status & VISIBLE_LV))
+               if (!(lv_is_displayable(lvl->lv)))
                        continue;
                if (!_print_lv(f, lvl->lv))
                        return_0;
        }
 
        dm_list_iterate_items(lvl, &vg->lvs) {
-               if ((lvl->lv->status & VISIBLE_LV))
+               if ((lv_is_displayable(lvl->lv)))
                        continue;
                if (!_print_lv(f, lvl->lv))
                        return_0;
index e5302f9b6b4150e66fa4f0beca88062030aee6ea..0e40756b94bedef80921eac270f7c759472bb2b7 100644 (file)
@@ -1715,7 +1715,7 @@ int lv_rename(struct cmd_context *cmd, struct logical_volume *lv,
        struct lv_names lv_names;
 
        /* rename is not allowed on sub LVs */
-       if (!lv_is_visible(lv)) {
+       if (!lv_is_displayable(lv)) {
                log_error("Cannot rename internal LV \"%s\".", lv->name);
                return 0;
        }
index d49eaba0125826d4d10d79a57f3bdbe4269b2f09..40ece6f3e241099552af8c2df4f963565ab66ad4 100644 (file)
@@ -483,6 +483,9 @@ int lv_is_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 pv_is_in_vg(struct volume_group *vg, struct physical_volume *pv);
 
 /* Given a cow LV, return return the snapshot lv_segment that uses it */
index e5a13e64bf9129ad33e88f82445e671ea065b1e8..a49c4d89e5b27e8211407f6d1f528351d17bc0c4 100644 (file)
@@ -337,6 +337,7 @@ int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
 {
        struct physical_volume *pv;
        struct pv_list *pvl;
+       unsigned lv_count;
        int ret = 1;
 
        if (!vg || !consistent || vg_missing_pv_count(vg)) {
@@ -350,22 +351,26 @@ int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
        if (!vg_check_status(vg, EXPORTED_VG))
                return 0;
 
-       if (vg->lv_count) {
+       lv_count = displayable_lvs_in_vg(vg);
+
+       if (lv_count) {
                if ((force == PROMPT) &&
                    (yes_no_prompt("Do you really want to remove volume "
-                                  "group \"%s\" containing %d "
+                                  "group \"%s\" containing %u "
                                   "logical volumes? [y/n]: ",
-                                  vg_name, vg->lv_count) == 'n')) {
+                                  vg_name, lv_count) == 'n')) {
                        log_print("Volume group \"%s\" not removed", vg_name);
                        return 0;
                }
                if (!remove_lvs_in_vg(cmd, vg, force))
                        return 0;
        }
+
+       lv_count = displayable_lvs_in_vg(vg);
        
-       if (vg->lv_count) {
-               log_error("Volume group \"%s\" still contains %d "
-                         "logical volume(s)", vg_name, vg->lv_count);
+       if (lv_count) {
+               log_error("Volume group \"%s\" still contains %u "
+                         "logical volume(s)", vg_name, lv_count);
                return 0;
        }
 
@@ -1098,6 +1103,18 @@ 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;
+}
+
 /*
  * Determine whether two vgs are compatible for merging.
  */
index 3d9fd8dac885c73f586ed7e0753aedd7970ff23e..02d47377cf84b63d34f09f38fcb6798a367aadff 100644 (file)
@@ -320,6 +320,11 @@ 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);
+
 /*
  * For internal metadata caching.
  */
index a3c7fb89ccf1d81a32a47d53064d1201aa13ff56..9531c921d1f887190f68dcf8778ca5300caeb9b7 100644 (file)
@@ -36,6 +36,14 @@ 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;
+}
+
 /* Given a cow LV, return the snapshot lv_segment that uses it */
 struct lv_segment *find_cow(const struct logical_volume *lv)
 {
index 437bfd8b6e0ba8eb3f127bccf5e297f3fae705d3..4c164c9b471278fbc83c7fd241d6865a0a028d4d 100644 (file)
@@ -511,7 +511,7 @@ static int _lvname_disp(struct dm_report *rh, struct dm_pool *mem,
        char *repstr, *lvname;
        size_t len;
 
-       if (lv_is_visible(lv)) {
+       if (lv_is_displayable(lv)) {
                repstr = lv->name;
                return dm_report_field_string(rh, field, (const char **) &repstr);
        }
@@ -911,12 +911,9 @@ static int _lvcount_disp(struct dm_report *rh, struct dm_pool *mem,
                         const void *data, void *private)
 {
        const struct volume_group *vg = (const struct volume_group *) data;
-        struct lv_list *lvl;
-       uint32_t count = 0;
+       uint32_t count;
 
-        dm_list_iterate_items(lvl, &vg->lvs)
-               if (lv_is_visible(lvl->lv) && !(lvl->lv->status & SNAPSHOT))
-                       count++;
+       count = displayable_lvs_in_vg(vg);      
 
        return _uint32_disp(rh, mem, field, &count, private);
 }
index 4016c8f57cc48aff050de4676c464ae5fb0245b7..3c2fa19a29118aaa4032a46fd14f3cee6a07d8d7 100644 (file)
@@ -590,7 +590,7 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
                return ECMD_FAILED;
        }
 
-       if (!(lv->status & VISIBLE_LV)) {
+       if (!(lv_is_displayable(lv))) {
                log_error("Unable to change internal LV %s directly",
                          lv->name);
                return ECMD_FAILED;
index 16e7052f2060ed6acd9a7507d63ed65357175d14..5263e0d12facca8d9b847edc694ca9ed4ae9f12f 100644 (file)
@@ -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_visible(lv))
+       if (!arg_count(cmd, all_ARG) && !lv_is_displayable(lv))
                return ECMD_PROCESSED;
 
        if (arg_count(cmd, colon_ARG))
index a286fe17fb524b2fd1b975ae3ef822ed7bd70a7b..1186b3bcefcaf48577ff086157ac51dd67f23d0d 100644 (file)
@@ -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_visible(lv))
+       if (!arg_count(cmd, all_ARG) && !lv_is_displayable(lv))
                return ECMD_PROCESSED;
 
        inkernel = lv_info(cmd, lv, &info, 1, 0) && info.exists;
index e95ed5e80881ba97bbd89a705f37c7a32daa7122..d1907438f1e2cef625dc04985d2167b15bb1051f 100644 (file)
@@ -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_visible(lv))
+       if (!arg_count(cmd, all_ARG) && !lv_is_displayable(lv))
                return ECMD_PROCESSED;
 
        if (!report_object(handle, lv->vg, lv, NULL, NULL, NULL))
@@ -102,7 +102,7 @@ static int _pvsegs_sub_single(struct cmd_context *cmd __attribute((unused)),
 static int _lvsegs_single(struct cmd_context *cmd, struct logical_volume *lv,
                          void *handle)
 {
-       if (!arg_count(cmd, all_ARG) && !lv_is_visible(lv))
+       if (!arg_count(cmd, all_ARG) && !lv_is_displayable(lv))
                return ECMD_PROCESSED;
 
        return process_each_segment_in_lv(cmd, lv, handle, _segs_single);
This page took 0.061299 seconds and 5 git commands to generate.