Skip to content
Snippets Groups Projects
Commit 327cc21f authored by Robert Morris's avatar Robert Morris
Browse files

make dirlookup and dirlink more similar

parent cd3d739e
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
......
......@@ -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[])
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment