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 行目もコメントアウトの方向で