make dirlookup and dirlink more similar
This commit is contained in:
		
							parent
							
								
									cd3d739e6f
								
							
						
					
					
						commit
						327cc21fba
					
				
					 2 changed files with 66 additions and 18 deletions
				
			
		
							
								
								
									
										31
									
								
								fs.c
									
										
									
									
									
								
							
							
						
						
									
										31
									
								
								fs.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -469,30 +469,25 @@ struct inode*
 | 
			
		|||
dirlookup(struct inode *dp, char *name, uint *poff)
 | 
			
		||||
{
 | 
			
		||||
  uint off, inum;
 | 
			
		||||
  struct buf *bp;
 | 
			
		||||
  struct dirent *de;
 | 
			
		||||
  struct dirent de;
 | 
			
		||||
 | 
			
		||||
  if(dp->type != T_DIR)
 | 
			
		||||
    panic("dirlookup not DIR");
 | 
			
		||||
 | 
			
		||||
  for(off = 0; off < dp->size; off += BSIZE){
 | 
			
		||||
    bp = bread(dp->dev, bmap(dp, off / BSIZE));
 | 
			
		||||
    for(de = (struct dirent*)bp->data;
 | 
			
		||||
        de < (struct dirent*)(bp->data + BSIZE);
 | 
			
		||||
        de++){
 | 
			
		||||
      if(de->inum == 0)
 | 
			
		||||
        continue;
 | 
			
		||||
      if(namecmp(name, de->name) == 0){
 | 
			
		||||
        // entry matches path element
 | 
			
		||||
        if(poff)
 | 
			
		||||
          *poff = off + (uchar*)de - bp->data;
 | 
			
		||||
        inum = de->inum;
 | 
			
		||||
        brelse(bp);
 | 
			
		||||
        return iget(dp->dev, inum);
 | 
			
		||||
      }
 | 
			
		||||
  for(off = 0; off < dp->size; off += sizeof(de)){
 | 
			
		||||
    if(readi(dp, (char*)&de, off, sizeof(de)) != sizeof(de))
 | 
			
		||||
      panic("dirlink read");
 | 
			
		||||
    if(de.inum == 0)
 | 
			
		||||
      continue;
 | 
			
		||||
    if(namecmp(name, de.name) == 0){
 | 
			
		||||
      // entry matches path element
 | 
			
		||||
      if(poff)
 | 
			
		||||
        *poff = off;
 | 
			
		||||
      inum = de.inum;
 | 
			
		||||
      return iget(dp->dev, inum);
 | 
			
		||||
    }
 | 
			
		||||
    brelse(bp);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										53
									
								
								usertests.c
									
										
									
									
									
								
							
							
						
						
									
										53
									
								
								usertests.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1529,6 +1529,59 @@ bigargtest(void)
 | 
			
		|||
  wait();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// what happens when the file system runs out of blocks?
 | 
			
		||||
// answer: balloc panics, so this test is not useful.
 | 
			
		||||
void
 | 
			
		||||
fsfull()
 | 
			
		||||
{
 | 
			
		||||
  int nfiles;
 | 
			
		||||
  int fsblocks = 0;
 | 
			
		||||
 | 
			
		||||
  printf(1, "fsfull test\n");
 | 
			
		||||
 | 
			
		||||
  for(nfiles = 0; ; nfiles++){
 | 
			
		||||
    char name[64];
 | 
			
		||||
    name[0] = 'f';
 | 
			
		||||
    name[1] = '0' + nfiles / 1000;
 | 
			
		||||
    name[2] = '0' + (nfiles % 1000) / 100;
 | 
			
		||||
    name[3] = '0' + (nfiles % 100) / 10;
 | 
			
		||||
    name[4] = '0' + (nfiles % 10);
 | 
			
		||||
    name[5] = '\0';
 | 
			
		||||
    printf(1, "writing %s\n", name);
 | 
			
		||||
    int fd = open(name, O_CREATE|O_RDWR);
 | 
			
		||||
    if(fd < 0){
 | 
			
		||||
      printf(1, "open %s failed\n", name);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    int total = 0;
 | 
			
		||||
    while(1){
 | 
			
		||||
      int cc = write(fd, buf, 512);
 | 
			
		||||
      if(cc < 512)
 | 
			
		||||
        break;
 | 
			
		||||
      total += cc;
 | 
			
		||||
      fsblocks++;
 | 
			
		||||
    }
 | 
			
		||||
    printf(1, "wrote %d bytes\n", total);
 | 
			
		||||
    close(fd);
 | 
			
		||||
    if(total == 0)
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  while(nfiles >= 0){
 | 
			
		||||
    char name[64];
 | 
			
		||||
    name[0] = 'f';
 | 
			
		||||
    name[1] = '0' + nfiles / 1000;
 | 
			
		||||
    name[2] = '0' + (nfiles % 1000) / 100;
 | 
			
		||||
    name[3] = '0' + (nfiles % 100) / 10;
 | 
			
		||||
    name[4] = '0' + (nfiles % 10);
 | 
			
		||||
    name[5] = '\0';
 | 
			
		||||
    unlink(name);
 | 
			
		||||
    nfiles--;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  printf(1, "fsfull test finished\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue