Linux之Mount内核代码分析

来源:互联网 发布:iphone同步软件 编辑:程序博客网 时间:2024/05/16 15:58
本质上,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。 


转载自http://www.linuxeye.com/linuxrumen/1121.html

0 0
原创粉丝点击