From 530431045237d7ccbbc0bb65ed83309845c19893 Mon Sep 17 00:00:00 2001 From: Frans Kaashoek Date: Mon, 29 Jul 2019 17:33:16 -0400 Subject: Remove B_DIRTY Use refcnt to pin blocks into the cache Replace flags/B_VALID with a boolean field valid Use info[id].status to signal completion of disk interrupt Pass a read/write flag to virtio_disk_rw --- kernel/log.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'kernel/log.c') diff --git a/kernel/log.c b/kernel/log.c index c8f7e62..5aea267 100644 --- a/kernel/log.c +++ b/kernel/log.c @@ -77,6 +77,7 @@ install_trans(void) struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst bwrite(dbuf); // write dst to disk + dbuf->refcnt--; // unpin buffer from cache brelse(lbuf); brelse(dbuf); } @@ -203,7 +204,7 @@ commit() } // Caller has modified b->data and is done with the buffer. -// Record the block number and pin in the cache with B_DIRTY. +// Record the block number and pin in the cache by increasing refcnt. // commit()/write_log() will do the disk write. // // log_write() replaces bwrite(); a typical use is: @@ -227,9 +228,10 @@ log_write(struct buf *b) break; } log.lh.block[i] = b->blockno; - if (i == log.lh.n) + if (i == log.lh.n) { // Add new block to log? + b->refcnt++; // Pin block in cache log.lh.n++; - b->flags |= B_DIRTY; // prevent eviction + } release(&log.lock); } -- cgit v1.2.3 From f37a3e396454268074f48517e3773f099846d0e3 Mon Sep 17 00:00:00 2001 From: Frans Kaashoek Date: Tue, 30 Jul 2019 08:54:43 -0400 Subject: Make pin/unpin explicit --- kernel/log.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'kernel/log.c') diff --git a/kernel/log.c b/kernel/log.c index 5aea267..59984db 100644 --- a/kernel/log.c +++ b/kernel/log.c @@ -77,7 +77,7 @@ install_trans(void) struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst bwrite(dbuf); // write dst to disk - dbuf->refcnt--; // unpin buffer from cache + bunpin(dbuf); brelse(lbuf); brelse(dbuf); } @@ -229,7 +229,7 @@ log_write(struct buf *b) } log.lh.block[i] = b->blockno; if (i == log.lh.n) { // Add new block to log? - b->refcnt++; // Pin block in cache + bpin(b); log.lh.n++; } release(&log.lock); -- cgit v1.2.3