tarfs について (17)

現在、file.c にて compilation error が出ている状態。

/home/rms/kernel/tarfs/src/file.c: In function 'tarfs_file_lseek':
/home/rms/kernel/tarfs/src/file.c:53: error: 'event' undeclared (first use in this function)
/home/rms/kernel/tarfs/src/file.c:53: error: (Each undeclared identifier is reported only once
/home/rms/kernel/tarfs/src/file.c:53: error: for each function it appears in.)
/home/rms/kernel/tarfs/src/file.c: At top level:
/home/rms/kernel/tarfs/src/file.c:68: error: 'generic_file_read' undeclared here (not in a function)

53 行目はこんなカンジ。

		file->f_version = ++event;

ググッてみたら Linux Kernel 2.4 Internals: 仮想ファイルシステム (VFS) に記述があった。キャッシュを取り消すためのバージョン管理メカニズム、とある。これは確かに lseek とかの機能で使われるわな。
で、2.6 ではこの event というグローバル変数が無い、と。で、linux-2.6.20/include/linux/fs.h 見てみたら f_version という属性は残ってますな。
ってよく考えたら lseek なソレの実装見てみりゃ良いのか。例えば fs/seq_file.c の seq_lseek() 関数を見てみると最初に

    struct seq_file *m = (struct seq_file *)file->private_data;

file 構造体なオブジェクトの private_data 属性を seq_file 構造体なソレにキャストしておいて

    file->f_version = m->version;

みたいなマネをしている。seq_file 構造体にも version という属性がある。む、これって直上の記述の上にて

  • m->version に file->f_version の値を代入
  • 条件によって m->version をゼロで初期化
  • file->f_version に m->version の値を代入 (直上のナニ

という事で seq_lseek() 関数では、f_version 属性は 0 で初期化されることもある、という程度のナニですな。
若干微妙なので fs/read_write.c の generic_file_llseek() も見てみると

            file->f_version = 0;

とほほほ。

いろいろ見てるに f_version は llseek で操作されていないカンジ。もう少し fs 配下のソレ達を確認の必要はあるかと思いますが、おそらくビンゴのはず。
しかし未だに f_version という属性が何を表現しようとしているかは不明。
ですが、とりあえずこの 53 行目もコメントアウトの方向で