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