big directory test

This commit is contained in:
rtm 2006-08-24 19:21:19 +00:00
parent 1be7668537
commit bcfb84b6a9
3 changed files with 59 additions and 2 deletions

9
Notes
View file

@ -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 unlinks a file while another links to it
test: one process opens a file while another deletes it test: one process opens a file while another deletes it
test: mkdir. deadlock d/.. vs ../d 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 make proc[0] runnable
cpu early tss and gdt cpu early tss and gdt
@ -139,3 +144,7 @@ sh: support pipes? leave it for the class?
sh: dynamic memory allocation? sh: dynamic memory allocation?
sh: should sh support ; () & --- need malloc sh: should sh support ; () & --- need malloc
sh: stop stdin on ctrl-d (for cat > y) 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
View file

@ -262,8 +262,8 @@ iunlink(struct inode *ip)
if (ip->addrs[i] != 0) { if (ip->addrs[i] != 0) {
if (i == INDIRECT) { if (i == INDIRECT) {
inbp = bread(ip->dev, ip->addrs[INDIRECT]); inbp = bread(ip->dev, ip->addrs[INDIRECT]);
uint *a = (uint *) inbp->data;
for (j = 0; j < NINDIRECT; j++) { for (j = 0; j < NINDIRECT; j++) {
uint *a = (uint *) inbp->data;
if (a[j] != 0) { if (a[j] != 0) {
bfree(ip->dev, a[j]); bfree(ip->dev, a[j]);
a[j] = 0; a[j] = 0;
@ -589,6 +589,9 @@ unlink(char *cp)
ip = iget(dev, inum); ip = iget(dev, inum);
if(ip->nlink < 1)
panic("unlink nlink < 1");
ip->nlink--; ip->nlink--;
iupdate(ip); iupdate(ip);

View file

@ -365,11 +365,56 @@ concreate()
puts("concreate ok\n"); 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 int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
puts("fstests starting\n"); puts("fstests starting\n");
bigdir();
concreate(); concreate();
linktest(); linktest();
unlinkread(); unlinkread();