What are the arguments to "struct file_operations"?

I am using the Linux character device driver.

The linux / fs.h header file lists file_operations without argument names.

eg.

struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *, fl_owner_t id); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, loff_t, loff_t, int datasync); int (*aio_fsync) (struct kiocb *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); int (*check_flags)(int); int (*flock) (struct file *, int, struct file_lock *); ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); int (*setlease)(struct file *, long, struct file_lock **); long (*fallocate)(struct file *file, int mode, loff_t offset, loff_t len); }; 

Where is the documentation that tells me what each argument is? Some of them are obvious, but some are not. I prefer to refer to the official documentation if I can, but I just can't find it.

eg.

 int (*fsync) (struct file *, loff_t, loff_t, int datasync); 

There are two arguments to loff_t. How do I know what they are doing?

I was Google and read the device driver book, but I can not find any documents explaining why the arguments are needed. Some of the arguments have also changed since the writing of LDD3.

+6
source share
2 answers

The LDD3 book is very useful to understand the big picture, but it will not help in details (this is for kernel 2.6.10, but for now we go to 3.9). The kernelnewbies drivers page is perhaps the most advanced, comprehensive resource. For daily changes, LWN regularly comments on API changes and publishes more detailed reviews of new features. H-online contains a number of articles that describe in detail the changes from the kernel version to the kernel version, links to discussions and corrections.

+5
source

I had to implement my first Linux driver some time ago. By far, the best I can do is load the kernel source for the version you are working against. There is a directory called / Documentation in the kernel source tree. I would start there, the last time I checked that this is the “Official Documentation” for the kernel.

If you have the source code, there really is no better documentation than reading the code and looking at what it used. For such things, I go through / drivers / fs / and find an example of where this structure is used, and see how they use it.

+1
source

All Articles