diff options
author | Frans Kaashoek <[email protected]> | 2011-08-21 21:14:42 -0400 |
---|---|---|
committer | Frans Kaashoek <[email protected]> | 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[]) { |