diff options
author | Lars Müller | 2008-03-01 19:30:38 +0100 |
---|---|---|
committer | Lars Müller | 2008-03-01 19:30:38 +0100 |
commit | 868fec1f8eca7c344fc9ac057b7418331299d9ce (patch) | |
tree | c07cdf11db710dc495c3c7a513cc0f8fd68d6626 /kernel/cache.h | |
download | dnbd-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.h | 49 |
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 |