Subject: Re: linux-next: manual merge of the rust tree with the driver-core tree

From: Stephen Rothwell <[email-masked]>
Date: Thu, 23 Jan 2025 14:30:25 +1100

Hi all,

On Tue, 14 Jan 2025 15:46:23 +1100 Stephen Rothwell <[email-masked]> wrote:
> 
> Today's linux-next merge of the rust tree got a conflict in:
> 
>   rust/kernel/miscdevice.rs
> 
> between commit:
> 
>   88441d5c6d17 ("rust: miscdevice: access the `struct miscdevice` from fops->open()")
> 
> from the driver-core tree and commit:
> 
>   14686571a914 ("rust: kernel: change `ForeignOwnable` pointer to mut")
> 
> from the rust tree.
> 
> I fixed it up (see below) and can carry the fix as necessary. This
> is now fixed as far as linux-next is concerned, but any non trivial
> conflicts should be mentioned to your upstream maintainer when your tree
> is submitted for merging.  You may also want to consider cooperating
> with the maintainer of the conflicting tree to minimise any particularly
> complex conflicts.
> 
> diff --cc rust/kernel/miscdevice.rs
> index dfb363630c70,b3a6cc50b240..000000000000
> --- a/rust/kernel/miscdevice.rs
> +++ b/rust/kernel/miscdevice.rs
> @@@ -10,11 -10,9 +10,12 @@@
>   
>   use crate::{
>       bindings,
>  +    device::Device,
>       error::{to_result, Error, Result, VTABLE_DEFAULT_ERROR},
> +     ffi::{c_int, c_long, c_uint, c_ulong},
>  +    fs::File,
>       prelude::*,
>  +    seq_file::SeqFile,
>       str::CStr,
>       types::{ForeignOwnable, Opaque},
>   };
> @@@ -151,17 -132,8 +147,17 @@@ pub trait MiscDevice: Sized 
>           _cmd: u32,
>           _arg: usize,
>       ) -> Result<isize> {
> -         kernel::build_error!(VTABLE_DEFAULT_ERROR)
> +         build_error!(VTABLE_DEFAULT_ERROR)
>       }
>  +
>  +    /// Show info for this fd.
>  +    fn show_fdinfo(
>  +        _device: <Self::Ptr as ForeignOwnable>::Borrowed<'_>,
>  +        _m: &SeqFile,
>  +        _file: &File,
>  +    ) {
> -         kernel::build_error!(VTABLE_DEFAULT_ERROR)
> ++        build_error!(VTABLE_DEFAULT_ERROR)
>  +    }
>   }
>   
>   const fn create_vtable<T: MiscDevice>() -> &'static bindings::file_operations {
> @@@ -230,12 -188,8 +226,12 @@@ unsafe extern "C" fn fops_open<T: MiscD
>           Err(err) => return err.to_errno(),
>       };
>   
>  -    // SAFETY: The open call of a file owns the private data.
>  -    unsafe { (*file).private_data = ptr.into_foreign() };
>  +    // This overwrites the private data with the value specified by the user, changing the type of
>  +    // this file's private data. All future accesses to the private data is performed by other
>  +    // fops_* methods in this file, which all correctly cast the private data to the new type.
>  +    //
>  +    // SAFETY: The open call of a file can access the private data.
> -     unsafe { (*raw_file).private_data = ptr.into_foreign().cast_mut() };
> ++    unsafe { (*raw_file).private_data = ptr.into_foreign() };
>   
>       0
>   }
> @@@ -274,12 -225,7 +270,12 @@@ unsafe extern "C" fn fops_ioctl<T: Misc
>       // SAFETY: Ioctl calls can borrow the private data of the file.
>       let device = unsafe { <T::Ptr as ForeignOwnable>::borrow(private) };
>   
>  -    match T::ioctl(device, cmd, arg) {
>  +    // SAFETY:
>  +    // * The file is valid for the duration of this call.
>  +    // * There is no active fdget_pos region on the file on this thread.
>  +    let file = unsafe { File::from_raw_file(file) };
>  +
> -     match T::ioctl(device, file, cmd, arg as usize) {
> ++    match T::ioctl(device, file, cmd, arg) {
>           Ok(ret) => ret as c_long,
>           Err(err) => err.to_errno() as c_long,
>       }
> @@@ -299,12 -245,7 +295,12 @@@ unsafe extern "C" fn fops_compat_ioctl<
>       // SAFETY: Ioctl calls can borrow the private data of the file.
>       let device = unsafe { <T::Ptr as ForeignOwnable>::borrow(private) };
>   
>  -    match T::compat_ioctl(device, cmd, arg) {
>  +    // SAFETY:
>  +    // * The file is valid for the duration of this call.
>  +    // * There is no active fdget_pos region on the file on this thread.
>  +    let file = unsafe { File::from_raw_file(file) };
>  +
> -     match T::compat_ioctl(device, file, cmd, arg as usize) {
> ++    match T::compat_ioctl(device, file, cmd, arg) {
>           Ok(ret) => ret as c_long,
>           Err(err) => err.to_errno() as c_long,
>       }

This is now a conflict between the driver-core tree and Linus' tree.

-- 
Cheers,
Stephen Rothwell