wdir now uses readi/writei
This commit is contained in:
parent
17e3cf15ba
commit
e4bcd2a3a9
45
fs.c
45
fs.c
|
@ -450,43 +450,24 @@ void
|
|||
wdir(struct inode *dp, char *name, uint ino)
|
||||
{
|
||||
uint off;
|
||||
struct buf *bp = 0;
|
||||
struct dirent *ep = 0;
|
||||
struct dirent de;
|
||||
int i;
|
||||
int lb;
|
||||
|
||||
if(dp->size % BSIZE)
|
||||
dp->size += (BSIZE - dp->size % BSIZE);
|
||||
for(off = 0; off < dp->size; off += sizeof(de)){
|
||||
if(readi(dp, (char *) &de, off, sizeof(de)) != sizeof(de))
|
||||
panic("wdir read");
|
||||
if(de.inum == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
for(off = 0; off < dp->size; off += BSIZE) {
|
||||
bp = bread(dp->dev, bmap(dp, off / BSIZE));
|
||||
for(ep = (struct dirent *) bp->data;
|
||||
ep < (struct dirent *) (bp->data + BSIZE);
|
||||
ep++){
|
||||
if(ep->inum == 0)
|
||||
goto found;
|
||||
}
|
||||
brelse(bp);
|
||||
}
|
||||
lb = dp->size / BSIZE;
|
||||
if (lb >= NDIRECT) {
|
||||
panic ("wdir: too many entries");
|
||||
}
|
||||
dp->addrs[lb] = balloc(dp->dev);
|
||||
bp = bread(dp->dev, dp->addrs[lb]);
|
||||
memset(bp->data, 0, BSIZE);
|
||||
ep = (struct dirent *) (bp->data);
|
||||
dp->size += BSIZE;
|
||||
|
||||
found:
|
||||
ep->inum = ino;
|
||||
de.inum = ino;
|
||||
for(i = 0; i < DIRSIZ && name[i]; i++)
|
||||
ep->name[i] = name[i];
|
||||
de.name[i] = name[i];
|
||||
for( ; i < DIRSIZ; i++)
|
||||
ep->name[i] = '\0';
|
||||
bwrite (bp, bmap(dp, off/BSIZE)); // write directory block
|
||||
brelse(bp);
|
||||
iupdate(dp);
|
||||
de.name[i] = '\0';
|
||||
|
||||
if(writei(dp, (char *) &de, off, sizeof(de)) != sizeof(de))
|
||||
panic("wdir write");
|
||||
}
|
||||
|
||||
struct inode *
|
||||
|
|
Loading…
Reference in a new issue