对于具体的文件系统,因为在vfs层下,所以必须有inode和dentry才能用,但从前两篇中我们只看到了sysfs中的sysfs_dirent搭建起来的目录树,通过sysfs_dirent与kobject的紧密关系,也可看到kobject的层次关系。

      但前面的创建目录和创建文件,都没有inode和dentry,下面我们就看看sysfs中sysfs_dirent与inode dentry是如何建立联系的?

      前面提到过,就在sysfs_lookup函数中:

      

static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
				struct nameidata *nd)
{
	struct dentry *ret = NULL;
	struct sysfs_dirent *parent_sd = dentry->d_parent->d_fsdata;
	struct sysfs_dirent *sd;
	struct inode *inode;

	mutex_lock(&sysfs_mutex);

	sd = sysfs_find_dirent(parent_sd, dentry->d_name.name);

	/* no such entry */
	if (!sd) {
		ret = ERR_PTR(-ENOENT);
		goto out_unlock;
	}

	/* attach dentry and inode */
	inode = sysfs_get_inode(dir->i_sb, sd);
	if (!inode) {
		ret = ERR_PTR(-ENOMEM);
		goto out_unlock;
	}

	/* instantiate and hash dentry */
	ret = d_find_alias(inode);
	if (!ret) {
		dentry->d_op = &sysfs_dentry_ops;
		dentry->d_fsdata = sysfs_get(sd);
		d_add(dentry, inode);
	} else {
		d_move(ret, dentry);
		iput(inode);
	}

 out_unlock:
	mutex_unlock(&sysfs_mutex);
	return ret;
}
   1、struct sysfs_dirent *parent_sd = dentry->d_parent->d_fsdata; //找出父级的sysfs_dirent

   通过dentry的父子层次关系来找到sysfs_dirent,实际在dentry结构体中,有一个指针:void *d_fsdata; /* fs-specific data */

   在sysfs中,我们都是通过这个指针来建立dentry和sysfs_dirent的关系,其实在sysfs安装之初,就有sysfs的“/”(dentry)的d_fsdata指向了sysfs_root(sysfs_dirent的根)

   2、sd = sysfs_find_dirent(parent_sd, dentry->d_name.name);  

   根据name在parent_sd下层中的sysfs_dirent查找,在linux文件系统的系统分析--(六)sysfs下目录的创建的图中可以看出链表的查找过程

   3、inode = sysfs_get_inode(dir->i_sb, sd);创建inode

       sysfs_get_inode-->iget_locked从inode_hashtable中获取inode

       sysfs_get_inode-->sysfs_init_inode

	switch (sysfs_type(sd)) {
	case SYSFS_DIR:
		inode->i_op = &sysfs_dir_inode_operations;
		inode->i_fop = &sysfs_dir_operations;
		break;
	case SYSFS_KOBJ_ATTR:
		inode->i_size = PAGE_SIZE;
		inode->i_fop = &sysfs_file_operations;
     对于目录和属性文件,这里就是不同的i_fop

     4、将inode dentry和sysfs_dirent的关系建立起来:dentry->d_fsdata = sysfs_dirent  dentry->d_inode = inode  inode->i_private = sysfs_dirent


     到此,关系都确立了,实际上dentry的层次关系是这样的:通过上层dentry的d_subdirs与下层dentry的d_child组成一个双向的循环链表,总体来说dentry与sysfs_dirent

     的层次结构是相一致的。


GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐