Change DriverFile::open() to return impl PinInit<Self, Error> instead of Result<Pin<KBox<Self>>>, consistent with how bus device private data works.
Drivers no longer need to allocate a Pin<KBox<_>> themselves; they just return an initializer and the subsystem takes care of the allocation. Signed-off-by: Danilo Krummrich <[email protected]> --- drivers/gpu/drm/nova/file.rs | 4 ++-- drivers/gpu/drm/tyr/file.rs | 4 ++-- rust/kernel/drm/file.rs | 7 ++++--- rust/kernel/drm/gem/shmem.rs | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/nova/file.rs b/drivers/gpu/drm/nova/file.rs index 1f94201af92b..30bbabe6ee78 100644 --- a/drivers/gpu/drm/nova/file.rs +++ b/drivers/gpu/drm/nova/file.rs @@ -20,8 +20,8 @@ impl drm::file::DriverFile<'_> for File { type Driver = NovaDriver; - fn open(_device: &NovaDevice<Registered>, _reg_data: &()) -> Result<Pin<KBox<Self>>> { - Ok(KBox::new(Self, GFP_KERNEL)?.into()) + fn open(_device: &NovaDevice<Registered>, _reg_data: &()) -> impl PinInit<Self, Error> { + Ok(Self) } } diff --git a/drivers/gpu/drm/tyr/file.rs b/drivers/gpu/drm/tyr/file.rs index 0e0878090de6..933a365cb016 100644 --- a/drivers/gpu/drm/tyr/file.rs +++ b/drivers/gpu/drm/tyr/file.rs @@ -28,8 +28,8 @@ impl drm::file::DriverFile<'_> for TyrDrmFileData { fn open( _device: &TyrDrmDevice<Registered>, _reg_data: &TyrDrmRegistrationData<'_>, - ) -> Result<Pin<KBox<Self>>> { - KBox::try_pin_init(try_pin_init!(Self {}), GFP_KERNEL) + ) -> impl PinInit<Self, Error> { + Ok(Self {}) } } diff --git a/rust/kernel/drm/file.rs b/rust/kernel/drm/file.rs index 6491ec5707a0..31fc318eb535 100644 --- a/rust/kernel/drm/file.rs +++ b/rust/kernel/drm/file.rs @@ -30,12 +30,12 @@ pub trait DriverFile<'a>: Sized { /// Open a new DRM file, creating the per-file driver data. /// - /// Called when a client opens the DRM device. The returned file data may borrow from + /// Called when a client opens the DRM device. The returned initializer may borrow from /// `reg_data` with lifetime `'a`. fn open( device: &drm::Device<Self::Driver, drm::Registered>, reg_data: &'a <Self::Driver as drm::Driver>::RegistrationData<'a>, - ) -> Result<Pin<KBox<Self>>>; + ) -> impl PinInit<Self, Error>; } /// An open DRM File. @@ -107,7 +107,8 @@ pub(crate) extern "C" fn open_callback( unsafe { drm::device::Device::from_raw(raw_dev) }; dev.registration_data_with(|reg_data| { - let inner = match <<D::File as ForLt>::Of<'_> as DriverFile<'_>>::open(dev, reg_data) { + let init = <<D::File as ForLt>::Of<'_> as DriverFile<'_>>::open(dev, reg_data); + let inner = match KBox::try_pin_init(init, GFP_KERNEL) { Err(e) => return e.to_errno(), Ok(i) => i, }; diff --git a/rust/kernel/drm/gem/shmem.rs b/rust/kernel/drm/gem/shmem.rs index 793b4883de3a..d882b505fe0f 100644 --- a/rust/kernel/drm/gem/shmem.rs +++ b/rust/kernel/drm/gem/shmem.rs @@ -611,8 +611,8 @@ impl drm::file::DriverFile<'_> for KunitFile { fn open( _device: &drm::Device<KunitDriver, drm::Registered>, _reg_data: &(), - ) -> Result<Pin<KBox<Self>>> { - Ok(KBox::new(Self, GFP_KERNEL)?.into()) + ) -> impl PinInit<Self, Error> { + Ok(Self) } } -- 2.55.0
