diff options
author | rtm <rtm> | 2006-08-13 20:06:42 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-08-13 20:06:42 +0000 |
commit | e4bcd2a3a919ef040d2a577a1025f286c3b57168 (patch) | |
tree | 7b42cfb4ed65e40131cf5b5f76440521a8c45c55 /fs.c | |
parent | 17e3cf15bac0c1ac60780ce7d1d228442ff08ed9 (diff) | |
download | xv6-labs-e4bcd2a3a919ef040d2a577a1025f286c3b57168.tar.gz xv6-labs-e4bcd2a3a919ef040d2a577a1025f286c3b57168.tar.bz2 xv6-labs-e4bcd2a3a919ef040d2a577a1025f286c3b57168.zip |
wdir now uses readi/writei
Diffstat (limited to 'fs.c')
-rw-r--r-- | fs.c | 45 |
1 files changed, 13 insertions, 32 deletions
@@ -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 += 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"); + + 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; } - 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 * |