diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2011-08-19 13:30:57 -0400 | 
|---|---|---|
| committer | Robert Morris <rtm@csail.mit.edu> | 2011-08-19 13:30:57 -0400 | 
| commit | 327cc21fba38359c5b7fd4c9f39b1dc00fb4f182 (patch) | |
| tree | bf9bfb4240d32dd4725b774e39ac7d270e2ab905 | |
| parent | cd3d739e6f3d4d356ac8c34b25f16df82a5f2789 (diff) | |
| download | xv6-labs-327cc21fba38359c5b7fd4c9f39b1dc00fb4f182.tar.gz xv6-labs-327cc21fba38359c5b7fd4c9f39b1dc00fb4f182.tar.bz2 xv6-labs-327cc21fba38359c5b7fd4c9f39b1dc00fb4f182.zip | |
make dirlookup and dirlink more similar
| -rw-r--r-- | fs.c | 31 | ||||
| -rw-r--r-- | usertests.c | 53 | 
2 files changed, 66 insertions, 18 deletions
| @@ -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;  } diff --git a/usertests.c b/usertests.c index 8db8385..455e68a 100644 --- a/usertests.c +++ b/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[])  { | 
