読者です 読者をやめる 読者になる 読者になる

ramfsを読んでみる。

linux

ソースはlxrの2.6.31

まずは、初期化から。

 295static int __init init_ramfs_fs(void)
 296{
 297        return register_filesystem(&ramfs_fs_type);
 298}

init_ramfs_fs()は特別なことは一切しなくて、register_filesystem()をコールして、自分自身を登録する。

ramfs_fs_typeは3フィールドだけ設定している。
sbはきっとSuper Blockの略。

 284static struct file_system_type ramfs_fs_type = {
 285        .name           = "ramfs",
 286        .get_sb         = ramfs_get_sb,
 287        .kill_sb        = ramfs_kill_sb,
 288};

file_system_type構造体はこんな形(include/linux/fs.h)

1741struct file_system_type {
1742        const char *name;
1743        int fs_flags;
1744        int (*get_sb) (struct file_system_type *, int,
1745                       const char *, void *, struct vfsmount *);
1746        void (*kill_sb) (struct super_block *);
1747        struct module *owner;
1748        struct file_system_type * next;
1749        struct list_head fs_supers;
1750
1751        struct lock_class_key s_lock_key;
1752        struct lock_class_key s_umount_key;
1753
1754        struct lock_class_key i_lock_key;
1755        struct lock_class_key i_mutex_key;
1756        struct lock_class_key i_mutex_dir_key;
1757        struct lock_class_key i_alloc_sem_key;
1758};

そんなわけで、file_system_type構造体からramfsに関係する関数呼び出しは、get_sb()とkill_sb()だけ。
ramfs_get_sb()はこのような関数。

 265int ramfs_get_sb(struct file_system_type *fs_type,
 266        int flags, const char *dev_name, void *data, struct vfsmount *mnt)
 267{
 268        return get_sb_nodev(fs_type, flags, data, ramfs_fill_super, mnt);
 269}

これも1行だけの関数で、get_sb_nodev()をコールして戻り値を返す。
これの引数のうち、4番めの引数は関数へのポインタで、2番め・3番めの引数はramfs_fill_super()に渡す引数になっている。

get_sb_nodev()はfs/super.cfs/super.cにいる。

 801int get_sb_nodev(struct file_system_type *fs_type,
 802        int flags, void *data,
 803        int (*fill_super)(struct super_block *, void *, int),
 804        struct vfsmount *mnt)
 805{
 806        int error;
 807        struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
 808
 809        if (IS_ERR(s))
 810                return PTR_ERR(s);
 811
 812        s->s_flags = flags;
 813
 814        error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
 815        if (error) {
 816                deactivate_locked_super(s);
 817                return error;
 818        }
 819        s->s_flags |= MS_ACTIVE;
 820        simple_set_mnt(mnt, s);
 821        return 0;
 822}

sget()とかを深く追っていくとVFSの実装をちゃんと調べる必要が出てくるので深追いはしないwww
今日はここまでにして、今度はfill_super()というかramfs_fill_super()を見ていこう。