[PATCH v2 6/8] makedumpfile: Read and process 'for' command from config file.
Mahesh J Salgaonkar
mahesh at linux.vnet.ibm.com
Mon Sep 5 10:40:33 EDT 2011
Hi Ken'ichi,
On 2011-09-01 17:06:58 Thu, Ken'ichi Ohmichi wrote:
>
> Hi Mahesh,
>
> Thank you for the patch.
> I have one question.
>
> On Tue, 30 Aug 2011 23:46:42 +0530
> Mahesh J Salgaonkar <mahesh at linux.vnet.ibm.com> wrote:
> >
> > [PATCH] makedumpfile: Fix array traversal for array of structure and char type.
> >
> > From: Mahesh Salgaonkar <mahesh at linux.vnet.ibm.com>
> >
> > Introduce new function get_next_list_entry() that returns config entry
> > for each element in the LIST entry. This approach improves the handling
> > of LIST entry. With this change the function get_config_symbol_addr()
> > no longer required to handle LIST entry separately.
> >
> > This patch fixes following BUGs:
>
> [..]
>
> > - The loop construct used for array of char* (pointer) silently fails and
> > does not filter the strings.
>
> Did the silent failure happen at the following code of list_entry_empty() ?
>
> 7373 addr = get_config_symbol_addr(le, 0, NULL);
> 7374 if (!addr)
> 7375 return TRUE;
>
Nope. It use to fail in resolve_list_entry()->resolve_config_entry()
and following hunk from the patch fixes it:
@@ -6866,7 +6882,7 @@ resolve_config_entry(struct config_entry *ce, unsigned long long base_addr,
* If this is a struct or list_head data type then
* create a leaf node entry with 'next' member.
*/
- if ((ce->type_flag & TYPE_BASE)
+ if (((ce->type_flag & (TYPE_BASE | TYPE_ARRAY)) == TYPE_BASE)
&& (strcmp(ce->type_name, "void")))
return FALSE;
The old code use to check only TYPE_BASE flag ignoring TYPE_ARRAY flag.
> If list_entry_empty() returns TRUE, a "while" loop of process_config() breaks
> and update_filter_info() is not called.
> Is that the problem you said ?
>
> If yes, I feel the behavior related with this problem has not changed.
> because the method for getting a pointer array has not changed like the
> following:
The while loop below still holds good as it just ignores the pointer array
elements which are NULL pointers and we dont have anything to be erased for
NULL pointers.
>
> o OLD
> 111 - while (ce->index < ce->array_length) {
> 112 - addr = read_pointer_value(ce->addr +
> 113 - (ce->index * get_pointer_size()));
> 114 - ce->index++;
> 115 - if (addr)
> 116 - break;
> 117 - }
> 118 - return addr;
>
> o NEW
> 197 + while (ce->index < ce->array_length) {
> 198 + addr = read_pointer_value(ce->addr +
> 199 + (ce->index * get_pointer_size()));
> 200 + if (addr)
> 201 + break;
> 202 + ce->index++;
> 203 + }
> 204 + if (ce->index == ce->array_length)
> 205 + return FALSE;
>
>
> I think the other bugfixes are right, thanks.
>
>
> Thanks
> Ken'ichi Ohmichi
>
Thanks,
-Mahesh.
More information about the kexec
mailing list