Skip to content

Commit

Permalink
feat(spdk): updating to spdk 24.01
Browse files Browse the repository at this point in the history
Signed-off-by: Dmitry Savitskiy <[email protected]>
  • Loading branch information
dsavitskiy committed Jul 5, 2024
1 parent b48586b commit b62829d
Show file tree
Hide file tree
Showing 23 changed files with 293 additions and 184 deletions.
31 changes: 27 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions ci.nix
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ mkShell {
kubernetes-helm
libaio
libbsd
libexecinfo
libnvme
libpcap
libunwind
Expand Down
1 change: 1 addition & 0 deletions io-engine-tests/src/error_bdev.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ pub fn inject_error(error_device: &str, op: u32, mode: u32, count: u32) {
error_num: count,
corrupt_offset: 0,
corrupt_value: 0,
error_qd: 0,
};

unsafe {
Expand Down
4 changes: 3 additions & 1 deletion io-engine/src/bdev/null_bdev.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,12 @@ impl CreateDestroy for Null {
});
}

let uuid = spdk_rs::Uuid::generate().into_raw();

let cname = self.name.clone().into_cstring();
let opts = spdk_rs::libspdk::spdk_null_bdev_opts {
name: cname.as_ptr(),
uuid: std::ptr::null(),
uuid: &uuid,
num_blocks: self.num_blocks,
block_size: self.blk_size,
physical_block_size: 0,
Expand Down
33 changes: 12 additions & 21 deletions io-engine/src/bdev/nvme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,9 @@ use snafu::ResultExt;
use url::Url;

use spdk_rs::{
bdevs::bdev_nvme_delete_async,
ffihelper::copy_str_with_null,
libspdk::{
bdev_nvme_create,
bdev_nvme_delete,
nvme_path_id,
spdk_nvme_transport_id,
},
libspdk::{bdev_nvme_create, spdk_nvme_transport_id},
};

use crate::{
Expand Down Expand Up @@ -136,25 +132,20 @@ impl CreateDestroy for NVMe {
if let Some(mut bdev) = UntypedBdev::lookup_by_name(&self.get_name()) {
bdev.remove_alias(self.url.as_ref());

let mut path_id = nvme_path_id::default();
copy_str_with_null(&self.name, &mut path_id.trid.traddr);
path_id.trid.trtype = spdk_rs::libspdk::SPDK_NVME_TRANSPORT_PCIE;
let res = bdev_nvme_delete_async(&self.name, None).await;

let errno = unsafe {
bdev_nvme_delete(
self.name.clone().into_cstring().as_ptr(),
&path_id,
)
};
if errno != 0 {
// Restore the alias in the case the deletion failed.
if !res.is_ok_and(|e| e.is_ok()) {
UntypedBdev::lookup_by_name(&self.get_name())
.map(|mut b| b.add_alias(self.url.as_ref()));
}
errno_result_from_i32((), errno).context(
bdev_api::DestroyBdevFailed {
name: self.name.clone(),
},
)

res.context(bdev_api::BdevCommandCanceled {
name: self.name.clone(),
})?
.context(bdev_api::DestroyBdevFailed {
name: self.name.clone(),
})
} else {
Err(BdevError::BdevNotFound {
name: self.get_name(),
Expand Down
62 changes: 36 additions & 26 deletions io-engine/src/bdev/nvmf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ use snafu::ResultExt;
use url::Url;

use spdk_rs::{
bdevs::bdev_nvme_delete_async,
ffihelper::copy_str_with_null,
libspdk::{
bdev_nvme_create,
bdev_nvme_delete,
spdk_nvme_transport_id,
SPDK_NVME_IO_FLAGS_PRCHK_GUARD,
SPDK_NVME_IO_FLAGS_PRCHK_REFTAG,
Expand Down Expand Up @@ -195,31 +195,46 @@ impl CreateDestroy for Nvmf {
name: self.name.clone(),
})?;

// Remove partially created nvme bdev which doesn't show up in
// the list of bdevs
if bdev_count == 0 {
error!("No nvme bdev created, no namespaces?");
// Remove partially created nvme bdev which doesn't show up in
// the list of bdevs
let errno =
unsafe { bdev_nvme_delete(cname.as_ptr(), std::ptr::null()) };
info!(
"removed partially created bdev {}, returned {}",
self.name, errno
error!(
"No nvme bdev created after creating {n}, no namespaces?",
n = self.name
);

match bdev_nvme_delete_async(&self.name, None).await {
Ok(_) => {
info!("Removed partially created bdev {n}", n = self.name)
}
Err(e) => {
error!(
"Failed to remove partially created bdev {n}: {e:?}",
n = self.name
)
}
}

return Err(BdevError::BdevNotFound {
name: self.name.clone(),
});
}

if let Some(mut bdev) = UntypedBdev::lookup_by_name(&self.get_name()) {
if let Some(u) = self.uuid {
if bdev.uuid_as_string() != u.hyphenated().to_string() {
error!("Connected to device {} but expect to connect to {} instead", bdev.uuid_as_string(), u.hyphenated().to_string());
error!(
"Connected to device {dev} but expect to connect to {s} instead",
dev = bdev.uuid_as_string(),
s = u.hyphenated().to_string(),
);
}
};
if !bdev.add_alias(&self.alias) {
error!(
"Failed to add alias {} to device {}",
self.alias,
self.get_name()
"Failed to add alias {alias} to device {name}",
alias = self.alias,
name = self.get_name()
);
}
};
Expand All @@ -235,20 +250,15 @@ impl CreateDestroy for Nvmf {
match UntypedBdev::lookup_by_name(&self.get_name()) {
Some(mut bdev) => {
bdev.remove_alias(&self.alias);
let cname = CString::new(self.name.clone()).unwrap();

let errno = unsafe {
bdev_nvme_delete(cname.as_ptr(), std::ptr::null())
};

async {
errno_result_from_i32((), errno).context(
bdev_api::DestroyBdevFailed {
name: self.name.clone(),
},
)
}
.await
bdev_nvme_delete_async(&self.name, None)
.await
.context(bdev_api::BdevCommandCanceled {
name: self.name.clone(),
})?
.context(bdev_api::DestroyBdevFailed {
name: self.name.clone(),
})
}
None => Err(BdevError::BdevNotFound {
name: self.get_name(),
Expand Down
7 changes: 4 additions & 3 deletions io-engine/src/bdev/nvmx/controller.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
use std::{
convert::From,
fmt,
mem::zeroed,
os::raw::c_void,
ptr::NonNull,
sync::{Arc, Mutex},
Expand Down Expand Up @@ -777,7 +778,7 @@ impl<'a> Drop for NvmeController<'a> {
}

extern "C" fn aer_cb(ctx: *mut c_void, cpl: *const spdk_nvme_cpl) {
let mut event = spdk_nvme_async_event_completion::default();
let mut event: spdk_nvme_async_event_completion = unsafe { zeroed() };

if !nvme_cpl_succeeded(cpl) {
warn!("AER request execute failed");
Expand Down Expand Up @@ -1017,7 +1018,7 @@ pub(crate) fn connected_attached_cb(

pub(crate) mod options {
use spdk_rs::ffihelper::copy_str_with_null;
use std::mem::size_of;
use std::mem::{size_of, zeroed};

use spdk_rs::libspdk::{
spdk_nvme_ctrlr_get_default_ctrlr_opts,
Expand All @@ -1037,7 +1038,7 @@ pub(crate) mod options {

impl Default for NvmeControllerOpts {
fn default() -> Self {
let mut default = spdk_nvme_ctrlr_opts::default();
let mut default: spdk_nvme_ctrlr_opts = unsafe { zeroed() };

unsafe {
spdk_nvme_ctrlr_get_default_ctrlr_opts(
Expand Down
29 changes: 17 additions & 12 deletions io-engine/src/bdev/nvmx/handle.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
use std::{alloc::Layout, mem::ManuallyDrop, os::raw::c_void, sync::Arc};
use std::{
alloc::Layout,
mem::{zeroed, ManuallyDrop},
os::raw::c_void,
sync::Arc,
};

use async_trait::async_trait;
use futures::channel::oneshot;
Expand Down Expand Up @@ -1118,12 +1123,12 @@ impl BlockDeviceHandle for NvmeDeviceHandle {
// Fill max-size ranges until the remaining blocks fit into one range.
while remaining > SPDK_NVME_DATASET_MANAGEMENT_RANGE_MAX_BLOCKS {
unsafe {
let mut range = spdk_nvme_dsm_range::default();

range.attributes.raw = 0;
range.length =
SPDK_NVME_DATASET_MANAGEMENT_RANGE_MAX_BLOCKS as u32;
range.starting_lba = offset;
let range = spdk_nvme_dsm_range {
attributes: zeroed(),
length: SPDK_NVME_DATASET_MANAGEMENT_RANGE_MAX_BLOCKS
as u32,
starting_lba: offset,
};

*dsm_ranges.add(range_id) = range;
}
Expand All @@ -1135,11 +1140,11 @@ impl BlockDeviceHandle for NvmeDeviceHandle {

// Setup range that describes the remaining blocks and schedule unmap.
let rc = unsafe {
let mut range = spdk_nvme_dsm_range::default();

range.attributes.raw = 0;
range.length = remaining as u32;
range.starting_lba = offset;
let range = spdk_nvme_dsm_range {
attributes: zeroed(),
length: remaining as u32,
starting_lba: offset,
};

*dsm_ranges.add(range_id) = range;

Expand Down
3 changes: 2 additions & 1 deletion io-engine/src/bdev/nvmx/qpair.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ use spdk_rs::libspdk::{

#[cfg(feature = "spdk-async-qpair-connect")]
use std::{os::raw::c_void, time::Duration};
use std::mem::zeroed;

#[cfg(feature = "spdk-async-qpair-connect")]
use spdk_rs::{
Expand Down Expand Up @@ -110,7 +111,7 @@ impl Drop for QPair {
fn get_default_options(
ctrlr_handle: SpdkNvmeController,
) -> spdk_nvme_io_qpair_opts {
let mut opts = spdk_nvme_io_qpair_opts::default();
let mut opts: spdk_nvme_io_qpair_opts = unsafe { zeroed() };
let default_opts = nvme_bdev_running_config();

unsafe {
Expand Down
3 changes: 2 additions & 1 deletion io-engine/src/bin/spdk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use std::{
ffi::{c_void, CString},
io::{Error, ErrorKind},
iter::Iterator,
mem::zeroed,
os::raw::{c_char, c_int},
ptr::null_mut,
vec::Vec,
Expand All @@ -35,7 +36,7 @@ fn main() -> Result<(), std::io::Error> {
.collect::<Vec<*const c_char>>();
c_args.push(std::ptr::null());

let mut opts: spdk_app_opts = Default::default();
let mut opts: spdk_app_opts = unsafe { zeroed() };

unsafe {
spdk_app_opts_init(
Expand Down
Loading

0 comments on commit b62829d

Please sign in to comment.