tarfs について (11)
順に読んでみる事に。なるべくだらだらヤります。(何
とりあえず dir.c から
tarfs_readdir()
ええと、i-node 読み込み操作 (tarfs_read_inode) にてディレクトリ認定された時の操作。ぶっちゃけてしまうとディレクトリを開いた時のディレクトリに格納されているファイルを読みだす操作になるはず。
とりあえず LinuxJapan の切り抜きによれば
- 引数で渡された struct file なオブジェクトから i-node を求める
- i-node から struct tarent なオブジェクトを取得
- struct tarent なオブジェクトの children な属性が、その i-node のサブディレクトリとなるので、順次 neighbors 属性を手繰って、ファイル位置(f_fpos 番目) のディレクトリエントリまで進める
- 以降の struct tarent オブジェクトについて、filldir 手続きを呼び出す
という事で順に確認。最初の二つは以下なナニと思われます
static int tarfs_readdir(struct file * filp, void * dirent, filldir_t filldir) { struct tarfs_inode_info *tii; struct inode *inode = filp->f_dentry->d_inode; int err; struct tarent *dir_tarent, *ent; int dtype=0; int count, stored; dir_tarent = TARENT(inode);
ええと、struct file 型なオブジェクトから i-node を求める時は f_dentry属性 (ってかオブジェクト) の d_inode 属性から、なんですか。なんか面倒臭いカンジがするのですが、これが共通話法なのでしょうか。
これ
struct inode *inode = filp->f_dentry->d_inode;
で i-node オブジェクトを取得して、次の_i-node から sturct tarent なオブジェクトを取得_するナニが以下
dir_tarent = TARENT(inode);
この TARENT というマクロが tarfs.h で定義されてて、定義が以下
#define TARENT(inode) ((struct tarent*)((inode)->u.generic_ip))
む。これは 2.4 なナニだな。このマクロも修正要な模様。こんなカンジ??
#define TARENT(inode) ((struct tarent*)((inode)->i_generation))
上記が正がどうかは分からんのですが、これってソースを全部さらえてみた方が良いように思っています。コツコツ頑張るか、と。