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