diff options
Diffstat (limited to 'drivers/char/mem.c')
| -rw-r--r-- | drivers/char/mem.c | 36 | 
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/char/mem.c b/drivers/char/mem.c index 2c644afbcdd..1ccbe9482fa 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c @@ -28,6 +28,7 @@  #include <linux/pfn.h>  #include <linux/export.h>  #include <linux/io.h> +#include <linux/aio.h>  #include <asm/uaccess.h> @@ -627,6 +628,18 @@ static ssize_t write_null(struct file *file, const char __user *buf,  	return count;  } +static ssize_t aio_read_null(struct kiocb *iocb, const struct iovec *iov, +			     unsigned long nr_segs, loff_t pos) +{ +	return 0; +} + +static ssize_t aio_write_null(struct kiocb *iocb, const struct iovec *iov, +			      unsigned long nr_segs, loff_t pos) +{ +	return iov_length(iov, nr_segs); +} +  static int pipe_to_null(struct pipe_inode_info *info, struct pipe_buffer *buf,  			struct splice_desc *sd)  { @@ -670,6 +683,24 @@ static ssize_t read_zero(struct file *file, char __user *buf,  	return written ? written : -EFAULT;  } +static ssize_t aio_read_zero(struct kiocb *iocb, const struct iovec *iov, +			     unsigned long nr_segs, loff_t pos) +{ +	size_t written = 0; +	unsigned long i; +	ssize_t ret; + +	for (i = 0; i < nr_segs; i++) { +		ret = read_zero(iocb->ki_filp, iov[i].iov_base, iov[i].iov_len, +				&pos); +		if (ret < 0) +			break; +		written += ret; +	} + +	return written ? written : -EFAULT; +} +  static int mmap_zero(struct file *file, struct vm_area_struct *vma)  {  #ifndef CONFIG_MMU @@ -738,6 +769,7 @@ static int open_port(struct inode *inode, struct file *filp)  #define full_lseek      null_lseek  #define write_zero	write_null  #define read_full       read_zero +#define aio_write_zero	aio_write_null  #define open_mem	open_port  #define open_kmem	open_mem  #define open_oldmem	open_mem @@ -766,6 +798,8 @@ static const struct file_operations null_fops = {  	.llseek		= null_lseek,  	.read		= read_null,  	.write		= write_null, +	.aio_read	= aio_read_null, +	.aio_write	= aio_write_null,  	.splice_write	= splice_write_null,  }; @@ -782,6 +816,8 @@ static const struct file_operations zero_fops = {  	.llseek		= zero_lseek,  	.read		= read_zero,  	.write		= write_zero, +	.aio_read	= aio_read_zero, +	.aio_write	= aio_write_zero,  	.mmap		= mmap_zero,  };  |