There are no longer any in-kernel users of these, kill it with fire.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
if (fop->llseek)
file->f_mode |= FMODE_LSEEK;
if ((file->f_mode & FMODE_READ) &&
- likely(fop->read || fop->read_iter))
+ likely(fop->read_iter))
file->f_mode |= FMODE_CAN_READ;
if ((file->f_mode & FMODE_WRITE) &&
- likely(fop->write || fop->write_iter))
+ likely(fop->write_iter))
file->f_mode |= FMODE_CAN_WRITE;
file->f_iocb_flags = iocb_flags(file);
file->f_mode |= FMODE_OPENED;
}
f->f_mode |= FMODE_OPENED;
if ((f->f_mode & FMODE_READ) &&
- likely(f->f_op->read || f->f_op->read_iter))
+ likely(f->f_op->read_iter))
f->f_mode |= FMODE_CAN_READ;
if ((f->f_mode & FMODE_WRITE) &&
- likely(f->f_op->write || f->f_op->write_iter))
+ likely(f->f_op->write_iter))
f->f_mode |= FMODE_CAN_WRITE;
if ((f->f_mode & FMODE_LSEEK) && !f->f_op->llseek)
f->f_mode &= ~FMODE_LSEEK;
* Also fail if ->read_iter and ->read are both wired up as that
* implies very convoluted semantics.
*/
- if (unlikely(!file->f_op->read_iter || file->f_op->read))
+ if (unlikely(!file->f_op->read_iter))
return warn_unsupported(file, "read");
init_sync_kiocb(&kiocb, file);
if (count > MAX_RW_COUNT)
count = MAX_RW_COUNT;
- if (file->f_op->read)
- ret = file->f_op->read(file, buf, count, pos);
- else if (file->f_op->read_iter)
+ if (file->f_op->read_iter)
ret = new_sync_read(file, buf, count, pos);
else
ret = -EINVAL;
* Also fail if ->write_iter and ->write are both wired up as that
* implies very convoluted semantics.
*/
- if (unlikely(!file->f_op->write_iter || file->f_op->write))
+ if (unlikely(!file->f_op->write_iter))
return warn_unsupported(file, "write");
init_sync_kiocb(&kiocb, file);
if (count > MAX_RW_COUNT)
count = MAX_RW_COUNT;
file_start_write(file);
- if (file->f_op->write)
- ret = file->f_op->write(file, buf, count, pos);
- else if (file->f_op->write_iter)
+ if (file->f_op->write_iter)
ret = new_sync_write(file, buf, count, pos);
else
ret = -EINVAL;
if (file->f_op->read_iter)
ret = do_iter_readv_writev(file, &iter, pos, READ, flags);
- else
- ret = do_loop_readv(file, &iter, pos, flags, file->f_op->read);
out:
if (ret >= 0)
fsnotify_access(file);
file_start_write(file);
if (file->f_op->write_iter)
ret = do_iter_readv_writev(file, &iter, pos, WRITE, flags);
- else
- ret = do_loop_writev(file, &iter, pos, flags, file->f_op->write);
if (ret > 0)
fsnotify_modify(file);
file_end_write(file);
struct module *owner;
fop_flags_t fop_flags;
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 (*read_iter) (struct kiocb *, struct iov_iter *);
ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
int (*iopoll)(struct kiocb *kiocb, struct io_comp_batch *,
return (kiocb->ki_filp->f_mode & FMODE_STREAM) ? NULL : &kiocb->ki_pos;
}
-/*
- * For files that don't have ->read_iter() and ->write_iter(), handle them
- * by looping over ->read() or ->write() manually.
- */
-static ssize_t loop_rw_iter(int ddir, struct io_rw *rw, struct iov_iter *iter)
-{
- struct kiocb *kiocb = &rw->kiocb;
- struct file *file = kiocb->ki_filp;
- ssize_t ret = 0;
- loff_t *ppos;
-
- /*
- * Don't support polled IO through this interface, and we can't
- * support non-blocking either. For the latter, this just causes
- * the kiocb to be handled from an async context.
- */
- if (kiocb->ki_flags & IOCB_HIPRI)
- return -EOPNOTSUPP;
- if ((kiocb->ki_flags & IOCB_NOWAIT) &&
- !(kiocb->ki_filp->f_flags & O_NONBLOCK))
- return -EAGAIN;
-
- ppos = io_kiocb_ppos(kiocb);
-
- while (iov_iter_count(iter)) {
- void __user *addr;
- size_t len;
- ssize_t nr;
-
- if (iter_is_ubuf(iter)) {
- addr = iter->ubuf + iter->iov_offset;
- len = iov_iter_count(iter);
- } else if (!iov_iter_is_bvec(iter)) {
- addr = iter_iov_addr(iter);
- len = iter_iov_len(iter);
- } else {
- addr = u64_to_user_ptr(rw->addr);
- len = rw->len;
- }
-
- if (ddir == READ)
- nr = file->f_op->read(file, addr, len, ppos);
- else
- nr = file->f_op->write(file, addr, len, ppos);
-
- if (nr < 0) {
- if (!ret)
- ret = nr;
- break;
- }
- ret += nr;
- if (!iov_iter_is_bvec(iter)) {
- iov_iter_advance(iter, nr);
- } else {
- rw->addr += nr;
- rw->len -= nr;
- if (!rw->len)
- break;
- }
- if (nr != len)
- break;
- }
-
- return ret;
-}
-
/*
* This is our waitqueue callback handler, registered through __folio_lock_async()
* when we initially tried to do the IO with the iocb armed our waitqueue.
if (likely(file->f_op->read_iter))
return file->f_op->read_iter(&rw->kiocb, iter);
- else if (file->f_op->read)
- return loop_rw_iter(READ, rw, iter);
- else
- return -EINVAL;
+ return -EINVAL;
}
static bool need_complete_io(struct io_kiocb *req)
kiocb_start_write(kiocb);
kiocb->ki_flags |= IOCB_WRITE;
+ ret2 = -EINVAL;
if (likely(req->file->f_op->write_iter))
ret2 = req->file->f_op->write_iter(kiocb, &io->iter);
- else if (req->file->f_op->write)
- ret2 = loop_rw_iter(WRITE, rw, &io->iter);
- else
- ret2 = -EINVAL;
if (req->flags & REQ_F_REISSUE) {
req->flags &= ~REQ_F_REISSUE;