其他分享
首页 > 其他分享> > VFS数据结构之(dentry)

VFS数据结构之(dentry)

作者:互联网

1. 目录项对象(dentry object)

VFS把每个目录看作一个文件,由若干子目录和文件组成。对于进程查找路径名中的每个分量,内核都为其创建一个目录项对象;目录项对象将每个分量与其对应的索引节点相联系。例如/tmp/test,内核会分别为“/”,“tmp”,“test”创建目录项。注意,目录项对象在磁盘上没有对应的映像,所以dentry中不包含判断dirty的标志。

引入目录项结构是很有必要的,因为同一个文件有且仅有一个inode对象表示,而由于硬链接的存在,对同一文件的访问可以通过不同的文件名,所以中间需要引入目录项。

1.1 目录项数据结构

struct dentry {
	atomic_t d_count;				/* 目录项对象引用计数器 */
	unsigned int d_flags;			/* 目录项高速缓存标志 */
	spinlock_t d_lock;				/* 保护目录项对象的自旋锁 */
	struct inode *d_inode;			/* 与文件名关联的索引节点 */
	struct hlist_node d_hash;		/* 指向散列表表项链表的指针 */
	struct dentry *d_parent;		/* 父目录的目录项对象 */
	struct qstr d_name;				/* 文件名 */
	struct list_head d_lru;			/* 用于未使用目录项链表的指针 */
	union {
		struct list_head d_child;	/* 对目录而言,用于同一父目录中的目录项链表的指针 */
	 	struct rcu_head d_rcu;		/* 回收目录项对象时,由RCU描述符使用 */
	} d_u;
	struct list_head d_subdirs;		/* 对目录而言,子目录项链表的头 */
	struct list_head d_alias;		/* 用于与同一索引节点(别名)相关的目录项链表的指针 */
	unsigned long d_time;			/* 由d_revalidate方法使用 */
	struct dentry_operations *d_op;	/* 目录项方法 */
	struct super_block *d_sb;		/* 文件的超级块对象 */
	void *d_fsdata;					/* 依赖于文件系统的数据 */
	struct dcookie_struct *d_cookie;/* 指向内核配置文件使用的数据结构的指针 */
	int d_mounted;					/* 对目录项而言,用于记录安装该目录项的文件系统数的计数器 */
	unsigned char d_iname[DNAME_INLINE_LEN_MIN];	/* 存放短文件名的空间 */
};

1.2 目录项的状态

1.3 关键字段说明

1.4 目录项操作

与目录项对象关联的方法由 dentry_operations 结构描述,由 d_op 字段指向。

struct dentry_operations {
	int (*d_revalidate)(struct dentry *, struct nameidata *);
	int (*d_hash) (struct dentry *, struct qstr *);
	int (*d_compare) (struct dentry *, struct qstr *, struct qstr *);
	int (*d_delete)(struct dentry *);
	void (*d_release)(struct dentry *);
	void (*d_iput)(struct dentry *, struct inode *);
	char *(*d_dname)(struct dentry *, char *, int);
};

1.5 分配根目录项

/**
 *	@root_inode:	用于根目录项的索引节点
 */
struct dentry * d_alloc_root(struct inode * root_inode)
		struct dentry *res = NULL;
		/* 根目录项的名字“/” */
		static const struct qstr name = { .name = "/", .len = 1 };

		res = d_alloc(NULL, &name);
				struct dentry *dentry;
				char *dname;
				
				dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL);
				dentry->d_name.name = dname;
				dentry->d_name.len = name->len;
				dentry->d_name.hash = name->hash;
				memcpy(dname, name->name, name->len);
				atomic_set(&dentry->d_count, 1);
				dentry->d_flags = DCACHE_UNHASHED;
		res->d_sb = root_inode->i_sb;
		/* 根目录项的父目录项是其本身 */
		res->d_parent = res;
		/**
		 * d_instantiate - 为目录项填充索引节点信息
		 * @entry: 目录项
		 * @inode: 与该目录项关联的索引节点
		 */		
		d_instantiate(res, root_inode);
				list_add(&entry->d_alias, &inode->i_dentry);
				entry->d_inode = inode;

标签:hash,struct,dentry,对象,数据结构,VFS,目录,name
来源: https://blog.csdn.net/weixin_50497980/article/details/118853272