Linux虚拟文件系统之文件系统卸载(sys_umount())

Linux系统中,文件系统的卸载通过umount系统调用触发,具体执行在sys_umount()函数中。该过程涉及从内核链表移除及释放引用计数。
摘要由CSDN通过智能技术生成

 Linux中卸载文件系统由umount系统调用实现,入口函数为sys_umount()。较于文件系统的安装较为简单,下面是具体的实现。

/*sys_umont系统调用*/
SYSCALL_DEFINE2(umount, char __user *, name, int, flags)
{
	struct path path;
	int retval;
	/*找到装载点的vfsmount实例和dentry实例,二者包装
	在一个nameidata结构中*/
	retval = user_path(name, &path);
	if (retval)
		goto out;
	retval = -EINVAL;
	/*如果查找的最终目录不是文件系统的挂载点*/
	if (path.dentry != path.mnt->mnt_root)
		goto dput_and_out;
	/*如果要卸载的文件系统还没有安装在命名空间中*/
	if (!check_mnt(path.mnt))
		goto dput_and_out;

	retval = -EPERM;
	/*如果用户不具有卸载文件系统的特权*/
	if (!capable(CAP_SYS_ADMIN))
		goto dput_and_out;
	/*实际umount工作*/
	retval = do_umount(path.mnt, flags);
dput_and_out:
	/* we mustn't call path_put() as that would clear mnt_expiry_mark */
	dput(path.dentry);
	mntput_no_expire(path.mnt);
out:
	return retval;
}

卸载实际工作

static int do_umount(struct vfsmount *mnt, int flags)
{
	/*从vfsmount对象的mnt_sb字段检索超级块对象sb的地址*/
	struct super_block *sb = mnt->mnt_sb;
	int retval;
	/*初始化umount_list,该链表在后面的释放中会做临时链表
	用*/
	LIST_HEAD(umount_list);

	retval = security_sb_umount(mnt, flags);
	if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值