summaryrefslogtreecommitdiffstats
path: root/kernel/cache.h
diff options
context:
space:
mode:
authorLars Müller2008-03-01 19:30:38 +0100
committerLars Müller2008-03-01 19:30:38 +0100
commit868fec1f8eca7c344fc9ac057b7418331299d9ce (patch)
treec07cdf11db710dc495c3c7a513cc0f8fd68d6626 /kernel/cache.h
downloaddnbd-868fec1f8eca7c344fc9ac057b7418331299d9ce.tar.gz
dnbd-868fec1f8eca7c344fc9ac057b7418331299d9ce.tar.xz
dnbd-868fec1f8eca7c344fc9ac057b7418331299d9ce.zip
Import dnbd* from the former openslx-contrib repo as of revision 92.
openslx-contrib is currently read only and will get removed in some days. git-svn-id: http://svn.openslx.org/svn/openslx/contrib/dnbd/trunk@1592 95ad53e4-c205-0410-b2fa-d234c58c8868
Diffstat (limited to 'kernel/cache.h')
-rw-r--r--kernel/cache.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/kernel/cache.h b/kernel/cache.h
new file mode 100644
index 0000000..1cc2b49
--- /dev/null
+++ b/kernel/cache.h
@@ -0,0 +1,49 @@
+#ifndef LINUX_DNBD_CACHE_H
+#define LINUX_DNBD_CACHE_H 1
+
+#include <linux/rbtree.h>
+#include <linux/blkdev.h>
+
+#include "../common/dnbd-cliserv.h"
+
+/* node for red-black tree */
+struct cache_node {
+ struct rb_node rb_node;
+ sector_t rb_key;
+ sector_t rb_data;
+ /* previous and next node used for LRU */
+ struct cache_node *prev;
+ struct cache_node *next;
+};
+
+typedef struct cache_node cache_node_t;
+
+/* cache characteristics */
+struct dnbd_cache {
+ int active; /* !0 when cache active */
+ char *fname; /* cache file name */
+ int fd; /* cache file descriptor */
+ struct file *filp; /* cache file structure */
+ struct rb_root root; /* root node of cache */
+ sector_t max_blocks; /* maximum of cached blocks */
+ sector_t used_blocks; /* current used blocks */
+ size_t blksize;
+ struct cache_node *head; /* head of LRU list */
+ struct cache_node *tail; /* tail of LRU list */
+ spinlock_t lock;
+ struct semaphore sema;
+ int (*insert) (struct dnbd_cache * cache, sector_t sector, void *buf);
+ int (*search) (struct dnbd_cache * cache, struct request *req);
+ void (*clean) (struct dnbd_cache * cache);
+ long hits; /* statistics */
+ long miss;
+ long lru;
+
+};
+
+typedef struct dnbd_cache dnbd_cache_t;
+
+int dnbd_cache_init(dnbd_cache_t * cache);
+int dnbd_cache_set(dnbd_cache_t * dcache, struct dnbd_file __user * cachefile, size_t blksize);
+
+#endif