超级块(super_block) 定义于 include/linux/fs.h

超级块对象代表一个已安装的文件按系统,存储该文件系统的相关信息,比如文件系统的类型,大小,状态等。对于基于磁盘的文件系统,这类对象通常存放在磁盘上的特定扇区;对于并非基于磁盘的文件系统(比如就内存的文件系统sysfs),它们会现场创建超级块对象并将其保存在内存中。

struct super_block {
    struct list_head        s_list;         /* Keep this first */
    dev_t                   s_dev;          /* search index; _not_ kdev_t */
    unsigned char           s_blocksize_bits;
    unsigned long           s_blocksize;
    loff_t                  s_maxbytes;     /* Max file size */
    struct file_system_type *s_type;
    const struct super_operations   *s_op;
    const struct dquot_operations   *dq_op;
    const struct quotactl_ops       *s_qcop;
    const struct export_operations *s_export_op;
    unsigned long           s_flags;
    unsigned long           s_iflags;       /* internal SB_I_* flags */
    unsigned long           s_magic;
    struct dentry           *s_root;
    struct rw_semaphore     s_umount;
    int                     s_count;
    atomic_t                s_active;
#ifdef CONFIG_SECURITY
    void                    *s_security;
#endif
    const struct xattr_handler **s_xattr;
    struct list_head        s_inodes;       /* all inodes */
    struct hlist_bl_head    s_anon;         /* anonymous dentries for (nfs) exporting */
    struct list_head        s_mounts;       /* list of mounts; _not_ for fs use */
    struct block_device     *s_bdev;
    struct backing_dev_info *s_bdi;
    struct mtd_info         *s_mtd;
    struct hlist_node       s_instances;
    unsigned int            s_quota_types;  /* Bitmask of supported quota types */
    struct quota_info       s_dquot;        /* Diskquota specific options */
    struct sb_writers       s_writers;
    char s_id[32];                          /* Informational name */
    u8 s_uuid[16];                          /* UUID */
    void                    *s_fs_info;     /* Filesystem private info */
    unsigned int            s_max_links;
    fmode_t                 s_mode;
    /* Granularity of c/m/atime in ns. Cannot be worse than a second */
    u32                s_time_gran;
    /*
     * The next field is for VFS *only*. No filesystems have any business
     * even looking at it. You had been warned.
     */
    struct mutex s_vfs_rename_mutex;        /* Kludge */
    /*
     * Filesystem subtype. If non-empty the filesystem type field
     * in /proc/mounts will be "type.subtype"
     */
     char *s_subtype;
     /*
      * Saved mount options for lazy filesystems using
      * generic_show_options()
      */
      char __rcu *s_options;
      const struct dentry_operations *s_d_op; /* default d_op for dentries */
     /*
      * Saved pool identifier for cleancache (-1 means none)
      */
      int cleancache_poolid;
      struct shrinker s_shrink;       /* per-sb shrinker handle */
     /* Number of inodes with nlink == 0 but still referenced */
     atomic_long_t s_remove_count;
     /* Being remounted read-only */
     int s_readonly_remount;
     /* AIO completions deferred from interrupt context */
     struct workqueue_struct *s_dio_done_wq;
     struct hlist_head s_pins;
    /*
     * Keep the lru lists last in the structure so they always sit on their
     * own individual cachelines.
     */
    struct list_lru         s_dentry_lru ____cacheline_aligned_in_smp;
    struct list_lru         s_inode_lru ____cacheline_aligned_in_smp;
    struct rcu_head         rcu; 
    /*
    * Indicates how deep in a filesystem stack this SB is
    */
    int s_stack_depth;
};
struct super_operations {
    struct inode *(*alloc_inode)(struct super_block *sb);
    void (*destroy_inode)(struct inode *);
    void (*dirty_inode) (struct inode *, int flags);
    int (*write_inode) (struct inode *, struct writeback_control *wbc);
    int (*drop_inode) (struct inode *);
    void (*evict_inode) (struct inode *);
    void (*put_super) (struct super_block *);
    int (*sync_fs)(struct super_block *sb, int wait);
    int (*freeze_super) (struct super_block *);
    int (*freeze_fs) (struct super_block *);
    int (*thaw_super) (struct super_block *);
    int (*unfreeze_fs) (struct super_block *);
    int (*statfs) (struct dentry *, struct kstatfs *);
    int (*remount_fs) (struct super_block *, int *, char *);
    void (*umount_begin) (struct super_block *);
    int (*show_options)(struct seq_file *, struct dentry *);
    int (*show_devname)(struct seq_file *, struct dentry *);
    int (*show_path)(struct seq_file *, struct dentry *);
    int (*show_stats)(struct seq_file *, struct dentry *);
#ifdef CONFIG_QUOTA
    ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
    ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
    struct dquot **(*get_dquots)(struct inode *);
 #endif
    int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
    long (*nr_cached_objects)(struct super_block *,
                              struct shrink_control *);
    long (*free_cached_objects)(struct super_block *,
                                struct shrink_control *);
};