jffs2的目录项查找过程
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的目录项查找过程相关推荐
- linux 内核 目录项高速缓存 dentry cache 简介
每个dentry对象都属于下列几种状态之一: (1)未使用(unused)状态:该dentry对象的引用计数d_count的值为0,但其d_inode指针仍然指向相关的的索引节点.该目录项仍然包含有效 ...
- linux vfs 根节点名称,Linux:文件,目录项,索引节点,超级块,VFS,具体文件系统...
[笔记:http://m.blog.csdn.net/blog/zhouzhou135] 在了解文件系统之前,先了解磁盘格式化的知识. 所以要理解文件系统的数据结构,要从两个方向来理解: 1:磁盘中的 ...
- Linux文件存储结构,包括目录项、inode、数据块
2019独角兽企业重金招聘Python工程师标准>>> 先说inode 理解inode,要从文件储存说起.文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sec ...
- 命题作文:在一棵IPv4地址树中彻底理解IP路由表的各种查找过程
这是一篇命题作文.近期一直想写点东西,但一直找不到题目,正好收到一封邮件,有人问我Linux路由表的布局问题以及路由缓存的问题,加之前些日子又帮人做了一个片上路由表,所以觉得这是个好题目,索性花了多半 ...
- 命题作文 在一棵IPv4地址树中彻底理解IP路由表的各种查找过程
这是一篇命题作文.近期一直想写点东西,但一直找不到题目,正好收到一封邮件,有人问我Linux路由表的布局问题以及路由缓存的问题,加之前些日子又帮人做了一个片上路由表,所以觉得这是个好题目,索性花了多半 ...
- 在一棵IPv4地址树中彻底理解IP路由表的各种查找过程
1.IPv4地址空间树 IPv4的整个地址空间可以构成一棵完美的二叉树,因为它完全占满了整个4G的地址空间.这棵树如下所示: 需要指明的是,完全画出这幅图是不可能的,如果一个节点的直径小到1mm(这意 ...
- FAT16文件系统之目录项分析(四)
FAT16文件系统的FDT分析 1:FDT位置 FDT的含义为文件目录表,它在一个文件系统中的具体位置是紧跟在FAT2之后. 定位过程: A:系统通过读取该分区表信息,定位到其DBR扇区 B:读取DB ...
- 记录 误删linux bin目录的恢复过程
记录 误删linux bin目录的恢复过程 这两天在公司的k8s平台系统中,使用root用户误删了bin 目录,,导致整个系统大部分的命令都 无法执行 原本想执行的是 rm -rf ~/bin 结果手 ...
- winscp 列出‘/users‘的目录项时出错解决方法
背景:需要访问ftp,查看服务器中文件,最后选择使用winscp连接,正常安装winscp后,输入信息访问,但是一直出现"监测到超时! (数据连接) 无法获得目录列表 列出'/users'的 ...
最新文章
- AM335X can驱动移植
- js 排列 组合 的一个简单例子
- nginx整合php+lua+oracle环境搭建
- 搭建本地的git仓库
- JavaScript练习笔记
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
- vue中标签自定义属性的使用
- Django Model View Template 之间的简单交互 (二)
- 搜索引擎字符串(亲测)
- 安装vbb的一些经验(包括mysql,apache)
- 学计算机买什么书好,学电脑基础知识买什么书好?
- 沟通CTBS立白集团远程接入成功案例
- 网络中的三张表——ARP表、MAC表、路由表
- CAD图纸转BMP格式图片时怎么设置输出色彩?
- linux安装qq(deb文件)
- 高德地图有用的API
- HTML中让整个效果居中,仅使用CSS做到完全居中的超级攻略
- Unity 2d 机器人的来回巡游
- 华为交换机端口安全配置
- os.listdir()详解
热门文章
- python3 zlib 实现压缩与解压字符串与文件数据流
- 关于Android证书MD5获取
- 2、mysql基本操作中
- 华邦存储芯片 W25Q 系列命名规则
- 修改战网服务器,使命召唤16现代战争怎么改战网地区_修改战网客户端的方法_3DM单机...
- 计算机二级C语言考试地点,最新计算机二级《C语言》重要考点
- 洛谷 Cantor 表
- 2017ICPC北京现场赛G Liaoning Ship’s Voyage(BFS+点在多边形内判定)
- android连连看源代码,#经典连连看#源码分享
- MFC实现基本图形绘制、变换、自由曲线绘制、图形裁剪和填充