dentryのメモリ領域の拡張と解放

dentryは必要に応じてどんどん動的に確保していく。必ずiノードとリンクされるため、dentryの総数はiノード数に準じた値となる。

dentry領域の確保はd_alloc関数にて行われる。ファイル名が17byte以上の場合は、dentryの他にファイル名格納用のメモリを別途確保する。確保したメモリはdentryとして初期化(他のdentryとのリンクを張り、参照数を1とする)

必要が無くなったdentry領域の解放はd_free関数にて行われる。ここでは純粋にdentryを空きメモリに返却する。この関数は上記dput関数と、次に述べるprune_one_dentry関数から呼び出される。

d_add関数は、dentryを利用可能な状態にする。dentryのキャッシュへの登録(d_rehash関数)とdentryとiノードとのリンクを行う。

d_delete関数は、dentryを利用不可な状態にする。この関数はファイル削除時に呼び出されるのだが、iノードの解放のみを行い、ディレクトリキャッシュからはずしていない。存在しないファイルのdentryがキャッシュにヒットするため、エレガントな作りとは言えない。パス検索でも無駄なエラーチェックを行う結果となっている。

参照数が2以上の場合はopenしているファイルの削除を意味している。そのうちcloseの延長でdput関数が呼び出され、dentry領域の解放が行われる。

       d_delete(dentry)
             if(参照数が1) {
                  iノードの解放(dentry_iput関数)
                  return;
             }
             キャッシュから落す。(d_drop関数)

(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1