Chinaunix

标题: 关于follow_mount()的疑惑 [打印本页]

作者: chishanmingshen    时间: 2013-01-28 17:04
标题: 关于follow_mount()的疑惑
from 3.7.0
  1. /*
  2. * Skip to top of mountpoint pile in refwalk mode for follow_dotdot()
  3. */
  4. static void follow_mount(struct path *path)
  5. {
  6.         while (d_mountpoint(path->dentry)) {
  7.                 struct vfsmount *mounted = lookup_mnt(path);
  8.                 if (!mounted)
  9.                         break;
  10.                 dput(path->dentry);
  11.                 mntput(path->mnt);
  12.                 path->mnt = mounted;
  13.                 path->dentry = dget(mounted->mnt_root);<----------此处的赋值是否不变?
  14.         }
  15. }
复制代码
可以多个fs挂载到同一个目录, 所以此处的dentry是否不变?
查了下挂载时的操作, 貌似没有生成新的dentry...

不明白啊, 请指点, 谢谢!

作者: zylthinking    时间: 2013-01-28 17:04
不变是什么意思? 不明白
但这段代码大概我明白是什么意思, path->dentry 是一个挂载点, 想要向下走到挂载到这个挂载点的设备上吧? 你问的是不是如果多个设备挂载到同一个挂载点, 那么这里向下走到的会不会永远是其中某一个设备?

多个设备是可以挂载到同一个目录, 这里有两个不同的分支:
1. 设备A挂载到该挂载点, 设备B挂载到设备A的根目录, 设备C挂载到设备B的根目录, 外边看起来, 其实 A,B隐藏了, 似乎是设备C直接挂载到挂载点。 那么这个函数其实是走到设备A, 要想走到设备C, 循环调用这个函数则可以。
2. 这个挂载点有不同的路径, 比如 /mountA/path/to/dentry 和 /mountB/path/to/dentry, 也就是说, 其实dentry 所在设备同时挂载到另两个不同的目录 mountA/mountB 上, 然后设备A再挂载到  /mountA/path/to/dentry 上, 设备B挂载到 /mountB/path/to/dentry 上, 那么从 dentry 往下走会走到哪个目录视你从 /mountA/path/to/这个路径到达的 dentry 还是 /mountB/path/to 到达的 dentry. 从 mountA 到达的, 会返回设备 A 的根目录, 否则返回设备B的根目录。 内部逻辑是根据 mnt_parent 指针做的判断, 这个指针要么指向 mountA, 要么指向 mountB.
作者: chishanmingshen    时间: 2013-02-01 19:17
求解!!

请高手指点
作者: T-Bagwell    时间: 2013-02-01 23:57
前面dput了
作者: chishanmingshen    时间: 2013-02-02 11:27
                path->dentry = dget(mounted->mnt_root);<----------此处的赋值是否不变?
我是说每次循环中的 得到的 "path->dentry "是否是一样的? 呵呵
作者: T-Bagwell    时间: 2013-02-02 12:38

代码都有了,为啥不看以下呢
对吧

作者: chishanmingshen    时间: 2013-02-02 16:32

看了下代码,貌似是不一样的。

每个文件系统都有自己特有的sb,自然对应的dentry也是不同的。

是这样么,请指点,谢谢!


作者: chishanmingshen    时间: 2013-02-03 16:38
哦 应该都不同 sb只是最一般的情况

即使是同一个文件系统的多个目录被挂载到同一个挂载点

呵呵 对么?
作者: chishanmingshen    时间: 2013-02-05 10:37
请专家指点, 然后结贴...




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2