Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-0.11
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
xpstem
linux-0.11
Commits
079c8897
Commit
079c8897
authored
Jul 16, 2014
by
DChen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
给fs/super.c文件增加注释(4).
parent
deb60685
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
21 additions
and
0 deletions
+21
-0
fs/super.c
fs/super.c
+21
-0
No files found.
fs/super.c
View file @
079c8897
...
...
@@ -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) */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment