From e4bcd2a3a919ef040d2a577a1025f286c3b57168 Mon Sep 17 00:00:00 2001 From: rtm Date: Sun, 13 Aug 2006 20:06:42 +0000 Subject: [PATCH] wdir now uses readi/writei --- fs.c | 43 ++++++++++++------------------------------- picirq.c | 1 - 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/fs.c b/fs.c index fbb4a8c..cf717a2 100644 --- a/fs.c +++ b/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 += 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); + 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; } - 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 * diff --git a/picirq.c b/picirq.c index 28b5e5d..ab3e7b9 100644 --- a/picirq.c +++ b/picirq.c @@ -17,7 +17,6 @@ static ushort irq_mask_8259A = 0xFFFF & ~(1<