VFS四大对象之三 struct dentry
Posted yooooooo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VFS四大对象之三 struct dentry相关的知识,希望对你有一定的参考价值。
继上一篇文章介绍了inode结构体:继续介绍目录项dentry:
三、dentry结构体
目录项:目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计。注意不管是文件夹还是最终的文件,都是属于目录项,所有的目录项在一起构成一颗庞大的目录树。例如:open一个文件/home/xxx/yyy.txt,那么/、home、xxx、yyy.txt都是一个目录项,VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,那么沿着目录项进行操作就可以找到最终的文件。
注意:目录也是一种文件(所以也存在对应的inode)。打开目录,实际上就是打开目录文件。
1 struct dentry { 2 /* RCU lookup touched fields */ 3 unsigned int d_flags; /* protected by d_lock */ 4 seqcount_t d_seq; /* per dentry seqlock */ 5 struct hlist_bl_node d_hash; /* lookup hash list */ 6 struct dentry *d_parent; /* parent directory */ 7 struct qstr d_name; 8 struct inode *d_inode; /* Where the name belongs to - NULL is 9 * negative */ 10 unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ 11 12 /* Ref lookup also touches following */ 13 unsigned int d_count; /* protected by d_lock */ 14 spinlock_t d_lock; /* per dentry lock */ 15 const struct dentry_operations *d_op; 16 struct super_block *d_sb; /* The root of the dentry tree */ 17 unsigned long d_time; /* used by d_revalidate */ 18 void *d_fsdata; /* fs-specific data */ 19 20 struct list_head d_lru; /* LRU list */ 21 /* 22 * d_child and d_rcu can share memory 23 */ 24 union { 25 struct list_head d_child; /* child of parent list */ 26 struct rcu_head d_rcu; 27 } d_u; 28 struct list_head d_subdirs; /* our children */ 29 struct list_head d_alias; /* inode alias list */ 30 };
解释一些字段:
d_count:引用计数
d_flags:目录项缓存标识,可取DCACHE_UNUSED、DCACHE_REFERENCED等
d_inode:与该目录项关联的inode
d_parent:父目录的目录项
d_hash:内核使用dentry_hashtable对dentry进行管理,dentry_hashtable是由list_head组成的链表,一个dentry创建之后,就通过
d_hash链接进入对应的hash值的链表中。
d_lru:最近未使用的目录项的链表
d_child:目录项通过这个加入到父目录的d_subdirs中
d_subdirs:本目录的所有孩子目录链表头
d_alias:一个有效的dentry必然与一个inode关联,但是一个inode可以对应多个dentry,因为一个文件可以被链接到其他文件,所以,这个dentry就是通过这个字段链接到属于自己的inode结构中的i_dentry链表中的。(inode中讲过)
d_mounted:安装在该目录的文件系统的数量!注意一个文件目录下可以有不同的文件系统!
d_name:目录项名称
d_time:重新变为有效的时间!注意只要操作成功这个dentry就是有效的,否则无效。
d_op:目录项操作
d_sb:这个目录项所属的文件系统的超级块
d_vfs_flags:一些标志
d_fsdata:文件系统私有数据
d_iname:存放短的文件名
一些解释:一个有效的dentry结构必定有一个inode结构,这是因为一个目录项要么代表着一个文件,要么代表着一个目录,而目录实际上也是文件。所以,只要dentry结构是有效的,则其指针d_inode必定指向一个inode结构。但是inode却可以对应多个
dentry,上面已经说过两次了。
注意:整个结构其实就是一棵树。
以上是关于VFS四大对象之三 struct dentry的主要内容,如果未能解决你的问题,请参考以下文章
文件系统VFS数据结构(超级块 inode dentry file)(收集整理)
VFS,super_block,inode,dentry—结构体图解