前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何通过inode找到对应dentry

如何通过inode找到对应dentry

原创
作者头像
johnazhang
修改2021-05-28 18:10:38
2.3K0
修改2021-05-28 18:10:38
举报
文章被收录于专栏:Linux问题笔记Linux问题笔记

通过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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档