jffs2的目录项查找调用的函数是jffs2_lookup,下面一起看一下这个函数。

/* We keep the dirent list sorted in increasing order of name hash,and we use the same hash function as the dentries. Makes thisnice and simple
*/
//上面的函数介绍中已经说明了,jffs2将文件夹的目录项按照目录项名的哈希值升序排序,以便于查找
static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,unsigned int flags)
{struct jffs2_inode_info *dir_f;struct jffs2_full_dirent *fd = NULL, *fd_list;uint32_t ino = 0;struct inode *inode = NULL;jffs2_dbg(1, "jffs2_lookup()\n");if (target->d_name.len > JFFS2_MAX_NAME_LEN)return ERR_PTR(-ENAMETOOLONG);dir_f = JFFS2_INODE_INFO(dir_i); //获取jffs2_inode_infomutex_lock(&dir_f->sem);//获取锁/* NB: The 2.2 backport will need to explicitly check for '.' and '..' here *///遍历dents链表for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {if (fd_list->nhash == target->d_name.hash &&(!fd || fd_list->version > fd->version) &&strlen(fd_list->name) == target->d_name.len &&!strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {fd = fd_list;}}if (fd)//若果找到了相应的jffs2_full_dirent结构体ino = fd->ino;mutex_unlock(&dir_f->sem);if (ino) {inode = jffs2_iget(dir_i->i_sb, ino);//获取相应inode节点if (IS_ERR(inode))pr_warn("iget() failed for ino #%u\n", ino);}return d_splice_alias(inode, target);//splice a disconnected dentry into the tree if one exists
}

一开始看这个函数有个疑问,在jffs2的mount过程中,最后不是把相应的full_dirent结构体释放了吗?为什么这里可以直接读呢?
原来,对于ino!=1的目录节点,在jffs2_do_read_inode_internel函数中,jffs2_do_read_inode_internal->jffs2_get_inode_nodes->read_direntry函数已经根据读取到的flash数据,建立了目录文件的目录项的jffs2_full_dirent结构体,并调用函数jffs2_add_fd_to_list把该full_dirent添加进入dents链表里,所以这里jffs2_lookup函数直接查询dents链表即可。
而对于ino==1的节点,在mount过程的最后,jffs2_do_fill_super->jffs2_iget(sb, 1)->jffs2_fo_read_inode函数最终还是会调用read_direntry函数完成full_dirent节点的创建。

jffs2的目录项查找过程相关推荐

  1. linux 内核 目录项高速缓存 dentry cache 简介

    每个dentry对象都属于下列几种状态之一: (1)未使用(unused)状态:该dentry对象的引用计数d_count的值为0,但其d_inode指针仍然指向相关的的索引节点.该目录项仍然包含有效 ...

  2. linux vfs 根节点名称,Linux:文件,目录项,索引节点,超级块,VFS,具体文件系统...

    [笔记:http://m.blog.csdn.net/blog/zhouzhou135] 在了解文件系统之前,先了解磁盘格式化的知识. 所以要理解文件系统的数据结构,要从两个方向来理解: 1:磁盘中的 ...

  3. Linux文件存储结构,包括目录项、inode、数据块

    2019独角兽企业重金招聘Python工程师标准>>> 先说inode 理解inode,要从文件储存说起.文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sec ...

  4. 命题作文:在一棵IPv4地址树中彻底理解IP路由表的各种查找过程

    这是一篇命题作文.近期一直想写点东西,但一直找不到题目,正好收到一封邮件,有人问我Linux路由表的布局问题以及路由缓存的问题,加之前些日子又帮人做了一个片上路由表,所以觉得这是个好题目,索性花了多半 ...

  5. 命题作文 在一棵IPv4地址树中彻底理解IP路由表的各种查找过程

    这是一篇命题作文.近期一直想写点东西,但一直找不到题目,正好收到一封邮件,有人问我Linux路由表的布局问题以及路由缓存的问题,加之前些日子又帮人做了一个片上路由表,所以觉得这是个好题目,索性花了多半 ...

  6. 在一棵IPv4地址树中彻底理解IP路由表的各种查找过程

    1.IPv4地址空间树 IPv4的整个地址空间可以构成一棵完美的二叉树,因为它完全占满了整个4G的地址空间.这棵树如下所示: 需要指明的是,完全画出这幅图是不可能的,如果一个节点的直径小到1mm(这意 ...

  7. FAT16文件系统之目录项分析(四)

    FAT16文件系统的FDT分析 1:FDT位置 FDT的含义为文件目录表,它在一个文件系统中的具体位置是紧跟在FAT2之后. 定位过程: A:系统通过读取该分区表信息,定位到其DBR扇区 B:读取DB ...

  8. 记录 误删linux bin目录的恢复过程

    记录 误删linux bin目录的恢复过程 这两天在公司的k8s平台系统中,使用root用户误删了bin 目录,,导致整个系统大部分的命令都 无法执行 原本想执行的是 rm -rf ~/bin 结果手 ...

  9. winscp 列出‘/users‘的目录项时出错解决方法

    背景:需要访问ftp,查看服务器中文件,最后选择使用winscp连接,正常安装winscp后,输入信息访问,但是一直出现"监测到超时! (数据连接) 无法获得目录列表 列出'/users'的 ...

最新文章

  1. AM335X can驱动移植
  2. js 排列 组合 的一个简单例子
  3. nginx整合php+lua+oracle环境搭建
  4. 搭建本地的git仓库
  5. JavaScript练习笔记
  6. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
  7. vue中标签自定义属性的使用
  8. Django Model View Template 之间的简单交互 (二)
  9. 搜索引擎字符串(亲测)
  10. 安装vbb的一些经验(包括mysql,apache)
  11. 学计算机买什么书好,学电脑基础知识买什么书好?
  12. 沟通CTBS立白集团远程接入成功案例
  13. 网络中的三张表——ARP表、MAC表、路由表
  14. CAD图纸转BMP格式图片时怎么设置输出色彩?
  15. linux安装qq(deb文件)
  16. 高德地图有用的API
  17. HTML中让整个效果居中,仅使用CSS做到完全居中的超级攻略
  18. Unity 2d 机器人的来回巡游
  19. 华为交换机端口安全配置
  20. os.listdir()详解

热门文章

  1. python3 zlib 实现压缩与解压字符串与文件数据流
  2. 关于Android证书MD5获取
  3. 2、mysql基本操作中
  4. 华邦存储芯片 W25Q 系列命名规则
  5. 修改战网服务器,使命召唤16现代战争怎么改战网地区_修改战网客户端的方法_3DM单机...
  6. 计算机二级C语言考试地点,最新计算机二级《C语言》重要考点
  7. 洛谷 Cantor 表
  8. 2017ICPC北京现场赛G Liaoning Ship’s Voyage(BFS+点在多边形内判定)
  9. android连连看源代码,#经典连连看#源码分享
  10. MFC实现基本图形绘制、变换、自由曲线绘制、图形裁剪和填充