原文:http://blog.sina.com.cn/s/blog_5219094a01009a4c.html
super block
相关的数据结构为:
struct super_block {
struct list_head s_list;
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_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 |---/
+-------------+ +-------------+ +-------------+
| | | | | |
+-------------+ +-------------+ +-------------+
| | | | | |
+-------------+ +-------------+ +-------------+
| | | | | |