Linux虚拟文件系统之文件系统安装(sys

[cpp]

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;          /* Discard magic */       if ((flags & MS_MGC_MSK) == MS_MGC_VAL)           flags &= ~MS_MGC_MSK;          /* Basic sanity checks */          if (!dir_name || !*dir_name || !memchr(dir_name, 0, PAGE_SIZE))           return -EINVAL;          if (data_page)           ((char *)data_page)[PAGE_SIZE - 1] = 0;          /* Default to relatime unless overriden */       if (!(flags & MS_NOATIME))           mnt_flags |= MNT_RELATIME;          /* Separate the per-mountpoint flags */       if (flags & MS_NOSUID)           mnt_flags |= MNT_NOSUID;       if (flags & MS_NODEV)           mnt_flags |= MNT_NODEV;       if (flags & MS_NOEXEC)           mnt_flags |= MNT_NOEXEC;       if (flags & MS_NOATIME)           mnt_flags |= MNT_NOATIME;       if (flags & MS_NODIRATIME)           mnt_flags |= MNT_NODIRATIME;       if (flags & MS_STRICTATIME)           mnt_flags &= ~(MNT_RELATIME | MNT_NOATIME);       if (flags & MS_RDONLY)           mnt_flags |= MNT_READONLY;          flags &= ~(MS_NOSUID | MS_NOEXEC | MS_NODEV | MS_ACTIVE |              MS_NOATIME | MS_NODIRATIME | MS_RELATIME| MS_KERNMOUNT |              MS_STRICTATIME);          /* ... and get the mountpoint */       /*获得安装点path结构*/       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;          if (flags & MS_REMOUNT)           /*修改已经存在的文件系统参数,即改变超级块对象s_flags      字段的安装标志*/           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))           /*is responsible for handling shared, slave, and unbindable mounts by changing          the mount flags or building up the required data structure connections           between the vfsmount          instances involved.*/           retval = do_change_type(&path, flags);       else if (flags & MS_MOVE)           /*改变已安装文件的安装点*/               /*used to move a mounted filesystem*/           retval = do_move_mount(&path, dev_name);       else           /*handles normal mount operations. This is the default situation, so no special           flags          are required*/           /*当用户要求安装一个特殊文件系统或存放在磁盘分区          中的普通文件系统时,调用*/           retval = do_new_mount(&path, type_page, flags, mnt_flags,                         dev_name, data_page);   dput_out:       path_put(&path);       return retval;   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22568.html