提交 8ffe342f 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

bio.cc

上级 e69077a7
...@@ -21,11 +21,13 @@ ...@@ -21,11 +21,13 @@
// * B_DIRTY: the buffer data has been modified // * B_DIRTY: the buffer data has been modified
// and needs to be written to disk. // and needs to be written to disk.
extern "C" {
#include "types.h" #include "types.h"
#include "kernel.h" #include "kernel.h"
#include "spinlock.h" #include "spinlock.h"
#include "condvar.h" #include "condvar.h"
#include "buf.h" #include "buf.h"
}
static struct ns *bufns; static struct ns *bufns;
...@@ -34,7 +36,7 @@ enum { writeback = 0 }; ...@@ -34,7 +36,7 @@ enum { writeback = 0 };
static void * static void *
evict(void *vkey, void *bp, void *arg) evict(void *vkey, void *bp, void *arg)
{ {
struct buf *b = bp; struct buf *b = (buf*) bp;
acquire(&b->lock); acquire(&b->lock);
if ((b->flags & (B_BUSY | B_DIRTY | B_VALID)) == 0) if ((b->flags & (B_BUSY | B_DIRTY | B_VALID)) == 0)
return b; return b;
...@@ -45,7 +47,7 @@ evict(void *vkey, void *bp, void *arg) ...@@ -45,7 +47,7 @@ evict(void *vkey, void *bp, void *arg)
static void * static void *
evict_valid(void *vkey, void *bp, void *arg) evict_valid(void *vkey, void *bp, void *arg)
{ {
struct buf *b = bp; struct buf *b = (buf*) bp;
acquire(&b->lock); acquire(&b->lock);
if ((b->flags & (B_BUSY | B_DIRTY)) == 0) if ((b->flags & (B_BUSY | B_DIRTY)) == 0)
return b; return b;
...@@ -65,7 +67,7 @@ bget(u32 dev, u64 sector, int *writer) ...@@ -65,7 +67,7 @@ bget(u32 dev, u64 sector, int *writer)
// Try for cached block. // Try for cached block.
// XXX ignore dev // XXX ignore dev
gc_begin_epoch(); gc_begin_epoch();
b = ns_lookup(bufns, KII(dev, sector)); b = (buf*) ns_lookup(bufns, KII(dev, sector));
if (b) { if (b) {
if (b->dev != dev || b->sector != sector) if (b->dev != dev || b->sector != sector)
panic("block mismatch"); panic("block mismatch");
...@@ -89,9 +91,9 @@ bget(u32 dev, u64 sector, int *writer) ...@@ -89,9 +91,9 @@ bget(u32 dev, u64 sector, int *writer)
gc_end_epoch(); gc_end_epoch();
// Allocate fresh block. // Allocate fresh block.
struct buf *victim = ns_enumerate(bufns, evict, 0); struct buf *victim = (buf*) ns_enumerate(bufns, evict, 0);
if (victim == 0) if (victim == 0)
victim = ns_enumerate(bufns, evict_valid, 0); victim = (buf*) ns_enumerate(bufns, evict_valid, 0);
if (victim == 0) if (victim == 0)
panic("bget all busy"); panic("bget all busy");
victim->flags |= B_BUSY; victim->flags |= B_BUSY;
...@@ -100,7 +102,7 @@ bget(u32 dev, u64 sector, int *writer) ...@@ -100,7 +102,7 @@ bget(u32 dev, u64 sector, int *writer)
destroylock(&victim->lock); destroylock(&victim->lock);
gc_delayed(victim, kmfree); gc_delayed(victim, kmfree);
b = kmalloc(sizeof(*b)); b = (buf*) kmalloc(sizeof(*b));
b->dev = dev; b->dev = dev;
b->sector = sector; b->sector = sector;
b->flags = B_BUSY; b->flags = B_BUSY;
...@@ -166,7 +168,7 @@ initbio(void) ...@@ -166,7 +168,7 @@ initbio(void)
bufns = nsalloc(0); bufns = nsalloc(0);
for (u64 i = 0; i < NBUF; i++) { for (u64 i = 0; i < NBUF; i++) {
struct buf *b = kmalloc(sizeof(*b)); struct buf *b = (buf*) kmalloc(sizeof(*b));
b->dev = 0xdeadbeef; b->dev = 0xdeadbeef;
b->sector = -i; /* dummy to pre-allocate NBUF spaces for evict */ b->sector = -i; /* dummy to pre-allocate NBUF spaces for evict */
b->flags = 0; b->flags = 0;
......
...@@ -209,7 +209,7 @@ struct nskey { ...@@ -209,7 +209,7 @@ struct nskey {
}; };
#define KI(v) (struct nskey){type: nskey_int, u: { i: v }} #define KI(v) (struct nskey){type: nskey_int, u: { i: v }}
#define KII(x,y) (struct nskey){.type=nskey_ii,.u.ii.a=x,.u.ii.b=y} #define KII(x,y) (struct nskey){type: nskey_ii, u: {ii: {a:x, b:y}}}
#define KS(v) (struct nskey){.type=nskey_str,.u.s=v} #define KS(v) (struct nskey){.type=nskey_str,.u.s=v}
#define KD(v) (struct nskey){type: nskey_dirname, u: { dirname: v }} #define KD(v) (struct nskey){type: nskey_dirname, u: { dirname: v }}
#define KIIS(x,y,z) (struct nskey){.type=nskey_iis,.u.iis.a=x, \ #define KIIS(x,y,z) (struct nskey){.type=nskey_iis,.u.iis.a=x, \
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论