mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	This adds a variant of Vec::insert that does not allocate memory. This makes it safe to use this function while holding a spinlock. Rust Binder uses it for the range allocator fast path. Signed-off-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Benno Lossin <lossin@kernel.org> Link: https://lore.kernel.org/r/20250502-vec-methods-v5-7-06d20ad9366f@google.com Signed-off-by: Danilo Krummrich <dakr@kernel.org>
		
			
				
	
	
		
			61 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
 | 
						|
//! Errors for the [`Vec`] type.
 | 
						|
 | 
						|
use core::fmt::{self, Debug, Formatter};
 | 
						|
use kernel::prelude::*;
 | 
						|
 | 
						|
/// Error type for [`Vec::push_within_capacity`].
 | 
						|
pub struct PushError<T>(pub T);
 | 
						|
 | 
						|
impl<T> Debug for PushError<T> {
 | 
						|
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
 | 
						|
        write!(f, "Not enough capacity")
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
impl<T> From<PushError<T>> for Error {
 | 
						|
    fn from(_: PushError<T>) -> Error {
 | 
						|
        // Returning ENOMEM isn't appropriate because the system is not out of memory. The vector
 | 
						|
        // is just full and we are refusing to resize it.
 | 
						|
        EINVAL
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/// Error type for [`Vec::remove`].
 | 
						|
pub struct RemoveError;
 | 
						|
 | 
						|
impl Debug for RemoveError {
 | 
						|
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
 | 
						|
        write!(f, "Index out of bounds")
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
impl From<RemoveError> for Error {
 | 
						|
    fn from(_: RemoveError) -> Error {
 | 
						|
        EINVAL
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/// Error type for [`Vec::insert_within_capacity`].
 | 
						|
pub enum InsertError<T> {
 | 
						|
    /// The value could not be inserted because the index is out of bounds.
 | 
						|
    IndexOutOfBounds(T),
 | 
						|
    /// The value could not be inserted because the vector is out of capacity.
 | 
						|
    OutOfCapacity(T),
 | 
						|
}
 | 
						|
 | 
						|
impl<T> Debug for InsertError<T> {
 | 
						|
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
 | 
						|
        match self {
 | 
						|
            InsertError::IndexOutOfBounds(_) => write!(f, "Index out of bounds"),
 | 
						|
            InsertError::OutOfCapacity(_) => write!(f, "Not enough capacity"),
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
impl<T> From<InsertError<T>> for Error {
 | 
						|
    fn from(_: InsertError<T>) -> Error {
 | 
						|
        EINVAL
 | 
						|
    }
 | 
						|
}
 |