昨晩の続き
__iget() 見てたのか。
とりあえず掘らずにざっくり中身をナニ。
if (atomic_read(&inode->i_count)) { atomic_inc(&inode->i_count); return; }
なブロックは &inode->i_count が非ゼロであれば加算して終了、な意図。で、ゼロだったら以下で加算しといて
atomic_inc(&inode->i_count);
引数な inode オブジェクトの i_state 属性が I_LOCK でも I_DIRTY でも無ければ inode_in_use なリストに inode オブジェクトを移動。逆に言うと LOCK 乃至 DIRTY だったら、そのステイトを脱する時点で i_count とかを見て_解放_しないような措置を取るんだろうと類推してますが、別途確認必要。
最後のソレが微妙。
inodes_stat.nr_unused--;
inodes_stat は inode.c にて以下な定義。
struct inodes_stat_t inodes_stat;
この inodes_stat_t は構造体で include/linux/fs.h にて以下な定義。
struct inodes_stat_t { int nr_inodes; int nr_unused; int dummy[5]; }; extern struct inodes_stat_t inodes_stat;
inode_stat_t で grep したら以下な出力。
$ grep inodes_stat * fs-writeback.c: inodes_stat.nr_unused++; fs-writeback.c: (inodes_stat.nr_inodes - inodes_stat.nr_unused) + inode.c:struct inodes_stat_t inodes_stat; inode.c: inodes_stat.nr_unused--; inode.c: inodes_stat.nr_inodes -= nr_disposed; inode.c: inodes_stat.nr_unused -= count; inode.c: inodes_stat.nr_unused -= nr_pruned; inode.c: return (inodes_stat.nr_unused / 100) * sysctl_vfs_cache_pressure; inode.c: inodes_stat.nr_inodes++; inode.c: inodes_stat.nr_inodes++; inode.c: inodes_stat.nr_inodes++; inode.c: inodes_stat.nr_inodes--; inode.c: inodes_stat.nr_unused++; inode.c: inodes_stat.nr_unused--; inode.c: inodes_stat.nr_inodes--; $
このあたり、明日確認予定ッス。(を
wiki に出力できてないな。