- 论坛徽章:
- 1
|
本帖最后由 maybe524 于 2015-07-28 10:19 编辑
终于知道kernel是怎么做了,因为在look_up的过程中,会不断地判断dentry是否被挂载(kernel-2.6.26):- static int do_lookup(struct nameidata *nd, struct qstr *name,
- struct path *path)
- {
- struct vfsmount *mnt = nd->path.mnt;
- struct dentry *dentry = __d_lookup(nd->path.dentry, name); // 在父目录所在的散列表(缓存)中查找该目录项对象
- if (!dentry)
- goto need_lookup;
- if (dentry->d_op && dentry->d_op->d_revalidate) // 如果在缓存中找到,那么检查是否仍然有效
- goto need_revalidate;
- done:
- path->mnt = mnt;
- path->dentry = dentry;
- __follow_mount(path); // 检查当前的dentry是否是一个挂载点
- return 0;
- need_lookup:
- dentry = real_lookup(nd->path.dentry, name, nd); // 如果在__d_lookup中未找到,需要在最底层的文件系统中查找操作
- if (IS_ERR(dentry))
- goto fail;
- goto done;
- need_revalidate:
- dentry = do_revalidate(dentry, nd);
- if (!dentry)
- goto need_lookup;
- if (IS_ERR(dentry))
- goto fail;
- goto done;
- fail:
- return PTR_ERR(dentry);
- }
复制代码- static int __follow_mount(struct path *path)
- {
- int res = 0;
- while (d_mountpoint(path->dentry)) { // 检查dentry->d_mounted是否大于1,如果大于,则判定dentry是一个挂载点
- struct vfsmount *mounted = lookup_mnt(path->mnt, path->dentry);
- if (!mounted)
- break;
- dput(path->dentry);
- if (res)
- mntput(path->mnt);
- path->mnt = mounted;
- path->dentry = dget(mounted->mnt_root); // 在此例子中,dentry指向flsh分区1的root的目录。哈哈,这样就完成了从ramfs到fat的过渡了。
- res = 1;
- }
- return res;
- }
复制代码 |
|