通过dentry找inode众人皆知,但是如何通过inode找dentry?
答案先行:inode里有一个成员叫i_dentry,一般情况可以通过这个来找到。
实践:
在一次crash分析中,write卡住了,我们需要找到write的是什么文件。
通过从栈上找参数,我们找到了inode的地址是:ffff915e6effb130
然后看看i_dentry:
crash> inode.i_dentry ffff915e6effb130
i_dentry = {
first = 0xffff91617f8e9bf0
}
dentry中的d_alias对应的就是上面的成员,他的偏移量在0xb0,因此对应dentry的地址就是0xffff91617f8e9bf0
- 0xb0是ffff91617f8e9b40,我们来看看:
crash> dentry ffff91617f8e9b40
struct dentry {
d_flags = 67108992,
d_seq = {
sequence = 4
},
d_hash = {
next = 0x0,
pprev = 0xffffbb10c05f2c78
},
d_parent = 0xffff915ec7769900,
d_name = {
{
{
hash = 1414399152,
len = 26
},
hash_len = 113083548848
},
name = 0xffff91617f8e9b78 从这里就可以知道文件名是啥,但由于有客户机器相关信息这里删掉了
},
d_inode = 0xffff915e6effb130,
d_iname = , 删掉了,和上面的name同理
d_lockref = {
{
lock_count = 4294967296,
{
lock = {
{
rlock = {
raw_lock = {
val = {
counter = 0
}
}
}
}
},
count = 1
}
}
},
d_op = 0x0,
d_sb = 0xffff915d768f4800,
d_time = 3689916158396609585,
d_fsdata = 0x0,
d_lru = {
next = 0xffff91617f8e9bc0,
prev = 0xffff91617f8e9bc0
},
d_u = {
d_child = {
next = 0xffff9160532855d0,
prev = 0xffff915ec77699a0
},
d_rcu = {
next = 0xffff9160532855d0,
func = 0xffff915ec77699a0
}
},
d_subdirs = {
next = 0xffff91617f8e9be0,
prev = 0xffff91617f8e9be0
},
d_alias = {
next = 0x0,
pprev = 0xffff915e6effb248
}
}
这样可以看到对应的inode和文件名了。
最后补充说明一下,可以看到d_alias是一个hlist,因为inode可以对应很多dentry(硬链接),所以要找到所有对应的dentry就要用list找了,那就是另一个故事了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。