VFS之super

    技术2025-02-10  45

    今天在解决工作问题的同时也扩展我的知识面,有一种想深入研究文件系统的冲动,初略的研究了一下。

     

    虚拟文件系统: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 |---/              +-------------+        +-------------+      +-------------+                  |             |        |             |      |             |                  +-------------+        +-------------+      +-------------+                  |             |        |             |      |             |                  +-------------+        +-------------+      +-------------+                  |             |        |             |      |             |

     

    最新回复(0)