diff --git a/fs.c b/fs.c
index fbb4a8c2167fcf29183638d2444d79bbcca613ce..cf717a2061db24cc6fe0e22e4a8266a752e1430c 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);
-  }
-  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 *
diff --git a/picirq.c b/picirq.c
index 28b5e5dc5b4ca8ac7d05d0f992942210bbbdc323..ab3e7b96ec0f75362460122b0a4f9d93cc2b873c 100644
--- a/picirq.c
+++ b/picirq.c
@@ -17,7 +17,6 @@ static ushort irq_mask_8259A = 0xFFFF & ~(1<<IRQ_SLAVE);
 static void
 irq_setmask_8259A(ushort mask)
 {
-  int i;
   irq_mask_8259A = mask;
 
   outb(IO_PIC1+1, (char)mask);