big directory test
This commit is contained in:
parent
1be7668537
commit
bcfb84b6a9
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 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
5
fs.c
|
@ -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]);
|
||||||
for (j = 0; j < NINDIRECT; j++) {
|
|
||||||
uint *a = (uint *) inbp->data;
|
uint *a = (uint *) inbp->data;
|
||||||
|
for (j = 0; j < NINDIRECT; j++) {
|
||||||
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);
|
||||||
|
|
45
fstests.c
45
fstests.c
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue