Linux文件编程之虚拟文件系统(VFS)(4)


6. 超级对象中最重要的就是s_op,每一种文件系统都应该有自己的super_operations操作实例。它指向超级块的操作函数表, 它由struct super_operations结构体来表示。

现在来看一下它的定义:它的定义在 include/linux/fs.h头文件中可以看到

1560struct super_operations {
1561        struct inode *(*alloc_inode)(struct super_block *sb);
1562        void (*destroy_inode)(struct inode *);
1563
1564        void (*dirty_inode) (struct inode *);
1565        int (*write_inode) (struct inode *, struct writeback_control *wbc);
1566        int (*drop_inode) (struct inode *);
1567        void (*evict_inode) (struct inode *);
1568        void (*put_super) (struct super_block *);
1569        void (*write_super) (struct super_block *);
1570        int (*sync_fs)(struct super_block *sb, int wait);
1571        int (*freeze_fs) (struct super_block *);
1572        int (*unfreeze_fs) (struct super_block *);
1573        int (*statfs) (struct dentry *, struct kstatfs *);
1574        int (*remount_fs) (struct super_block *, int *, char *);
1575        void (*umount_begin) (struct super_block *);
1576
1577        int (*show_options)(struct seq_file *, struct vfsmount *);
1578        int (*show_stats)(struct seq_file *, struct vfsmount *);
1579#ifdef CONFIG_QUOTA
1580        ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
1581        ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
1582#endif
1583        int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
1584};


1>可以看到该结构体中的每一项都是一个指向超级块操作函数的指针,超级块操作函数执行文件系统和索引节点的低层操作。

2>当文件系统需要对超级块执行操作时,要在超级块对象中寻找需要的操作方法

例如:一个文件系统要写自己的超级块,需要调用:

sturct super_block * sb;

sb->s_op->write_super)(sb);

sb是指向文件系统超级块的指针,沿着该指针进入超级块操作函数表,并从表中取得writ_super()函数,该函数执行写入超级块的实际操作。

Tiger-John说明:

尽管writ_super()方法来自超级块,但是在调用时,还是要把超级块作为参数传递给它。


3>.分析其中比较重要的一些数据结构。

a.struct inode * alloc_inode(struct super_block * sb) :创建和初始化一个新的索引结点。
b.void destroy_inode(struct super_block *sb) :释放指定的索引结点 。


c.void dirty_inode(struct inode *inode) :VFS在索引节点被修改时会调用此函数。

d.void  write_inode(struct inode *inode, struct writeback_control *wbc) 将指定的inode写回磁盘。

e.void  drop_inode( struct inode * inode):删除索引节点。

f.void   put_super(struct super_block *sb) :用来释放超级块。

g.void  write_super(struct super_block *sb):更新磁盘上的超级块。

h.void   sync_fs(struct super_block *sb,in wait):使文件系统的数据元素与磁盘上的文件系统同步,wait参数指定操作是否同步。

i.int statfs(struct super_block *sb,struct statfs *statfs):获取文件系统状态。把文件系统相关的统计信息放在statfs中。


2.VFS的索引节点

1>文件系统处理文件或目录时的所有信息都存放在称为索引节点的数据结构中。

文件名可以随时该,但是索引节点对文件是唯一的(它是随文件的存在而存在)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwszjs.html