ext3_fill_super() 手続き (3)
ええと、get_sb_bdev() から呼ばれる open_bdev_excl() から呼ばれる blkdev_get() から呼ばれる __blkdev_get() あたりからログ。
まず
__blkdev_get() から。以下の通り、基本的に fake な file オブジェクトを渡して
static int __blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags, int for_part) { /* * This crockload is due to bad choice of ->open() type. * It will go away. * For now, block device ->open() routine must _not_ * examine anything in 'inode' argument except ->i_rdev. */ struct file fake_file = {}; struct dentry fake_dentry = {}; fake_file.f_mode = mode; fake_file.f_flags = flags; fake_file.f_path.dentry = &fake_dentry; fake_dentry.d_inode = bdev->bd_inode; return do_open(bdev, &fake_file, for_part); }
do_open() を呼び出す。定義は同じファイル (fs/block_dev.c) です。とりあえずエラーなケイスですが以下を見てみる。
static int do_open(struct block_device *bdev, struct file *file, int for_part) { struct module *owner = NULL; struct gendisk *disk; int ret = -ENXIO; int part; file->f_mapping = bdev->bd_inode->i_mapping; lock_kernel(); disk = get_gendisk(bdev->bd_dev, &part); if (!disk) { unlock_kernel(); bdput(bdev); return ret; }
えーと、
- 渡された block_device オブジェクトの bd_inode 属性 (inode オブジェクト) の i_mapping 属性 (address_space オブジェクトのポインタ) を引数 file の i_mapping にセットしている
- lock_kernel() 呼び出してビッグカーネルロック取得
- ここ、ポイント高いようですが今日はスルー
- get_gendisk() 呼び出しの戻りを disk にセット
ここは個別で
定義が block/genhd.c で以下。
/** * get_gendisk - get partitioning information for a given device * @dev: device to get partitioning information for * * This function gets the structure containing partitioning * information for the given device @dev. */ struct gendisk *get_gendisk(dev_t dev, int *part) { struct kobject *kobj = kobj_lookup(bdev_map, dev, part); return kobj ? to_disk(kobj) : NULL; }
kobject?
ってかこれ、面白そう。でも今日の掘削は無理。