big directory test
This commit is contained in:
parent
1be7668537
commit
bcfb84b6a9
3 changed files with 59 additions and 2 deletions
9
Notes
9
Notes
|
@ -115,6 +115,11 @@ why does shell often ignore first line of input?
|
|||
test: one process unlinks a file while another links to it
|
||||
test: one process opens a file while another deletes it
|
||||
test: mkdir. deadlock d/.. vs ../d
|
||||
test: sub-sub directories. mkdir("d1/d2")
|
||||
test: dup() shared fd->off
|
||||
test: indirect blocks. files and directories.
|
||||
test: sbrk
|
||||
test: does echo foo > x truncate x?
|
||||
|
||||
make proc[0] runnable
|
||||
cpu early tss and gdt
|
||||
|
@ -139,3 +144,7 @@ sh: support pipes? leave it for the class?
|
|||
sh: dynamic memory allocation?
|
||||
sh: should sh support ; () & --- need malloc
|
||||
sh: stop stdin on ctrl-d (for cat > y)
|
||||
|
||||
really should have bdwrite() for file content
|
||||
and make some inode updates async
|
||||
so soft updates make sense
|
||||
|
|
5
fs.c
5
fs.c
|
@ -262,8 +262,8 @@ iunlink(struct inode *ip)
|
|||
if (ip->addrs[i] != 0) {
|
||||
if (i == INDIRECT) {
|
||||
inbp = bread(ip->dev, ip->addrs[INDIRECT]);
|
||||
for (j = 0; j < NINDIRECT; j++) {
|
||||
uint *a = (uint *) inbp->data;
|
||||
for (j = 0; j < NINDIRECT; j++) {
|
||||
if (a[j] != 0) {
|
||||
bfree(ip->dev, a[j]);
|
||||
a[j] = 0;
|
||||
|
@ -589,6 +589,9 @@ unlink(char *cp)
|
|||
|
||||
ip = iget(dev, inum);
|
||||
|
||||
if(ip->nlink < 1)
|
||||
panic("unlink nlink < 1");
|
||||
|
||||
ip->nlink--;
|
||||
|
||||
iupdate(ip);
|
||||
|
|
45
fstests.c
45
fstests.c
|
@ -365,11 +365,56 @@ concreate()
|
|||
puts("concreate ok\n");
|
||||
}
|
||||
|
||||
// directory that uses indirect blocks
|
||||
void
|
||||
bigdir()
|
||||
{
|
||||
int i, fd;
|
||||
char name[10];
|
||||
|
||||
unlink("bd");
|
||||
|
||||
fd = open("bd", O_CREATE);
|
||||
if(fd < 0){
|
||||
puts("bigdir create failed\n");
|
||||
exit();
|
||||
}
|
||||
close(fd);
|
||||
|
||||
for(i = 0; i < 500; i++){
|
||||
name[0] = 'x';
|
||||
name[1] = '0' + (i / 64);
|
||||
name[2] = '0' + (i % 64);
|
||||
name[3] = '\0';
|
||||
if(link("bd", name) != 0){
|
||||
puts("bigdir link failed\n");
|
||||
exit();
|
||||
}
|
||||
puts("c");
|
||||
}
|
||||
|
||||
unlink("bd");
|
||||
for(i = 0; i < 500; i++){
|
||||
name[0] = 'x';
|
||||
name[1] = '0' + (i / 64);
|
||||
name[2] = '0' + (i % 64);
|
||||
name[3] = '\0';
|
||||
if(unlink(name) != 0){
|
||||
puts("bigdir unlink failed");
|
||||
exit();
|
||||
}
|
||||
puts("d");
|
||||
}
|
||||
|
||||
puts("bigdir ok\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
puts("fstests starting\n");
|
||||
|
||||
bigdir();
|
||||
concreate();
|
||||
linktest();
|
||||
unlinkread();
|
||||
|
|
Loading…
Reference in a new issue