Here is an enhancement Montavista used to debug a race condition in the kernel. Someone may find it useful here.
MR: 17281 Type: Enhancement Disposition: submitted to [email protected] Signed-off-by: Steven Dake <[EMAIL PROTECTED]> Signed-off-by: Mark Bellon <[EMAIL PROTECTED]> Description: If f_dentry is null, this KDB module will not print out any information. This patch changes that behavior to print out as much data as possible in the filp structure. diff -a -u -r1.1.4.1.50.2 kdbm_vm.c --- kdb/modules/kdbm_vm.c 4 Feb 2005 01:18:12 -0000 1.1.4.1.50.2 +++ kdb/modules/kdbm_vm.c 27 Feb 2006 17:18:58 -0000 @@ -341,18 +341,8 @@ nextarg = 1; if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs)) || - (diag = kdb_getarea(f, addr)) || - (diag = kdb_getarea(d, (unsigned long)f.f_dentry))) + (diag = kdb_getarea(f, addr))) goto out; - if (!(i = kmalloc(sizeof(*i), GFP_ATOMIC))) { - kdb_printf("kdbm_fp: cannot kmalloc inode\n"); - goto out; - } - if ((diag = kdb_getarea(*i, (unsigned long)d.d_inode))) - goto out; - - kdb_printf("name.name 0x%p name.len %d\n", - d.d_name.name, d.d_name.len); kdb_printf("File Pointer at 0x%lx\n", addr); @@ -363,21 +353,27 @@ f.f_dentry, f.f_op); kdb_printf(" f_count = %d f_flags = 0x%x f_mode = 0x%x\n", - f.f_count.counter, f.f_flags, f.f_mode); + atomic_read(&f.f_count), f.f_flags, f.f_mode); kdb_printf(" f_pos = %Ld f_reada = %ld f_ramax = %ld\n", f.f_pos, f.f_reada, f.f_ramax); - kdb_printf(" f_raend = %ld f_ralen = %ld f_rawin = %ld\n\n", + kdb_printf(" f_raend = %ld f_ralen = %ld f_rawin = %ld\n", f.f_raend, f.f_ralen, f.f_rawin); + kdb_printf(" f_vfsmnt = 0x%p\n\n", + f.f_vfsmnt); + + if (!f.f_dentry || (diag = kdb_getarea(d, (unsigned long)f.f_dentry))) + goto out; kdb_printf("\nDirectory Entry at 0x%p\n", f.f_dentry); + kdb_printf(" d_name.len = %d d_name.name = 0x%p>\n", d.d_name.len, d.d_name.name); kdb_printf(" d_count = %d d_flags = 0x%x d_inode = 0x%p\n", - atomic_read(&d.d_count), d.d_flags, d.d_inode); + atomic_read(&d.d_count), d.d_flags, d.d_inode); kdb_printf(" d_hash.nxt = 0x%p d_hash.prv = 0x%p\n", d.d_hash.next, d.d_hash.prev); @@ -397,6 +393,13 @@ kdb_printf(" d_op = 0x%p d_sb = 0x%p\n\n", d.d_op, d.d_sb); + if (!(i = kmalloc(sizeof(*i), GFP_ATOMIC))) { + kdb_printf("kdbm_fp: cannot kmalloc inode\n"); + goto out; + } + + if (!d.d_inode || (diag = kdb_getarea(*i, (unsigned long)d.d_inode))) + goto out; kdb_printf("\nInode Entry at 0x%p\n", d.d_inode); @@ -412,7 +415,7 @@ kdb_printf(" i_list.nxt = 0x%p i_list.prv = 0x%p\n", i->i_list.next, i->i_list.prev); - kdb_printf(" i_dentry.nxt = 0x%p i_dentry.prv = 0x%p\n", + kdb_printf(" i_dentry.nxt = 0x%p i_dentry.prv = 0x%p\n\n", i->i_dentry.next, i->i_dentry.prev); out: --------------------------- Use http://oss.sgi.com/ecartis to modify your settings or to unsubscribe.
