Minor ring manifest format updates

Update to the format changes that were made while implementing ring
replay in the kernel.
This commit is contained in:
Zach Brown
2016-02-25 22:45:06 -08:00
parent 906c0186bc
commit d8f76cb893
3 changed files with 35 additions and 27 deletions

View File

@@ -24,6 +24,7 @@
#define SCOUTFS_CHUNK_SHIFT 22
#define SCOUTFS_CHUNK_SIZE (1 << SCOUTFS_CHUNK_SHIFT)
#define SCOUTFS_CHUNK_BLOCK_SHIFT (SCOUTFS_CHUNK_SHIFT - SCOUTFS_BLOCK_SHIFT)
#define SCOUTFS_CHUNK_BLOCK_MASK ((1 << SCOUTFS_CHUNK_BLOCK_SHIFT) - 1)
#define SCOUTFS_BLOCKS_PER_CHUNK (1 << SCOUTFS_CHUNK_BLOCK_SHIFT)
/*
@@ -93,6 +94,10 @@ struct scoutfs_ring_map_block {
__le64 blknos[0];
} __packed;
#define SCOUTFS_RING_MAP_BLOCKS \
((SCOUTFS_BLOCK_SIZE - sizeof(struct scoutfs_ring_map_block)) / \
sizeof(__le64))
struct scoutfs_ring_entry {
u8 type;
__le16 len;
@@ -112,15 +117,11 @@ struct scoutfs_ring_block {
} __packed;
enum {
SCOUTFS_RING_REMOVE_MANIFEST = 0,
SCOUTFS_RING_ADD_MANIFEST,
SCOUTFS_RING_ADD_MANIFEST = 0,
SCOUTFS_RING_DEL_MANIFEST,
SCOUTFS_RING_BITMAP,
};
struct scoutfs_ring_remove_manifest {
__le64 blkno;
} __packed;
/*
* Including both keys might make the manifest too large. It might be
* better to only include one key and infer a block's range from the
@@ -128,7 +129,7 @@ struct scoutfs_ring_remove_manifest {
* isn't unused key space between blocks in a level. We might search
* blocks when we didn't need to.
*/
struct scoutfs_ring_add_manifest {
struct scoutfs_ring_manifest_entry {
__le64 blkno;
__le64 seq;
__u8 level;
@@ -136,6 +137,13 @@ struct scoutfs_ring_add_manifest {
struct scoutfs_key last;
} __packed;
struct scoutfs_ring_del_manifest {
__le64 blkno;
} __packed;
/* 2^22 * 10^13 > 2^64 */
#define SCOUTFS_MAX_LEVEL 13
struct scoutfs_ring_bitmap {
__le32 offset;
__le64 bits[2];

View File

@@ -46,7 +46,7 @@ static int write_new_fs(char *path, int fd)
struct scoutfs_ring_map_block *map;
struct scoutfs_ring_block *ring;
struct scoutfs_ring_entry *ent;
struct scoutfs_ring_add_manifest *mani;
struct scoutfs_ring_manifest_entry *mani;
struct scoutfs_ring_bitmap *bm;
struct scoutfs_item_block *iblk;
struct scoutfs_item_header *ihdr;

View File

@@ -154,10 +154,10 @@ static int print_log_segments(int fd, __le64 *log_segs, u64 total_chunks)
static char *ent_type_str(u8 type)
{
switch (type) {
case SCOUTFS_RING_REMOVE_MANIFEST:
return "REMOVE_MANIFEST";
case SCOUTFS_RING_ADD_MANIFEST:
return "ADD_MANIFEST";
case SCOUTFS_RING_DEL_MANIFEST:
return "DEL_MANIFEST";
case SCOUTFS_RING_BITMAP:
return "BITMAP";
default:
@@ -167,8 +167,8 @@ static char *ent_type_str(u8 type)
static void print_ring_entry(int fd, struct scoutfs_ring_entry *ent)
{
struct scoutfs_ring_remove_manifest *rem;
struct scoutfs_ring_add_manifest *add;
struct scoutfs_ring_manifest_entry *ment;
struct scoutfs_ring_del_manifest *del;
struct scoutfs_ring_bitmap *bm;
printf(" entry:\n"
@@ -177,20 +177,20 @@ static void print_ring_entry(int fd, struct scoutfs_ring_entry *ent)
ent->type, ent_type_str(ent->type), le16_to_cpu(ent->len));
switch(ent->type) {
case SCOUTFS_RING_REMOVE_MANIFEST:
rem = (void *)(ent + 1);
printf(" blkno: %llu\n",
le64_to_cpu(rem->blkno));
break;
case SCOUTFS_RING_ADD_MANIFEST:
add = (void *)(ent + 1);
ment = (void *)(ent + 1);
printf(" blkno: %llu\n"
" seq: %llu\n"
" level: %u\n"
" first: "SKF"\n"
" last: "SKF"\n",
le64_to_cpu(add->blkno), le64_to_cpu(add->seq),
add->level, SKA(&add->first), SKA(&add->last));
le64_to_cpu(ment->blkno), le64_to_cpu(ment->seq),
ment->level, SKA(&ment->first), SKA(&ment->last));
break;
case SCOUTFS_RING_DEL_MANIFEST:
del = (void *)(ent + 1);
printf(" blkno: %llu\n",
le64_to_cpu(del->blkno));
break;
case SCOUTFS_RING_BITMAP:
bm = (void *)(ent + 1);
@@ -205,21 +205,21 @@ static void print_ring_entry(int fd, struct scoutfs_ring_entry *ent)
static void update_log_segs(struct scoutfs_ring_entry *ent,
__le64 *log_segs)
{
struct scoutfs_ring_remove_manifest *rem;
struct scoutfs_ring_add_manifest *add;
struct scoutfs_ring_manifest_entry *add;
struct scoutfs_ring_del_manifest *del;
u64 bit;
switch(ent->type) {
case SCOUTFS_RING_REMOVE_MANIFEST:
rem = (void *)(ent + 1);
bit = le64_to_cpu(rem->blkno) >> SCOUTFS_CHUNK_BLOCK_SHIFT;
clear_le_bit(log_segs, bit);
break;
case SCOUTFS_RING_ADD_MANIFEST:
add = (void *)(ent + 1);
bit = le64_to_cpu(add->blkno) >> SCOUTFS_CHUNK_BLOCK_SHIFT;
set_le_bit(log_segs, bit);
break;
case SCOUTFS_RING_DEL_MANIFEST:
del = (void *)(ent + 1);
bit = le64_to_cpu(del->blkno) >> SCOUTFS_CHUNK_BLOCK_SHIFT;
clear_le_bit(log_segs, bit);
break;
}
}