Alan Tyson wrote:
 I notice that there is a function to look at radix trees in
filesys.c, 
 but it's not called by anything in the crash executable from what I can 
 see.  In fact when I wrote a small extension to call it, I see that it 
 simply doesn't work for several reasons (wrong structures, incorrect 
 dereferencing of pointers).  Attached is a patch which addresses these.  
 I've tested it on i686, x86_64 and ia64.
 
 If you think that this type of ("utility") code is best left out of 
 crash, then let's just remove this from the source and not clutter it 
 with dead code.  Personally, I think it's nice to have it there... when 
 it works.
  
I don't care either way any more, but since you've made it work
again, I'll queue your changes for the next release.
Thanks,
   Dave
 Regards,
 
 Alan Tyson, HP.
 
 
 ------------------------------------------------------------------------
 
 --- a/filesys.c	2008-01-11 19:35:32.000000000 +0000
 +++ b/filesys.c	2008-01-21 16:21:20.000000000 +0000
 @@ -3484,10 +3484,14 @@ cleanup_memory_driver(void)
  #define RADIX_TREE_MAP_SHIFT  6
  #define RADIX_TREE_MAP_SIZE  (1UL << RADIX_TREE_MAP_SHIFT)
  #define RADIX_TREE_MAP_MASK  (RADIX_TREE_MAP_SIZE-1)
 +#define RADIX_TREE_TAGS         2
 +#define RADIX_TREE_TAG_LONGS    \
 +	((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG)
  
  struct radix_tree_node {
          unsigned int    count;
          void            *slots[RADIX_TREE_MAP_SIZE];
 +	unsigned long	tags[RADIX_TREE_TAGS][RADIX_TREE_TAG_LONGS];
  };
  
  /*
 @@ -3639,16 +3643,15 @@ static void *
  radix_tree_lookup(ulong root_rnode, ulong index, int height)
  {
  	unsigned int shift;
 -	struct radix_tree_node **slot;
 +	void *slot;
  	struct radix_tree_node slotbuf;
 -	void **kslotp, **uslotp;
  
  	shift = (height-1) * RADIX_TREE_MAP_SHIFT;
 -	kslotp = (void **)root_rnode;
 +
 +	readmem(root_rnode, KVADDR, &slot, sizeof(void *),
 +		"radix_tree_root rnode", FAULT_ON_ERROR);
  
  	while (height > 0) {
 -		readmem((ulong)kslotp, KVADDR, &slot, sizeof(void *),
 -			"radix_tree_node slot", FAULT_ON_ERROR);
  
  		if (slot == NULL)
  			return NULL;
 @@ -3657,15 +3660,13 @@ radix_tree_lookup(ulong root_rnode, ulon
  			sizeof(struct radix_tree_node),
  			"radix_tree_node struct", FAULT_ON_ERROR);
  
 -		uslotp = (void **)
 -		    (slotbuf.slots + ((index >> shift) & RADIX_TREE_MAP_MASK));
 -		kslotp = *uslotp;
 -
 +		slot = slotbuf.slots[((index >> shift) & RADIX_TREE_MAP_MASK)];
 +		
  		shift -= RADIX_TREE_MAP_SHIFT;
  		height--;
  	}
  
 -	return (void *) kslotp;
 +	return slot;
  }
  
  int
 
 
 ------------------------------------------------------------------------
 
 --
 Crash-utility mailing list
 Crash-utility(a)redhat.com
 
https://www.redhat.com/mailman/listinfo/crash-utility