diff options
Diffstat (limited to 'sys/compat/linuxkpi/common/include/linux/fs.h')
| -rw-r--r-- | sys/compat/linuxkpi/common/include/linux/fs.h | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/fs.h b/sys/compat/linuxkpi/common/include/linux/fs.h index f1568ad6282d..749a9fd22d3d 100644 --- a/sys/compat/linuxkpi/common/include/linux/fs.h +++ b/sys/compat/linuxkpi/common/include/linux/fs.h @@ -133,8 +133,11 @@ do { \ typedef int (*filldir_t)(void *, const char *, int, off_t, u64, unsigned); +typedef unsigned int fop_flags_t; + struct file_operations { struct module *owner; + fop_flags_t fop_flags; /* Unused on FreeBSD. */ ssize_t (*read)(struct linux_file *, char __user *, size_t, off_t *); ssize_t (*write)(struct linux_file *, const char __user *, size_t, off_t *); unsigned int (*poll) (struct linux_file *, struct poll_table_struct *); @@ -182,6 +185,14 @@ struct file_operations { int (*setlease)(struct file *, long, struct file_lock **); #endif }; + +#define FOP_BUFFER_RASYNC (1 << 0) +#define FOP_BUFFER_WASYNC (1 << 1) +#define FOP_MMAP_SYNC (1 << 2) +#define FOP_DIO_PARALLEL_WRITE (1 << 3) +#define FOP_HUGE_PAGES (1 << 4) +#define FOP_UNSIGNED_OFFSET (1 << 5) + #define fops_get(fops) (fops) #define replace_fops(f, fops) ((f)->f_op = (fops)) @@ -364,27 +375,23 @@ static inline ssize_t simple_read_from_buffer(void __user *dest, size_t read_size, loff_t *ppos, void *orig, size_t buf_size) { - void *p, *read_pos = ((char *) orig) + *ppos; + void *read_pos = ((char *) orig) + *ppos; size_t buf_remain = buf_size - *ppos; + ssize_t num_read; - if (buf_remain < 0 || buf_remain > buf_size) - return -EINVAL; + if (*ppos >= buf_size || read_size == 0) + return (0); if (read_size > buf_remain) read_size = buf_remain; - /* - * XXX At time of commit only debugfs consumers could be - * identified. If others will use this function we may - * have to revise this: normally we would call copy_to_user() - * here but lindebugfs will return the result and the - * copyout is done elsewhere for us. - */ - p = memcpy(dest, read_pos, read_size); - if (p != NULL) - *ppos += read_size; - - return (read_size); + /* copy_to_user returns number of bytes NOT read */ + num_read = read_size - copy_to_user(dest, read_pos, read_size); + if (num_read == 0) + return -EFAULT; + *ppos += num_read; + + return (num_read); } MALLOC_DECLARE(M_LSATTR); @@ -415,11 +422,13 @@ int simple_attr_open(struct inode *inode, struct file *filp, int simple_attr_release(struct inode *inode, struct file *filp); -ssize_t simple_attr_read(struct file *filp, char *buf, size_t read_size, loff_t *ppos); +ssize_t simple_attr_read(struct file *filp, char __user *buf, size_t read_size, + loff_t *ppos); -ssize_t simple_attr_write(struct file *filp, const char *buf, size_t write_size, loff_t *ppos); +ssize_t simple_attr_write(struct file *filp, const char __user *buf, + size_t write_size, loff_t *ppos); -ssize_t simple_attr_write_signed(struct file *filp, const char *buf, +ssize_t simple_attr_write_signed(struct file *filp, const char __user *buf, size_t write_size, loff_t *ppos); #endif /* _LINUXKPI_LINUX_FS_H_ */ |
