怎么通过inode获取绝对路径

如题所述

比如说ln a b之后,dentry a和dentry b的d_inode都是相同的,而这两个dentry,通过d_alias字段挂在inode的i_dentry列表中。
所以说,从一个inode出发,得到的全路径不止一个(每个link有一个)。
从dentry找全路径的过程,可以参考sys_getcwd的实现。
举个实际的例子:

[~]# touch linka
[~]# ln linka linkb
[~]# ls -i linka linkb
68834 linka 68834 linkb <------- 两个文件共享一个inode

#通过其它手段得知,对应的indoe位于ffff810035dc7110

#查看inode的dentry信息
crash> inode.i_dentry,i_ino ffff810035dc7110
i_dentry = {
next = 0xffff810028a3ed90, <------ next!=prev,说明非空,并且不只一个元素
prev = 0xffff81002bb6cbe0
}
i_ino = 68834 <------- 的确是这个inode

#遍历inode.i_dentry链表
#由于inode.i_dentry的偏移是0x30,所以i_dentry的地址是0xffff810035dc7110 + 0x30

crash> list -o dentry.d_alias -s dentry.d_name,d_inode -H ffff810035dc7140
#第一个node,也就是next
ffff810028a3ed20 <----- dentry.d_alias的偏移是0x70, 0xffff810028a3ed90 - 0x70
d_name = {
hash = 306522898,
len = 5,
name = 0xffff810028a3edd4 "linkb"
}
d_inode = 0xffff810035dc7110 <---- linkb的inode就是#68834
#第二个node,也就是prev
ffff81002bb6cb70 <------ 0xffff81002bb6cbe0 - 0x70
d_name = {
hash = 306522722,
len = 5,
name = 0xffff81002bb6cc24 "linka"
}
d_inode = 0xffff810035dc7110 <---- linka的inode也是#68834
温馨提示:答案为网友推荐,仅供参考
相似回答