> +impl BdrvChild { > + /// Creates a new child reference from a `BlockdevRef`. > + pub unsafe fn new( > + parent: *mut bindings::BlockDriverState, > + bref: *mut bindings::BlockdevRef, > + errp: *mut *mut bindings::Error, > + ) -> Option<Self> { > + unsafe { > + let child_bs = bindings::bdrv_open_blockdev_ref_file(bref, > parent, errp); > + if child_bs.is_null() { > + return None; > + } > + > + bindings::bdrv_graph_wrlock(); > + let child = bindings::bdrv_attach_child( > + parent, > + child_bs, > + c"file".as_ptr(),
c literal starts from v1.77, and there's a workaround provided by c_str.rs: c_str!("file").as_ptr() > + &bindings::child_of_bds as *const _, > + bindings::BDRV_CHILD_IMAGE, > + errp, > + ); > + bindings::bdrv_graph_wrunlock(); > + > + if child.is_null() { > + None > + } else { > + Some(BdrvChild { child }) > + } > + } > + } > +