Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
5f3d853d
提交
5f3d853d
5月 24, 2011
创建
作者:
Robert Morris
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
oops
上级
7e8cd598
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
111 行增加
和
0 行删除
+111
-0
namecache.c
namecache.c
+111
-0
没有找到文件。
namecache.c
0 → 100644
浏览文件 @
5f3d853d
//
// file-system name cache
//
// to do:
// use ns.c namespaces
// invalidation (for rename, unlink)
// does directory inum need to be locked?
// need a lock to make table lookup and iget atomic?
// insert when file created, not just looked up
//
#include "types.h"
#include "defs.h"
#include "param.h"
#include "stat.h"
#include "mmu.h"
#include "spinlock.h"
#include "condvar.h"
#include "queue.h"
#include "proc.h"
#include "buf.h"
#include "fs.h"
#include "file.h"
struct
spinlock
nc_lock
;
// map the tuple <dev,dinum,name> to cinum;
struct
nce
{
int
valid
;
uint
dev
;
uint
dinum
;
// directory inumber
char
name
[
DIRSIZ
];
uint
cinum
;
// child inumber
};
#define NCE 32
struct
nce
nce
[
NCE
];
void
nc_init
()
{
initlock
(
&
nc_lock
,
"namecache"
);
}
// nc_lock must be held
struct
nce
*
nc_lookup1
(
struct
inode
*
dir
,
char
*
name
)
{
for
(
int
i
=
0
;
i
<
NCE
;
i
++
){
struct
nce
*
e
=
&
nce
[
i
];
if
(
e
->
valid
&&
e
->
dev
==
dir
->
dev
&&
e
->
dinum
==
dir
->
inum
&&
namecmp
(
name
,
e
->
name
)
==
0
){
return
e
;
}
}
return
0
;
}
struct
inode
*
nc_lookup
(
struct
inode
*
dir
,
char
*
name
)
{
uint
inum
=
0
;
acquire
(
&
nc_lock
);
struct
nce
*
e
=
nc_lookup1
(
dir
,
name
);
if
(
e
)
inum
=
e
->
cinum
;
release
(
&
nc_lock
);
if
(
inum
)
return
iget
(
dir
->
dev
,
inum
);
else
return
0
;
}
void
nc_insert
(
struct
inode
*
dir
,
char
*
name
,
struct
inode
*
ip
)
{
acquire
(
&
nc_lock
);
struct
nce
*
e
=
nc_lookup1
(
dir
,
name
);
if
(
e
){
if
(
e
->
cinum
!=
ip
->
inum
)
panic
(
"nc_insert change"
);
release
(
&
nc_lock
);
return
;
}
for
(
int
i
=
0
;
i
<
NCE
;
i
++
){
e
=
&
nce
[
i
];
if
(
e
->
valid
==
0
){
e
->
valid
=
1
;
e
->
dev
=
dir
->
dev
;
e
->
dinum
=
dir
->
inum
;
strncpy
(
e
->
name
,
name
,
DIRSIZ
);
e
->
cinum
=
ip
->
inum
;
break
;
}
}
release
(
&
nc_lock
);
}
void
nc_invalidate
(
struct
inode
*
dir
,
char
*
name
)
{
acquire
(
&
nc_lock
);
struct
nce
*
e
=
nc_lookup1
(
dir
,
name
);
if
(
e
)
e
->
valid
=
0
;
release
(
&
nc_lock
);
}
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论