tarfs について (15)

体調微妙ですが、なんとなく昨晩の続きを。
ええと、dir.o を make してるのに file.c がコンパイルされてるのは愛嬌、という事で別途対応予定。おそらく

${tarfs-objs}: ${HEADERS}
	${MAKE} -C ${KDIR} M=${PWD}

なカンジでまるっとヤッツケちゃってるのが敗因っぽい。

file.c の翻訳エラー

ええと、struct file には f_reada などというメンバは無い、という件から。2.4 の struct file 型についての解説が以下。

上記によれば_readahead をサポートする_とある。ソレげなメンバを 2.6 で探してみると f_ra というメンバが「先読み制御用情報」との事。どうやって初期化するんだか、という事で既存を確認。
と、fs/open.c の __dentry_open() という手続き中で file_ra_state_init() という手続きを使って初期化しているクサイ。正直 '\0' で memset しとけばええじゃん、という微妙な考えも頭の中をよぎっているのですが。

あらら

カン違いしてました。上記のナニは struct file_operations 型の llseek 属性にセットされる手続きである tarfs_file_lseek() 手続きの中で云々。
と言いつつ中身を見たんですが、lseek な手続きの標準なソレを知らんのに中身をどうこう、は不可能なコトに気づく。それ以前に llseek というナニが分かってないな、という事で Manpage of LLSEEK を確認。オフセットを変更するだけな模様。
あと、llseek の三番目の引数 origin も意味不明。lkhj の default_llseek() な解説に origin の説明あり。簡単に控えとくと

  • 0 は設定
  • 1 は offset の値を変更
  • 2 は終端

というカンジ??
ええと、fs/read_write.c の generic_file_llseek() 手続きを見るに

                if (offset != file->f_pos) {
                        file->f_pos = offset;
                        file->f_version = 0;
                }

な記述があるので、file.c の tarfs_file_lseek() の以下の記述

	if (offset != file->f_pos) {
		file->f_pos = offset;
		file->f_reada = 0;
		file->f_version = ++event;
	}

の f_reada 属性に 0 を代入しているナニは抹消しても良さげ。seq_lseek() 手続きも同様な模様。という事にてこの行はコメントアウト。

もうちょい

f_version という属性について。
Linux Kernel 2.4 internals: 仮想ファイルシステム (VFS) の記述によれば f_version 属性は

キャッシュを取り消すためのバージョン管理メカニズム (グローバル変数の event を使って) f_pos が変わったときにいつも増分される。

とある。2.6 な本では「バージョン番号」としか記述がない。これも generic_file_llseek() に倣えば 0 を代入しとけば良さげに見えます。ただ、0 ではない値を代入する事の意味というか意図を理解しておく必要はありそげ。