在一般情况下while(1)循环中的内容可以保证正确的退到父目录,但是考虑一种情况就是,当用户进入了一个目录后,其父目录上又重新挂载了一个文件系统,这时新的文件系统会覆盖旧的文件系统,使得之前的内容都被隐藏,因此这时要后退到上级目录则不是退回到原本所属的文件系统的目录了,而是退回到了最新的那个文件系统的挂载点。下面的一个例子可以用来说明这种情况:
1. 通过mkdir -p /mnt/test在/mnt目录下创建一个test目录
2. cd /mnt/test
3. ls .. 这时可以看到我们后退到的目录对应的是原文件系统,因此显示的是test
4. mount /dev/cdrom /mnt
5.ls .. 这时因为重新挂载了一个文件系统,因此test对应的文件系统被覆盖,所以显示的内容是cdrom根目录下的内容而看不到test了。
follow_mount()函数就是用来解决这么一个问题,即保证后退(或者前进)的目录是最新的那个文件系统对应的目录
static void follow_mount(struct path *path)
{
while (d_mountpoint(path->dentry)) {//目录下有文件系统被安装
struct vfsmount *mounted = lookup_mnt(path);//找到最先被挂载的子文件系统
if (!mounted)//如果mounted为0,也就表示之前处理的子文件系统是最后一个子文件系统了,
break; //这个文件系统的mnt才是所要返回的上级目录的真正mnt
dput(path->dentry);
mntput(path->mnt);
path->mnt = mounted;//保存vfsmount
path->dentry = dget(mounted->mnt_root);//保存dentry,并更新引用计数
}
}