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]);
 | 
			
		||||
        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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										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…
	
	Add table
		
		Reference in a new issue