enhancement to filp macro

Steven Dake sdake at mvista.com
Mon Feb 27 12:29:39 PST 2006


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 kdb at oss.sgi.com
Signed-off-by: Steven Dake <sdake at mvista.com>
Signed-off-by: Mark Bellon <mbellon at mvista.com>
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.


More information about the kdb mailing list