diff --git a/drivers/staging/android/ashmem.h b/drivers/staging/android/ashmem.h index ad64cf791f2e..06f7f91ac22b 100644 --- a/drivers/staging/android/ashmem.h +++ b/drivers/staging/android/ashmem.h @@ -33,5 +33,6 @@ enum { bool is_ashmem_file(struct file *file); int ashmem_area_name(struct file *file, char *name); +long ashmem_area_size(struct file *file); #endif /* _LINUX_ASHMEM_H */ diff --git a/drivers/staging/android/ashmem_rust.rs b/drivers/staging/android/ashmem_rust.rs index b147e524f88f..30c886c63246 100644 --- a/drivers/staging/android/ashmem_rust.rs +++ b/drivers/staging/android/ashmem_rust.rs @@ -707,3 +707,20 @@ unsafe extern "C" fn ashmem_area_name( Err(err) => err.to_errno() as c_int, } } + +/// # Safety +/// +/// The caller must ensure that `file` is valid for the duration of this function. +#[no_mangle] +unsafe extern "C" fn ashmem_area_size(file: *mut bindings::file) -> isize { + // SAFETY: file is valid for the duration of this function. + let ashmem = match unsafe { get_ashmem_area(file) } { + Ok(area) => area, + Err(_err) => return 0, + }; + + match ashmem.get_size() { + Ok(size) => size, + Err(_err) => 0, + } +} diff --git a/drivers/staging/android/ashmem_rust_exports.c b/drivers/staging/android/ashmem_rust_exports.c index 95546739bd6f..3957a3b208c0 100644 --- a/drivers/staging/android/ashmem_rust_exports.c +++ b/drivers/staging/android/ashmem_rust_exports.c @@ -18,3 +18,4 @@ */ EXPORT_SYMBOL_GPL(is_ashmem_file); EXPORT_SYMBOL_GPL(ashmem_area_name); +EXPORT_SYMBOL_GPL(ashmem_area_size);