与 索引节点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介绍相关推荐

  1. 通用文件模型及VFS-VFS结构

    在VFS接口实现中,涉及大量的数据结构.VFS结构由两个部分组成:文件和文件系统,这些都需要管理和抽象. 1.文件表示 inode是Linux内核选择用于表示内容和相关元数据的方法.在抽象对底层文件系 ...

  2. Linux调试技术介绍

    对于任何编写内核代码的人来说,最吸引他们注意的问题之一就是如何完成调试.由于内核是一个不与某个进程相关的功能集,其代码不能很轻松地放在调试器中执行,而且也不能跟踪. 本章介绍你可以用来监视内核代码和跟 ...

  3. Linux Kernel Namespace实现: namespace API介绍

    1)前言 随着docker的出现, Linux container这种轻量级虚拟化方案越来越在产业里得到大规模的部署和应用. 而Namespace是Linux Container的基础, 了解name ...

  4. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

  5. 常用开源协议介绍以及开源软件规范列表

    1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...

  6. python:Json模块dumps、loads、dump、load介绍

    20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...

  7. pytorch学习笔记(九):PyTorch结构介绍

    PyTorch结构介绍 对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握.水平有限,如有错误,欢迎指错,谢谢! 几个重要的类型 和数值相关的 T ...

  8. Python字节码介绍

    了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代 ...

  9. Pytest - 使用介绍

    1. 概述 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手,文档丰富: 2.支持参数化,可以细粒度地控制要测试的测试用例: 3.能够支持简单的单 ...

最新文章

  1. unity中app实现拖拽_10分钟让你实现在APP中对网络状态变化进行全局提示
  2. centos7开启,关闭防火墙
  3. WordPress制作插件中使用wp_enqueue_script('jquery')库不起作用解决方法
  4. APP技巧:微信中这6个设置建议关闭,可以防止个人信息或将全暴露,赶快看一看吧!...
  5. java 打包后 文件资源文件 jar,JAVA打包成JAR无法找到资源文件
  6. python实现的摩斯电码解码\编码器
  7. 视觉中国网站部分恢复上线? 官方回应:并没有
  8. [译] Cilium:BPF 和 XDP 参考指南(2021)
  9. 微信AI开放接口介绍
  10. java实时解析mysql日志,利用maxwell 组件实时监听Mysql的Binlog日志,并且把解析的json格式数据发送到kafka窗口供实时消费...
  11. 【ZOJ 4097 The 19th Zhejiang University Programming Contest H】Rescue the Princess【边双连通缩点+LCA】
  12. matlab 均值滤波实现
  13. python-docx原有图片居中
  14. 我用数据分析,揭开了中国男篮最后的遮羞布
  15. U盘蠕虫病毒解决办法
  16. 要看就看最好,16万字全网最硬核redis总结,谁赞成,谁反对?(被粉丝疯狂催更,已有人反馈看完专栏拿到大厂offer!!!)
  17. 算法工程师的工程修养:Linux 服务器性能故障分析
  18. 如何禁止访问一个网站??
  19. vue-cli3访问public文件夹静态资源的报错解决
  20. 关于Jlink调试器JTAG和SWD的接口定义

热门文章

  1. 快速生成26个英文字母字符串
  2. 从年终奖看待美国留学热门专业就业薪酬
  3. 中国卡车停车电气化市场深度研究分析报告
  4. Pycharm运行时出现Could not load the Qt platform plugin “xcb“问题
  5. 大直播时代,P2P才是降低成本的必杀技
  6. bartender连接oracle,bartender2019版本连接ODBC解决方案
  7. 【报告分享】苏宁:2019中国智慧零售门店数字化白皮书(附下载)
  8. 微信多开的方案(win11)
  9. javascript练习38:幸运数字机
  10. 川希:如何打造个人IP让别人信任,主动追着我们付钱!