除非有额外的说明,否则VFS不会加锁调用这些函数。这意味着这些函数阻塞时,不会影响到其他线程。所有的函数只会在进程上下文调用,不会在中断上下文中调用。
alloc_inode:用于分配和初始化inode。如果未指定该方法,则使用纯粹的struct inode。通常情况下,文件系统会自定义自己的inode结构,除了包含struct inode外,还会包含和底层文件系统相关的字段。
destroy_inode:销毁inode,必须和alloc_inode一起实现。
dirty_inode:将inode标记为脏inode
write_inode:将inode写回到磁盘。该函数第二个参数用于指定是否同步写入,并非所有文件系统都检查这个标志
drop_inode:用于判断是否从内存中移除inode。当inode引用计数为0时调用该函数,调用前会锁定inode->i_lock。drop_inode应该是NULL(正常UNIX文件系统语义)或者是generic_delete_inode()(不考虑引用计数,强制清除inode,适用于不想缓存inode的文件系统)。
delete_inode:从内存中移除inode。v2.6.39的struct super_operations就没有这个字段,取而代之的是evict_inode
put_super:释放superblock,调用前锁定superblock lock。
sync_fs:将superblock关联的脏数据写回到存储。第二个参数用于指明是否等待数据写完后再返回。
freeze_fs:锁定文件系统并迫使它进入一致状态。目前被逻辑卷管理(LVM)会用到该函数。
unfreeze_fs:解锁文件系统,使其可以重新写入。
statfs:获取文件系统统计信息。
remount_fs:重新挂载文件系统,主要用于更新挂载参数。调用前锁定**kernel lock。
clear_inode:标记不再使用该inode。v2.6.39的struct super_operations就没有这个字段
umount_begin:卸载文件系统
show_options:用于在/proc//mounts里输出挂载选项
quota_read:读quota file
quota_write:写quota file
nr_cached_objects:返回可释放的对象个数。
free_cache_objects:清理对象。需要和nr_cached_objects一起定义
如果这些函数内会执行批量任务,那么必须包含支持重新调度的函数,这使得VFS无需担心这些函数长时间处理的问题。
设置inode时必须初始化struct inode的i_op字段,其指向struct inode_operations,该结构包含了一系列操作inode的函数。
struct xattr_handler当文件系统需要支持扩展属性时,可以指定superblock的s_xattr字段,其指向一个一NULL结尾的struct xattr_handler数组。扩展属性是一个name-value对。
struct xattr_handler { const char *name; const char *prefix; int flags; /* fs private flags */ bool (*list)(struct dentry *dentry); int (*get)(const struct xattr_handler *, struct dentry *dentry, struct inode *inode, const char *name, void *buffer, size_t size); int (*set)(const struct xattr_handler *, struct dentry *dentry, struct inode *inode, const char *name, const void *buffer, size_t size, int flags); };name:该结构中的函数用于处理该名字代表的属性,比如"system.posix_acl_access"。指定name,则prefix必须是NULL
prefix:该结构中的函数用于处理该前缀代表的属性,比如"user."。指定了prefix,则name必须是NULL
list:确定是否应为特定的dentry列出与此处理函数匹配的属性。
get:获取扩展属性的值。该方法在getxattr(2)流程中调用
set:设置扩展属性的值。如果新值为NULL,则移除扩展属性。该函数在setxattr(2)和removexattr(2)流程中调用
当文件系统没有xattr的处理方法或者没有匹配的属性时,会返回-EOPNOTSUPP。
The Inode Object一个inode代表了一个文件系统对象
struct inode_operationsstruct inode_operations描述了VFS如何操作inode
struct inode_operations { int (*create) (struct inode *,struct dentry *, umode_t, bool); struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int); 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 *,umode_t); int (*rmdir) (struct inode *,struct dentry *); int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t); int (*rename) (struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); int (*readlink) (struct dentry *, char __user *,int); const char *(*get_link) (struct dentry *, struct inode *, struct delayed_call *); int (*permission) (struct inode *, int); int (*get_acl)(struct inode *, int); int (*setattr) (struct dentry *, struct iattr *); int (*getattr) (const struct path *, struct kstat *, u32, unsigned int); ssize_t (*listxattr) (struct dentry *, char *, size_t); void (*update_time)(struct inode *, struct timespec *, int); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode); int (*tmpfile) (struct inode *, struct dentry *, umode_t); };除非有额外说明,否则所有方法都不会持锁调用。