Skip to content
This repository was archived by the owner on Mar 7, 2021. It is now read-only.

Commit 71fc1ba

Browse files
committed
Move to a builder API for FileOperationsVtable
1 parent f3f24f2 commit 71fc1ba

File tree

2 files changed

+60
-49
lines changed

2 files changed

+60
-49
lines changed

src/file_operations.rs

Lines changed: 58 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use core::convert::{TryFrom, TryInto};
2-
use core::{mem, ptr};
2+
use core::{marker, mem, ptr};
33

44
use alloc::boxed::Box;
55

@@ -101,52 +101,63 @@ unsafe extern "C" fn llseek_callback<T: FileOperations>(
101101
}
102102

103103
impl FileOperationsVtable {
104-
pub const fn new<T: FileOperations>() -> FileOperationsVtable {
105-
FileOperationsVtable(bindings::file_operations {
106-
open: Some(open_callback::<T>),
107-
read: Some(read_callback::<T>),
108-
release: Some(release_callback::<T>),
109-
llseek: Some(llseek_callback::<T>),
110-
111-
check_flags: None,
112-
#[cfg(not(kernel_4_20_0_or_greater))]
113-
clone_file_range: None,
114-
compat_ioctl: None,
115-
copy_file_range: None,
116-
#[cfg(not(kernel_4_20_0_or_greater))]
117-
dedupe_file_range: None,
118-
fallocate: None,
119-
#[cfg(kernel_4_19_0_or_greater)]
120-
fadvise: None,
121-
fasync: None,
122-
flock: None,
123-
flush: None,
124-
fsync: None,
125-
get_unmapped_area: None,
126-
iterate: None,
127-
iterate_shared: None,
128-
#[cfg(kernel_5_1_0_or_greater)]
129-
iopoll: None,
130-
lock: None,
131-
mmap: None,
132-
#[cfg(kernel_4_15_0_or_greater)]
133-
mmap_supported_flags: 0,
134-
owner: ptr::null_mut(),
135-
poll: None,
136-
read_iter: None,
137-
#[cfg(kernel_4_20_0_or_greater)]
138-
remap_file_range: None,
139-
sendpage: None,
140-
#[cfg(kernel_aufs_setfl)]
141-
setfl: None,
142-
setlease: None,
143-
show_fdinfo: None,
144-
splice_read: None,
145-
splice_write: None,
146-
unlocked_ioctl: None,
147-
write: None,
148-
write_iter: None,
149-
})
104+
pub const fn builder<T: FileOperations>() -> FileOperationsVtableBuilder<T> {
105+
FileOperationsVtableBuilder(
106+
bindings::file_operations {
107+
open: Some(open_callback::<T>),
108+
read: Some(read_callback::<T>),
109+
release: Some(release_callback::<T>),
110+
llseek: Some(llseek_callback::<T>),
111+
112+
check_flags: None,
113+
#[cfg(not(kernel_4_20_0_or_greater))]
114+
clone_file_range: None,
115+
compat_ioctl: None,
116+
copy_file_range: None,
117+
#[cfg(not(kernel_4_20_0_or_greater))]
118+
dedupe_file_range: None,
119+
fallocate: None,
120+
#[cfg(kernel_4_19_0_or_greater)]
121+
fadvise: None,
122+
fasync: None,
123+
flock: None,
124+
flush: None,
125+
fsync: None,
126+
get_unmapped_area: None,
127+
iterate: None,
128+
iterate_shared: None,
129+
#[cfg(kernel_5_1_0_or_greater)]
130+
iopoll: None,
131+
lock: None,
132+
mmap: None,
133+
#[cfg(kernel_4_15_0_or_greater)]
134+
mmap_supported_flags: 0,
135+
owner: ptr::null_mut(),
136+
poll: None,
137+
read_iter: None,
138+
#[cfg(kernel_4_20_0_or_greater)]
139+
remap_file_range: None,
140+
sendpage: None,
141+
#[cfg(kernel_aufs_setfl)]
142+
setfl: None,
143+
setlease: None,
144+
show_fdinfo: None,
145+
splice_read: None,
146+
splice_write: None,
147+
unlocked_ioctl: None,
148+
write: None,
149+
write_iter: None,
150+
},
151+
marker::PhantomData,
152+
)
153+
}
154+
}
155+
156+
pub struct FileOperationsVtableBuilder<T>(bindings::file_operations, marker::PhantomData<T>);
157+
158+
impl<T> FileOperationsVtableBuilder<T> {
159+
pub const fn build(self) -> FileOperationsVtable {
160+
FileOperationsVtable(self.0)
150161
}
151162
}
152163

tests/chrdev/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ struct CycleFile;
66

77
impl linux_kernel_module::file_operations::FileOperations for CycleFile {
88
const VTABLE: linux_kernel_module::file_operations::FileOperationsVtable =
9-
linux_kernel_module::file_operations::FileOperationsVtable::new::<Self>();
9+
linux_kernel_module::file_operations::FileOperationsVtable::builder::<Self>().build();
1010

1111
fn open() -> linux_kernel_module::KernelResult<Self> {
1212
return Ok(CycleFile);
@@ -33,7 +33,7 @@ struct SeekFile;
3333

3434
impl linux_kernel_module::file_operations::FileOperations for SeekFile {
3535
const VTABLE: linux_kernel_module::file_operations::FileOperationsVtable =
36-
linux_kernel_module::file_operations::FileOperationsVtable::new::<Self>();
36+
linux_kernel_module::file_operations::FileOperationsVtable::builder::<Self>().build();
3737

3838
fn open() -> linux_kernel_module::KernelResult<Self> {
3939
return Ok(SeekFile);

0 commit comments

Comments
 (0)