之前我们讲过mount的内核源代码,今天我们来一起看一下umount系统调用的内核源代码实现吧。
首先看sys_umount函数,定义在fs/namespace.c,定义如下
我们继续看do_umount函数,do_umount函数定义在fs/namespace.c,定义如下
首先看sys_umount函数,定义在fs/namespace.c,定义如下
asmlinkage long sys_umount(char __user * name, int flags)
{
struct nameidata nd;
int retval;
/*之前讲过的,格局传入的路径名返回文件的inode和vfsmount结构体*/
retval = __user_walk(name, LOOKUP_FOLLOW, &nd);
/*如果失败了就返回错误代码*/
if (retval)
goto out;
retval = -EINVAL;
/*如果传入的umount点不是对应的挂载文件系统的根节点,也返回*/
if (nd.dentry != nd.mnt->mnt_root)
goto dput_and_out;
/*命名空间检查*/
if (!check_mnt(nd.mnt))
goto dput_and_out;
retval = -EPERM;
/*之前讲过,权限检查*/
if (!capable(CAP_SYS_ADMIN))
goto dput_and_out;
/*主要工作*/
retval = do_umount(nd.mnt, flags);
dput_and_out:
path_release_on_umount(&nd);
out:
return retval;
}
我们继续看do_umount函数,do_umount函数定义在fs/namespace.c,定义如下
static int do_umount(struct vfsmount *mnt, int flags)
{
/*挂载点的超