mount系统调用在内核中对应的服务函数为do_mount函数.下面就简单总结一下该函数的实现.
long do_mount(char *dev_name, char *dir_name, char *type_page,
unsigned long flags, void *data_page)
{
struct path path;
int retval = 0;
int mnt_flags = 0;
//检查参数,省略
......
/*调用函数kern_path函数获取挂载点的信息,后面会专门写总结介绍的,在这里只需
之道调用这个函数之后,挂载点的vfsmount,dentry和inode信息都会得到.*/
retval = kern_path(dir_name, LOOKUP_FOLLOW, &path);
if (retval)
return retval;
retval = security_sb_mount(dev_name, &path,
type_page, flags, data_page);
if (retval)
goto dput_out;
/*下面这段是根据flags参数进行判断要执行那个函数,一般的挂载会执行do_new_mount函数,
这也是最常走的分支.*/
if (flags & MS_REMOUNT)
retval = do_remount(&path, flags & ~MS_REMOUNT, mnt_flags,
data_page);
else if (flags & MS_BIND)
retval = do_loopback(&path, dev_name, flags & MS_REC);
else if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE))
retval = do_change_type(&path, flags);
else if (flags & MS_MOVE)
retval = do_move_mount(&path, dev_name);
else
retval = do_new_mount(&path, type_page, flags, mnt_flags,
dev_name, data_page);//通常会执行该函数,下面会详细介绍
dput_out:
path_put(&path);
return retval;
}
static int do_new_mount(struct path *path, char *type, int flags,
int mnt_flags, char *name, void *data)
{
struct vfsmount *mnt;
if (!type)
ret
long do_mount(char *dev_name, char *dir_name, char *type_page,
unsigned long flags, void *data_page)
{
struct path path;
int retval = 0;
int mnt_flags = 0;
//检查参数,省略
......
/*调用函数kern_path函数获取挂载点的信息,后面会专门写总结介绍的,在这里只需
之道调用这个函数之后,挂载点的vfsmount,dentry和inode信息都会得到.*/
retval = kern_path(dir_name, LOOKUP_FOLLOW, &path);
if (retval)
return retval;
retval = security_sb_mount(dev_name, &path,
type_page, flags, data_page);
if (retval)
goto dput_out;
/*下面这段是根据flags参数进行判断要执行那个函数,一般的挂载会执行do_new_mount函数,
这也是最常走的分支.*/
if (flags & MS_REMOUNT)
retval = do_remount(&path, flags & ~MS_REMOUNT, mnt_flags,
data_page);
else if (flags & MS_BIND)
retval = do_loopback(&path, dev_name, flags & MS_REC);
else if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE))
retval = do_change_type(&path, flags);
else if (flags & MS_MOVE)
retval = do_move_mount(&path, dev_name);
else
retval = do_new_mount(&path, type_page, flags, mnt_flags,
dev_name, data_page);//通常会执行该函数,下面会详细介绍
dput_out:
path_put(&path);
return retval;
}
static int do_new_mount(struct path *path, char *type, int flags,
int mnt_flags, char *name, void *data)
{
struct vfsmount *mnt;
if (!type)
ret