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?
ってかこれ、面白そう。でも今日の掘削は無理。