commit 12abb1a56164a0d71fb7a76a465c912409f2f60b
parent 38eee5bca75cc16d40101953bc2003bb77d452e7
Author: Robert Morris <rtm@csail.mit.edu>
Date: Fri, 14 Oct 2011 10:23:23 -0400
don't let dirty blocks be evicted from cache!
Diffstat:
4 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/bio.c b/bio.c
@@ -79,9 +79,9 @@ bget(uint dev, uint sector)
}
}
- // Not cached; recycle some existing buffer.
+ // Not cached; recycle some non-busy and clean buffer.
for(b = bcache.head.prev; b != &bcache.head; b = b->prev){
- if((b->flags & B_BUSY) == 0){
+ if((b->flags & B_BUSY) == 0 && (b->flags & B_DIRTY) == 0){
b->dev = dev;
b->sector = sector;
b->flags = B_BUSY;
diff --git a/file.c b/file.c
@@ -1,3 +1,7 @@
+//
+// File descriptors
+//
+
#include "types.h"
#include "defs.h"
#include "param.h"
@@ -87,7 +91,7 @@ filestat(struct file *f, struct stat *st)
return -1;
}
-// Read from file f. Addr is kernel address.
+// Read from file f.
int
fileread(struct file *f, char *addr, int n)
{
@@ -108,7 +112,7 @@ fileread(struct file *f, char *addr, int n)
}
//PAGEBREAK!
-// Write to file f. Addr is kernel address.
+// Write to file f.
int
filewrite(struct file *f, char *addr, int n)
{
diff --git a/log.c b/log.c
@@ -177,6 +177,7 @@ log_write(struct buf *b)
brelse(lbuf);
if (i == log.lh.n)
log.lh.n++;
+ b->flags |= B_DIRTY; // XXX prevent eviction
}
//PAGEBREAK!
diff --git a/sysfile.c b/sysfile.c
@@ -1,3 +1,9 @@
+//
+// File-system system calls.
+// Mostly argument checking, since we don't trust
+// user code, and calls into file.c and fs.c.
+//
+
#include "types.h"
#include "defs.h"
#include "param.h"