71.5. dentry (カーネル)

 dentry は「 Directory Entry 」の略です。

 ディレクトリーを抽象化したオブジェクトですね。

 それとヘッダーソースは「 dcache.h 」にありますんで、他のファイルシステムオブジェクトとは別のヘッダーにあります。

// /usr/src/linux-headers-4.18.16-041816-generic/include/linux/dcache.h
 88 struct dentry {
 89   /* RCU lookup touched fields */
 90   unsigned int d_flags;   /* protected by d_lock */
 91   seqcount_t d_seq;   /* per dentry seqlock */
 92   struct hlist_bl_node d_hash;  /* lookup hash list */
 93   struct dentry *d_parent;  /* parent directory */
 94   struct qstr d_name;
 95   struct inode *d_inode;    /* Where the name belongs to - NULL is
 96            * negative */
 97   unsigned char d_iname[DNAME_INLINE_LEN];  /* small names */
 98
 99   /* Ref lookup also touches following */
100   struct lockref d_lockref; /* per-dentry lock and refcount */
101   const struct dentry_operations *d_op;
102   struct super_block *d_sb; /* The root of the dentry tree */
103   unsigned long d_time;   /* used by d_revalidate */
104   void *d_fsdata;     /* fs-specific data */
105
106   union {
107     struct list_head d_lru;   /* LRU list */
108     wait_queue_head_t *d_wait;  /* in-lookup ones only */
109   };
110   struct list_head d_child; /* child of parent list */
111   struct list_head d_subdirs; /* our children */
112   /*
113    * d_alias and d_rcu can share memory
114    */
115   union {
116     struct hlist_node d_alias;  /* inode alias list */
117     struct hlist_bl_node d_in_lookup_hash;  /* only for in-lookup ones */
118     struct rcu_head d_rcu;
119   } d_u;
120 } __randomize_layout;

 dentry には3つの状態があります。

used
(d_inode)が有効な inode を指しており 1 以上のユーザーがある状態(メモリーの解放はできない)
unused
(d_inode)が有効な inode を指しているがユーザーなし(キャッシュとして保持するが、廃棄可能)
negative
(d_inode)が有効な inode を指していない。存在しないファイルに open 関数を使うとおきる

 dentry はルックアップのためにキャッシュに保持されるために、こうした区別が必要とのことです。

281 /* appendix may either be NULL or be used for transname suffixes */
282 extern struct dentry *d_lookup(const struct dentry *, const struct qstr *);
283 extern struct dentry *d_hash_and_lookup(struct dentry *, struct qstr *);
284 extern struct dentry *__d_lookup(const struct dentry *, const struct qstr *);
285 extern struct dentry *__d_lookup_rcu(const struct dentry *parent,
286         const struct qstr *name, unsigned *seq);
287
288 static inline unsigned d_count(const struct dentry *dentry)
289 {
290   return dentry->d_lockref.count;
291 }

 dentry のルックアップには d_lookup 関数を使えます。

 dentry は LRU で掃除や回復をするようですが、3つの状態はその際にも使われます。

 あと dentry の細かな操作の関数ポインターについては dentry_operations オブジェクトに宣言されています。

// /usr/src/linux-headers-4.18.16-041816-generic/include/linux/dcache.h
134 struct dentry_operations {
135   int (*d_revalidate)(struct dentry *, unsigned int);
136   int (*d_weak_revalidate)(struct dentry *, unsigned int);
137   int (*d_hash)(const struct dentry *, struct qstr *);
138   int (*d_compare)(const struct dentry *,
139       unsigned int, const char *, const struct qstr *);
140   int (*d_delete)(const struct dentry *);
141   int (*d_init)(struct dentry *);
142   void (*d_release)(struct dentry *);
143   void (*d_prune)(struct dentry *);
144   void (*d_iput)(struct dentry *, struct inode *);
145   char *(*d_dname)(struct dentry *, char *, int);
146   struct vfsmount *(*d_automount)(struct path *);
147   int (*d_manage)(const struct path *, bool);
148   struct dentry *(*d_real)(struct dentry *, const struct inode *,
149          unsigned int, unsigned int);
150 } ____cacheline_aligned;

 dentry の操作関数にはキャッシュ系のものが多いです。

 まあこの辺は重要じゃないので、理解するために投資する時間を考慮するなら、覚える必要はないと思います。

Copyright 2018-2019, by Masaki Komatsu