10/01/02 15:25, Eric Sandeen wrote:
> Can you do a bit more work?
>
> Assuming your kernel has xfs built in, and you have a source tree that
> can rebuild this exact kernel, try:
>
> cd /usr/src/linux
> rm fs/xfs/xfs_vfsops.o
>
> then rebuild the kernel:
>
> make CFLAGS_xfs_vfsops.o=-g vmlinux
[root@awacs linux]$ make CFLAGS_xfs_vfsops.o=-g vmlinux
. scripts/mkversion > .tmpversion
/bin/sh: invalid character 46 in exportstr for CFLAGS_xfs_vfsops.o
/bin/sh: invalid character 46 in exportstr for CFLAGS_xfs_vfsops.o
/bin/sh: invalid character 46 in exportstr for CFLAGS_xfs_vfsops.o
/bin/sh: invalid character 46 in exportstr for CFLAGS_xfs_vfsops.o
/bin/sh: invalid character 46 in exportstr for CFLAGS_xfs_vfsops.o
/bin/sh: invalid character 46 in exportstr for CFLAGS_xfs_vfsops.o
/bin/sh: invalid character 46 in exportstr for CFLAGS_xfs_vfsops.o
/bin/sh: invalid character 46 in exportstr for CFLAGS_xfs_vfsops.o
kgcc -D__KERNEL__ -I/usr/src/linux-2.4.16-xfs-ll/include -Wall
-Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common
-fomit-frame-pointer -pi
[Hmm..]
> Then run objdump on /usr/src/vmlinux:
>
> objdump -S --start-address=c01ccb00 --stop-address=c01ccbff vmlinux
>
> (you can expand/contract --start-address and stop-address, just need
> enough to contain your oops point (c01ccb41) and some surrounding code).
[root@awacs linux]$ objdump -S --start-address=c01ccb00 --stop-address=c01ccbff
vmlinux
objdump: --start-address: bad number: c01ccb00
[Just read Keith's post, apparently the numbers should be 0x...]
[root@awacs linux]$ objdump -S --start-address=0xc01ccb00
--stop-address=0xc01ccbff vmlinux
[Wow, what a nice tool!]
vmlinux: file format elf32-i386
Disassembly of section .text:
c01ccb00 <xfs_syncsub+0x918>:
if (mount_locked == B_FALSE) {
XFS_MOUNT_ILOCK(mp);
mount_locked = B_TRUE;
IPOINTER_REMOVE(ip, mp);
c01ccb00: 0c 89 or $0x89,%al
c01ccb02: 70 08 jo c01ccb0c <xfs_syncsub+0x924>
c01ccb04: 8b 4c 24 70 mov 0x70(%esp,1),%ecx
c01ccb08: 8b 91 14 01 00 00 mov 0x114(%ecx),%edx
c01ccb0e: 39 fa cmp %edi,%edx
c01ccb10: 75 2f jne c01ccb41 <xfs_syncsub+0x959>
c01ccb12: 89 b1 14 01 00 00 mov %esi,0x114(%ecx)
c01ccb18: 89 f2 mov %esi,%edx
c01ccb1a: eb 25 jmp c01ccb41 <xfs_syncsub+0x959>
c01ccb1c: 8d 74 26 00 lea 0x0(%esi,1),%esi
c01ccb20: 8b 5c 24 70 mov 0x70(%esp,1),%ebx
c01ccb24: c7 83 14 01 00 00 00 movl $0x0,0x114(%ebx)
c01ccb2b: 00 00 00
c01ccb2e: 31 f6 xor %esi,%esi
continue;
c01ccb30: 31 d2 xor %edx,%edx
c01ccb32: eb 0d jmp c01ccb41 <xfs_syncsub+0x959>
}
ASSERT(ipointer_in == B_FALSE);
ip = ip->i_mnext;
c01ccb34: 8b 4c 24 70 mov 0x70(%esp,1),%ecx
c01ccb38: 8b 76 08 mov 0x8(%esi),%esi
c01ccb3b: 8b 91 14 01 00 00 mov 0x114(%ecx),%edx
} while (ip->i_mnext != mp->m_inodes);
[*ksymoops disassembly matches here*]
c01ccb41: 39 56 08 cmp %edx,0x8(%esi)
c01ccb44: 74 10 je c01ccb56 <xfs_syncsub+0x96e>
c01ccb46: 8b 5c 24 38 mov 0x38(%esp,1),%ebx
c01ccb4a: 89 5c 24 3c mov %ebx,0x3c(%esp,1)
c01ccb4e: 85 f6 test %esi,%esi
c01ccb50: 0f 85 fa f7 ff ff jne c01cc350 <xfs_syncsub+0x168>
XFS_MOUNT_IUNLOCK(mp);
c01ccb56: 8b 4c 24 20 mov 0x20(%esp,1),%ecx
c01ccb5a: 51 push %ecx
c01ccb5b: e8 30 33 01 00 call c01dfe90 <_mutex_unlock>
ASSERT(ipointer_in == B_FALSE);
/*
* Get the Quota Manager to flush the dquots in a similar manner.
*/
if (XFS_IS_QUOTA_ON(mp)) {
c01ccb60: 83 c4 04 add $0x4,%esp
c01ccb63: 8b 5c 24 70 mov 0x70(%esp,1),%ebx
c01ccb67: f7 83 50 02 00 00 80 testl $0x180,0x250(%ebx)
c01ccb6e: 01 00 00
c01ccb71: 74 3d je c01ccbb0 <xfs_syncsub+0x9c8>
if ((error = xfs_qm_sync(mp, flags))) {
c01ccb73: 0f bf 44 24 74 movswl 0x74(%esp,1),%eax
c01ccb78: 50 push %eax
c01ccb79: 53 push %ebx
c01ccb7a: e8 01 d0 fa ff call c0179b80 <xfs_qm_sync>
c01ccb7f: 89 44 24 54 mov %eax,0x54(%esp,1)
c01ccb83: 83 c4 08 add $0x8,%esp
c01ccb86: 83 7c 24 4c 00 cmpl $0x0,0x4c(%esp,1)
c01ccb8b: 74 23 je c01ccbb0 <xfs_syncsub+0x9c8>
/*
* If we got an IO error, we will be shutting down.
* So, there's nothing more for us to do here.
*/
ASSERT(error != EIO || XFS_FORCED_SHUTDOWN(mp));
if (XFS_FORCED_SHUTDOWN(mp)) {
c01ccb8d: f6 83 34 02 00 00 10 testb $0x10,0x234(%ebx)
c01ccb94: 74 1a je c01ccbb0 <xfs_syncsub+0x9c8>
kmem_free(ipointer, sizeof(xfs_iptr_t));
c01ccb96: 6a 18 push $0x18
c01ccb98: 57 push %edi
c01ccb99: e8 16 2a 01 00 call c01df5b4 <kmem_free>
return XFS_ERROR(error);
c01ccb9e: 8b 44 24 54 mov 0x54(%esp,1),%eax
c01ccba2: 83 c4 08 add $0x8,%esp
c01ccba5: e9 5d 02 00 00 jmp c01cce07 <xfs_syncsub+0xc1f>
c01ccbaa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
}
}
}
/*
* Flushing out dirty data above probably generated more
* log activity, so if this isn't vfs_sync() then flush
* the log again. If SYNC_WAIT is set then do it synchronously.
*/
if (!(flags & SYNC_BDFLUSH)) {
c01ccbb0: 83 7c 24 28 00 cmpl $0x0,0x28(%esp,1)
c01ccbb5: 75 24 jne c01ccbdb <xfs_syncsub+0x9f3>
log_flags = XFS_LOG_FORCE;
c01ccbb7: b8 02 00 00 00 mov $0x2,%eax
if (flags & SYNC_WAIT) {
c01ccbbc: ba 03 00 00 00 mov $0x3,%edx
c01ccbc1: 83 7c 24 24 00 cmpl $0x0,0x24(%esp,1)
c01ccbc6: 0f 45 c2 cmovne %edx,%eax
log_flags |= XFS_LOG_SYNC;
}
xfs_log_force(mp, (xfs_lsn_t)0, log_flags);
c01ccbc9: 50 push %eax
c01ccbca: 6a 00 push $0x0
c01ccbcc: 6a 00 push $0x0
c01ccbce: 8b 4c 24 7c mov 0x7c(%esp,1),%ecx
c01ccbd2: 51 push %ecx
c01ccbd3: e8 08 f6 fe ff call c01bc1e0 <xfs_log_force>
}
c01ccbd8: 83 c4 10 add $0x10,%esp
if (flags & SYNC_FSDATA) {
c01ccbdb: 8b 5c 24 74 mov 0x74(%esp,1),%ebx
c01ccbdf: f6 c3 20 test $0x20,%bl
c01ccbe2: 0f 84 db 00 00 00 je c01cccc3 <xfs_syncsub+0xadb>
/*
* If this is vfs_sync() then only sync the superblock
* if we can lock it without sleeping and it is not pinned.
*/
if (flags & SYNC_BDFLUSH) {
c01ccbe8: 83 7c 24 14 00 cmpl $0x0,0x14(%esp,1)
c01ccbed: 74 71 je c01ccc60 <xfs_syncsub+0xa78>
bp = xfs_getsb(mp, XFS_BUF_TRYLOCK);
c01ccbef: 68 00 40 00 00 push $0x4000
c01ccbf4: 8b 4c 24 74 mov 0x74(%esp,1),%ecx
c01ccbf8: 51 push %ecx
c01ccbf9: e8 6a 82 ff ff call c01c4e68 <xfs_getsb>
c01ccbfe: 89 44 24 5c mov %eax,0x5c(%esp,1)
Disassembly of section .text.lock:
Disassembly of section .text.init:
|