pub(crate) fn readv(&self, io: &Bio, channels: &mut NexusChannelInner) {
        // we use RR to read from the children.
        let child = channels.child_select();
        if child.is_none() {
            error!(
                "{}: No child available to read from {:p}",
                io.nexus_as_ref().name,
                io.as_ptr(),
            );
            io.fail();
            return;
        }

        // if there is no buffer space for us allocated within the request
        // allocate it now, taking care of proper alignment
        if io.need_buf() {
            unsafe {
                spdk_bdev_io_get_buf(
                    io.as_ptr(),
                    Some(Self::nexus_get_buf_cb),
                    io.num_blocks() * io.block_len(),
                )
            }
            return;
        }

        let (desc, ch) = channels.readers[child.unwrap()].io_tuple();

        let ret = Self::readv_impl(io.as_ptr(), desc, ch);

        if ret != 0 {
            error!(
                "{}: Failed to submit dispatched IO {:p}",
                io.nexus_as_ref().name,
                io.as_ptr()
            );

            io.fail();
        }
    }
/// read vectored io from the underlying children.
read vectored io from the underlying children.
read vectored io from the underlying children .
pub(crate) fn readv(&self, io: &Bio, channels: &mut NexusChannelInner) {
        // we use RR to read from the children.
        let child = channels.child_select();
        if child.is_none() {
            error!(
                "{}: No child available to read from {:p}",
                io.nexus_as_ref().name,
                io.as_ptr(),
            );
            io.fail();
            return;
        }
        // if there is no buffer space for us allocated within the request
        // allocate it now, taking care of proper alignment
        if io.need_buf() {
            unsafe {
                spdk_bdev_io_get_buf(
                    io.as_ptr(),
                    Some(Self::nexus_get_buf_cb),
                    io.num_blocks() * io.block_len(),
                )
            }
            return;
        }
        let (desc, ch) = channels.readers[child.unwrap()].io_tuple();
        let ret = Self::readv_impl(io.as_ptr(), desc, ch);
        if ret != 0 {
            error!(
                "{}: Failed to submit dispatched IO {:p}",
                io.nexus_as_ref().name,
                io.as_ptr()
            );
            io.fail();
        }
    }
pub ( crate ) fn readv ( & self , io : & Bio , channels : & mut NexusChannelInner ) { // we use RR to read from the children. let child = channels . child_select ( ) ; if child . is_none ( ) { error ! ( " " io nexus_as_ref ( ) name io as_ptr ( ) ) ; io . fail ( ) ; return ; } // if there is no buffer space for us allocated within the request // allocate it now, taking care of proper alignment if io . need_buf ( ) { unsafe { spdk_bdev_io_get_buf ( io . as_ptr ( ) , Some ( Self :: nexus_get_buf_cb ) , io . num_blocks ( ) * io . block_len ( ) , ) } return ; } let ( desc , ch ) = channels . readers [ child . unwrap ( ) ] . io_tuple ( ) ; let ret = Self :: readv_impl ( io . as_ptr ( ) , desc , ch ) ; if ret != 0 { error ! ( " " io nexus_as_ref ( ) name io as_ptr ( ) ) ; io . fail ( ) ; } }
read vectored io from the underlying children.
read vectored io from the underlying children .
&self
io
&Bio
channels
&mut NexusChannelInner