----- Original Message -----
Hi Dave,
On a recurring series of crashes on kernel 3.10.0-693.17.1.el7.x86_64 (RHEL
7.4), a problem was triggered by deletion of a file by a process with this
stack trace:
#0 [ffff88115b0ef798] __schedule at ffffffff816ab2ac
#1 [ffff88115b0ef828] schedule at ffffffff816ab8a9
#2 [ffff88115b0ef838] jbd2_log_wait_commit at ffffffffc0177455 [jbd2]
#3 [ffff88115b0ef8b0] jbd2_log_do_checkpoint at ffffffffc017405f [jbd2]
#4 [ffff88115b0ef918] __jbd2_log_wait_for_space at ffffffffc017445f [jbd2]
#5 [ffff88115b0ef960] add_transaction_credits at ffffffffc016e3d3 [jbd2]
#6 [ffff88115b0ef9c0] start_this_handle at ffffffffc016e5e1 [jbd2]
#7 [ffff88115b0efa58] jbd2__journal_restart at ffffffffc016ec9e [jbd2]
#8 [ffff88115b0efa98] jbd2_journal_restart at ffffffffc016ed13 [jbd2]
#9 [ffff88115b0efaa8] ext4_truncate_restart_trans at ffffffffc027be7e [ext4]:
#10 [ffff88115b0efad8] ext4_free_branches at ffffffffc02bc9d7 [ext4]
#11 [ffff88115b0efb38] ext4_free_branches at ffffffffc02bc887 [ext4]
#12 [ffff88115b0efb98] ext4_free_branches at ffffffffc02bc887 [ext4]
#13 [ffff88115b0efbf8] ext4_ind_truncate at ffffffffc02bda5e [ext4]
#14 [ffff88115b0efcb8] ext4_truncate at ffffffffc0280ca8 [ext4]
#15 [ffff88115b0efcf0] ext4_evict_inode at ffffffffc02818e0 [ext4]
#16 [ffff88115b0efd10] evict at ffffffff8121f879
#17 [ffff88115b0efd38] iput at ffffffff81220189
#18 [ffff88115b0efd68] rfs_d_iput at ffffffffc03f7d10 [ redirfs ]
#19 [ffff88115b0efe00] dentry_kill at ffffffff8121a90c
#20 [ffff88115b0efe30] dput at ffffffff8121a9ce
#21 [ffff88115b0efe50] path_put at ffffffff8120d576
#22 [ffff88115b0efe68] gsch_nd_release at ffffffffc043733e [ gsch ]
#23 [ffff88115b0efe78] gsch_unlink_hook_fn at ffffffffc043
It was useful for our troubleshooting to identify the file being deleted in
each of these crashes, and dentry_kill () takes a dentry pointer as its only
argument:
struct dentry * dentry_kill ( struct dentry *);
Finding the dentry pointer (using ‘ fregs ’ command in PyKdump , or digging
it off the stack):
#19 dentry_kill called from 0xffffffff8121a9ce <dput+94>
+R12: 0xffff880328399858
+R13: 0x0
+R14: 0xffff880a0fb975b8
+RBP: 0xffff88115b0efe48
+RBX: 0xffff880328399800
1 RDI: 0xffff880328399800 arg0 struct dentry *
‘files -d’ on this dentry doesn’t return the path:
crash64> files -d 0xffff880328399800
DENTRY INODE SUPERBLK TYPE PATH
ffff880328399800 0 0 N/A
This is because dentry.d_inode is null; at this point in the removal process,
dentry_iput () has cleared it.
crash64> dentry.d_inode 0xffff880328399800
d_inode = 0x0
And display_dentry_info () in crash gives up if this is the case:
if (! inode || !superblock)
goto nopath ;
But the dentry still contains all the information needed to find the path:
crash64> dentry.d_sb,d_name ffff880328399800
d_sb = 0xffff8817daaf6800
d_name = {
{
{
hash = 3169988838,
len = 30
},
hash_len = 132019007718
},
name = 0xffff880328399838 "MRAQ0431_1_10357_982129979.arc"
So I modified the following:
( defs.h )
2069d2068
< long dentry_d_sb ;
( filesys.c )
1698,1702c1698,1702
< } else {
< inode_buf = NULL;
< }
<
< superblock = ULONG( dentry_buf + OFFSET( dentry_d_sb ));
---
> superblock = ULONG( inode_buf + OFFSET( inode_i_sb ));
> } else {
> inode_buf = NULL;
> superblock = 0;
> }
1704c1704
< if (!superblock)
---
> if (! inode || !superblock)
2018d2017
< MEMBER_OFFSET_INIT( dentry_d_sb , " dentry ", " d_sb ");
With this patch, ‘files -d’ correctly returns the path:
crash> files -d ffff880328399800
DENTRY INODE SUPERBLK TYPE PATH
ffff880328399800 0 ffff8817daaf6800 N/A /u02/ oraarch
/MRAQ0431/MRAQ0431_1_10357_982129979.arc
Can this be included as a patch to crash?
Rather than making a wholesale switch, can you make it check the dentry.d_inode first,
and if it's NULL, then check dentry.d_sb? I'm probably being paranoid, but
I'm worried
about unintended consequences.
Thanks,
Dave
Thanks,
Martin
Martin Moore
Linux/Tru64 RTCC Engineer
CSC Americas
HPE Technology Services
Hewlett Packard Enterprise
--
Crash-utility mailing list
Crash-utility(a)redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility