索引节点(inode)定义于 include/linux/fs.h

索引节点对象代表存储设备上的一个实际物理文件,存储该文件的有关信息。Linux将文件的相关信息,比如访问权限,大小,创建时间等信息,与文件本身区分开来。文件的相关信息又称为文件的元数据。

索引节点对象有两种,一种是位于内存中的VFS索引节点;另一种是具体文件系统的索引节点,存储在磁盘中,使用是将其读入内存填充VFS的索引节点。之后对VFS索引节点的任何修改都将写回磁盘,更新磁盘上的索引节点。

struct inode {
    umode_t                 i_mode;
    unsigned short          i_opflags;
    kuid_t                  i_uid;
    kgid_t                  i_gid;
    unsigned int            i_flags;
#ifdef CONFIG_FS_POSIX_ACL
    struct posix_acl        *i_acl;
    struct posix_acl        *i_default_acl;
#endif
    const struct inode_operations   *i_op;
    struct super_block      *i_sb;
    struct address_space    *i_mapping;
#ifdef CONFIG_SECURITY
    void                    *i_security;
#endif
    /* Stat data, not accessed from path walking */
    unsigned long           i_ino;
    /*
 * Filesystems may only read i_nlink directly. They shall use the
 * following functions for modification:
 *
     * (set|clear|inc|drop)_nlink
     * inode_(inc|dec)_link_count
     */
     union {
         const unsigned int i_nlink;
         unsigned int __i_nlink;
     };
     dev_t                   i_rdev;
     loff_t                  i_size;
     struct timespec         i_atime;
     struct timespec         i_mtime;
     struct timespec         i_ctime;
     spinlock_t              i_lock; /* i_blocks, i_bytes, maybe i_size */
     unsigned short          i_bytes;
     unsigned int            i_blkbits;
     blkcnt_t                i_blocks;
#ifdef __NEED_I_SIZE_ORDERED
     seqcount_t              i_size_seqcount;
#endif
     /* Misc */
     unsigned long           i_state;
     struct mutex            i_mutex;
     unsigned long           dirtied_when;   /* jiffies of first dirtying */
     unsigned long           dirtied_time_when;
     struct hlist_node       i_hash;
     struct list_head        i_wb_list;      /* backing dev IO list */
#ifdef CONFIG_CGROUP_WRITEBACK
     struct bdi_writeback    *i_wb;          /* the associated cgroup wb */
     /* foreign inode detection, see wbc_detach_inode() */
     int                     i_wb_frn_winner;
     u16                     i_wb_frn_avg_time;
     u16                     i_wb_frn_history;
#endif
     struct list_head        i_lru;          /* inode LRU list */
     struct list_head        i_sb_list;
     union {
         struct hlist_head       i_dentry;
         struct rcu_head         i_rcu;
     };
     u64                     i_version;
     atomic_t                i_count;
     atomic_t                i_dio_count;
     atomic_t                i_writecount;
#ifdef CONFIG_IMA
     atomic_t                i_readcount; /* struct files open RO */
#endif
     const struct file_operations    *i_fop; /* former ->i_op->default_file_ops */
     struct file_lock_context        *i_flctx;
     struct address_space    i_data;
     struct list_head        i_devices;
     union {
         struct pipe_inode_info  *i_pipe;
         struct block_device     *i_bdev;
         struct cdev             *i_cdev;
         char                    *i_link;
     };
     __u32                   i_generation;
#ifdef CONFIG_FSNOTIFY
     __u32                   i_fsnotify_mask; /* all events this inode cares about */
     struct hlist_head       i_fsnotify_marks;
#endif
     void                    *i_private; /* fs or device private pointer */
};
struct inode_operations {
    struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int);
    const char * (*follow_link) (struct dentry *, void **);
    int (*permission) (struct inode *, int);
    struct posix_acl * (*get_acl)(struct inode *, int);
    int (*readlink) (struct dentry *, char __user *,int);
    void (*put_link) (struct inode *, void *);
    int (*create) (struct inode *,struct dentry *, umode_t, bool);
    int (*link) (struct dentry *,struct inode *,struct dentry *);
    int (*unlink) (struct inode *,struct dentry *);
    int (*symlink) (struct inode *,struct dentry *,const char *);
    int (*mkdir) (struct inode *,struct dentry *,umode_t);
    int (*rmdir) (struct inode *,struct dentry *);
    int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t);
    int (*rename) (struct inode *, struct dentry *,
                   struct inode *, struct dentry *);
    int (*rename2) (struct inode *, struct dentry *,
                    struct inode *, struct dentry *, unsigned int);
    int (*setattr) (struct dentry *, struct iattr *);
    int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
    int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
    ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
    ssize_t (*listxattr) (struct dentry *, char *, size_t);
    int (*removexattr) (struct dentry *, const char *);
    int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
                  u64 len);
    int (*update_time)(struct inode *, struct timespec *, int);
    int (*atomic_open)(struct inode *, struct dentry *,
                       struct file *, unsigned open_flag,
                       umode_t create_mode, int *opened);
    int (*tmpfile) (struct inode *, struct dentry *, umode_t);
    int (*set_acl)(struct inode *, struct posix_acl *, int);
    /* WARNING: probably going away soon, do not use! */
};