diff --git a/io-engine-tests/src/error_bdev.rs b/io-engine-tests/src/error_bdev.rs index 89a0d51c7..bd857b290 100644 --- a/io-engine-tests/src/error_bdev.rs +++ b/io-engine-tests/src/error_bdev.rs @@ -16,7 +16,13 @@ pub fn create_error_bdev(error_device: &str, backing_device: &str) { unsafe { // this allows us to create a bdev without its name being a uri - retval = create_aio_bdev(cname.as_ptr(), filename.as_ptr(), 512, false) + retval = create_aio_bdev( + cname.as_ptr(), + filename.as_ptr(), + 512, + false, + false, + ) }; assert_eq!(retval, 0); diff --git a/io-engine/src/bdev/aio.rs b/io-engine/src/bdev/aio.rs index 99fc5cbf2..52dc1e91a 100644 --- a/io-engine/src/bdev/aio.rs +++ b/io-engine/src/bdev/aio.rs @@ -116,6 +116,7 @@ impl CreateDestroy for Aio { cname.as_ptr(), self.blk_size, false, + false, ) }; diff --git a/io-engine/src/bdev/uring.rs b/io-engine/src/bdev/uring.rs index b8d8ba69e..6a1c19b03 100644 --- a/io-engine/src/bdev/uring.rs +++ b/io-engine/src/bdev/uring.rs @@ -10,7 +10,7 @@ use futures::channel::oneshot; use snafu::ResultExt; use url::Url; -use spdk_rs::libspdk::{create_uring_bdev, delete_uring_bdev}; +use spdk_rs::libspdk::{bdev_uring_opts, create_uring_bdev, delete_uring_bdev}; use crate::{ bdev::{dev::reject_unknown_parameters, util::uri, CreateDestroy, GetName}, @@ -101,10 +101,16 @@ impl CreateDestroy for Uring { } let cname = CString::new(self.get_name()).unwrap(); + let opts = bdev_uring_opts { + name: cname.as_ptr(), + filename: cname.as_ptr(), + block_size: self.blk_size, + uuid: spdk_rs::Uuid::generate().into_raw(), + }; - if let Some(mut bdev) = UntypedBdev::checked_from_ptr(unsafe { - create_uring_bdev(cname.as_ptr(), cname.as_ptr(), self.blk_size) - }) { + if let Some(mut bdev) = + UntypedBdev::checked_from_ptr(unsafe { create_uring_bdev(&opts) }) + { if let Some(uuid) = self.uuid { unsafe { bdev.set_raw_uuid(uuid.into()) }; } diff --git a/io-engine/src/bin/io-engine.rs b/io-engine/src/bin/io-engine.rs index 58193becb..a62335108 100644 --- a/io-engine/src/bin/io-engine.rs +++ b/io-engine/src/bin/io-engine.rs @@ -111,6 +111,16 @@ fn start_tokio_runtime(args: &MayastorCliArgs) { warn!("RDMA is enabled for Mayastor NVMEoF target"); } + unsafe { + spdk_rs::libspdk::spdk_blob_enable_cluster_unmap(args.bs_cluster_unmap); + } + + if args.bs_cluster_unmap { + warn!("Blob store cluster release on UNMAP is enabled"); + } else { + debug!("Blob store cluster release on UNMAP is disabled"); + } + print_feature!("Async QPair connection", "spdk-async-qpair-connect"); print_feature!("Fault injection", "fault-injection"); diff --git a/io-engine/src/core/env.rs b/io-engine/src/core/env.rs index 020410b96..3554a07d5 100644 --- a/io-engine/src/core/env.rs +++ b/io-engine/src/core/env.rs @@ -272,6 +272,9 @@ pub struct MayastorCliArgs { /// Enables RDMA between initiator and Mayastor Nvmf target. #[clap(long = "enable-rdma", env = "ENABLE_RDMA", value_parser = delay_compat)] pub rdma: bool, + /// Enables globally blob store cluster release on unmap. + #[clap(long, env = "ENABLE_BS_CLUSTER_UNMAP", hide = true)] + pub bs_cluster_unmap: bool, } fn delay_compat(s: &str) -> Result { @@ -340,6 +343,7 @@ impl Default for MayastorCliArgs { snap_rebuild: false, developer_delay: false, rdma: false, + bs_cluster_unmap: false, } } } @@ -421,6 +425,7 @@ pub struct MayastorEnvironment { enable_io_all_thrd_nexus_channels: bool, developer_delay: bool, rdma: bool, + bs_cluster_unmap: bool, } impl Default for MayastorEnvironment { @@ -470,6 +475,7 @@ impl Default for MayastorEnvironment { enable_io_all_thrd_nexus_channels: false, developer_delay: false, rdma: false, + bs_cluster_unmap: false, } } } @@ -612,6 +618,7 @@ impl MayastorEnvironment { skip_sig_handler: args.skip_sig_handler, developer_delay: args.developer_delay, rdma: args.rdma, + bs_cluster_unmap: args.bs_cluster_unmap, enable_io_all_thrd_nexus_channels: args .enable_io_all_thrd_nexus_channels, ..Default::default() diff --git a/io-engine/src/subsys/config/opts.rs b/io-engine/src/subsys/config/opts.rs index 58f1f65dd..0360e2f28 100644 --- a/io-engine/src/subsys/config/opts.rs +++ b/io-engine/src/subsys/config/opts.rs @@ -103,12 +103,17 @@ pub struct NvmfTgtConfig { impl From for Box { fn from(o: NvmfTgtConfig) -> Self { - let mut out = spdk_nvmf_target_opts { - name: unsafe { zeroed() }, - max_subsystems: o.max_namespaces, - crdt: o.crdt, - discovery_filter: 0, - }; + let mut out = struct_size_init!( + spdk_nvmf_target_opts { + name: unsafe { zeroed() }, + max_subsystems: o.max_namespaces, + crdt: o.crdt, + discovery_filter: 0, + dhchap_digests: 0, + dhchap_dhgroups: 0, + }, + size + ); copy_str_with_null(&o.name, &mut out.name); Box::new(out) } @@ -162,6 +167,10 @@ pub struct NvmfTcpTransportOpts { acceptor_poll_rate: u32, /// Use zero-copy operations if the underlying bdev supports them zcopy: bool, + /// ACK timeout in milliseconds + ack_timeout: u32, + /// Size of RDMA data WR pool + data_wr_pool_size: u32, } /// try to read an env variable or returns the default when not found @@ -273,6 +282,8 @@ impl Default for NvmfTcpTransportOpts { abort_timeout_sec: 1, acceptor_poll_rate: try_from_env("NVMF_ACCEPTOR_POLL_RATE", 10_000), zcopy: try_from_env("NVMF_ZCOPY", 1) == 1, + ack_timeout: try_from_env("NVMF_ACK_TIMEOUT", 0), + data_wr_pool_size: try_from_env("NVMF_DATA_WR_POOL_SIZE", 0), } } } @@ -282,25 +293,29 @@ impl Default for NvmfTcpTransportOpts { /// know about it during compile time. impl From for spdk_nvmf_transport_opts { fn from(o: NvmfTcpTransportOpts) -> Self { - Self { - max_queue_depth: o.max_queue_depth, - max_qpairs_per_ctrlr: o.max_qpairs_per_ctrl, - in_capsule_data_size: o.in_capsule_data_size, - max_io_size: o.max_io_size, - io_unit_size: o.io_unit_size, - max_aq_depth: o.max_aq_depth, - num_shared_buffers: o.num_shared_buf, - buf_cache_size: o.buf_cache_size, - dif_insert_or_strip: o.dif_insert_or_strip, - reserved29: Default::default(), - abort_timeout_sec: o.abort_timeout_sec, - association_timeout: 120000, - transport_specific: std::ptr::null(), - opts_size: std::mem::size_of::() as u64, - acceptor_poll_rate: o.acceptor_poll_rate, - zcopy: o.zcopy, - reserved61: Default::default(), - } + struct_size_init!( + Self { + max_queue_depth: o.max_queue_depth, + max_qpairs_per_ctrlr: o.max_qpairs_per_ctrl, + in_capsule_data_size: o.in_capsule_data_size, + max_io_size: o.max_io_size, + io_unit_size: o.io_unit_size, + max_aq_depth: o.max_aq_depth, + num_shared_buffers: o.num_shared_buf, + buf_cache_size: o.buf_cache_size, + dif_insert_or_strip: o.dif_insert_or_strip, + reserved29: Default::default(), + abort_timeout_sec: o.abort_timeout_sec, + association_timeout: 120000, + transport_specific: std::ptr::null(), + acceptor_poll_rate: o.acceptor_poll_rate, + zcopy: o.zcopy, + reserved61: Default::default(), + ack_timeout: o.ack_timeout, + data_wr_pool_size: o.data_wr_pool_size, + }, + opts_size + ) } } @@ -477,6 +492,9 @@ impl From<&NvmeBdevOpts> for spdk_bdev_nvme_opts { io_path_stat: false, allow_accel_sequence: false, rdma_max_cq_size: 0, + rdma_cm_event_timeout_ms: 0, + dhchap_digests: 0, + dhchap_dhgroups: 0, } } } @@ -700,13 +718,16 @@ pub struct IoBufOpts { impl GetOpts for IoBufOpts { fn get(&self) -> Self { - let mut opts = spdk_iobuf_opts { - small_pool_count: 0, - large_pool_count: 0, - small_bufsize: 0, - large_bufsize: 0, - }; - unsafe { spdk_iobuf_get_opts(&mut opts) }; + let mut opts = struct_size_init!( + spdk_iobuf_opts { + small_pool_count: 0, + large_pool_count: 0, + small_bufsize: 0, + large_bufsize: 0, + }, + opts_size + ); + unsafe { spdk_iobuf_get_opts(&mut opts, opts.opts_size) }; opts.into() } @@ -744,11 +765,14 @@ impl From for IoBufOpts { impl From<&IoBufOpts> for spdk_iobuf_opts { fn from(o: &IoBufOpts) -> Self { - Self { - small_pool_count: o.small_pool_count, - large_pool_count: o.large_pool_count, - small_bufsize: o.small_bufsize, - large_bufsize: o.large_bufsize, - } + struct_size_init!( + Self { + small_pool_count: o.small_pool_count, + large_pool_count: o.large_pool_count, + small_bufsize: o.small_bufsize, + large_bufsize: o.large_bufsize, + }, + opts_size + ) } } diff --git a/io-engine/src/subsys/nvmf/subsystem.rs b/io-engine/src/subsys/nvmf/subsystem.rs index c9e26acf8..a80314559 100644 --- a/io-engine/src/subsys/nvmf/subsystem.rs +++ b/io-engine/src/subsys/nvmf/subsystem.rs @@ -129,10 +129,7 @@ impl Debug for NvmfSubsystem { .field("subnqn", &self.0.as_ref().subnqn.as_str().to_string()) .field("sn", &self.0.as_ref().sn.as_str().to_string()) .field("mn", &self.0.as_ref().mn.as_str().to_string()) - .field( - "allow_any_host", - &self.0.as_ref().flags.allow_any_host(), - ) + .field("allow_any_host", &self.0.as_ref().allow_any_host) .field("ana_reporting", &self.0.as_ref().flags.ana_reporting()) .field("listeners", &self.listeners_to_vec()) .finish() @@ -527,7 +524,9 @@ impl NvmfSubsystem { uuid: Default::default(), reserved44: unsafe { zeroed() }, anagrpid: 0, - reserved60: unsafe { zeroed() }, + no_auto_visible: false, + reserved61: unsafe { zeroed() }, + transport_specific: ptr::null(), }, opts_size ); diff --git a/spdk-rs b/spdk-rs index 1b2a59613..10c2d8c7e 160000 --- a/spdk-rs +++ b/spdk-rs @@ -1 +1 @@ -Subproject commit 1b2a59613382aa86fb42040c1c9b39da2f2f0ca7 +Subproject commit 10c2d8c7ea059d32b62853df74587d1b1617361e