mirror of
https://github.com/versity/scoutfs.git
synced 2026-01-03 02:45:20 +00:00
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:
@@ -24,6 +24,7 @@
|
|||||||
#define SCOUTFS_CHUNK_SHIFT 22
|
#define SCOUTFS_CHUNK_SHIFT 22
|
||||||
#define SCOUTFS_CHUNK_SIZE (1 << SCOUTFS_CHUNK_SHIFT)
|
#define SCOUTFS_CHUNK_SIZE (1 << SCOUTFS_CHUNK_SHIFT)
|
||||||
#define SCOUTFS_CHUNK_BLOCK_SHIFT (SCOUTFS_CHUNK_SHIFT - SCOUTFS_BLOCK_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)
|
#define SCOUTFS_BLOCKS_PER_CHUNK (1 << SCOUTFS_CHUNK_BLOCK_SHIFT)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -93,6 +94,10 @@ struct scoutfs_ring_map_block {
|
|||||||
__le64 blknos[0];
|
__le64 blknos[0];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
#define SCOUTFS_RING_MAP_BLOCKS \
|
||||||
|
((SCOUTFS_BLOCK_SIZE - sizeof(struct scoutfs_ring_map_block)) / \
|
||||||
|
sizeof(__le64))
|
||||||
|
|
||||||
struct scoutfs_ring_entry {
|
struct scoutfs_ring_entry {
|
||||||
u8 type;
|
u8 type;
|
||||||
__le16 len;
|
__le16 len;
|
||||||
@@ -112,15 +117,11 @@ struct scoutfs_ring_block {
|
|||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SCOUTFS_RING_REMOVE_MANIFEST = 0,
|
SCOUTFS_RING_ADD_MANIFEST = 0,
|
||||||
SCOUTFS_RING_ADD_MANIFEST,
|
SCOUTFS_RING_DEL_MANIFEST,
|
||||||
SCOUTFS_RING_BITMAP,
|
SCOUTFS_RING_BITMAP,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct scoutfs_ring_remove_manifest {
|
|
||||||
__le64 blkno;
|
|
||||||
} __packed;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Including both keys might make the manifest too large. It might be
|
* 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
|
* 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
|
* isn't unused key space between blocks in a level. We might search
|
||||||
* blocks when we didn't need to.
|
* blocks when we didn't need to.
|
||||||
*/
|
*/
|
||||||
struct scoutfs_ring_add_manifest {
|
struct scoutfs_ring_manifest_entry {
|
||||||
__le64 blkno;
|
__le64 blkno;
|
||||||
__le64 seq;
|
__le64 seq;
|
||||||
__u8 level;
|
__u8 level;
|
||||||
@@ -136,6 +137,13 @@ struct scoutfs_ring_add_manifest {
|
|||||||
struct scoutfs_key last;
|
struct scoutfs_key last;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
struct scoutfs_ring_del_manifest {
|
||||||
|
__le64 blkno;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
/* 2^22 * 10^13 > 2^64 */
|
||||||
|
#define SCOUTFS_MAX_LEVEL 13
|
||||||
|
|
||||||
struct scoutfs_ring_bitmap {
|
struct scoutfs_ring_bitmap {
|
||||||
__le32 offset;
|
__le32 offset;
|
||||||
__le64 bits[2];
|
__le64 bits[2];
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ static int write_new_fs(char *path, int fd)
|
|||||||
struct scoutfs_ring_map_block *map;
|
struct scoutfs_ring_map_block *map;
|
||||||
struct scoutfs_ring_block *ring;
|
struct scoutfs_ring_block *ring;
|
||||||
struct scoutfs_ring_entry *ent;
|
struct scoutfs_ring_entry *ent;
|
||||||
struct scoutfs_ring_add_manifest *mani;
|
struct scoutfs_ring_manifest_entry *mani;
|
||||||
struct scoutfs_ring_bitmap *bm;
|
struct scoutfs_ring_bitmap *bm;
|
||||||
struct scoutfs_item_block *iblk;
|
struct scoutfs_item_block *iblk;
|
||||||
struct scoutfs_item_header *ihdr;
|
struct scoutfs_item_header *ihdr;
|
||||||
|
|||||||
@@ -154,10 +154,10 @@ static int print_log_segments(int fd, __le64 *log_segs, u64 total_chunks)
|
|||||||
static char *ent_type_str(u8 type)
|
static char *ent_type_str(u8 type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SCOUTFS_RING_REMOVE_MANIFEST:
|
|
||||||
return "REMOVE_MANIFEST";
|
|
||||||
case SCOUTFS_RING_ADD_MANIFEST:
|
case SCOUTFS_RING_ADD_MANIFEST:
|
||||||
return "ADD_MANIFEST";
|
return "ADD_MANIFEST";
|
||||||
|
case SCOUTFS_RING_DEL_MANIFEST:
|
||||||
|
return "DEL_MANIFEST";
|
||||||
case SCOUTFS_RING_BITMAP:
|
case SCOUTFS_RING_BITMAP:
|
||||||
return "BITMAP";
|
return "BITMAP";
|
||||||
default:
|
default:
|
||||||
@@ -167,8 +167,8 @@ static char *ent_type_str(u8 type)
|
|||||||
|
|
||||||
static void print_ring_entry(int fd, struct scoutfs_ring_entry *ent)
|
static void print_ring_entry(int fd, struct scoutfs_ring_entry *ent)
|
||||||
{
|
{
|
||||||
struct scoutfs_ring_remove_manifest *rem;
|
struct scoutfs_ring_manifest_entry *ment;
|
||||||
struct scoutfs_ring_add_manifest *add;
|
struct scoutfs_ring_del_manifest *del;
|
||||||
struct scoutfs_ring_bitmap *bm;
|
struct scoutfs_ring_bitmap *bm;
|
||||||
|
|
||||||
printf(" entry:\n"
|
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));
|
ent->type, ent_type_str(ent->type), le16_to_cpu(ent->len));
|
||||||
|
|
||||||
switch(ent->type) {
|
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:
|
case SCOUTFS_RING_ADD_MANIFEST:
|
||||||
add = (void *)(ent + 1);
|
ment = (void *)(ent + 1);
|
||||||
printf(" blkno: %llu\n"
|
printf(" blkno: %llu\n"
|
||||||
" seq: %llu\n"
|
" seq: %llu\n"
|
||||||
" level: %u\n"
|
" level: %u\n"
|
||||||
" first: "SKF"\n"
|
" first: "SKF"\n"
|
||||||
" last: "SKF"\n",
|
" last: "SKF"\n",
|
||||||
le64_to_cpu(add->blkno), le64_to_cpu(add->seq),
|
le64_to_cpu(ment->blkno), le64_to_cpu(ment->seq),
|
||||||
add->level, SKA(&add->first), SKA(&add->last));
|
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;
|
break;
|
||||||
case SCOUTFS_RING_BITMAP:
|
case SCOUTFS_RING_BITMAP:
|
||||||
bm = (void *)(ent + 1);
|
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,
|
static void update_log_segs(struct scoutfs_ring_entry *ent,
|
||||||
__le64 *log_segs)
|
__le64 *log_segs)
|
||||||
{
|
{
|
||||||
struct scoutfs_ring_remove_manifest *rem;
|
struct scoutfs_ring_manifest_entry *add;
|
||||||
struct scoutfs_ring_add_manifest *add;
|
struct scoutfs_ring_del_manifest *del;
|
||||||
u64 bit;
|
u64 bit;
|
||||||
|
|
||||||
switch(ent->type) {
|
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:
|
case SCOUTFS_RING_ADD_MANIFEST:
|
||||||
add = (void *)(ent + 1);
|
add = (void *)(ent + 1);
|
||||||
bit = le64_to_cpu(add->blkno) >> SCOUTFS_CHUNK_BLOCK_SHIFT;
|
bit = le64_to_cpu(add->blkno) >> SCOUTFS_CHUNK_BLOCK_SHIFT;
|
||||||
set_le_bit(log_segs, bit);
|
set_le_bit(log_segs, bit);
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user