• VFS四大对象之一 struct super_block


    linux虚拟文件系统四大对象:

    1)超级块(super block)

    2)索引节点(inode)

    3)目录项(dentry)

    4)文件对象(file)

    现在先介绍第一个

    一、super_block的含义:

    超级块代表了整个文件系统,超级块是文件系统的控制块,有整个文件系统信息,一个文件系统所有的inode都要连接到超级块上,可以说,一个超级块就代表了一个文件系统。

    说到inode是啥?参照下一篇博客;

     1 struct super_block {
     2     struct list_head    s_list;        /* Keep this first */
     3     dev_t            s_dev;        /* search index; _not_ kdev_t */
     4     unsigned char        s_dirt;
     5     unsigned char        s_blocksize_bits;
     6     unsigned long        s_blocksize;
     7     loff_t            s_maxbytes;    /* Max file size */
     8     struct file_system_type    *s_type;
     9     const struct super_operations    *s_op;
    10     const struct dquot_operations    *dq_op;
    11     const struct quotactl_ops    *s_qcop;
    12     const struct export_operations *s_export_op;
    13     unsigned long        s_flags;
    14     unsigned long        s_magic;
    15     struct dentry        *s_root;
    16     struct rw_semaphore    s_umount;
    17     struct mutex        s_lock;
    18     int            s_count;
    19     atomic_t        s_active;
    20 #ifdef CONFIG_SECURITY
    21     void                    *s_security;
    22 #endif
    23     const struct xattr_handler **s_xattr;
    24 
    25     struct list_head    s_inodes;    /* all inodes */
    26     struct hlist_bl_head    s_anon;        /* anonymous dentries for (nfs) exporting */
    27 #ifdef CONFIG_SMP
    28     struct list_head __percpu *s_files;
    29 #else
    30     struct list_head    s_files;
    31 #endif
    32     struct list_head    s_mounts;    /* list of mounts; _not_ for fs use */
    33     /* s_dentry_lru, s_nr_dentry_unused protected by dcache.c lru locks */
    34     struct list_head    s_dentry_lru;    /* unused dentry lru */
    35     int            s_nr_dentry_unused;    /* # of dentry on lru */
    36 
    37     /* s_inode_lru_lock protects s_inode_lru and s_nr_inodes_unused */
    38     spinlock_t        s_inode_lru_lock ____cacheline_aligned_in_smp;
    39     struct list_head    s_inode_lru;        /* unused inode lru */
    40     int            s_nr_inodes_unused;    /* # of inodes on lru */
    41 
    42     struct block_device    *s_bdev;
    43     struct backing_dev_info *s_bdi;
    44     struct mtd_info        *s_mtd;
    45     struct hlist_node    s_instances;
    46     struct quota_info    s_dquot;    /* Diskquota specific options */
    47 
    48     int            s_frozen;
    49     wait_queue_head_t    s_wait_unfrozen;
    50 
    51     char s_id[32];                /* Informational name */
    52     u8 s_uuid[16];                /* UUID */
    53 
    54     void             *s_fs_info;    /* Filesystem private info */
    55     unsigned int        s_max_links;
    56     fmode_t            s_mode;
    57 
    58     /* Granularity of c/m/atime in ns.
    59        Cannot be worse than a second */
    60     u32           s_time_gran;
    61 
    62     /*
    63      * The next field is for VFS *only*. No filesystems have any business
    64      * even looking at it. You had been warned.
    65      */
    66     struct mutex s_vfs_rename_mutex;    /* Kludge */
    67 
    68     /*
    69      * Filesystem subtype.  If non-empty the filesystem type field
    70      * in /proc/mounts will be "type.subtype"
    71      */
    72     char *s_subtype;
    73 
    74     /*
    75      * Saved mount options for lazy filesystems using
    76      * generic_show_options()
    77      */
    78     char __rcu *s_options;
    79     const struct dentry_operations *s_d_op; /* default d_op for dentries */
    80 
    81     /*
    82      * Saved pool identifier for cleancache (-1 means none)
    83      */
    84     int cleancache_poolid;
    85 
    86     struct shrinker s_shrink;    /* per-sb shrinker handle */
    87 
    88     /* Number of inodes with nlink == 0 but still referenced */
    89     atomic_long_t s_remove_count;
    90 
    91     /* Being remounted read-only */
    92     int s_readonly_remount;
    93 };

    这个数据结构十分庞大,毕竟是聚集了一个文件系统的重要信息,我们关注一些比较重要的信息就行了。

    1 struct list_head    s_list;

    s_list 这是第一个成员,是一个双向循环链表,把所有的super_block连接起来,一个super_block代表一个在linux上的文件系统,这个list上边的就是所有的在linux上记录的文件系统。

    1 dev_t s_dev;

     s_dev:设备标识符

    1 unsigned char        s_dirt;
    2 unsigned char        s_blocksize_bits;
    3 unsigned long        s_blocksize;
    4 loff_t            s_maxbytes;    /* Max file size */

     s_dev:包含该具体文件系统的块设备标识符。例如,对于 /dev/hda1,其设备标识符为 0x301

    s_blocksize:文件系统中数据块大小,以字节单位

    s_blocksize_bits:上面的size大小占用位数,例如512字节就是9 bits

    s_dirt:脏位,标识是否超级块被修改

    1 loff_t            s_maxbytes;    /* Max file size */

     s_maxbytes:允许的最大的文件大小(字节数)

     

    1 struct file_system_type    *s_type;

     struct file_system_type *s_type:文件系统类型(也就是当前这个文件系统属于哪个类型?ext2还是fat32)要区分“文件系统”和“文件系统类型”不一样!一个文件系统类型下可以包括很多文件系统即很多的super_block。

    1 const struct super_operations    *s_op;
    2 const struct dquot_operations    *dq_op;

    struct super_operations *s_op:指向某个特定的具体文件系统的用于超级块操作的函数集合。

    struct dquot_operations *dq_op:指向某个特定的具体文件系统用于限额操作的函数集合。

    1 const struct quotactl_ops    *s_qcop;

    struct quotactl_ops     *s_qcop:用于配置磁盘限额的的方法,处理来自用户空间的请求。

    1 const struct export_operations *s_export_op;

    struct export_operations *s_export_op:导出方法

    1 unsigned long        s_flags;

    s_flags:安装标识

    1 unsigned long        s_magic;

    s_magic:区别于其他文件系统的标识

    1 struct dentry        *s_root;

    s_root:指向该具体文件系统安装目录的目录项

    1 struct rw_semaphore    s_umount;

    s_umount:对超级块读写时进行同步

    1 struct mutex        s_lock;

    s_lock:锁标志位,若置该位,则其它进程不能对该超级块操作

    1 int            s_count;

    s_count:对超级块的使用计数

    1 atomic_t        s_active;

    s_active:引用计数

    s_dirty:已修改的索引节点inode形成的链表,一个文件系统中有很多的inode,有些inode节点的内容会被修改,那么会先被记录,然后写回磁盘。

    s_locked_inodes:要进行同步的索引节点形成的链表

    s_files:所有的已经打开文件的链表,这个file和实实在在的进程相关的

    s_bdev:指向文件系统被安装的块设备

    uu 联合体域包括属于具体文件系统的超级块信息

    s_instances:具体的意义后来会说的!(同一类型的文件系统通过这个子墩将所有的super_block连接起来)

    s_dquot:磁盘限额相关选项

    Reference:

    http://www.linuxidc.com/Linux/2011-02/32127.htm

    http://blog.csdn.net/shanshanpt/article/details/38943731

  • 相关阅读:
    (最大团) poj 3692
    (floyd+匈牙利算法) poj 3216
    (floyd+匈牙利算法) poj 2594
    (最小点覆盖) hdu 1054
    (最小点覆盖) hdu 4619
    (最小点覆盖) hdu 1498
    (匈牙利算法+贪心) hdu 3729
    (匈牙利算法) hdu 5093
    (匈牙利算法) bzoj 1059
    (二分+匈牙利算法) hdu 2236
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/7427027.html
Copyright © 2020-2023  润新知