今天在解决工作问题的同时也扩展我的知识面,有一种想深入研究文件系统的冲动,初略的研究了一下。
虚拟文件系统:VFS, virtual fiel system.
struct super_block {
struct list_head s_list; //维护super_blocks全局变量的成员
dev_t s_dev;
unsigned long s_blocksize;
unsigned long s_old_blocksize;
unsigned char s_blocksize_bits;
unsigned char s_dirt;
unsigned long long s_maxbytes;
struct file_system_type *s_type;
struct super_operations *s_op;
struct dquot_operations *dq_op;
struct quotactl_ops *s_qcop;
struct export_operations *s_export_op;
unsigned long s_flags;
unsigned long s_magic;
struct dentry *s_root;
struct rw_semaphore s_umount;
struct semaphore s_lock;
int s_count;
int s_syncing;
int s_need_sync_fs;
atomic_t s_active;
void *s_security;
struct xattr_handler **s_xattr;
struct list_head s_inodes;
struct list_head s_dirty;
struct list_head s_io;
struct hlist_head s_anon;
struct list_head s_files;
struct block_device *s_bdev;
struct list_head s_instances; //维护特定文件系统全局变量的成员
struct quota_info s_dquot;
int s_frozen;
wait_queue_head_t s_wait_unfrozen;
char s_id[32];
void *s_fs_info;
struct semaphore s_vfs_rename_sem;
u32 s_time_gran;
};
super_block存在于两个链表中,一个是系统所有super_block的链表, 一个是对于特定的文件系统的super_block链表. 前者是被维护在一个全局变量super_blocks中,这个全局变量定义在文件fs/super.c。后者也是被维护在一个全局变量file_systems中,它被定义在文件fs/filesystems.c中。下图给予形象的展示:
所有的super_block都存在于 super-blocks 链表中:
/------------\
/--------->|super_blocks|<--- .......... ---------------------\
| \------------/ |
| |
| super_block super_block super_block |
| +-----------+ +-----------+ +-----------+ |
\----->| s_list |<--------->| s_list |<--------->| s_list |<---/
+-----------+ +-----------+ +-----------+
| s_inodes | | s_inodes | | s_inodes |
+-----------+ +-----------+ +-----------+
| s_files | | s_files | | s_files |
+-----------+ +-----------+ +-----------+
| s_dirty | | s_dirty | | s_dirty |
+-----------+ +-----------+ +-----------+
| s_op | | s_op | | s_op |
+-----------+ +-----------+ +-----------+
| s_fs_info| | s_fs_info| | s_fs_info|
+-----------+ +-----------+ +-----------+
| | | | | |
对于特定的文件系统, 该文件系统的所有的super block 都存在于file_sytem_type中的fs_supers链表中.
而所有的文件系统,都存在于file_systems链表中.这是通过调用register_filesystem接口来注册文件系统的.
int register_filesystem(struct file_system_type * fs)
file_system_type file_system_type
/--->+-------------+ /--->+-------------+
| | name | | | name |
/--------------\ | +-------------+ | +-------------+ /------\
| file_systems |----/ | next |----/ | next |---->| NULL |
\--------------/ +-------------+ +-------------+ \------/
| get_sb | | get_sb |
+-------------+ +-------------+
| kill_sb | | kill_sb |
+-------------+ +-------------+
/---------------->| fs_supers |<---\ | fs_supers |
| +-------------+ | +-------------+
| | | | | |
| /------------->+-------------+ | +-------------+
| | /\ |
| | || \------------.............------\
| | |\--------------------\ |
| | | | |
| | super_block | super_block | super_block |
| | +-------------+ | +-------------+ | +-------------+ |
| \---| s_type | \----| s_type | \---| s_type | |
| +-------------+ +-------------+ +-------------+ |
\----->| s_instances |<------>| s_instances |<---->| s_instances |---/
+-------------+ +-------------+ +-------------+
| | | | | |
+-------------+ +-------------+ +-------------+
| | | | | |
+-------------+ +-------------+ +-------------+
| | | | | |
阅读(617) | 评论(0) | 转发(0) |