Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
eba1fae2
提交
eba1fae2
4月 25, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Reference each inode with a non-zero nlink
上级
9f840849
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
48 行增加
和
18 行删除
+48
-18
file.hh
include/file.hh
+6
-2
fs.cc
kernel/fs.cc
+33
-7
sampler.cc
kernel/sampler.cc
+1
-1
sysfile.cc
kernel/sysfile.cc
+8
-8
没有找到文件。
include/file.hh
浏览文件 @
eba1fae2
...
...
@@ -39,13 +39,16 @@ protected:
};
// in-core file system types
struct
inode
:
public
rcu_freed
{
static
inode
*
alloc
(
u32
dev
,
u32
inum
);
virtual
void
do_gc
()
{
delete
this
;
}
void
init
();
void
link
();
void
unlink
();
short
nlink
();
inode
&
operator
=
(
const
inode
&
)
=
delete
;
inode
(
const
inode
&
x
)
=
delete
;
...
...
@@ -63,7 +66,6 @@ struct inode : public rcu_freed
short
type
;
// copy of disk inode
short
major
;
short
minor
;
short
nlink
;
u32
size
;
u32
addrs
[
NDIRECT
+
1
];
...
...
@@ -71,6 +73,8 @@ private:
inode
();
~
inode
();
NEW_DELETE_OPS
(
inode
)
short
nlink_
;
};
#define I_BUSYR 0x1
...
...
kernel/fs.cc
浏览文件 @
eba1fae2
...
...
@@ -193,7 +193,7 @@ ialloc(u32 dev, short type)
if
(
ip
->
type
==
0
){
ip
->
type
=
type
;
ip
->
gen
+=
1
;
if
(
ip
->
nlink
||
ip
->
size
||
ip
->
addrs
[
0
])
if
(
ip
->
nlink
()
||
ip
->
size
||
ip
->
addrs
[
0
])
panic
(
"ialloc not zeroed"
);
iupdate
(
ip
);
return
ip
;
...
...
@@ -218,7 +218,7 @@ iupdate(struct inode *ip)
dip
->
type
=
ip
->
type
;
dip
->
major
=
ip
->
major
;
dip
->
minor
=
ip
->
minor
;
dip
->
nlink
=
ip
->
nlink
;
dip
->
nlink
=
ip
->
nlink
()
;
dip
->
size
=
ip
->
size
;
dip
->
gen
=
ip
->
gen
;
memmove
(
dip
->
addrs
,
ip
->
addrs
,
sizeof
(
ip
->
addrs
));
...
...
@@ -317,7 +317,7 @@ inode::init(void)
type
=
dip
->
type
;
major
=
dip
->
major
;
minor
=
dip
->
minor
;
nlink
=
dip
->
nlink
;
nlink
_
=
dip
->
nlink
;
size
=
dip
->
size
;
gen
=
dip
->
gen
;
memmove
(
addrs
,
dip
->
addrs
,
sizeof
(
addrs
));
...
...
@@ -325,6 +325,32 @@ inode::init(void)
flags
|=
I_VALID
;
}
void
inode
::
link
(
void
)
{
// Must hold ilock if inode is accessible by multiple threads
if
(
++
nlink_
==
1
)
{
// A non-zero nlink_ holds a reference to the inode
idup
(
this
);
}
}
void
inode
::
unlink
(
void
)
{
// Must hold ilock if inode is accessible by multiple threads
if
(
--
nlink_
==
0
)
{
if
(
--
ref
==
0
)
panic
(
"inode::unlink last ref"
);
}
}
short
inode
::
nlink
(
void
)
{
// Must hold ilock if inode is accessible by multiple threads
return
nlink_
;
}
// Increment reference count for ip.
// Returns ip to enable ip = idup(ip1) idiom.
...
...
@@ -375,10 +401,10 @@ void
iput
(
struct
inode
*
ip
)
{
if
(
--
ip
->
ref
==
0
)
{
if
(
ip
->
nlink
)
return
;
acquire
(
&
ip
->
lock
);
if
(
ip
->
ref
==
0
&&
ip
->
nlink
==
0
)
{
if
(
ip
->
nlink
())
panic
(
"iput: nlink %u
\n
"
,
ip
->
nlink
());
if
(
ip
->
ref
==
0
)
{
// inode is no longer used: truncate and free inode.
if
(
ip
->
flags
&
(
I_BUSYR
|
I_BUSYW
))
{
// race with iget
...
...
@@ -547,7 +573,7 @@ stati(struct inode *ip, struct stat *st)
st
->
dev
=
ip
->
dev
;
st
->
ino
=
ip
->
inum
;
st
->
type
=
ip
->
type
;
st
->
nlink
=
ip
->
nlink
;
st
->
nlink
=
ip
->
nlink
()
;
st
->
size
=
ip
->
size
;
}
...
...
kernel/sampler.cc
浏览文件 @
eba1fae2
...
...
@@ -225,7 +225,7 @@ sampstat(struct inode *ip, struct stat *st)
st
->
dev
=
ip
->
dev
;
st
->
ino
=
ip
->
inum
;
st
->
type
=
ip
->
type
;
st
->
nlink
=
ip
->
nlink
;
st
->
nlink
=
ip
->
nlink
()
;
st
->
size
=
sz
;
}
...
...
kernel/sysfile.cc
浏览文件 @
eba1fae2
...
...
@@ -124,7 +124,7 @@ sys_link(const char *old, const char *newn)
iunlockput
(
ip
);
return
-
1
;
}
ip
->
nlink
++
;
ip
->
link
()
;
iupdate
(
ip
);
iunlock
(
ip
);
...
...
@@ -139,7 +139,7 @@ sys_link(const char *old, const char *newn)
bad:
ilock
(
ip
,
1
);
ip
->
nlink
--
;
ip
->
unlink
()
;
iupdate
(
ip
);
iunlockput
(
ip
);
return
-
1
;
...
...
@@ -189,7 +189,7 @@ sys_unlink(const char *path)
}
ilock
(
ip
,
1
);
if
(
ip
->
nlink
<
1
)
if
(
ip
->
nlink
()
<
1
)
panic
(
"unlink: nlink < 1"
);
if
(
ip
->
type
==
T_DIR
&&
!
isdirempty
(
ip
)){
iunlockput
(
ip
);
...
...
@@ -205,7 +205,7 @@ sys_unlink(const char *path)
if
(
ip
->
type
==
T_DIR
){
ilock
(
dp
,
1
);
dp
->
nlink
--
;
dp
->
unlink
()
;
iupdate
(
dp
);
iunlock
(
dp
);
}
...
...
@@ -213,7 +213,7 @@ sys_unlink(const char *path)
//nc_invalidate(dp, name);
iput
(
dp
);
ip
->
nlink
--
;
ip
->
unlink
()
;
iupdate
(
ip
);
iunlockput
(
ip
);
return
0
;
...
...
@@ -248,13 +248,13 @@ create(inode *cwd, const char *path, short type, short major, short minor)
ip
->
major
=
major
;
ip
->
minor
=
minor
;
ip
->
nlink
=
1
;
ip
->
link
()
;
iupdate
(
ip
);
mtwriteavar
(
"inode:%x.%x"
,
ip
->
dev
,
ip
->
inum
);
if
(
type
==
T_DIR
){
// Create . and .. entries.
dp
->
nlink
++
;
// for ".."
dp
->
link
();
// for ".."
iupdate
(
dp
);
// No ip->nlink++ for ".": avoid cyclic ref count.
if
(
dirlink
(
ip
,
"."
,
ip
->
inum
)
<
0
||
dirlink
(
ip
,
".."
,
dp
->
inum
)
<
0
)
...
...
@@ -263,7 +263,7 @@ create(inode *cwd, const char *path, short type, short major, short minor)
if
(
dirlink
(
dp
,
name
,
ip
->
inum
)
<
0
)
{
// create race
ip
->
nlink
--
;
ip
->
unlink
()
;
iunlockput
(
ip
);
iput
(
dp
);
goto
retry
;
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论