Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
c372e8dc
提交
c372e8dc
8月 13, 2006
创建
作者:
kaashoek
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
zero freed blocks
multi-block directories track size of directory (size = number entries in use) should namei (and other code that scans through directories) scan through all blocks of a directory and not use size?
上级
9e5970d5
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
34 行增加
和
8 行删除
+34
-8
fs.c
fs.c
+19
-8
userfs.c
userfs.c
+15
-0
没有找到文件。
fs.c
浏览文件 @
c372e8dc
...
...
@@ -76,6 +76,11 @@ bfree(int dev, uint b)
ninodes
=
sb
->
ninodes
;
brelse
(
bp
);
bp
=
bread
(
dev
,
b
);
memset
(
bp
->
data
,
0
,
BSIZE
);
bwrite
(
bp
,
b
);
brelse
(
bp
);
bp
=
bread
(
dev
,
BBLOCK
(
b
,
ninodes
));
bi
=
b
%
BPB
;
m
=
~
(
0x1
<<
(
bi
%
8
));
...
...
@@ -446,6 +451,7 @@ wdir(struct inode *dp, char *name, uint ino)
struct
buf
*
bp
=
0
;
struct
dirent
*
ep
=
0
;
int
i
;
int
lb
;
for
(
off
=
0
;
off
<
dp
->
size
;
off
+=
BSIZE
)
{
bp
=
bread
(
dp
->
dev
,
bmap
(
dp
,
off
/
BSIZE
));
...
...
@@ -457,17 +463,23 @@ wdir(struct inode *dp, char *name, uint ino)
}
brelse
(
bp
);
}
panic
(
"mknod: XXXX no dir entry free
\n
"
);
lb
=
dp
->
size
/
BSIZE
;
if
(
lb
>=
NDIRECT
)
{
panic
(
"wdir: too many entries"
);
}
dp
->
addrs
[
lb
]
=
balloc
(
dp
->
dev
);
bp
=
bread
(
dp
->
dev
,
dp
->
addrs
[
lb
]);
ep
=
(
struct
dirent
*
)
(
bp
->
data
);
found:
ep
->
inum
=
ino
;
for
(
i
=
0
;
i
<
DIRSIZ
&&
name
[
i
];
i
++
)
ep
->
name
[
i
]
=
name
[
i
];
for
(
;
i
<
DIRSIZ
;
i
++
)
ep
->
name
[
i
]
=
'\0'
;
dp
->
size
+=
sizeof
(
struct
dirent
);
bwrite
(
bp
,
bmap
(
dp
,
off
/
BSIZE
));
// write directory block
brelse
(
bp
);
iupdate
(
dp
);
}
struct
inode
*
...
...
@@ -482,7 +494,6 @@ mknod(char *cp, short type, short major, short minor)
iput
(
ip
);
return
0
;
}
cprintf
(
"mknod: pinum = %d
\n
"
,
pinum
);
dp
=
iget
(
rootdev
,
pinum
);
ip
=
ialloc
(
dp
->
dev
,
type
);
if
(
ip
==
0
)
{
...
...
@@ -495,11 +506,9 @@ mknod(char *cp, short type, short major, short minor)
ip
->
nlink
=
1
;
iupdate
(
ip
);
// write new inode to disk
wdir
(
dp
,
cp
,
ip
->
inum
);
iput
(
dp
);
return
ip
;
}
...
...
@@ -537,12 +546,14 @@ unlink(char *cp)
}
brelse
(
bp
);
}
panic
(
"
mknod: XXXX no dir entry free
\n
"
);
panic
(
"
unlink: entry doesn't exist
\n
"
);
found:
ep
->
inum
=
0
;
memset
(
ep
->
name
,
'\0'
,
DIRSIZ
);
bwrite
(
bp
,
bmap
(
dp
,
off
/
BSIZE
));
// write directory block
brelse
(
bp
);
dp
->
size
-=
sizeof
(
struct
dirent
);
iupdate
(
dp
);
iput
(
dp
);
iput
(
ip
);
...
...
userfs.c
浏览文件 @
c372e8dc
...
...
@@ -7,6 +7,7 @@
// file system tests
char
buf
[
2000
];
char
name
[
3
];
char
*
echo_args
[]
=
{
"echo"
,
"hello"
,
"goodbye"
,
0
};
char
*
cat_args
[]
=
{
"cat"
,
"README"
,
0
};
...
...
@@ -65,6 +66,20 @@ main(void)
}
close
(
fd
);
unlink
(
"doesnotexist"
);
name
[
0
]
=
'a'
;
name
[
2
]
=
'\0'
;
for
(
i
=
0
;
i
<
52
;
i
++
)
{
name
[
1
]
=
'0'
+
i
;
fd
=
open
(
name
,
O_CREATE
|
O_RDWR
);
close
(
fd
);
}
name
[
0
]
=
'a'
;
name
[
2
]
=
'\0'
;
for
(
i
=
0
;
i
<
52
;
i
++
)
{
name
[
1
]
=
'0'
+
i
;
unlink
(
name
);
}
//exec("echo", echo_args);
printf
(
stdout
,
"about to do exec
\n
"
);
exec
(
"cat"
,
cat_args
);
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论