免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2256 | 回复: 4
打印 上一主题 下一主题

[文件系统] mount与路径查询 [复制链接]

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-26 11:05 |只看该作者 |倒序浏览
本帖最后由 asuka2001 于 2012-06-26 11:16 编辑

root@ubuntu:/home# find {a,b,c} -type f
a/a
b/b
c/c
root@ubuntu:/home# mount -B b a
root@ubuntu:/home# mount -B c b
root@ubuntu:/home# find {a,b,c} -type f
a/b
b/c
c/c
root@ubuntu:/home# mount -B a c
root@ubuntu:/home# find {a,b,c} -type f
a/b
b/c
c/b

ps: Ubuntu 9.10系统


查看了下内核里的mount系统调用代码,以mount -B b a为例:

1. 查找到dentry a

2. 查找到dentry b

3. 创建vfsmount,然后把vfsmount->mnt_root指向dentry b

4. 将dentry a的d_flags上加上DCACHE_MOUNTED

这样路径查询时,当查找到dentry a时,由于DCACHE_MOUNTED的存在,将直接跳转到对应的vfsmount->mnt_root上,即dentry b

我现在的疑问是第一个红色部分:即a的dentry和b的dentry现在都已经设置了DCACHE_MOUNTED,为什么在路径查询时,只从dentry a跳转到了dentry b上,而没有继续跳转到dentry c上?

即对应以下的代码中的循环为何第一次从dentry a中跳到了对应的vfsmount->mnt_root,即dentry b;而dentry b同样是被mount了,应该继续跳转到dentry c才对!(仅以rcu-walk部分举例,ref-walk部分与之类似)

walk_component() -> do_lookup() -> __follow_mount_rcu()
  1. static bool __follow_mount_rcu(struct nameidata *nd, struct path *path,
  2.                                struct inode **inode)
  3. {
  4.         for (;;) {
  5.                 struct vfsmount *mounted;
  6.                 /*
  7.                  * Don't forget we might have a non-mountpoint managed dentry
  8.                  * that wants to block transit.
  9.                  */
  10.                 if (unlikely(managed_dentry_might_block(path->dentry)))
  11.                         return false;

  12.                 if (!d_mountpoint(path->dentry))
  13.                         break;

  14.                 mounted = __lookup_mnt(path->mnt, path->dentry, 1);
  15.                 if (!mounted)
  16.                         break;
  17.                 path->mnt = mounted;
  18.                 path->dentry = mounted->mnt_root;
  19.                 nd->flags |= LOOKUP_JUMPED;
  20.                 nd->seq = read_seqcount_begin(&path->dentry->d_seq);
  21.                 /*
  22.                  * Update the inode too. We don't need to re-check the
  23.                  * dentry sequence number here after this d_inode read,
  24.                  * because a mount-point is always pinned.
  25.                  */
  26.                 *inode = path->dentry->d_inode;
  27.         }
  28.         return true;
  29. }
复制代码

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
2 [报告]
发表于 2012-06-26 11:56 |只看该作者
  1. yan@yanx:/tmp/teset$ find -type f
  2. ./b/b
  3. ./a/a
  4. ./c/c
  5. yan@yanx:/tmp/teset$ sudo mount -B b b
  6. yan@yanx:/tmp/teset$ sudo mount --make-shared b
  7. yan@yanx:/tmp/teset$ sudo mount -B b a
  8. yan@yanx:/tmp/teset$ ls a
  9. b
  10. yan@yanx:/tmp/teset$ sudo mount -B c b
  11. yan@yanx:/tmp/teset$ ls a
  12. c
  13. yan@yanx:/tmp/teset$
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-06-26 20:11 |只看该作者
本帖最后由 yushang 于 2012-06-26 20:12 编辑

瞎说一句:单纯从follow_mount来看,应该跨过多个挂载点。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
4 [报告]
发表于 2012-06-27 09:40 |只看该作者
回复 2# tempname2

多谢指点,没仔细去看__lookup_mnt(),一看到hash就跳过了。。。

从dentry a跳到dentry b后再次进行__lookup_mnt()时使用的hash参数和建立b到c的vfsmount时使用的hash参数()不一样,所以那个循环直接跳出去了!



   

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
5 [报告]
发表于 2012-06-27 09:43 |只看该作者
感激各位的帮助!

等研究了MNT_SHARED后再来看看为什么mount目标为MNT_SHARE时可以从hash表里找到对应的vfsmount,从而从dentry a跳到dentry c。也期待高手们指点下:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP