/*
 * Keep mostly read-only and often accessed (especially for
 * the RCU path lookup and 'stat' data) fields at the beginning
 * of the 'struct inode'
 */
struct inode {
  umode_t     i_mode;
  unsigned short    i_opflags;
  uid_t     i_uid;
  gid_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;
  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;
  blkcnt_t    i_blocks;
  loff_t      i_size;

#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 */

  struct hlist_node i_hash;
  struct list_head  i_wb_list;  /* backing dev IO list */
  struct list_head  i_lru;    /* inode LRU list */
  struct list_head  i_sb_list;
  union {
    struct list_head  i_dentry;
    struct rcu_head   i_rcu;
  };
  atomic_t    i_count;
  unsigned int    i_blkbits;
  u64     i_version;
  atomic_t    i_dio_count;
  atomic_t    i_writecount;
  const struct file_operations  *i_fop; /* former ->i_op->default_file_ops */
  struct file_lock  *i_flock;
  struct address_space  i_data;
#ifdef CONFIG_QUOTA
  struct dquot    *i_dquot[MAXQUOTAS];
#endif
  struct list_head  i_devices;
  union {



    struct pipe_inode_info  *i_pipe;
    struct block_device *i_bdev;
    struct cdev   *i_cdev;
  };

  __u32     i_generation;

#ifdef CONFIG_FSNOTIFY
  __u32     i_fsnotify_mask; /* all events this inode cares about */
  struct hlist_head i_fsnotify_marks;
#endif

#ifdef CONFIG_IMA
  atomic_t    i_readcount; /* struct files open RO */
#endif
  void      *i_private; /* fs or device private pointer */
};