thin-provisioning-tools/functional-tests/bcache/bcache.h
2017-09-07 15:39:55 +01:00

70 lines
1.6 KiB
C

#ifndef BCACHE_H
#define BCACHE_H
#include <stdint.h>
/*----------------------------------------------------------------*/
typedef uint64_t block_address;
typedef uint64_t sector_t;
struct block;
struct bcache;
// FIXME: allow the cache to be opened read only.
struct bcache *bcache_create(int fd, sector_t block_size,
uint64_t on_disk_blocks,
unsigned nr_cache_blocks);
/*
* A simpler way of creating a bcache that assumes 4k block size, and stats to
* get the file size.
*/
struct bcache *bcache_simple(const char *path, unsigned nr_cache_blocks);
void bcache_destroy(struct bcache *cache);
uint64_t get_nr_blocks(struct bcache *cache);
uint64_t get_nr_locked(struct bcache *cache);
int flush_cache(struct bcache *cache);
struct bcache;
struct block {
/* clients may only access these two fields */
void *data;
uint64_t index;
struct bcache *cache;
struct list_head list;
struct list_head hash;
unsigned flags;
unsigned ref_count;
int error;
};
enum get_flags {
/*
* The block will be zeroed before get_block returns it. This
* potentially avoids a read if the block is not already in the cache.
* GF_DIRTY is implicit.
*/
GF_ZERO = (1 << 0),
/*
* Indicates the caller is intending to change the data in the block, a
* writeback will occur after the block is released.
*/
GF_DIRTY = (1 << 1),
};
struct block *get_block(struct bcache *cache, block_address index, unsigned flags);
void prefetch_block(struct bcache *cache, block_address index);
void release_block(struct block *b);
/*----------------------------------------------------------------*/
#endif