四、inode对象
inode是文件系统中的对象元素。
1、inode_operations结构
该结构描述了VFS如何操作文件系统中的inode。在2.6.20中定义如下:
struct inode_operations {
int (*create) (struct inode *,struct dentry *,int, struct nameidata *);
struct dentry * (*lookup) (struct inode *,struct dentry *, 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 *);
int (*readlink) (struct dentry *, char __user *,int);
void * (*follow_link) (struct dentry *, struct nameidata *);
void (*put_link) (struct dentry *, struct nameidata *, void *);
void (*truncate) (struct inode *);
int (*permission) (struct inode *, int, struct nameidata *);
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);
};
所有方法除非特别要求,调用时不必持有锁。
create: 由open(2)和create(2)系统调用调用。只在需要支持常规文件时必须定义。获得的目录结构不能存在inode(如,消极entry.如果有,就不需要创建了)。也许还需要为该dentry和新创建的inode调用d_instantiate()。
lookup: 在VFS需要从父目录里查找一个inode时调用。查找的名字从dentry中获得。该方法将找到的inode通过调用d_add()插入到目录结构中。结构中的i_count项增1。如果该名字的inode不存在,则在dentry中增加一个空的inode(该dentryb被称为消极dentry)
link: 由link(2)系统调用调用,只在需要支持硬链接(hard link)时必须定义。和在create()方法中类似,需要调用d_instantiate()。
ulink: 由ulink(2)系统调用调用,只在需要支持删除inode时必须定义。
symlink: 由symlink(2)系统调用调用,只在需要支持软链接(symbolick link)时必须定义。和在create()方法中类似,需要调用d_instantiate()。
mkdir: 由mkdir(2)系统调用调用,只在需要支持软链接(symbolick link)时必须定义。和在create()方法中类似,需要调用d_instantiate()。
rmdir: 由rmdir(2)系统调用调用,只在需要支持删除子目录时必须定义。
mknod: 由mknode(2)系统调用用来为设备(字符或块),命名管道或者套接字创建inode时调用,只在需要支持创建这类inode时必须定义。和在create()方法中类似,需要调用d_instantiate()。
rename: 由rename(2)系统调用调用,将源inode和dentry(前两个)改为目标inode和dentry(后两个)的父目录和文件名。
readlink: 由readlink(2)系统调用调用,只在需要支持软链接(symbolick link)时必须定义。
follow_link: 由VFS调用,用来获得一个软链接所指向的inode,只在需要支持软链接(symbolick link)时必须定义。该方法返回一个可以传给put_link()方法的空指针。
put_link: 由VFS调用,用来释放由follow_link分配的资源。该方法的最后一个参数是由follow_up返回的一个空指针的值参。它在页缓存不稳定的文件系统(如,NFS)中应用。
truncate: 由VFS调用,用来改变一个文件的大小。必须在该方法调用前用需要得大小来设置inode的i_size值。该方法被truncate(2)以及相关的系统调用调用。
permission: VFS调用该方法检查在POSIX类的文件系统上的访问权限。
serattr: VFS调用该方法设置文件的属性。该方法被chmod(2)以及相关的系统调用调用。
getattr: 获得文件属性。由stat(2)以及相关系统调用调用。
setxattr: VFS调用该方法设置文件的扩展属性信息。扩展属性是inode相关的"name:value"对。该方法由setxattr(2)系统调用调用。
getxattr; VFS调用该方法获得给定文件扩展属性的值。该方法由getxattr(2)系统调用调用。
listxattr: VFS调用该方法列出给定文件的所有扩展属性信息。该方法由listxattr(2)系统调用调用。
removexattr: VFS调用该方法移除给定文件的所有扩展属性信息。该方法由removexattr(2)系统调用调用。