tarfs について (2)
最近なんちゃらシリーズが途中で頓挫する事が多いな。とりあえず、頑張りましょうという事で。
register_filesystem
Linux Kernel Hack Japan の register_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 なナニを確認してみる事に。