linux 回退目录,Linux虚拟文件系统--文件路径名的解析(2)--回退父目录

在一般情况下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了。

766b52c02da34eba80726f179d884396.png

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,并更新引用计数

}

}0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值