On 8/16/19 12:08 PM, Eric Blake wrote:
Implementing extents requires some coordination for the Rust code to
call back into libnbdkit; I'm not familiar with Rust enough to do
that. But with placeholders for those slots, implementing
can_cache/cache is trivial. This improves the situation mentioned in
commit 031fae85.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
+++ b/plugins/rust/src/lib.rs
@@ -93,6 +93,15 @@ pub struct Plugin {
pub magic_config_key: *const c_char,
pub can_multi_conn: Option<extern fn (h: *mut c_void) -> c_int>,
+
+ // Slots for extents functions, which needs more integration.
+ _can_extents: Option<extern fn ()>,
+ _extents: Option<extern fn ()>,
Here, I was just copying what we had already done for the v1 fields that
should remain unused (see above, in _pread_old for example). But is
there a saner way to write a Rust struct that reserves the space
required by the C ABI, but where the field MUST be left as NULL and not
populated with Some(...) by the end user? Perhaps by marking the field
const, while the rest of the struct is used as a mutable? (Doesn't
change this patch, so much as a cleanup we could apply on top to prevent
all of our _named fields from being overwritten after the initial
construction with default values).
And of course, if you want to actually implement extents, and figure out
how to expose C-based nbdkit functions to be called by Rust code, be my
guest (for .zero, we need nbdkit_set_error(), for extents, we need
nbdkit_add_extent(), and then we have several other utility functions
like nbdkit_realpath() that could be useful).
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization:
qemu.org |
libvirt.org