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

ramfsを読んでみる2

linux

ramfs_fill_super()の実装を見ていく。

217static int ramfs_fill_super(struct super_block * sb, void * data, int silent)
||}<

>|c|
 224        save_mount_options(sb, data);
 225
 226        fsi = kzalloc(sizeof(struct ramfs_fs_info), GFP_KERNEL);
 227        sb->s_fs_info = fsi;
 228        if (!fsi) {
 229                err = -ENOMEM;
 230                goto fail;
 231        }

まずは、マウントオプションをセーブする。
そしたら、kzalloc()でメモリを確保。kzallocはkmallocのラッパーでGFPフラグに__GFP_ZEROを追加して、kmallocを呼び出す。
そうすると、memset()で0に初期化されている領域を返してくれる。

ramfs_fs_infoはどんな構造体かと言うとこんな感じ。

 181struct ramfs_fs_info {
 182        struct ramfs_mount_opts mount_opts;
 183};

 167struct ramfs_mount_opts {
 168        umode_t mode;
 169};

次にマウントオプションの正当性をチェックして、正しくなければエラー処理に進む。

 233        err = ramfs_parse_options(data, &fsi->mount_opts);
 234        if (err)
 235                goto fail;

マウントオプションに問題がなければ、super_block構造体にデータを設定。

 237        sb->s_maxbytes          = MAX_LFS_FILESIZE;
 238        sb->s_blocksize         = PAGE_CACHE_SIZE;
 239        sb->s_blocksize_bits    = PAGE_CACHE_SHIFT;
 240        sb->s_magic             = RAMFS_MAGIC;
 241        sb->s_op                = &ramfs_ops;
 242        sb->s_time_gran         = 1;
 161static const struct super_operations ramfs_ops = {
 162        .statfs         = simple_statfs,
 163        .drop_inode     = generic_delete_inode,
 164        .show_options   = generic_show_options,
 165};

super_operations構造体は、スーパーブロックを操作するための関数をセットする構造体。
ramfsでは独自に用意しないで、ジェネリックな関数のみを使用。

次に、inodeを確保。

 244        inode = ramfs_get_inode(sb, S_IFDIR | fsi->mount_opts.mode, 0);
 245        if (!inode) {
 246                err = -ENOMEM;
 247                goto fail;
 248        }

そしたら、dentryの領域を確保する。
dentryはファイルパス名の情報を格納しメモリ上にキャッシュするためのもの。

 250        root = d_alloc_root(inode);
 251        sb->s_root = root;
 252        if (!root) {
 253                err = -ENOMEM;
 254                goto fail;
 255        }

rootがNULLじゃなければ、すべての処理は成功なので0を返して終了。

 257        return 0;
 258fail:
 259        kfree(fsi);
 260        sb->s_fs_info = NULL;
 261        iput(inode);
 262        return err;

どこかでエラーが発生すると、failラベルに飛んできてkzalloc()で確保した領域(fsi)の開放や、inodeの開放をする。

今日はここまで。次は今回飛ばしたramfs_get_inode()を見る。