rename系统调用的实现浅析
rename系统调用用于在同一个文件系统中做文件的rename操作。如果源和目的在不同mount点上,rename会返回错误EXDEV。
rename系统调用的实现入口在./fs/namei.c中:
SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newname) { return sys_renameat(AT_FDCWD, oldname, AT_FDCWD, newname); }
可以看到,它实际上是转调用了renameat系统调用。renameat系统调用的实现也在./fs/namei.c中,它的函数定义是:
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname);
下面是它的具体实现:
1,对oldname和newname分别做目录查找,得到它们对应的nameidata数据结构oldnd和newnd。这个过程会涉及到查找目录项缓存,如果目录不在目录项缓存中,需要将目录从磁盘读取到目录项缓存中,具体细节见这里:http://www.cnblogs.com/cobbliu/p/4888751.html。
2,查看oldnd和newnd的mount点是否一样,不一样则返回EXDEV
3,做一堆其他的验证和准备工作,这个过程中会找到oldname的old_dir的inode和old_dentry,newname的new_dir的inode和new_dentry
4,调用VFS层的error = vfs_rename(old_dir->d_inode, old_dentry, new_dir->d_inode, new_dentry);
int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry)的实现:
1,如果目的和源的inode一样,则返回0
2,查看是否需要删除old_dentry和是否需要新建new_dentry
3,如果old_dentry是个目录则调用vfs_rename_dir,否则调用vfs_rename_other
static int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,struct inode *new_dir, struct dentry *new_dentry)的实现:
1,调用dget(new_dentry)
2,调用old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);做真正的rename操作
3,调用dput(new_dentry)
ext4_rename函数真正实现了rename过程,ext4_rename实际上是讲旧目录文件中的文件项的refcount递减,然后在新目录文件中加入新文件名的目录项,并不会移动实际的数据文件,也不会修改数据文件的inode号。
/proc/sys/fs/dentry_state显示目录项高速缓存的一些信息:
- nr_dentry - number of dentries currently allocated
- nr_unused - nuber of unused dentries
- age_limit - seconds after the entry may be reclaimed, when memory is short
- remaining - reserved.
通常linux文件系统中目录项高速缓存的age_limit是45s,也就是说该目录项在目录项高速缓存中停留45s还无访问,就将它换出。
http://www.linuxinsight.com/proc_sys_fs_dentry_state.html
相关文章
- C# 第三方DLL,可以实现PDF转图片,支持32位系统、64位系统
- 使用系统自带的 UIRefreshControl 实现下拉刷新
- Java实现 LeetCode 609 在系统中查找重复文件(阅读理解+暴力大法)
- 重新整理 .net core 实践篇—————配置系统之间谍[八](文件监控)
- WebService实例-CRM系统提供WebService实现用户注册功能
- Eclipse如何跳转到Java系统类的源代码
- 〖Python语法进阶篇⑮〗- 综合实战 - 抽奖系统之基础功能开发 - base用户相关功能实现
- 计及调峰主动性的风光水火储多能系统互补协调优化调度(Matlab代码实现)
- 分布式光伏储能系统的优化配置方法(Matlab代码实现)
- 【语音处理】使用块反射器的基于DFT的系统中用于旁瓣抑制的正交预编码(Matlab代码实现)
- m基于Lorenz混沌自同步的混沌数字保密通信系统的FPGA实现,verilog编程实现+MATLAB混沌验证程序
- [读后感]spring Mvc 教程框架实例以及系统演示下载
- 【华为机试真题 Python实现】最优策略组合下的总的系统消耗资源数
- Hive 系统架构
- Raw-OS源代码分析之消息系统-Queue_Size
- petshop4.0 具体解释之中的一个(系统架构设计)
- Linux系统磁盘在线扩容方案
- Linux查看系统glibc版本号
- Windows 7系统安装MySQL5.5.21图解
- MATLAB信号与系统分析(四)——离散信号与系统的复频域分析及MATLAB实现
- Linux 系统中用户切换(su user与 su - user 的区别)
- 基于Java+SpringBoot+Vue前后端分离书店购书系统设计与实现(有视频教程)
- 大规模MIMO通信系统的发射端采用混合波束成形(Matlab代码实现)
- 目标检测系列算法:简单实现YOLO语音TTS报警系统(检测人员入侵室内或室外)
- 【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用