ファイルのオープン

スデに限界近いんですが手掛りを。

call graph

ざっくり控え。

sys_open (fs/open.c)
  do_sys_open (fs/open.c)
    get_unused_fd (fs/open.c)
    do_filp_open (fs/open.c)
      open_namei (fs/namei.c)
        path_lookup_open (fs/namei.c)
          __path_lookup_intent_open (fs/namei.c)
            do_path_lookup (fs/namei.c)
      nameidata_to_filp (fs/open.c)
        __dentry_open (fs/open.c)
    fsnotify_open
    fd_install (fs/open.c)

上記、2.6.20 なナニです。Linux カーネル2.6 解読室なナニによれば __dentry_open() 手続きがいっちゃんポイント高いとの事。

もう少し

__dentry_open() 手続きにて file 構造体の f_op 属性に以下なナニで取得した inode オブジェクトの

	inode = dentry->d_inode;

i_fop 属性がセット。この手続きには dentry 構造体と vfsmount 構造体なオブジェクトが渡されるはず (未確認)。
do_filp_open() 手続きの定義が以下で

static struct file *do_filp_open(int dfd, const char *filename, int flags,
				 int mode)
{
	int namei_flags, error;
	struct nameidata nd;

	namei_flags = flags;
	if ((namei_flags+1) & O_ACCMODE)
		namei_flags++;

	error = open_namei(dfd, filename, namei_flags, mode, &nd);
	if (!error)
		return nameidata_to_filp(&nd, flags);

	return ERR_PTR(error);
}

nameidata_to_filep に open_namei() 手続きで取得したと思われる nameidata 構造体が渡されてます。むむむ、と言いつつ nameidata_to_filp() 手続きの定義を見てみるに

struct file *nameidata_to_filp(struct nameidata *nd, int flags)
{
	struct file *filp;

	/* Pick up the filp from the open intent */
	filp = nd->intent.open.file;
	/* Has the filesystem initialised the file for us? */
	if (filp->f_path.dentry == NULL)
		filp = __dentry_open(nd->dentry, nd->mnt, flags, filp, NULL);
	else
		path_release(nd);
	return filp;
}

nameidata 構造体なオブジェクトの属性になっとりますな。カーネル2.6 解読室によれば open_namei() の中で path な lookup をしてる、との事にて、dentry だの vfsmount だのなナニを取得しているものと思われます。

明日は

この二つのエントリを元にあるかどうか不明な稼動空きで確認してみます。