2013-04-16 23:57:41 -04:00
|
|
|
/* -*- mode: C; c-basic-offset: 4 -*- */
|
|
|
|
#ifndef BLOCKTABLE_H
|
|
|
|
#define BLOCKTABLE_H
|
|
|
|
#ident "Copyright (c) 2007, 2008 Tokutek Inc. All rights reserved."
|
|
|
|
|
|
|
|
typedef struct block_table *BLOCK_TABLE;
|
|
|
|
|
|
|
|
//Needed by tests, brtdump
|
|
|
|
struct block_translation_pair {
|
|
|
|
DISKOFF diskoff; // When in free list, set to the next free block. In this case it's really a BLOCKNUM.
|
|
|
|
DISKOFF size; // set to 0xFFFFFFFFFFFFFFFF for free
|
|
|
|
};
|
|
|
|
|
2013-04-16 23:57:44 -04:00
|
|
|
void toku_block_realloc(BLOCK_TABLE bt, BLOCKNUM b, u_int64_t size, u_int64_t *offset, int *dirty);
|
2013-04-16 23:57:41 -04:00
|
|
|
void toku_block_alloc(BLOCK_TABLE bt, u_int64_t size, u_int64_t *offset);
|
|
|
|
void toku_block_free(BLOCK_TABLE bt, u_int64_t offset);
|
|
|
|
DISKOFF toku_block_get_offset(BLOCK_TABLE bt, BLOCKNUM b);
|
|
|
|
DISKOFF toku_block_get_size(BLOCK_TABLE bt, BLOCKNUM b);
|
2013-04-16 23:57:42 -04:00
|
|
|
void toku_block_get_offset_size(BLOCK_TABLE bt, BLOCKNUM b, DISKOFF *offset, DISKOFF *size);
|
2013-04-16 23:57:42 -04:00
|
|
|
int toku_allocate_diskblocknumber(BLOCK_TABLE bt, BLOCKNUM *res, int *dirty);
|
|
|
|
int toku_free_diskblocknumber(BLOCK_TABLE bt, BLOCKNUM *b, int *dirty);
|
2013-04-16 23:57:41 -04:00
|
|
|
void toku_verify_diskblocknumber_allocated(BLOCK_TABLE bt, BLOCKNUM b);
|
|
|
|
void toku_block_verify_no_free_blocks(BLOCK_TABLE bt);
|
|
|
|
u_int64_t toku_block_allocator_allocated_limit(BLOCK_TABLE bt);
|
|
|
|
void toku_block_dump_translation_table(FILE *f, BLOCK_TABLE bt);
|
|
|
|
void toku_block_dump_translation(BLOCK_TABLE bt, u_int64_t offset);
|
|
|
|
|
|
|
|
void toku_blocktable_destroy(BLOCK_TABLE *btp);
|
|
|
|
void toku_blocktable_debug_set_translation(BLOCK_TABLE bt,
|
|
|
|
u_int64_t limit,
|
|
|
|
struct block_translation_pair *table);
|
|
|
|
void toku_blocktable_create(BLOCK_TABLE *btp,
|
|
|
|
BLOCKNUM free_blocks,
|
|
|
|
BLOCKNUM unused_blocks,
|
|
|
|
u_int64_t translated_blocknum_limit,
|
|
|
|
u_int64_t block_translation_address_on_disk,
|
|
|
|
u_int64_t block_translation_size_on_disk,
|
|
|
|
unsigned char *buffer);
|
|
|
|
void toku_blocktable_create_new(BLOCK_TABLE *bt);
|
|
|
|
|
|
|
|
void toku_block_recovery_set_unused_blocks(BLOCK_TABLE bt, BLOCKNUM newunused);
|
|
|
|
void toku_block_recovery_set_free_blocks(BLOCK_TABLE bt, BLOCKNUM newfree);
|
|
|
|
BLOCKNUM toku_block_get_unused_blocks(BLOCK_TABLE bt);
|
|
|
|
BLOCKNUM toku_block_get_free_blocks(BLOCK_TABLE bt);
|
|
|
|
u_int64_t toku_block_get_translated_blocknum_limit(BLOCK_TABLE bt);
|
|
|
|
|
|
|
|
void toku_block_memcpy_translation_table(BLOCK_TABLE bt, size_t n, void *p);
|
|
|
|
|
|
|
|
//Unlocked/multi ops
|
2013-04-16 23:57:44 -04:00
|
|
|
void toku_block_lock_for_multiple_operations(BLOCK_TABLE bt);
|
|
|
|
void toku_block_unlock_for_multiple_operations(BLOCK_TABLE bt);
|
2013-04-16 23:57:41 -04:00
|
|
|
|
|
|
|
void toku_block_realloc_translation_unlocked(BLOCK_TABLE bt);
|
|
|
|
void toku_block_wbuf_free_blocks_unlocked(BLOCK_TABLE bt, struct wbuf *wbuf);
|
|
|
|
void toku_block_wbuf_unused_blocks_unlocked(BLOCK_TABLE bt, struct wbuf *wbuf);
|
|
|
|
void toku_block_wbuf_translated_blocknum_limit_unlocked(BLOCK_TABLE bt, struct wbuf *wbuf);
|
|
|
|
void toku_block_wbuf_block_translation_address_on_disk_unlocked(BLOCK_TABLE bt, struct wbuf *wbuf);
|
|
|
|
void toku_block_wbuf_init_and_fill_unlocked(BLOCK_TABLE bt, struct wbuf *w,
|
|
|
|
u_int64_t *size, u_int64_t *address);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|