Loading drivers/char/mem.c +13 −43 Original line number Original line Diff line number Diff line Loading @@ -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) Loading Loading @@ -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 Loading Loading @@ -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, }; }; Loading @@ -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, }; }; Loading Loading
drivers/char/mem.c +13 −43 Original line number Original line Diff line number Diff line Loading @@ -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) Loading Loading @@ -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 Loading Loading @@ -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, }; }; Loading @@ -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, }; }; Loading