diff --git a/drivers/staging/android/ashmem_rust.rs b/drivers/staging/android/ashmem_rust.rs index a01cfa4d479a..2f9083548061 100644 --- a/drivers/staging/android/ashmem_rust.rs +++ b/drivers/staging/android/ashmem_rust.rs @@ -20,6 +20,7 @@ use kernel::{ mm::virt::{flags as vma_flags, VmAreaNew}, page::page_align, prelude::*, + seq_file::{seq_print, SeqFile}, sync::{new_mutex, Mutex}, task::Task, uaccess::{UserSlice, UserSliceReader, UserSliceWriter}, @@ -208,6 +209,7 @@ impl MiscDevice for Ashmem { bindings::ASHMEM_GET_SIZE => me.get_size(), bindings::ASHMEM_SET_PROT_MASK => me.set_prot_mask(arg), bindings::ASHMEM_GET_PROT_MASK => me.get_prot_mask(), + bindings::ASHMEM_GET_FILE_ID => me.get_file_id(UserSlice::new(arg, size).writer()), _ => Err(EINVAL), } } @@ -221,6 +223,19 @@ impl MiscDevice for Ashmem { }; Self::ioctl(me, file, cmd, arg) } + + fn show_fdinfo(me: Pin<&Ashmem>, m: &SeqFile, _file: &File) { + let asma = me.inner.lock(); + + if let Some(file) = asma.file.as_ref() { + seq_print!(m, "inode:\t{}\n", file.inode_ino()); + } + if let Some(name) = asma.name.as_ref() { + let name = core::str::from_utf8(name).unwrap_or(""); + seq_print!(m, "name:\t{}\n", name); + } + seq_print!(m, "size\t{}\n", asma.size); + } } impl Ashmem { @@ -298,6 +313,18 @@ impl Ashmem { fn get_prot_mask(&self) -> Result { Ok(self.inner.lock().prot_mask as isize) } + + fn get_file_id(&self, mut writer: UserSliceWriter) -> Result { + let ino = { + let asma = self.inner.lock(); + let Some(file) = asma.file.as_ref() else { + return Err(EINVAL); + }; + file.inode_ino() + }; + writer.write(&ino)?; + Ok(0) + } } impl AshmemInner { diff --git a/drivers/staging/android/shmem.rs b/drivers/staging/android/shmem.rs index f0e3f5dfaeea..3bddaea0628d 100644 --- a/drivers/staging/android/shmem.rs +++ b/drivers/staging/android/shmem.rs @@ -107,6 +107,11 @@ impl ShmemFile { Ok(ret as loff_t) } } + + pub(crate) fn inode_ino(&self) -> usize { + // SAFETY: Accessing the ino is always okay. + unsafe { (*(*self.inner.as_ptr()).f_inode).i_ino as usize } + } } /// Fix the lockdep class of the shmem inode.