diff options
| author | rtm <rtm> | 2006-08-24 19:21:19 +0000 | 
|---|---|---|
| committer | rtm <rtm> | 2006-08-24 19:21:19 +0000 | 
| commit | bcfb84b6a9077b5e035325b3396c062d1f183ac4 (patch) | |
| tree | 5a08eec2343a00631160aa42644ebf1d7a71a45c | |
| parent | 1be766853771bda6023b8024041453413fb777bb (diff) | |
| download | xv6-labs-bcfb84b6a9077b5e035325b3396c062d1f183ac4.tar.gz xv6-labs-bcfb84b6a9077b5e035325b3396c062d1f183ac4.tar.bz2 xv6-labs-bcfb84b6a9077b5e035325b3396c062d1f183ac4.zip | |
big directory test
| -rw-r--r-- | Notes | 11 | ||||
| -rw-r--r-- | fs.c | 5 | ||||
| -rw-r--r-- | fstests.c | 45 | 
3 files changed, 59 insertions, 2 deletions
| @@ -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 @@ -138,4 +143,8 @@ are the locks in the right place in keyboardintr?  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)
\ No newline at end of file +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 @@ -262,8 +262,8 @@ iunlink(struct inode *ip)      if (ip->addrs[i] != 0) {        if (i == INDIRECT) {  	inbp = bread(ip->dev, ip->addrs[INDIRECT]); +        uint *a = (uint *) inbp->data;  	for (j = 0; j < NINDIRECT; j++) { -	  uint *a = (uint *) inbp->data;  	  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); @@ -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(); | 
