ext3_fill_super() 手続き

昨晩の続き。
これって get_sb_bdev() 手続きに渡されてるナニ。

static int ext3_get_sb(struct file_system_type *fs_type,
        int flags, const char *dev_name, void *data, struct vfsmount *mnt)
{
        return get_sb_bdev(fs_type, flags, dev_name, data, ext3_fill_super, mnt);
}

static struct file_system_type ext3_fs_type = {
        .owner          = THIS_MODULE,
        .name           = "ext3",
        .get_sb         = ext3_get_sb,
        .kill_sb        = kill_block_super,
        .fs_flags       = FS_REQUIRES_DEV,
};

上記の通り、ext3_fs_type の get_sb な属性に設定されている。これは確か mount 時に呼び出される手続きのはず。これはもしかして fs/super.c の get_sb_bdev() から確認した方が良いのかなぁ。

とゆーコトで

とりあえず get_sb_bdev() から見てみます。これ、3rd Edition に解説がありますな。非常にざっくりなんですが

  • open_bdev_excl() でブロックデバイスを open
  • sget() で super block なリストを検索。
    • リストに既に存在、というのはそのデバイスが既に mount されているケイスなのだろうか
    • そうでなければ fill_super にセットされた手続きを呼び出す

みたいな流れな模様。たしかにソースもそんなカンジ。とりあえず個別に掘削。

open_bdev_excl() 手続き

get_sb_bdev() では以下なカンジで呼び出されている。

	bdev = open_bdev_excl(dev_name, flags, fs_type);
	if (IS_ERR(bdev))
		return PTR_ERR(bdev);

掘ってみます。fs/block_dev.c にて定義されている。関数定義のコメントが以下。

/**
 * open_bdev_excl  -  open a block device by name and set it up for use
 *
 * @path:	special file representing the block device
 * @flags:	%MS_RDONLY for opening read-only
 * @holder:	owner for exclusion
 *
 * Open the blockdevice described by the special file at @path, claim it
 * for the @holder.
 */

@holder にセットされる引数は上記の file_system_type なオブジェクト。3rd Edition によれば_ブロック型デバイスの所有者のリニアアドレスを格納_とある。ざっくりな処理手順は以下なカンジ?

  • lookup_bdev() の戻りを block_device 構造体なポインタに格納
  • blkdev_get() 呼び出し
    • lookup_bdev() が戻すナニを open する模様
  • bd_claim() を呼び出して bdev なオブジェクトの bd_holder 属性に引数セット

どーでもええけど excl って何の略だろ。(を

とほほ

この週末、神経をスリ減らす会社イベントが予定されてるので体力温存のため、検討別途にします。振替が火、水なんでそのあたりで頑張る予定。