diff --git a/utils/src/format.h b/utils/src/format.h index d27748c0..bafaef80 100644 --- a/utils/src/format.h +++ b/utils/src/format.h @@ -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]; diff --git a/utils/src/mkfs.c b/utils/src/mkfs.c index f42fbe04..396b3997 100644 --- a/utils/src/mkfs.c +++ b/utils/src/mkfs.c @@ -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; diff --git a/utils/src/print.c b/utils/src/print.c index 324db059..f00ef3e3 100644 --- a/utils/src/print.c +++ b/utils/src/print.c @@ -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; } }