tarfs について (2)

最近なんちゃらシリーズが途中で頓挫する事が多いな。とりあえず、頑張りましょうという事で。

register_filesystem

Linux Kernel Hack Japanregister_filesystem によれば、この関数の引数は struct file_system_type 型との事。
struct file_system_type 型は include/linux/fs.h にて定義。register_filesystem に渡されているソレを遡ってみる必要があるかな。
とりあえずターゲットを drivers/usb/core/inode.c にしてみる事に。根拠はナシ。ドライバ初期化なソレは以下な模様。

int __init usbfs_init(void)
{
	int retval;

	retval = register_filesystem(&usb_fs_type);
	if (retval)
		return retval;

	usb_register_notify(&usbfs_nb);

	/* create mount point for usbfs */
	usbdir = proc_mkdir("usb", proc_bus);

	return 0;
}

これ、おそらくは module ではなくって、なソレでしょうか。とりあえず現時点では module 云々はスルーで register_filesystem に渡している usb_fs_type がナニ。掘ってみたら同一ソースにて定義されている模様。

static struct file_system_type usb_fs_type = {
	.owner =	THIS_MODULE,
	.name =		"usbfs",
	.get_sb =	usb_get_sb,
	.kill_sb =	kill_litter_super,
};

owner 属性ってここでも出てくるな。この定義を見るに 2.4 系の DECLARE_FSTYPE_DEV というマクロがとても気になる。
ちなみに get_sb 属性にセットされている usb_get_sb は直上で定義。

static int usb_get_sb(struct file_system_type *fs_type,
	int flags, const char *dev_name, void *data, struct vfsmount *mnt)
{
	return get_sb_single(fs_type, flags, data, usbfs_fill_super, mnt);
}

get_sb_single は fs/super.c にて定義されている模様。

int get_sb_single(struct file_system_type *fs_type,
	int flags, void *data,
	int (*fill_super)(struct super_block *, void *, int),
	struct vfsmount *mnt)
{
	struct super_block *s;
	int error;

	s = sget(fs_type, compare_single, set_anon_super, NULL);
	if (IS_ERR(s))
		return PTR_ERR(s);
	if (!s->s_root) {
		s->s_flags = flags;
		error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
		if (error) {
			up_write(&s->s_umount);
			deactivate_super(s);
			return error;
		}
		s->s_flags |= MS_ACTIVE;
	}
	do_remount_sb(s, flags, data, 0);
	return simple_set_mnt(mnt, s);
}

あるいは kill_litter_super は fs/super.c にて以下な定義。

void kill_litter_super(struct super_block *sb)
{
	if (sb->s_root)
		d_genocide(sb->s_root);
	kill_anon_super(sb);
}

とは言え、上記を掘り下げる前に DECLARE_FSTYPE_DEV なマクロがナニ。とても気になる。色々探している間に見つけたのをメモ

を。参考になりそげなのがあったかも

ええと以下なカンジ。ちなみに 2.4 までは include/linux/fs.h にて定義されていた模様。

868 #define DECLARE_FSTYPE_DEV(var,type,read) \
869         DECLARE_FSTYPE(var,type,read,FS_REQUIRES_DEV)

で、DECLARE_FSTYPE は以下。定義は同様に include/linux/fs.h な模様。

860 #define DECLARE_FSTYPE(var,type,read,flags) \
861 struct file_system_type var = { \
862         name:           type, \
863         read_super:     read, \
864         fs_flags:       flags, \
865         owner:          THIS_MODULE, \
866 }

しまった。直上だった。マクロ廃止の理由は分かりませんが、メンバが変更になっているのは明白。とりあえずここまで分かれば根拠は別途で良いな。
# って若干微妙。

とりあえず tarfs なナニでどうすれば良いのか、は分かったのでしょうか。なんか違うな。いや、大丈夫かな。とりあえず 2.6 なナニを確認してみる事に。