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()を見る。