linux文件系统的系统分析--(八)sysfs中sysfs_dirent与inode dentry的关系

11 篇文章 1 订阅


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

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

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

      

[cpp]   view plain  copy
  1. static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,  
  2.                 struct nameidata *nd)  
  3. {  
  4.     struct dentry *ret = NULL;  
  5.     struct sysfs_dirent *parent_sd = dentry->d_parent->d_fsdata;  
  6.     struct sysfs_dirent *sd;  
  7.     struct inode *inode;  
  8.   
  9.     mutex_lock(&sysfs_mutex);  
  10.   
  11.     sd = sysfs_find_dirent(parent_sd, dentry->d_name.name);  
  12.   
  13.     /* no such entry */  
  14.     if (!sd) {  
  15.         ret = ERR_PTR(-ENOENT);  
  16.         goto out_unlock;  
  17.     }  
  18.   
  19.     /* attach dentry and inode */  
  20.     inode = sysfs_get_inode(dir->i_sb, sd);  
  21.     if (!inode) {  
  22.         ret = ERR_PTR(-ENOMEM);  
  23.         goto out_unlock;  
  24.     }  
  25.   
  26.     /* instantiate and hash dentry */  
  27.     ret = d_find_alias(inode);  
  28.     if (!ret) {  
  29.         dentry->d_op = &sysfs_dentry_ops;  
  30.         dentry->d_fsdata = sysfs_get(sd);  
  31.         d_add(dentry, inode);  
  32.     } else {  
  33.         d_move(ret, dentry);  
  34.         iput(inode);  
  35.     }  
  36.   
  37.  out_unlock:  
  38.     mutex_unlock(&sysfs_mutex);  
  39.     return ret;  
  40. }  
   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

[cpp]   view plain  copy
  1. switch (sysfs_type(sd)) {  
  2. case SYSFS_DIR:  
  3.     inode->i_op = &sysfs_dir_inode_operations;  
  4.     inode->i_fop = &sysfs_dir_operations;  
  5.     break;  
  6. case SYSFS_KOBJ_ATTR:  
  7.     inode->i_size = PAGE_SIZE;  
  8.     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

     的层次结构是相一致的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值