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
rename系统调用的实现浅析的更多相关文章
- linux quota磁盘限额,引发的rename系统调用 errno:18 - Invalid cross-device link
起因: log4j日志滚动失败,debug发现jvm调用native方法rename失败,也就是系统调用rename失败. 自己写c程序系统调用rename,证实确实是这个问题. 日志打在容器里,日志 ...
- Linux内核同步
Linux内核剖析 之 内核同步 主要内容 1.内核请求何时以交错(interleave)的方式执行以及交错程度如何. 2.内核所实现的基本同步机制. 3.通常情况下如何使用内核提供的同步机制. 内核 ...
- Redis学习总结(1)——数据持久化
以前研究Redis的时候,很多东西都不太明白,理解得也不太深,现在有时间重新拾起来看看,将一些心得记录下来,希望和大家一起探讨. 一.简介 Redis是一个单线程高可用的Key-Value存储系统,和 ...
- 深入理解redis持久化
持久化方式: 快照(RDB)方式,默认方式,文件以二进制方式保存到RDB文件. 文件追加(AOF)方式,文件以协议文本的方式write到AOF文件. 作用,重启后的数据恢复.当两种方式都启用时,red ...
- 谈谈Memcached与Redis
1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个 ...
- Redis和Memcached的区别详解
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/119.html?1455855360 Redis的作者Salvatore ...
- Redis提供的持久化机制(RDB和AOF)
Redis提供的持久化机制 Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却 ...
- Redis持久化实践及灾难恢复模拟
参考资料: Redis Persistence http://redis.io/topics/persistence Google Groups https://groups.google.com/f ...
- Redis持久化-数据丢失及解决(转载)
本文转载自 Redis持久化-数据丢失及解决 感谢原作者 Redis的数据回写机制 Redis的数据回写机制分同步和异步两种, 同步回写即SAVE命令,主进程直接向磁盘回写数据.在数据 ...
随机推荐
- 在ASP.NET中支持断点续传下载大文件
IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下 ...
- [leetcode]Permutations II @ Python
原题地址:https://oj.leetcode.com/problems/permutations-ii/ 题意: Given a collection of numbers that might ...
- NodeJS错误-throw er; // Unhandled 'error' event
第一眼看以为Express版本出现问题,因为本地已经存在另外一个运行的Node项目,端口重复,修改一下端口号即可,错误提示如下: events.js:85 throw er; // Unhandled ...
- 转:Logistic regression (逻辑回归) 概述
Logistic regression (逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性.比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等 ...
- java 中xml转换为json对象
1.前提须要jar包: json-lib-2.4-jdk15.jar 和 xom-1.2.5.jar ,maven 仓库: net.sf.json-lib json-lib 2.4 jdk15 xom ...
- dubbo 提示No such extension Filter for filter/com.alibaba.dubbo.rpc.Filter
配置时 <dubbo:provider filter="DubboExceptionFilter"></dubbo:provider> DubboExcep ...
- GPUImage简单滤镜使用之色阶(三)
色阶是表示图像亮度强弱的指数标准,图像的色彩丰满度和精细度是由色阶决定的.在GPUImage中GPUImageLevelsFilter提供了此功能. GPUImageLevelsFilter定义了修改 ...
- Python爬虫实战(二):爬百度贴吧
代码: # _*_ coding:utf-8 _*_ import urllib import urllib2 import re class Tool: removingImg = re.compi ...
- beanshell
http://www.beanshell.org/download.html
- MyBatis 作用域和生命周期
理解到目前为止所讨论的类的作用域和生命周期是非常重要的.如果使用不当可导致严重的并发性问题. SqlSessionFactoryBuilder 这个类可以在任何时候被实例化.使用和销毁.一旦您创造了 ...