inode_operations介绍
与 索引节点inode对象关联的方法称为索引节点操作,由struct inode_operations 结构体描述,该结构的地址存放在inode结构体域变量i_op字段中,struct inode_operations具体描述如下:
struct inode_operations {
struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
void * (*follow_link) (struct dentry *, struct nameidata *);
int (*permission) (struct inode *, int);
struct posix_acl * (*get_acl)(struct inode *, int);
int (*readlink) (struct dentry *, char __user *,int);
void (*put_link) (struct dentry *, struct nameidata *, void *);
int (*create) (struct inode *,struct dentry *,int, struct nameidata *);
int (*link) (struct dentry *,struct inode *,struct dentry *);
int (*unlink) (struct inode *,struct dentry *);
int (*symlink) (struct inode *,struct dentry *,const char *);
int (*mkdir) (struct inode *,struct dentry *,int);
int (*rmdir) (struct inode *,struct dentry *);
int (*mknod) (struct inode *,struct dentry *,int,dev_t);
int (*rename) (struct inode *, struct dentry *,
struct inode *, struct dentry *);
void (*truncate) (struct inode *);
int (*setattr) (struct dentry *, struct iattr *);
int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
ssize_t (*listxattr) (struct dentry *, char *, size_t);
int (*removexattr) (struct dentry *, const char *);
void (*truncate_range)(struct inode *, loff_t, loff_t);
int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
u64 len);
} ____cacheline_aligned;
这些方法对所有的索引节点和文件系统都是可用的。不过只有其中的一个子集应用到某一特定的索引节点或文件系统中,未实现的方法对应的字段被置为NULL。
依次分析这些函数的含义:
create(struct inode *,struct dentry *,int, struct nameidata *);
在某个目录下,为与dentry目录项相关的常规文件创建一个新的磁盘索引节点。
SYSCALL_DEFINE2(creat, const char __user *, pathname, int, mode)
{
return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
}
sys_create
|--sys_open
|--do_filp_open
|--path_openat
|--do_last
|--vfs_create
|--dir->i_op->create(dir, dentry, mode, nd)
lookup(struct inode *dir,struct dentry *, struct nameidata *);
查找索引节点所在的目录,这个索引节点所对应的文件名就包含在dentry目录项中。在很多地方都会用到,比如:d_inode_lookup(),d_alloc_and_lookup()
follow_link(struct dentry *, struct nameidata *);
解释inode索引节点所指定的符号链;如果该符号链是相对路径名,从指定的dir目录开始进行查找。
permission(struct inode *dir, int);
确认是否允许对inode索引节点所指的文件进行指定模式的访问。
get_acl(struct inode *, int);
readlink(struct dentry *, char __user *,int);
将dentry所指定的符号链中对应的文件路径名拷贝到buffer所指定的内存区。
put_link(struct dentry *, struct nameidata *, void *);
link(struct dentry *,struct inode *,struct dentry *);
创建一个新的名为new_dentry硬链接,这个新的硬连接指向dir目录下名为的old_dentry文件。
unlink(struct inode *,struct dentry *);
从dir目录删除dentry目录项所指文件的硬链接
symlink(struct inode *,struct dentry *,const char *);
在某个目录下,为与目录项相关的符号链创建一个新的索引节点
mkdir(struct inode *,struct dentry *,int);
在某个目录下,为与目录项对应的目录创建一个新的索引节点。
rmdir(struct inode *,struct dentry *);
从一个目录中删除子目录。子目录的名称包含在目录项对象中
mknod(struct inode *,struct dentry *,int,dev_t);
在dir目录下,为与目录项对象相关的特殊文件创建一个新的磁盘索引节点。其中参数mode 和 rdev分别表示文件的类型和该设备的主码。
rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
将old_dir目录下的文件 old_dentry移到new_dir目录下,新文件名包含在 new_dentry指向的目录项中
truncate(struct inode *);
修改索引节点inode所指文件的长度。在调用该方法之前,必须将inode对象的i_size域设置为需要的新长度值。
setattr(struct dentry *, struct iattr *);
设置目录项的属性
getattr(struct vfsmount *mnt, struct dentry *, struct kstat *);
获得目录项的属性
setxattr(struct dentry *, const char *,const void *,size_t,int);
设置目录项的扩展属性(扩展属性存放在任何索引节点之外的磁盘块中)
getxattr(struct dentry *, const char *, void *, size_t);
获取目录项的扩展属性
listxattr(struct dentry *, char *, size_t);
获取扩展属性名称的整个链表
removexattr(struct dentry *, const char *);
删除索引节点的扩展属性
truncate_range(struct inode *, loff_t, loff_t);
fiemap(struct inode *, struct fiemap_extent_info *, u64 start, u64 len);
inode_operations介绍相关推荐
- 通用文件模型及VFS-VFS结构
在VFS接口实现中,涉及大量的数据结构.VFS结构由两个部分组成:文件和文件系统,这些都需要管理和抽象. 1.文件表示 inode是Linux内核选择用于表示内容和相关元数据的方法.在抽象对底层文件系 ...
- Linux调试技术介绍
对于任何编写内核代码的人来说,最吸引他们注意的问题之一就是如何完成调试.由于内核是一个不与某个进程相关的功能集,其代码不能很轻松地放在调试器中执行,而且也不能跟踪. 本章介绍你可以用来监视内核代码和跟 ...
- Linux Kernel Namespace实现: namespace API介绍
1)前言 随着docker的出现, Linux container这种轻量级虚拟化方案越来越在产业里得到大规模的部署和应用. 而Namespace是Linux Container的基础, 了解name ...
- 简单介绍互联网领域选择与营销方法
在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...
- 常用开源协议介绍以及开源软件规范列表
1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...
- python:Json模块dumps、loads、dump、load介绍
20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...
- pytorch学习笔记(九):PyTorch结构介绍
PyTorch结构介绍 对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握.水平有限,如有错误,欢迎指错,谢谢! 几个重要的类型 和数值相关的 T ...
- Python字节码介绍
了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代 ...
- Pytest - 使用介绍
1. 概述 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手,文档丰富: 2.支持参数化,可以细粒度地控制要测试的测试用例: 3.能够支持简单的单 ...
最新文章
- unity中app实现拖拽_10分钟让你实现在APP中对网络状态变化进行全局提示
- centos7开启,关闭防火墙
- WordPress制作插件中使用wp_enqueue_script('jquery')库不起作用解决方法
- APP技巧:微信中这6个设置建议关闭,可以防止个人信息或将全暴露,赶快看一看吧!...
- java 打包后 文件资源文件 jar,JAVA打包成JAR无法找到资源文件
- python实现的摩斯电码解码\编码器
- 视觉中国网站部分恢复上线? 官方回应:并没有
- [译] Cilium:BPF 和 XDP 参考指南(2021)
- 微信AI开放接口介绍
- java实时解析mysql日志,利用maxwell 组件实时监听Mysql的Binlog日志,并且把解析的json格式数据发送到kafka窗口供实时消费...
- 【ZOJ 4097 The 19th Zhejiang University Programming Contest H】Rescue the Princess【边双连通缩点+LCA】
- matlab 均值滤波实现
- python-docx原有图片居中
- 我用数据分析,揭开了中国男篮最后的遮羞布
- U盘蠕虫病毒解决办法
- 要看就看最好,16万字全网最硬核redis总结,谁赞成,谁反对?(被粉丝疯狂催更,已有人反馈看完专栏拿到大厂offer!!!)
- 算法工程师的工程修养:Linux 服务器性能故障分析
- 如何禁止访问一个网站??
- vue-cli3访问public文件夹静态资源的报错解决
- 关于Jlink调试器JTAG和SWD的接口定义
热门文章
- 快速生成26个英文字母字符串
- 从年终奖看待美国留学热门专业就业薪酬
- 中国卡车停车电气化市场深度研究分析报告
- Pycharm运行时出现Could not load the Qt platform plugin “xcb“问题
- 大直播时代,P2P才是降低成本的必杀技
- bartender连接oracle,bartender2019版本连接ODBC解决方案
- 【报告分享】苏宁:2019中国智慧零售门店数字化白皮书(附下载)
- 微信多开的方案(win11)
- javascript练习38:幸运数字机
- 川希:如何打造个人IP让别人信任,主动追着我们付钱!