From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8885 invoked by alias); 11 Mar 2011 22:16:39 -0000 Received: (qmail 8830 invoked by uid 9478); 11 Mar 2011 22:16:39 -0000 Date: Fri, 11 Mar 2011 22:16:00 -0000 Message-ID: <20110311221639.8828.qmail@sourceware.org> From: jbrassow@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2/scripts gdbinit Mailing-List: contact lvm2-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: lvm2-cvs-owner@sourceware.org X-SW-Source: 2011-03/txt/msg00057.txt.bz2 CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: jbrassow@sourceware.org 2011-03-11 22:16:38 Modified files: scripts : gdbinit Log message: lv_status_r has been fixed-up so that it supports infinite LV stacking (It does not yet follow 'log_lv' or 'origin' links.) Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/scripts/gdbinit.diff?cvsroot=lvm2&r1=1.2&r2=1.3 --- LVM2/scripts/gdbinit 2011/03/11 18:22:39 1.2 +++ LVM2/scripts/gdbinit 2011/03/11 22:16:38 1.3 @@ -34,13 +34,35 @@ set follow-fork-mode child +# Conventions: +# foo : function named 'foo' available to user +# __foo : an internal function +# +# External functions should have a corresponding 'document' +# section. Internal functions should have leading comments + + +# +# __first_seg +define __first_seg + set $arg0 = 0x0 + set $_lv = (struct logical_volume *)$arg1 + + if ($_lv->segments.n != &$_lv->segments) + set $arg0 = (struct lv_segment *)$_lv->segments.n + end +end + define first_seg - set $__lv=(struct logical_volume *)$arg0 + set $_seg = 0 + set $_lv=(struct logical_volume *)$arg0 - if ($__lv->segments.n == &$__lv->segments) - printf "No segments (list empty)\n" + __first_seg $_seg $_lv + + if ($_seg) + p $_seg else - p (struct lv_segment *)$__lv->segments.n + printf "No segments (list empty)\n" end end @@ -53,23 +75,50 @@ this function will be wrong. end -define seg_item - set $__seg=(struct lv_segment *)$arg0 - set $__index=$arg1 - set $__area=$__seg->areas[$__index] - set $__type=$__area.type +# +# __seg_item +define __seg_type + set $arg0 = 0x0 + set $_seg = (struct lv_segment *)$arg1 + set $_index= $arg2 + set $_area = $_seg->areas[$_index] + set $_type = $_area.type + + set $arg0 = $_type +end + +# +# __seg_item +define __seg_item + set $arg0 = 0x0 + set $_seg = (struct lv_segment *)$arg1 + set $_index= $arg2 + + if ($_index < $_seg->area_count) + set $_area = $_seg->areas[$_index] + set $_type = $_area.type - if ($__type == AREA_PV) - p $__area.u.pv.pvseg->pv - else - if ($__type == AREA_LV) - p $__area.u.lv.lv + if ($_type == AREA_PV) + set $arg0 = $_area.u.pv.pvseg->pv else - printf "AREA_UNASSIGNED or invalid\n" + if ($_type == AREA_LV) + set $arg0 = $_area.u.lv.lv + end end end end +define seg_item + set $_item = 0x0 + + __seg_item $_item $arg0 $arg1 + if ($_item) + p $_item + else + printf "AREA_UNASSIGNED or invalid\n" + end +end + document seg_item Returns the pointer to the LV or PV for the indexed area of a segment @@ -165,9 +214,9 @@ define seg_status set $_seg=(struct lv_segment *)$arg0 - printf "(%s) seg->status:", $_seg->lv->name + printf "[ (%s) seg->status:", $_seg->lv->name __status $_seg - printf "\n" + printf " ]\n" end document seg_status @@ -176,67 +225,29 @@ Usage: lv_status <(struct lv_segment *)> end -define __lv_status_r - set $_lv=(struct logical_volume *)$arg0 - set $_seg_list_head = &$_lv->segments - set $_s = $_lv->segments.n +# +# get_only_segment_using_this_lv +define __get_only_segment_using_this_lv + set $arg0 = 0x0 + set $_lv=(struct logical_volume *)$arg1 + set $_seg_list_head = &$_lv->segs_using_this_lv + set $_s = $_lv->segs_using_this_lv.n set $_i = 0 - # lv_status $_lv - printf "%s%s->status:", $arg1, $_lv->name - __status $_lv - printf "\n" + while (($_s != $_seg_list_head) && ($_i < 100)) + set $_seg_list = (struct seg_list *)$_s + set $_seg = (struct lv_segment *)$_seg_list->seg - if ($_s == $_seg_list_head) - printf "[ No segments for %s ]\n", $_lv->name - else - set $_seg = (struct lv_segment *)$_s - while ($_s != $_seg_list_head) - printf "%s[ %s->seg(%d)->status:", $arg1, $_lv->name, $_i - __status $_seg - printf " ]\n" - - set $_j = 0 - while ($_j < $_seg->area_count) - set $_area=$_seg->areas[$_j] - set $_type=$_area.type - if ($_type == AREA_LV) -# Damn it, gdb does not have scoping so functions are not reentrant -# __lv_status_r $_area.u.lv.lv " " - -# Next couple lines will get us through a non-stacked mirror... -printf "* " -lv_status $_area.u.lv.lv -set $barf = (struct lv_segment *)($_area.u.lv.lv)->segments.n -if ($barf != &($_area.u.lv.lv)->segments) -printf "* " -printf "[ %s->seg(0)->status:", $_lv->name -__status $barf -printf " ]\n" -end - end - set $_j++ - end - set $_s = $_s->n - set $_seg = (struct lv_segment *)$_s - set $_i++ - end + set $_i++ + set $_s = $_s->n end - printf "\n" -end - -define lv_status_r - __lv_status_r $arg0 "" -end -document lv_status_r -Display the status flags of an LV and its sub_lvs. - - Usage: lv_status_r - -This function is useful for checking that all the LVs that -compose a logical volume have the correct flags set (and also -their associated lv_segments) + if ($_i > 1) + printf "More than %s using %s\n", ($_i > 99) ? "100 segments" : "one segment", $_lv->name + end + if ($_i == 1) + set $arg0 = $_seg + end end define segs_using_this_lv @@ -259,8 +270,8 @@ else printf " [seg found in %s]\n", $_seg->lv->name end + set $_i++ set $_s = $_s->n - set $_i = $_i + 1 end end @@ -287,6 +298,101 @@ 0) seg: 0x92d360 [seg found in lv] end +# +# __next_area_index +define __next_area_index + set $arg0 = 0x0 + set $_seg = (struct lv_segment *)$arg1 + set $_item = 0x0 + set $_i = 0 + + __seg_item $_item $_seg $_i + while ($_item && ($_item != $arg2)) + set $_i++ + __seg_item $_item $_seg $_i + end + + # $_i points to current, now get next (if there) + set $_i++ + __seg_item $_item $_seg $_i + + if ($_item) + set $arg0 = $_i + end +end + +# +# __lv_status_r +# Decend tree, printing LV and seg status as we go. This +# performs a depth first approach (but can't come up) +# or +# __lv_status_r +# Try continuing decent of tree by first shifting to the +# next 'area' in the seg ($arg1). If no more areas, then +# try going to the next segment. +define __lv_status_r + if ($argc == 1) + set $_lv=(struct logical_volume *)$arg0 + set $_seg_list_head = &$_lv->segments + set $_s = $_lv->segments.n + set $_area_index = 0 + + printf "\n" + lv_status $_lv + else + set $_seg = (struct lv_segment *)$arg1 + + __next_area_index $_area_index $_seg $arg0 + + # Don't fuck this up. We need the next two lines here. + set $_lv=(struct logical_volume *)$_seg->lv + set $_seg_list_head = &$_lv->segments + set $_s = (struct dm_list *)$_seg + + if (!$_area_index) + set $_s = $_s->n + end + end + + if ($_s == $_seg_list_head) + if ($argc == 1) + printf "[ No segments for %s ]\n", $_lv->name + end + else + set $_seg = (struct lv_segment *)$_s + set $_type = 0x0 + + if (!$_area_index) + seg_status $_seg + end + + __seg_type $_type $_seg $_area_index + if ($_type == AREA_LV) + __seg_item $_lv $_seg $_area_index + __lv_status_r $_lv + else + __get_only_segment_using_this_lv $_seg $_lv + if ($_seg) + __lv_status_r $_lv $_seg + end + end + end +end + +define lv_status_r + __lv_status_r $arg0 +end + +document lv_status_r +Display the status flags of an LV and its sub_lvs. + + Usage: lv_status_r + +This function is useful for checking that all the LVs that +compose a logical volume have the correct flags set (and also +their associated lv_segments) +end + define lv_is_mirrored set $_lv=(struct logical_volume *)$arg0 set $_fs=(struct lv_segment *)$_lv->segments.n