kmod: break metadata span dependency

This commit is contained in:
Miroslav Crnic
2025-07-18 08:46:01 +00:00
parent c007b763dc
commit f1d0b649f1
4 changed files with 44 additions and 28 deletions

View File

@@ -11,7 +11,6 @@
#include "crc.h" #include "crc.h"
#include "rs.h" #include "rs.h"
#include "file.h" #include "file.h"
#include "span.h"
#include "dir.h" #include "dir.h"
int ternfs_mtu = TERNFS_DEFAULT_MTU; int ternfs_mtu = TERNFS_DEFAULT_MTU;
@@ -909,7 +908,14 @@ int ternfs_shard_add_span_certify(
return 0; 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; struct sk_buff* skb;
u32 attempts; 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); ternfs_bincode_get_finish_list_el(end);
if (likely(ctx.err == 0)) { if (likely(ctx.err == 0)) {
// TODO check CRC? // 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 { } else {
ternfs_fetched_blocks_span_get_start(&ctx, start); 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; ctx.buf += TERNFS_FETCHED_BLOCK_SIZE*blocks.len;
} }
blocks_ctx.end = ctx.buf; blocks_ctx.end = ctx.buf;
// DEPRECATED stripes
ternfs_fetched_blocks_span_get_stripes_crc(&ctx, blocks, stripes_crc_resp); 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)) { if (likely(ctx.err == 0)) {
ctx.buf += 4*stripes_crc_resp.len; ctx.buf += 4*stripes_crc_resp.len;
} }
// DEPRECATED_END stripes
ternfs_fetched_blocks_span_get_end(&ctx, stripes_crc_resp, end); ternfs_fetched_blocks_span_get_end(&ctx, stripes_crc_resp, end);
ternfs_bincode_get_finish_list_el(end); ternfs_bincode_get_finish_list_el(end);
if (likely(ctx.err == 0)) { 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; blocks_ctx.err = ctx.err;
int j; int j;
for (j = 0; j < blocks.len; 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_block_service_get_end(&bs_ctx, bs_flags, end);
ternfs_bincode_get_finish_list_el(end); ternfs_bincode_get_finish_list_el(end);
if (likely(bs_ctx.err == 0)) { 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; blocks_ctx.err = bs_ctx.err;
} }

View File

@@ -43,7 +43,28 @@ int ternfs_shard_parse_getattr_dir(
struct ternfs_policy_body* stripe_policy 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_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_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); 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. // Shoots a set_time request, does not wait/retry etc.

View File

@@ -818,7 +818,7 @@ struct get_span_ctx {
int err; 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); 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; 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->span.storage_class = storage_class;
span->cell_size = cell_size; span->cell_size = cell_size;
memcpy(span->stripes_crc, stripes_crcs, sizeof(uint32_t)*stripes);
span->num_stripes = stripes; span->num_stripes = stripes;
span->parity = parity; span->parity = parity;
ternfs_debug("adding normal span"); ternfs_debug("adding normal span");
insert_span(&ctx->spans, &span->span); insert_span(&ctx->spans, &span->span);
} }
void ternfs_file_spans_cb_block( static void file_spans_cb_block(
void* data, int block_ix, void* data, int block_ix,
u64 bs_id, u32 ip1, u16 port1, u32 ip2, u16 port2, u8 flags, u64 bs_id, u32 ip1, u16 port1, u32 ip2, u16 port2, u8 flags,
u64 block_id, u32 crc 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); 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; struct get_span_ctx* ctx = (struct get_span_ctx*)data;
@@ -936,7 +935,11 @@ retry:
struct get_span_ctx ctx = { .err = 0, .enode = enode }; struct get_span_ctx ctx = { .err = 0, .enode = enode };
ctx.spans = RB_ROOT; ctx.spans = RB_ROOT;
err = ternfs_error_to_linux(ternfs_shard_file_spans( 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; err = err ?: ctx.err;
if (unlikely(err)) { if (unlikely(err)) {

View File

@@ -92,22 +92,6 @@ void ternfs_unlink_spans(struct ternfs_inode* enode);
// even returning error aggressively is fine. // 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); 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); int __init ternfs_span_init(void);
void __cold ternfs_span_exit(void); void __cold ternfs_span_exit(void);