mount实现的过程

本质上,Ext3 mount的过程实际上是 inode 被替代的过程。例如,/dev/sdb块设备被mount到/mnt/alan目录。那么mount这个过程所需要解决的问题就是将/mnt/alan的dentry目录项所指向的inode屏蔽掉,然后重新定位到/dev/sdb所表示的inode索引节点。在没有分析阅读linux vfs mount代码的时候,我的想法是修改dentry所指向的inode索引节点,以此实现mount文件系统的访问。经过分析,在实际的vfs mount实现过程中,还是和我原始的想法略有差别,但是,基本目标还是相同的。
 
Linux  VFS的mount过程基本原理如下图所示:

当用户输入”mount /dev/sdb /mnt/alan”命令后,Linux会解析/mnt/alan字符串,并且从Dentry Hash表中获取相关的dentry目录项,然后将该目录项标识成DCACHE_MOUNTED。一旦该dentry被标识成DCACHE_MOUNTED,也就意味着在访问路径上对其进行了屏蔽。
 
在mount /dev/sdb设备上的ext3文件系统时,内核会创建一个该文件系统的superblock对象,并且从/dev/sdb设备上读取所有的superblock信息,初始化该内存对象。Linux内核维护了一个全局superblock对象链表。s_root是superblock对象所维护的dentry目录项,该目录项是该文件系统的根目录。即新mount的文件系统内容都需要通过该根目录进行访问。在mount的过程中,VFS会创建一个非常重要的vfsmount对象,该对象维护了文件系统mount的所有信息。Vfsmount对象通过HASH表进行维护,通过path地址计算HASH值,在这里vfsmount的HASH值通过“/mnt/alan”路径字符串进行计算得到。Vfsmount中的mnt_root指向superblock对象的s_root根目录项。因此,通过/mnt/alan地址可以检索VFSMOUNT Hash Table得到被mount的vfsmount对象,进而得到mnt_root根目录项。
 
例如,/dev/sdb被mount之后,用户想要访问该设备上的一个文件ab.c,假设该文件的地址为:/mnt/alan/ab.c。在打开该文件的时候,首先需要进行path解析。在解析到/mnt/alan的时候,得到/mnt/alan的dentry目录项,并且发现该目录项已经被标识为DCACHE_MOUNTED。之后,会采用/mnt/alan计算HASH值去检索VFSMOUNT Hash Table,得到对应的vfsmount对象,然后采用vfsmount指向的mnt_root目录项替代/mnt/alan原来的dentry,从而实现了dentry和inode的重定向。在新的dentry的基础上,解析程序继续执行,最终得到表示ab.c文件的inode对象。
 
关键数据结构说明
Linux VFS mount所涉及的关键数据结构分析如下。

Vfsmount数据结构
Vfsmount数据结构是vfs mount最为重要的数据结构,其维护了一个mount点的所有信息。该数据结构描述如下:
<span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> vfsmount </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head mnt_hash</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 连接到VFSMOUNT Hash Table */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> vfsmount </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt_parent</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 指向mount树中的父节点 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dentry </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt_mountpoint</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 指向mount点的目录项 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dentry </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt_root</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 被mount的文件系统根目录项 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> super_block </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt_sb</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 指向被mount的文件系统superblock */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">#ifdef</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> CONFIG_SMP  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_pcp __percpu </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt_pcp</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">atomic_t</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_longterm</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">      </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* how many of the refs are longterm */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">#else</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_count</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_writers</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">#endif</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head mnt_mounts</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 下级(child)vfsmount对象链表 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head mnt_child</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 链入上级vfsmount对象的链表点 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 4 bytes hole on 64bits arches without fsnotify */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">#ifdef</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> CONFIG_FSNOTIFY  
    __u32 mnt_fsnotify_mask</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> hlist_head mnt_fsnotify_marks</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">#endif</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">const</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt_devname</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 文件系统所在的设备名字,例如/dev/sdb */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head mnt_list</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head mnt_expire</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* link in fs-specific expiry list */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head mnt_share</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* circular list of shared mounts */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head mnt_slave_list</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* list of slave mounts */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head mnt_slave</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* slave list entry */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> vfsmount </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt_master</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* slave is on master->mnt_slave_list */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_namespace </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt_ns</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">   </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* containing namespace */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_id</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">         </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* mount identifier */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_group_id</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">       </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* peer group identifier */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_expiry_mark</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">        </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* true if marked for expiry */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_pinned</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_ghosts</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">};</span>

在Linux内核中不仅存在VFSMOUNT的Hash Table,而且还维护了一棵Mount对象树,通过该mount树,我们可以了解到各个文件系统之间的关系。该mount树描述如下:



上图所示为三层mount文件系统树。第一层为系统根目录“/”;第二层有两个mount点,一个为/mnt/a,另一个是/mnt/b;第三层在/mnt/a的基础上又创建了两个mount点,分别为/mnt/a/c和/mnt/a/d。通过mount树,可以对整个系统的mount结构一目了然。
 
Superblock数据结构
每个文件系统都会拥有一个superblock对象对其基本信息进行描述。对于像ext3之类的文件系统而言,在磁盘上会持久化存储一份superblock元数据信息,内存的superblock对象由磁盘上的信息初始化。对于像block device 之类的“伪文件系统”而言,在mount的时候也会创建superblock对象,只不过很多信息都是临时生成的,没有持久化信息。Vfs superblock数据结构定义如下:
<span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> super_block </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head    s_list</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">     </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 链入全局链表的对象*/</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">dev_t</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">           s_dev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">      </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* search index; _not_ kdev_t */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">unsigned</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">       s_dirt</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">unsigned</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">       s_blocksize_bits</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">unsigned</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">long</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">       s_blocksize</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">loff_t</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">          s_maxbytes</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* Max </span><a target=_blank href="http://www.linuxeye.com/command/file.html" target="_blank" style="color: rgb(37, 110, 177); text-decoration: none; padding: 0px; margin: 0px; border: none;"><span style="padding: 0px; margin: 0px;"><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">file</span></span></a><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);"> size */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> file_system_type </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">const</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> super_operations   </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_op</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">      </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* superblock操作函数集 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">const</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dquot_operations   </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">dq_op</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">const</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> quotactl_ops   </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_qcop</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">const</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> export_operations </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_export_op</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">unsigned</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">long</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">       s_flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">unsigned</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">long</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">       s_magic</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dentry       </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_root</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 文件系统根目录项 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> rw_semaphore s_</span><a target=_blank href="http://www.linuxeye.com/command/69.html" target="_blank" style="color: rgb(37, 110, 177); text-decoration: none; padding: 0px; margin: 0px; border: none;"><span style="padding: 0px; margin: 0px;"><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">umount</span></span></a><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mutex        s_lock</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">         s_count</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">atomic_t</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">        s_active</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">#ifdef</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> CONFIG_SECURITY  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">void</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">                    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_security</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">#endif</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">const</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> xattr_handler </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">**</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_xattr</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head    s_inodes</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">   </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* all inodes */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> hlist_bl_head    s_anon</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">     </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* anonymous dentries for (nfs) exporting */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">#ifdef</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> CONFIG_SMP  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head __percpu </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_files</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">#else</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head    s_files</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">#endif</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* s_dentry_lru, s_nr_dentry_unused protected by dcache.c lru locks */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head    s_dentry_lru</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">   </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* unused dentry lru */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">         s_nr_dentry_unused</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* # of dentry on lru */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* s_inode_lru_lock protects s_inode_lru and s_nr_inodes_unused */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">spinlock_t</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">      s_inode_lru_lock ____cacheline_aligned_in_smp</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head    s_inode_lru</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">        </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* unused inode lru */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">         s_nr_inodes_unused</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* # of inodes on lru */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> block_device </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> backing_dev_info </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_bdi</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mtd_info     </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_mtd</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> list_head    s_instances</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> quota_info   s_dquot</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* Diskquota specific options */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">         s_frozen</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">wait_queue_head_t</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">   s_wait_unfrozen</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> s_id</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">[</span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">32</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">];</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">              </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* Informational name */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    u8 s_uuid</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">[</span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">16</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">];</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">              </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* UUID */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">void</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">            </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_fs_info</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* Filesystem private info */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">fmode_t</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">         s_mode</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* Granularity of c/m/atime in ns.  
       Cannot be worse than a second */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    u32        s_time_gran</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/*  
     * The next field is for VFS *only*. No filesystems have any business  
     * even looking at it. You had been warned.  
     */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mutex s_vfs_rename_mutex</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* Kludge */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/*  
     * Filesystem subtype.  If non-empty the filesystem type field  
     * in /proc/mounts will be "type.subtype"  
     */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_subtype</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/*  
     * Saved mount options for lazy filesystems using  
     * generic_show_options()  
     */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> __rcu </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_options</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">const</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dentry_operations </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_d_op</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* default d_op for dentries */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/*  
     * Saved pool identifier for cleancache (-1 means none)  
     */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> cleancache_poolid</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> shrinker s_shrink</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">   </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* per-sb shrinker handle */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">};</span>

代码流程分析
Linux中实现mount操作需要一定的代码量,下面对Linux VFS Mount代码进行分析说明,整个分析过程按照mount操作函数调用流程进行。代码分析基于Linux-3.2版本。
 
当用户在用户层执行mount命令时,会执行系统调用从用户态陷入linux内核,执行如下函数(namespace.c):
<span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">SYSCALL_DEFINE5</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> __user </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dev_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> __user </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dir_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> __user </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">unsigned</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">long</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">void</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> __user </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> data</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> ret</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_dir</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_dev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">unsigned</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">long</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> data_page</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 获取mount类型 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    ret </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> copy_mount_string</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">ret </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);"><</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">goto</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> out_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 获取mount点目录字符串 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    kernel_dir </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> getname</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">dir_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">IS_ERR</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_dir</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">))</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        ret </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> PTR_ERR</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_dir</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">goto</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> out_dir</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 获取设备名称字符串 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    ret </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> copy_mount_string</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">dev_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_dev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">ret </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);"><</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">goto</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> out_dev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 获取其它选项 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    ret </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> copy_mount_options</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">data</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">data_page</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">ret </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);"><</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">goto</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> out_data</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 主要函数,执行挂载文件系统的具体操作 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    ret </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> do_mount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_dev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> kernel_dir</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> kernel_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">void</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> data_page</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    free_page</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">data_page</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
out_data</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    kfree</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_dev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
out_dev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    putname</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_dir</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
out_dir</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    kfree</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kernel_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
out_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> ret</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span>

do_mount()函数是mount操作过程中的核心函数,在该函数中,通过mount的目录字符串找到对应的dentry目录项,然后通过do_new_mount()函数完成具体的mount操作。do_mount()函数分析如下:
<span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">long</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> do_mount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">dev_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">dir_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">type_page</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
          </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">unsigned</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">long</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">void</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">data_page</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> path path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> retval </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">。。。</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 通过mount目录字符串获取path,path结构中包含有mount目录的dentry目录对象 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    retval </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> kern_path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">dir_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> LOOKUP_FOLLOW</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">retval</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> retval</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">。。。</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* Separate the per-mountpoint flags */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_NOSUID</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        mnt_flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MNT_NOSUID</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_NODEV</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        mnt_flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MNT_NODEV</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_NOEXEC</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        mnt_flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MNT_NOEXEC</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_NOATIME</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        mnt_flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MNT_NOATIME</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_NODIRATIME</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        mnt_flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MNT_NODIRATIME</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_STRICTATIME</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        mnt_flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">~(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">MNT_RELATIME </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MNT_NOATIME</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_RDONLY</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        mnt_flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MNT_READONLY</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">~(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">MS_NOSUID </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_NOEXEC </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_NODEV </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_ACTIVE </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_BORN </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
           MS_NOATIME </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_NODIRATIME </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_RELATIME</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_KERNMOUNT </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
           MS_STRICTATIME</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* remount操作 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_REMOUNT</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        retval </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> do_remount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">~</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">MS_REMOUNT</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
                    data_page</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">else</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_BIND</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        retval </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> do_loopback</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dev_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_REC</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">else</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">MS_SHARED </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_PRIVATE </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_SLAVE </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_UNBINDABLE</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">))</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        retval </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> do_change_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">else</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_MOVE</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        retval </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> do_move_mount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dev_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">else</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 正常的mount操作,完成具体的mount操作 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        retval </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> do_new_mount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> type_page</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
                      dev_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> data_page</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
dput_out</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    path_put</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> retval</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span>

do_new_mount()函数主要分成两大部分:第一部分建立vfsmount对象和superblock对象,必要时从设备上获取文件系统元数据;第二部分将vfsmount对象加入到mount树和Hash Table中,并且将原来的dentry对象无效掉。do_new_mount函数说明如下:
<span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">static</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> do_new_mount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> path </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
            </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">void</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">data</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> vfsmount </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> err</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">。。。</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 在内核建立vfsmount对象和superblock对象 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    mnt </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> do_kern_mount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> data</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">IS_ERR</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">))</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> PTR_ERR</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 将vfsmount对象加入系统,屏蔽原有dentry对象 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    err </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> do_add_mount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mnt_flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">err</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        mntput</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mnt</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> err</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span>

do_new_mount()中的第一步调用do_kern_mount()函数,该函数的主干调用路径如下:
do_kern_mount--> vfs_kern_mount--> mount_fs
在mount_fs()函数中会调用特定文件系统的mount方法,如果mount是ext3文件系统,那么在mount_fs函数中最终会调用ext3的mount方法。Ext3的mount方法定义在super.c文件中:
<span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">static</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> file_system_type ext3_fs_type </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">owner      </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> THIS_MODULE</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">name       </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="str" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"ext3"</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mount      </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> ext3_mount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">       </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* ext3文件系统mount方法 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">kill_sb    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> kill_block_super</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">fs_flags   </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> FS_REQUIRES_DEV</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">};</span>

ext3 mount函数主干调用路径为:ext3_mount--> mount_bdev。Mount_bdev()函数主要完成superblock对象的内存初始化,并且加入到全局superblock链表中。该函数说明如下:
<span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dentry </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">mount_bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> file_system_type </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">fs_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">const</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">dev_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">void</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">data</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">fill_super</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)(</span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> super_block </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">void</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">))</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> block_device </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">struct</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> super_block </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">fmode_t</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mode </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> FMODE_READ </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> FMODE_EXCL</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> error </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(!(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_RDONLY</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">))</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        mode </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> FMODE_WRITE</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 通过设备名字获取被mount设备的bdev对象 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    bdev </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> blkdev_get_by_path</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">dev_name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mode</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> fs_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">IS_ERR</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">))</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> ERR_CAST</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/*  
     * once the super is inserted into the list by sget, s_umount  
     * will protect the lockfs code from trying to start a snapshot  
     * while we are mounting  
     */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    mutex_lock</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bd_fsfreeze_mutex</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bd_fsfreeze_count </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        mutex_unlock</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bd_fsfreeze_mutex</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        error </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">EBUSY</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">goto</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> error_bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 查找或者创建superblock对象 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    s </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> sget</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">fs_type</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> test_bdev_super</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> set_bdev_super</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    mutex_unlock</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bd_fsfreeze_mutex</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">IS_ERR</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">))</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">goto</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> error_s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_root</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 被mount文件系统的根目录项已经存在 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">((</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">^</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_flags</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_RDONLY</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
            deactivate_locked_super</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
            error </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">EBUSY</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
            </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">goto</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> error_bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
        </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/*  
         * s_umount nests inside bd_mutex during  
         * __invalidate_device().  blkdev_put() acquires  
         * bd_mutex and can't be called under s_umount.  Drop  
         * s_umount temporarily.  This is safe as we're  
         * holding an active reference.  
         */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        up_write</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_umount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        blkdev_put</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mode</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        down_write</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_umount</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">else</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 文件系统根目录项不存在,通过filler_super函数读取磁盘上的superblock元数据信息,并且初始化superblock内存结构 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">char</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> b</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">[</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">BDEVNAME_SIZE</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">];</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
        s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_NOSEC</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_mode </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mode</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        strlcpy</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_id</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> bdevname</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> b</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">),</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">sizeof</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_id</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">));</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        sb_set_blocksize</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> block_size</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">));</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 对于ext3文件系统,调用ext3_fill_super函数 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        error </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> fill_super</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> data</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_SILENT </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">?</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">1</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">error</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
            deactivate_locked_super</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
            </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">goto</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> error</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
        s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_flags </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">|=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> MS_ACTIVE</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
        bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bd_super </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">/* 正常返回被mount文件系统根目录项 */</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> dget</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s_root</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
 
error_s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    error </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> PTR_ERR</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">s</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
error_bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    blkdev_put</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">bdev</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> mode</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
error</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
    </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> ERR_PTR</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">error</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">  
</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span>

do_new_mount()函数的第二步是将创建的vfsmount对象加入到mount树和VFSMOUNT Hash Table中,并且将老的dentry目录项无效掉。该过程主干函数调用过程如下所示:
do_new_mount--> do_add_mount--> graft_tree--> attach_recursive_mnt

attach_recursive_mnt()函数完成第二步过程的主要操作。至此,文件系统的mount操作已经完成。Mount完成之后,如果用户想要访问新mount文件系统中的文件,那么需要在path解析过程中重定位dentry,该过程主要在follow_managed()函数中完成。在该函数中会判断一个dentry是否已经被标识成DCACHE_MOUNTED,如果该标志位已经被设置,那么通过VFSMOUNT Hash Table可以重定位dentry。 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值