71.4. inode (カーネル)

 inode は「index node」の略です。

 ファイル、ディレクトリー、FIFOといったファイルシステムオブジェクトを実装したオブジェクトです。

// /usr/src/linux-headers-4.18.16-041816-generic/include/linux/fs.h
 572 struct inode {
 573   umode_t     i_mode;
 574   unsigned short    i_opflags;
 575   kuid_t      i_uid;
 576   kgid_t      i_gid;
 577   unsigned int    i_flags;
 578
 579 #ifdef CONFIG_FS_POSIX_ACL
 580   struct posix_acl  *i_acl;
 581   struct posix_acl  *i_default_acl;
 582 #endif
 583
 584   const struct inode_operations *i_op;
 585   struct super_block  *i_sb;
 586   struct address_space  *i_mapping;
//....一部割愛
 637   struct list_head  i_lru;    /* inode LRU list */
 638   struct list_head  i_sb_list;
 639   struct list_head  i_wb_list;  /* backing dev writeback list */
 640   union {
 641     struct hlist_head i_dentry;
 642     struct rcu_head   i_rcu;
 643   };
 644   atomic64_t    i_version;
 645   atomic_t    i_count;
 646   atomic_t    i_dio_count;
 647   atomic_t    i_writecount;
 648 #ifdef CONFIG_IMA
 649   atomic_t    i_readcount; /* struct files open RO */
 650 #endif
 651   const struct file_operations  *i_fop; /* former ->i_op->default_file_ops
 652   struct file_lock_context  *i_flctx;
 653   struct address_space  i_data;
 654   struct list_head  i_devices;
 655   union {
 656     struct pipe_inode_info  *i_pipe;
 657     struct block_device *i_bdev;
 658     struct cdev   *i_cdev;
 659     char      *i_link;
 660     unsigned    i_dir_seq;
 661   };

 以下のようにファイルやディレクトリーに関するメタデータを保持します。

 このオブジェクトはファイル・ディレクトリーがアクセスされたときに生成されるはずです。

 inode は inode_operations をメンバーオブジェクトとして宣言してます。

// /usr/src/linux-headers-4.18.16-041816-generic/include/linux/fs.h
1754 struct inode_operations {
1755   struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int);
1756   const char * (*get_link) (struct dentry *, struct inode *, struct delayed_call *);
1757   int (*permission) (struct inode *, int);
1758   struct posix_acl * (*get_acl)(struct inode *, int);
1759
1760   int (*readlink) (struct dentry *, char __user *,int);
1761
1762   int (*create) (struct inode *,struct dentry *, umode_t, bool);
1763   int (*link) (struct dentry *,struct inode *,struct dentry *);
1764   int (*unlink) (struct inode *,struct dentry *);
1765   int (*symlink) (struct inode *,struct dentry *,const char *);
1766   int (*mkdir) (struct inode *,struct dentry *,umode_t);
1767   int (*rmdir) (struct inode *,struct dentry *);
1768   int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t);
1769   int (*rename) (struct inode *, struct dentry *,
1770       struct inode *, struct dentry *, unsigned int);
1771   int (*setattr) (struct dentry *, struct iattr *);
1772   int (*getattr) (const struct path *, struct kstat *, u32, unsigned int);
1773   ssize_t (*listxattr) (struct dentry *, char *, size_t);
1774   int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
1775           u64 len);
1776   int (*update_time)(struct inode *, struct timespec64 *, int);
1777   int (*atomic_open)(struct inode *, struct dentry *,
1778          struct file *, unsigned open_flag,
1779          umode_t create_mode, int *opened);
1780   int (*tmpfile) (struct inode *, struct dentry *, umode_t);
1781   int (*set_acl)(struct inode *, struct posix_acl *, int);
1782 } ____cacheline_aligned;

 このオブジェクトが関数ポインターを保持しているので、この関数ポインターを使って操作をします。

 create / link / unlink / lookup といった基本操作を可能とする関数ポインターが宣言されてますね。

Copyright 2018-2019, by Masaki Komatsu