make dirlookup and dirlink more similar

This commit is contained in:
Robert Morris 2011-08-19 13:30:57 -04:00
parent cd3d739e6f
commit 327cc21fba
2 changed files with 66 additions and 18 deletions

31
fs.c
View file

@ -469,30 +469,25 @@ struct inode*
dirlookup(struct inode *dp, char *name, uint *poff) dirlookup(struct inode *dp, char *name, uint *poff)
{ {
uint off, inum; uint off, inum;
struct buf *bp; struct dirent de;
struct dirent *de;
if(dp->type != T_DIR) if(dp->type != T_DIR)
panic("dirlookup not DIR"); panic("dirlookup not DIR");
for(off = 0; off < dp->size; off += BSIZE){ for(off = 0; off < dp->size; off += sizeof(de)){
bp = bread(dp->dev, bmap(dp, off / BSIZE)); if(readi(dp, (char*)&de, off, sizeof(de)) != sizeof(de))
for(de = (struct dirent*)bp->data; panic("dirlink read");
de < (struct dirent*)(bp->data + BSIZE); if(de.inum == 0)
de++){ continue;
if(de->inum == 0) if(namecmp(name, de.name) == 0){
continue; // entry matches path element
if(namecmp(name, de->name) == 0){ if(poff)
// entry matches path element *poff = off;
if(poff) inum = de.inum;
*poff = off + (uchar*)de - bp->data; return iget(dp->dev, inum);
inum = de->inum;
brelse(bp);
return iget(dp->dev, inum);
}
} }
brelse(bp);
} }
return 0; return 0;
} }

View file

@ -1529,6 +1529,59 @@ bigargtest(void)
wait(); 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 int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {