Commit 13ba33e8 authored by Al Viro's avatar Al Viro

switch /dev/zero and /dev/full to ->read_iter()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent a1f6dbac
...@@ -622,53 +622,23 @@ static ssize_t splice_write_null(struct pipe_inode_info *pipe, struct file *out, ...@@ -622,53 +622,23 @@ static ssize_t splice_write_null(struct pipe_inode_info *pipe, struct file *out,
return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_null); return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_null);
} }
static ssize_t read_zero(struct file *file, char __user *buf, static ssize_t read_iter_zero(struct kiocb *iocb, struct iov_iter *iter)
size_t count, loff_t *ppos)
{ {
size_t written; size_t written = 0;
if (!count)
return 0;
if (!access_ok(VERIFY_WRITE, buf, count))
return -EFAULT;
written = 0;
while (count) {
unsigned long unwritten;
size_t chunk = count;
while (iov_iter_count(iter)) {
size_t chunk = iov_iter_count(iter), n;
if (chunk > PAGE_SIZE) if (chunk > PAGE_SIZE)
chunk = PAGE_SIZE; /* Just for latency reasons */ chunk = PAGE_SIZE; /* Just for latency reasons */
unwritten = __clear_user(buf, chunk); n = iov_iter_zero(chunk, iter);
written += chunk - unwritten; if (!n && iov_iter_count(iter))
if (unwritten) return written ? written : -EFAULT;
break; written += n;
if (signal_pending(current)) if (signal_pending(current))
return written ? written : -ERESTARTSYS; return written ? written : -ERESTARTSYS;
buf += chunk;
count -= chunk;
cond_resched(); cond_resched();
} }
return written ? written : -EFAULT; return written;
}
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) static int mmap_zero(struct file *file, struct vm_area_struct *vma)
...@@ -738,7 +708,6 @@ static int open_port(struct inode *inode, struct file *filp) ...@@ -738,7 +708,6 @@ static int open_port(struct inode *inode, struct file *filp)
#define zero_lseek null_lseek #define zero_lseek null_lseek
#define full_lseek null_lseek #define full_lseek null_lseek
#define write_zero write_null #define write_zero write_null
#define read_full read_zero
#define aio_write_zero aio_write_null #define aio_write_zero aio_write_null
#define open_mem open_port #define open_mem open_port
#define open_kmem open_mem #define open_kmem open_mem
...@@ -783,9 +752,9 @@ static const struct file_operations port_fops = { ...@@ -783,9 +752,9 @@ static const struct file_operations port_fops = {
static const struct file_operations zero_fops = { static const struct file_operations zero_fops = {
.llseek = zero_lseek, .llseek = zero_lseek,
.read = read_zero, .read = new_sync_read,
.write = write_zero, .write = write_zero,
.aio_read = aio_read_zero, .read_iter = read_iter_zero,
.aio_write = aio_write_zero, .aio_write = aio_write_zero,
.mmap = mmap_zero, .mmap = mmap_zero,
}; };
...@@ -802,7 +771,8 @@ static struct backing_dev_info zero_bdi = { ...@@ -802,7 +771,8 @@ static struct backing_dev_info zero_bdi = {
static const struct file_operations full_fops = { static const struct file_operations full_fops = {
.llseek = full_lseek, .llseek = full_lseek,
.read = read_full, .read = new_sync_read,
.read_iter = read_iter_zero,
.write = write_full, .write = write_full,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment