From f1d0b649f163820a7bac7404d2a1a2f79cbe8553 Mon Sep 17 00:00:00 2001 From: Miroslav Crnic Date: Fri, 18 Jul 2025 08:46:01 +0000 Subject: [PATCH] kmod: break metadata span dependency --- kmod/metadata.c | 20 ++++++++++++++------ kmod/metadata.h | 23 ++++++++++++++++++++++- kmod/span.c | 13 ++++++++----- kmod/span.h | 16 ---------------- 4 files changed, 44 insertions(+), 28 deletions(-) diff --git a/kmod/metadata.c b/kmod/metadata.c index b53e4b28..e3417715 100644 --- a/kmod/metadata.c +++ b/kmod/metadata.c @@ -11,7 +11,6 @@ #include "crc.h" #include "rs.h" #include "file.h" -#include "span.h" #include "dir.h" int ternfs_mtu = TERNFS_DEFAULT_MTU; @@ -909,7 +908,14 @@ int ternfs_shard_add_span_certify( return 0; } -int ternfs_shard_file_spans(struct ternfs_fs_info* info, u64 file, u64 offset, u64* next_offset, void* data) { +int ternfs_shard_file_spans( + struct ternfs_fs_info* info, + u64 file, u64 offset, + u64* next_offset, + ternfs_file_spans_cb_inline_span inline_span_cb, + ternfs_file_spans_cb_span span_cb, + ternfs_file_spans_cb_block block_cb, + void* cb_data) { struct sk_buff* skb; u32 attempts; @@ -959,7 +965,7 @@ int ternfs_shard_file_spans(struct ternfs_fs_info* info, u64 file, u64 offset, u ternfs_bincode_get_finish_list_el(end); if (likely(ctx.err == 0)) { // TODO check CRC? - ternfs_file_spans_cb_inline_span(data, byte_offset.x, size.x, body.str.len, body.str.buf); + inline_span_cb(cb_data, byte_offset.x, size.x, body.str.len, body.str.buf); } } else { ternfs_fetched_blocks_span_get_start(&ctx, start); @@ -972,15 +978,17 @@ int ternfs_shard_file_spans(struct ternfs_fs_info* info, u64 file, u64 offset, u ctx.buf += TERNFS_FETCHED_BLOCK_SIZE*blocks.len; } blocks_ctx.end = ctx.buf; + + // DEPRECATED stripes ternfs_fetched_blocks_span_get_stripes_crc(&ctx, blocks, stripes_crc_resp); - uint32_t* stripes_crc = (uint32_t*)ctx.buf; if (likely(ctx.err == 0)) { ctx.buf += 4*stripes_crc_resp.len; } + // DEPRECATED_END stripes ternfs_fetched_blocks_span_get_end(&ctx, stripes_crc_resp, end); ternfs_bincode_get_finish_list_el(end); if (likely(ctx.err == 0)) { - ternfs_file_spans_cb_span(data, byte_offset.x, size.x, crc.x, storage_class.x, parity.x, stripes.x, cell_size.x, stripes_crc); + span_cb(cb_data, byte_offset.x, size.x, crc.x, storage_class.x, parity.x, stripes.x, cell_size.x); blocks_ctx.err = ctx.err; int j; for (j = 0; j < blocks.len; j++) { @@ -1015,7 +1023,7 @@ int ternfs_shard_file_spans(struct ternfs_fs_info* info, u64 file, u64 offset, u ternfs_block_service_get_end(&bs_ctx, bs_flags, end); ternfs_bincode_get_finish_list_el(end); if (likely(bs_ctx.err == 0)) { - ternfs_file_spans_cb_block(data, j, bs_id.x, ip1.x, port1.x, ip2.x, port2.x, bs_flags.x, block_id.x, crc.x); + block_cb(cb_data, j, bs_id.x, ip1.x, port1.x, ip2.x, port2.x, bs_flags.x, block_id.x, crc.x); } blocks_ctx.err = bs_ctx.err; } diff --git a/kmod/metadata.h b/kmod/metadata.h index 1d55d27f..041dc362 100644 --- a/kmod/metadata.h +++ b/kmod/metadata.h @@ -43,7 +43,28 @@ int ternfs_shard_parse_getattr_dir( struct ternfs_policy_body* stripe_policy ); int ternfs_shard_create_file(struct ternfs_fs_info* info, u8 shid, int itype, const char* name, int name_len, u64* ino, u64* cookie); -int ternfs_shard_file_spans(struct ternfs_fs_info* info, u64 file, u64 offset, u64* next_offset, void* data); + +typedef void (*ternfs_file_spans_cb_inline_span)(void* data, u64 offset, u32 size, u8 len, const char* body); +typedef void (*ternfs_file_spans_cb_span)( + void* data, u64 offset, u32 size, u32 crc, + u8 storage_class, u8 parity, u8 stripes, u32 cell_size +); +typedef void (*ternfs_file_spans_cb_block)( + void* data, int block_ix, + // block service stuff + u64 bs_id, u32 ip1, u16 port1, u32 ip2, u16 port2, u8 flags, + // block stuff + u64 block_id, u32 crc +); + +int ternfs_shard_file_spans( + struct ternfs_fs_info* info, + u64 file, u64 offset, + u64* next_offset, + ternfs_file_spans_cb_inline_span inline_span_cb, + ternfs_file_spans_cb_span span_cb, + ternfs_file_spans_cb_block block_cb, + void* cb_data); int ternfs_shard_add_inline_span(struct ternfs_fs_info* info, u64 file, u64 cookie, u64 offset, u32 size, const char* data, u8 len); int ternfs_shard_set_time(struct ternfs_fs_info* info, u64 file, u64 mtime, u64 atime); // Shoots a set_time request, does not wait/retry etc. diff --git a/kmod/span.c b/kmod/span.c index 48bca387..525792d9 100644 --- a/kmod/span.c +++ b/kmod/span.c @@ -818,7 +818,7 @@ struct get_span_ctx { int err; }; -void ternfs_file_spans_cb_span(void* data, u64 offset, u32 size, u32 crc, u8 storage_class, u8 parity, u8 stripes, u32 cell_size, const uint32_t* stripes_crcs) { +static void file_spans_cb_span(void* data, u64 offset, u32 size, u32 crc, u8 storage_class, u8 parity, u8 stripes, u32 cell_size) { ternfs_debug("offset=%llu size=%u crc=%08x storage_class=%d parity=%d stripes=%d cell_size=%u", offset, size, crc, storage_class, parity, stripes, cell_size); struct get_span_ctx* ctx = (struct get_span_ctx*)data; @@ -840,14 +840,13 @@ void ternfs_file_spans_cb_span(void* data, u64 offset, u32 size, u32 crc, u8 sto span->span.storage_class = storage_class; span->cell_size = cell_size; - memcpy(span->stripes_crc, stripes_crcs, sizeof(uint32_t)*stripes); span->num_stripes = stripes; span->parity = parity; ternfs_debug("adding normal span"); insert_span(&ctx->spans, &span->span); } -void ternfs_file_spans_cb_block( +static void file_spans_cb_block( void* data, int block_ix, u64 bs_id, u32 ip1, u16 port1, u32 ip2, u16 port2, u8 flags, u64 block_id, u32 crc @@ -877,7 +876,7 @@ void ternfs_file_spans_cb_block( } } -void ternfs_file_spans_cb_inline_span(void* data, u64 offset, u32 size, u8 len, const char* body) { +static void file_spans_cb_inline_span(void* data, u64 offset, u32 size, u8 len, const char* body) { ternfs_debug("offset=%llu size=%u len=%u body=%*pE", offset, size, len, len, body); struct get_span_ctx* ctx = (struct get_span_ctx*)data; @@ -936,7 +935,11 @@ retry: struct get_span_ctx ctx = { .err = 0, .enode = enode }; ctx.spans = RB_ROOT; err = ternfs_error_to_linux(ternfs_shard_file_spans( - (struct ternfs_fs_info*)enode->inode.i_sb->s_fs_info, enode->inode.i_ino, offset, &next_offset,&ctx + (struct ternfs_fs_info*)enode->inode.i_sb->s_fs_info, enode->inode.i_ino, offset, &next_offset, + file_spans_cb_inline_span, + file_spans_cb_span, + file_spans_cb_block, + &ctx )); err = err ?: ctx.err; if (unlikely(err)) { diff --git a/kmod/span.h b/kmod/span.h index 2f63334c..0ad1010f 100644 --- a/kmod/span.h +++ b/kmod/span.h @@ -92,22 +92,6 @@ void ternfs_unlink_spans(struct ternfs_inode* enode); // even returning error aggressively is fine. int ternfs_span_get_pages(struct ternfs_block_span* block_span, struct address_space* mapping, struct list_head *pages, unsigned nr_pages, struct list_head *extra_pages); -// Callbacks for metadata -void ternfs_file_spans_cb_span( - void* data, u64 offset, u32 size, u32 crc, - u8 storage_class, u8 parity, u8 stripes, u32 cell_size, - const uint32_t* stripes_crcs -); - -void ternfs_file_spans_cb_block( - void* data, int block_ix, - // block service stuff - u64 bs_id, u32 ip1, u16 port1, u32 ip2, u16 port2, u8 flags, - // block stuff - u64 block_id, u32 crc -); -void ternfs_file_spans_cb_inline_span(void* data, u64 offset, u32 size, u8 len, const char* body); - int __init ternfs_span_init(void); void __cold ternfs_span_exit(void);