但前面的创建目录和创建文件,都没有inode和dentry,下面我们就看看sysfs中sysfs_dirent与inode dentry是如何建立联系的?
前面提到过,就在sysfs_lookup函数中:
通过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
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
的层次结构是相一致的。