}
}
- // 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;
+//
+// File descriptors
+//
+
#include "types.h"
#include "defs.h"
#include "param.h"
return -1;
}
-// Read from file f. Addr is kernel address.
+// Read from file f.
int
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)
{
brelse(lbuf);
if (i == log.lh.n)
log.lh.n++;
+ b->flags |= B_DIRTY; // XXX prevent eviction
}
//PAGEBREAK!
+//
+// 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"