mirror of
https://github.com/XTXMarkets/ternfs.git
synced 2025-12-20 10:10:17 -06:00
kmod: break metadata span dependency
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
13
kmod/span.c
13
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)) {
|
||||
|
||||
16
kmod/span.h
16
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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user