Commit 079c8897 authored by DChen's avatar DChen

给fs/super.c文件增加注释(4).

parent deb60685
......@@ -291,12 +291,19 @@ int sys_umount(char * dev_name)
return 0;
}
//// 安装文件系统(系统调用)
// 参数dev_name是设备文件名,dir_name是安装到的目录名,rw_flag被安装文件系统的可
// 读写标志。将被加载的地方必须是一个目录名,并并且对应的i节点没有被其他程序占用。
// 若操作成功则返回0,否则返回出错号。
int sys_mount(char * dev_name, char * dir_name, int rw_flag)
{
struct m_inode * dev_i, * dir_i;
struct super_block * sb;
int dev;
// 首先根据设备文件名找到对应的i节点,以取得其中的设备号。对于块特殊设备文件,
// 设备号在其i节点的i_zone[0]中。另外,由于文件凶必须在块设备中,因此如果不是
// 块设备文件,则放回刚取得的i节点dev_i,返回出错码。
if (!(dev_i=namei(dev_name)))
return -ENOENT;
dev = dev_i->i_zone[0];
......@@ -304,6 +311,12 @@ int sys_mount(char * dev_name, char * dir_name, int rw_flag)
iput(dev_i);
return -EPERM;
}
// OK,现在上面为了得到设备号而取得i节点dev_i已完成了它的使命,因此这里放回该
// 设备文件的i节点。接着我们来检查一下文件系统安装到的目录名是否有效。于是根据
// 给定的目录文件名找到对应的i节点dir_i。如果该i节点的引用计数不为1(仅在这里引用),
// 或者该i节点的节点号是根文件系统的节点号1,则放回该i节点的返回出错码。另外,如果
// 该节点不是一个目录文件节点,则也放回该i节点,返回出错码。因为文件系统只能安装
// 在一个目录名上。
iput(dev_i);
if (!(dir_i=namei(dir_name)))
return -ENOENT;
......@@ -315,10 +328,16 @@ int sys_mount(char * dev_name, char * dir_name, int rw_flag)
iput(dir_i);
return -EPERM;
}
// 现在安装点也检查完毕,我们开始读取要安装文件系统的超级块信息。如果读取超级块操
// 作失败,则返回该安装点i节点的dir_i并返回出错码。一个文件系统的超级块首先从超级
// 块表中进行搜索,如果不在超级块表中就从设备上读取。
if (!(sb=read_super(dev))) {
iput(dir_i);
return -EBUSY;
}
// 在得到了文件系统超级块之后,我们对它先进行检测一番。如果将要被安装的文件系统已经
// 安装在其他地方,则放回该i节点,返回出错码。如果将要安装到的i节点已经安装了文件系
// 统(安装标志已经置位),则放回该i节点,也返回出错码。
if (sb->s_imount) {
iput(dir_i);
return -EBUSY;
......@@ -327,6 +346,8 @@ int sys_mount(char * dev_name, char * dir_name, int rw_flag)
iput(dir_i);
return -EPERM;
}
// 最后设置被安装文件系统超级块的“被安装到i节点”字段指向安装到的目录名的i节点。并设置
// 安装位置i节点的安装标志和节点已修改标志。然后返回(安装成功)。
sb->s_imount=dir_i;
dir_i->i_mount=1;
dir_i->i_dirt=1; /* NOTE! we don't iput(dir_i) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment