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