Below is the file 'src/fs/coss/store_coss.h' from this revision. You can also download the file.

#ifndef __COSS_H__
#define __COSS_H__

#ifndef COSS_MEMBUF_SZ
#define	COSS_MEMBUF_SZ	1048576
#endif

/* Note that swap_filen in sio/e are actually disk block offsets too! */

typedef struct _cossmembuf CossMemBuf;
typedef struct _cossinfo CossInfo;
typedef struct _cossstate CossState;
typedef struct _cossindex CossIndexNode;
typedef struct _coss_pending_reloc CossPendingReloc;
typedef struct _coss_read_op CossReadOp;
typedef struct _cossstripe CossStripe;

/* What we're doing in storeCossAllocate() */
#define COSS_ALLOC_NOTIFY		0
#define COSS_ALLOC_ALLOCATE		1
#define COSS_ALLOC_REALLOC		2

/*
 * Define this if you would like to use the aufs IO method for
 * disk IO instead of the POSIX AIO method.
 */
//#define	USE_AUFSOPS 1

#if USE_AUFSOPS
/* XXX a hack; the async ops should be broken out! */
typedef void AIOCB(int fd, void *cbdata, const char *buf,
		    int aio_return, int aio_errno);
void aioWrite(int, off_t offset, char *, int size, AIOCB *, void *, FREE *);
void aioRead(int, off_t offset, int size, AIOCB *, void *);
void aioInit(void);
int aioCheckCallbacks(SwapDir *);
void aioSync(SwapDir *);
void squidaio_init(void);
void squidaio_shutdown(void);
extern int squidaio_magic1;
int aioQueueSize(void);
extern int squidaio_magic1;
#define MAGIC1 squidaio_magic1
#endif


struct _coss_stats {
    int stripes;
    int dead_stripes;
    struct {
	int alloc;
	int realloc;
	int collisions;
    } alloc;
    int disk_overflows;
    int stripe_overflows;
    int open_mem_hits;
    int open_mem_misses;
    struct {
	int ops;
	int success;
	int fail;
    } open, create, close, unlink, read, write, stripe_write;
};


struct _cossmembuf {
    dlink_node node;
    off_t diskstart;		/* in bytes */
    off_t diskend;		/* in bytes */
    int stripe;
    SwapDir *SD;
    int lockcount;
    char buffer[COSS_MEMBUF_SZ];
    struct _cossmembuf_flags {
	unsigned int full:1;
	unsigned int writing:1;
	unsigned int written:1;
	unsigned int dead:1;
    } flags;
    int numobjs;
};

typedef enum {
	COSS_OP_NONE,
	COSS_OP_READ,
} coss_op_t;

struct _coss_read_op {
	/*
	 * callback/callback data are part of the sio, and only one
	 * read op will be scheduled at any time
	 */
	coss_op_t type;
	dlink_node node;	/* per-storedir list */
	dlink_node pending_op_node;	/* children of the parent op we're blocking on */
	storeIOState *sio;
	size_t requestlen;
	size_t requestoffset;	/* in blocks */
	off_t reqdiskoffset;	/* in blocks */
	char *requestbuf;
	char completed;
	CossPendingReloc *pr;	/* NULL if we're not on a pending op list yet */
};

struct _cossstripe {
	int id;
	int numdiskobjs;
	int pending_relocs;
	struct _cossmembuf *membuf;
	dlink_list objlist;
};

struct _coss_pending_reloc {
	CossInfo *cs;
	dlink_node node;
	size_t len;
	sfileno original_filen, new_filen;	/* in blocks, not in bytes */
	dlink_list ops;
	char *p;
};


/* Per-storedir info */
struct _cossinfo {
    dlink_list membufs;
    dlink_list dead_membufs;
    struct _cossmembuf *current_membuf;
    off_t current_offset;	/* in bytes */
    int fd;
    int swaplog_fd;
    int numcollisions;
    dlink_list pending_relocs;
    dlink_list pending_ops;
    int pending_reloc_count;
    int count;
#if ! USE_AUFSOPS
    async_queue_t aq;
#endif
    dlink_node *walk_current;
    unsigned int blksz_bits;
    unsigned int blksz_mask;	/* just 1<<blksz_bits - 1 */

    int numstripes;
    struct _cossstripe *stripes;
    int curstripe;
    struct {
	    char rebuilding;
	    char reading;
	    int curstripe;
	    char *buf;
	    int buflen;
    } rebuild;
};

struct _cossindex {
    /* Note: the dlink_node MUST be the first member of the structure.
     * This member is later pointer typecasted to coss_index_node *.
     */
    dlink_node node;
};


/* Per-storeiostate info */
struct _cossstate {
    char *requestbuf;
    size_t requestlen;
    size_t requestoffset;	/* in blocks */
    off_t reqdiskoffset;	/* in blocks */
    struct {
	unsigned int reading:1;
	unsigned int writing:1;
	unsigned int reloc:1;
    } flags;
    struct _cossmembuf *locked_membuf;
};


/* Whether the coss system has been setup or not */
extern int coss_initialised;
extern MemPool *coss_membuf_pool;
extern MemPool *coss_state_pool;
extern MemPool *coss_index_pool;
extern MemPool *coss_realloc_pool;
extern MemPool *coss_op_pool;

/*
 * Store IO stuff
 */
extern STOBJCREATE storeCossCreate;
extern STOBJOPEN storeCossOpen;
extern STOBJCLOSE storeCossClose;
extern STOBJREAD storeCossRead;
extern STOBJWRITE storeCossWrite;
extern STOBJUNLINK storeCossUnlink;
extern STSYNC storeCossSync;

extern void storeCossAdd(SwapDir * sd, StoreEntry * e, int curstripe);
extern void storeCossRemove(SwapDir *, StoreEntry *);
extern void storeCossStartMembuf(SwapDir * SD);
extern void membufsDump(CossInfo *cs, StoreEntry *e);
extern void storeCossFreeDeadMemBufs(CossInfo *cs);
extern int storeCossFilenoToStripe(CossInfo *cs, sfileno filen);

extern struct _coss_stats coss_stats;

#endif