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 "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;
}

View File

@@ -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.

View File

@@ -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)) {

View File

@@ -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);