diff options
| author | Frans Kaashoek <kaashoek@Frans-Kaashoeks-MacBook-Pro.local> | 2011-08-21 21:14:42 -0400 | 
|---|---|---|
| committer | Frans Kaashoek <kaashoek@Frans-Kaashoeks-MacBook-Pro.local> | 2011-08-21 21:14:42 -0400 | 
| commit | 39f8cc56d30bd1aaf097f17de0c410424c59a3f0 (patch) | |
| tree | 0629c1a738eece4633655315df3af3de37c119e4 | |
| parent | 3682474f779c02419623ae16de49a12da8d23af7 (diff) | |
| parent | 327cc21fba38359c5b7fd4c9f39b1dc00fb4f182 (diff) | |
| download | xv6-labs-39f8cc56d30bd1aaf097f17de0c410424c59a3f0.tar.gz xv6-labs-39f8cc56d30bd1aaf097f17de0c410424c59a3f0.tar.bz2 xv6-labs-39f8cc56d30bd1aaf097f17de0c410424c59a3f0.zip | |
Merge branch 'master' of git+ssh://amsterdam.csail.mit.edu/home/am0/6.828/xv6
| -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[])  { | 
