]> sourceware.org Git - lvm2.git/commitdiff
Fix pvseg report for orphan PVs and other devices.
authorMilan Broz <mbroz@redhat.com>
Tue, 21 Apr 2009 12:59:18 +0000 (12:59 +0000)
committerMilan Broz <mbroz@redhat.com>
Tue, 21 Apr 2009 12:59:18 +0000 (12:59 +0000)
If user requests report attribute from PVSEG type
and PV is orphan (or all devices is set), the report
is empty.

Try for example (when only orphan PV are present)
 #pvs
 #pvs -o +devices
# pvs /dev/sdb1
  PV         VG   Fmt  Attr PSize  PFree
    /dev/sdb1       lvm2 --   46.58G 46.58G
# pvs -o +devices /dev/sdb1
(no output)

The problem is caused by empty pv->segments list.

Fix it by providing fake segment here (similar to fake structures
in _pvsegs_sub_single() calls.

WHATS_NEW
test/t-listings.sh
tools/reporter.c
tools/toollib.c

index 97b21c3a8f56edfc6a76a8014571853abcfb3e3f..eddaaadcf19d09a64ffe09c2a755a6b1a5159ded 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.46 - 
 ================================
+  Fix pvs report for orphan PVs when segment attributes are requested.
   Fix pvs -a output to not read volume groups from non-PV devices.
   Add MMC (mmcblk) device type to filters.
   Introduce memory pools per volume group (to reduce memory for large VGs).
index e6da5b0ef627fcb234c13e563966f53fee31bebe..9ea10b655e94754e71b8e3d796db49114af6b9b4 100644 (file)
@@ -34,6 +34,10 @@ pvcreate --metadatacopies 0 $dev5
 pvs --noheadings|tee out
 test $(wc -l <out) -eq 5
 
+#COMM pvs with segment attributes works even for orphans
+pvs --noheadings -o  seg_all,pv_all,lv_all,vg_all | tee out
+test $(wc -l <out) -eq 5
+
 vgcreate -c n $vg $devs
 
 #COMM pvs and vgs report mda_count, mda_free (bz202886, bz247444)
index 9d03f58742fe46ff5eb809457e6ae0842208992b..0a9de09ebbb69d701450fc1d59b66260609a1ade 100644 (file)
@@ -54,15 +54,20 @@ static int _segs_single(struct cmd_context *cmd __attribute((unused)),
        return ECMD_PROCESSED;
 }
 
-static int _pvsegs_sub_single(struct cmd_context *cmd __attribute((unused)),
+static int _pvsegs_sub_single(struct cmd_context *cmd,
                              struct volume_group *vg,
                              struct pv_segment *pvseg, void *handle)
 {
        int ret = ECMD_PROCESSED;
        struct lv_segment *seg = pvseg->lvseg;
 
+       struct volume_group _free_vg = {
+               .cmd = cmd,
+               .name = (char *)"",
+       };
+
        struct logical_volume _free_logical_volume = {
-               .vg = vg,
+               .vg = vg ?: &_free_vg,
                .name = (char *) "",
                .snapshot = NULL,
                .status = VISIBLE_LV,
@@ -88,6 +93,9 @@ static int _pvsegs_sub_single(struct cmd_context *cmd __attribute((unused)),
 
         _free_lv_segment.segtype = get_segtype_from_string(cmd, "free");
        _free_lv_segment.len = pvseg->len;
+       dm_list_init(&_free_vg.pvs);
+       dm_list_init(&_free_vg.lvs);
+       dm_list_init(&_free_vg.tags);
        dm_list_init(&_free_lv_segment.tags);
        dm_list_init(&_free_lv_segment.origin_list);
        dm_list_init(&_free_logical_volume.tags);
index bdca53fde3eb501acea35e585da1ac0b00808070..ae600c702691cdf2591d67e3fec4c33cb5369d76 100644 (file)
@@ -375,6 +375,7 @@ int process_each_segment_in_pv(struct cmd_context *cmd,
        int ret_max = ECMD_PROCESSED;
        int ret;
        struct volume_group *old_vg = vg;
+       struct pv_segment _free_pv_segment = { .pv = pv };
 
        if (is_pv(pv) && !vg && !is_orphan(pv)) {
                vg_name = pv_vg_name(pv);
@@ -399,13 +400,18 @@ int process_each_segment_in_pv(struct cmd_context *cmd,
                pv = pvl->pv;
        }
 
-       dm_list_iterate_items(pvseg, &pv->segments) {
-               ret = process_single(cmd, vg, pvseg, handle);
+       if (dm_list_empty(&pv->segments)) {
+               ret = process_single(cmd, NULL, &_free_pv_segment, handle);
                if (ret > ret_max)
                        ret_max = ret;
-               if (sigint_caught())
-                       break;
-       }
+       } else
+               dm_list_iterate_items(pvseg, &pv->segments) {
+                       ret = process_single(cmd, vg, pvseg, handle);
+                       if (ret > ret_max)
+                               ret_max = ret;
+                       if (sigint_caught())
+                               break;
+               }
 
        if (vg_name)
                unlock_vg(cmd, vg_name);
This page took 0.050191 seconds and 5 git commands to generate.