diff --git a/Notes b/Notes
index 3efafb32f6fe49f73f649f61e1f50fe4a5a78331..e1d763dbd7bf0d89c3619d40be03381e6ec45882 100644
--- a/Notes
+++ b/Notes
@@ -354,3 +354,6 @@ HMM maybe the variables at the end of struct cpu are being overwritten
  
 OH! recursive interrupts will use up any amount of cpu[].stack!
   underflow and wrecks *previous* cpu's struct
+
+better buffer cache replacement
+read/write of open file that's been unlinked
diff --git a/bio.c b/bio.c
index 7184a283340fdb4041d10174ee6285b4b2401d81..2db9694954ffb72d1f933fc02435b23cfc5228b6 100644
--- a/bio.c
+++ b/bio.c
@@ -20,20 +20,31 @@ struct buf *
 getblk(uint dev, uint sector)
 {
   struct buf *b;
+  static struct buf *scan = buf;
+  int i;
 
   acquire(&buf_table_lock);
 
   while(1){
     for(b = buf; b < buf+NBUF; b++)
-      if((b->flags & B_BUSY) && b->dev == dev && b->sector)
+      if((b->flags & (B_BUSY|B_VALID)) && b->dev == dev && b->sector == sector)
         break;
 
     if(b < buf+NBUF){
-      sleep(buf, &buf_table_lock);
+      if(b->flags & B_BUSY){
+        sleep(buf, &buf_table_lock);
+      } else {
+        b->flags |= B_BUSY;
+        release(&buf_table_lock);
+        return b;
+      }
     } else {
-      for(b = buf; b < buf+NBUF; b++){
+      for(i = 0; i < NBUF; i++){
+        b = scan++;
+        if(scan >= buf+NBUF)
+          scan = buf;
         if((b->flags & B_BUSY) == 0){
-          b->flags |= B_BUSY;
+          b->flags = B_BUSY;
           b->dev = dev;
           b->sector = sector;
           release(&buf_table_lock);
@@ -53,11 +64,14 @@ bread(uint dev, uint sector)
   extern struct spinlock ide_lock;
 
   b = getblk(dev, sector);
+  if(b->flags & B_VALID)
+    return b;
 
   acquire(&ide_lock);
   c = ide_start_rw(dev & 0xff, sector, b->data, 1, 1);
   sleep (c, &ide_lock);
   ide_finish(c);
+  b->flags |= B_VALID;
   release(&ide_lock);
 
   return b;
@@ -73,6 +87,7 @@ bwrite(uint dev, struct buf *b, uint sector)
   c = ide_start_rw(dev & 0xff, sector, b->data, 1, 0);
   sleep (c, &ide_lock);
   ide_finish(c);
+  b->flags |= B_VALID;
   release(&ide_lock);
 }
 
diff --git a/buf.h b/buf.h
index e3f6b143f4c605494fb7058ee68e878679a63d80..7ab352a68c7a5ec15e32b4a3d5ce72c8dfa07a59 100644
--- a/buf.h
+++ b/buf.h
@@ -5,3 +5,4 @@ struct buf {
   uchar data[512];
 };
 #define B_BUSY 0x1
+#define B_VALID 0x2
diff --git a/usertests.c b/usertests.c
index a3bb2848b337b968a2fc404ab7b448d69f92d732..9bd144c6cad7143d5b0f56737fcd45fffa63654b 100644
--- a/usertests.c
+++ b/usertests.c
@@ -339,7 +339,7 @@ main(int argc, char *argv[])
 {
   puts("usertests starting\n");
 
-  unlinkread();
+  //unlinkread();
   createdelete();
   twofiles();
   sharedfd();