1 #ifndef __LUNAIX_BLKBUF_H
2 #define __LUNAIX_BLKBUF_H
4 #include <lunaix/blkio.h>
5 #include <lunaix/bcache.h>
6 #include <lunaix/block.h>
7 #include <lunaix/ds/mutex.h>
17 struct llist_header dirty;
18 struct block_dev* blkdev;
25 struct llist_header dirty;
26 struct blkio_req* breq;
31 #define BLOCK_BUFFER(type, name) \
37 #define INVL_BUFFER 0xdeadc0de
39 #define bbuf_null ((bbuf_t)0)
42 blkbuf_errbuf(bbuf_t buf) {
43 return (ptr_t)buf == INVL_BUFFER;
47 blkbuf_nullbuf(bbuf_t buf) {
48 return buf == bbuf_null;
51 static inline unsigned int
54 return to_bcache_node(((struct blk_buf*)buf)->cobj)->tag;
57 static inline unsigned int
58 blkbuf_refcounts(bbuf_t buf)
60 return to_bcache_node(((struct blk_buf*)buf)->cobj)->refs;
64 blkbuf_not_shared(bbuf_t buf)
66 return blkbuf_refcounts(buf) == 1;
71 blkbuf_create(struct block_dev* blkdev, unsigned int blk_size);
74 blkbuf_take(struct blkbuf_cache* bc, unsigned int block_id);
77 blkbuf_refonce(bbuf_t buf)
79 if (likely(buf && !blkbuf_errbuf(buf))) {
80 bcache_refonce(((struct blk_buf*)buf)->cobj);
87 blkbuf_data(bbuf_t buf)
89 assert(!blkbuf_errbuf(buf));
90 return ((struct blk_buf*)buf)->raw;
92 #define block_buffer(buf, type) \
93 ((type*)blkbuf_data(buf))
96 blkbuf_dirty(bbuf_t buf);
99 blkbuf_schedule_sync(bbuf_t buf);
102 blkbuf_release(struct blkbuf_cache* bc);
105 blkbuf_put(bbuf_t buf);
108 blkbuf_syncall(struct blkbuf_cache* bc, bool async);
110 #endif /* __LUNAIX_BLKBUF_H */