Lines Matching refs:io

603 static ssize_t fuse_get_res_by_io(struct fuse_io_priv *io)  in fuse_get_res_by_io()  argument
605 if (io->err) in fuse_get_res_by_io()
606 return io->err; in fuse_get_res_by_io()
608 if (io->bytes >= 0 && io->write) in fuse_get_res_by_io()
611 return io->bytes < 0 ? io->size : io->bytes; in fuse_get_res_by_io()
630 static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos) in fuse_aio_complete() argument
634 spin_lock(&io->lock); in fuse_aio_complete()
636 io->err = io->err ? : err; in fuse_aio_complete()
637 else if (pos >= 0 && (io->bytes < 0 || pos < io->bytes)) in fuse_aio_complete()
638 io->bytes = pos; in fuse_aio_complete()
640 left = --io->reqs; in fuse_aio_complete()
641 if (!left && io->blocking) in fuse_aio_complete()
642 complete(io->done); in fuse_aio_complete()
643 spin_unlock(&io->lock); in fuse_aio_complete()
645 if (!left && !io->blocking) { in fuse_aio_complete()
646 ssize_t res = fuse_get_res_by_io(io); in fuse_aio_complete()
649 struct inode *inode = file_inode(io->iocb->ki_filp); in fuse_aio_complete()
658 io->iocb->ki_complete(io->iocb, res); in fuse_aio_complete()
661 kref_put(&io->refcnt, fuse_io_release); in fuse_aio_complete()
664 static struct fuse_io_args *fuse_io_alloc(struct fuse_io_priv *io, in fuse_io_alloc() argument
671 ia->io = io; in fuse_io_alloc()
692 struct fuse_io_priv *io = ia->io; in fuse_aio_complete_req() local
698 } else if (io->write) { in fuse_aio_complete_req()
704 pos = ia->write.in.offset - io->offset + in fuse_aio_complete_req()
712 pos = ia->read.in.offset - io->offset + outsize; in fuse_aio_complete_req()
715 fuse_release_user_pages(&ia->ap, err ?: nres, io->should_dirty); in fuse_aio_complete_req()
717 fuse_aio_complete(io, err, pos); in fuse_aio_complete_req()
725 struct fuse_io_priv *io = ia->io; in fuse_async_req_send() local
727 spin_lock(&io->lock); in fuse_async_req_send()
728 kref_get(&io->refcnt); in fuse_async_req_send()
729 io->size += num_bytes; in fuse_async_req_send()
730 io->reqs++; in fuse_async_req_send()
731 spin_unlock(&io->lock); in fuse_async_req_send()
734 ia->ap.args.may_block = io->should_dirty; in fuse_async_req_send()
745 struct file *file = ia->io->iocb->ki_filp; in fuse_send_read()
755 if (ia->io->async) in fuse_send_read()
1070 struct kiocb *iocb = ia->io->iocb; in fuse_send_write()
1084 if (ia->io->async) in fuse_send_write()
1581 ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, in fuse_direct_io() argument
1586 struct file *file = io->iocb->ki_filp; in fuse_direct_io()
1603 ia = fuse_io_alloc(io, max_pages); in fuse_direct_io()
1630 io->should_dirty = !write && user_backed_iter(iter); in fuse_direct_io()
1650 if (!io->async || nres < 0) { in fuse_direct_io()
1651 fuse_release_user_pages(&ia->ap, nres, io->should_dirty); in fuse_direct_io()
1671 ia = fuse_io_alloc(io, max_pages); in fuse_direct_io()
1685 static ssize_t __fuse_direct_read(struct fuse_io_priv *io, in __fuse_direct_read() argument
1690 struct inode *inode = file_inode(io->iocb->ki_filp); in __fuse_direct_read()
1692 res = fuse_direct_io(io, iter, ppos, 0); in __fuse_direct_read()
1708 struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); in fuse_direct_read_iter() local
1710 res = __fuse_direct_read(&io, to, &iocb->ki_pos); in fuse_direct_read_iter()
1729 struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); in fuse_direct_write_iter() local
1731 res = fuse_direct_io(&io, from, &iocb->ki_pos, in fuse_direct_write_iter()
2757 struct fuse_io_priv *io; in fuse_direct_IO() local
2766 io = kmalloc(sizeof(struct fuse_io_priv), GFP_KERNEL); in fuse_direct_IO()
2767 if (!io) in fuse_direct_IO()
2769 spin_lock_init(&io->lock); in fuse_direct_IO()
2770 kref_init(&io->refcnt); in fuse_direct_IO()
2771 io->reqs = 1; in fuse_direct_IO()
2772 io->bytes = -1; in fuse_direct_IO()
2773 io->size = 0; in fuse_direct_IO()
2774 io->offset = offset; in fuse_direct_IO()
2775 io->write = (iov_iter_rw(iter) == WRITE); in fuse_direct_IO()
2776 io->err = 0; in fuse_direct_IO()
2781 io->async = ff->fm->fc->async_dio; in fuse_direct_IO()
2782 io->iocb = iocb; in fuse_direct_IO()
2783 io->blocking = is_sync_kiocb(iocb); in fuse_direct_IO()
2786 if (io->async && !io->write && offset + count > i_size) { in fuse_direct_IO()
2796 if ((offset + count > i_size) && io->write) in fuse_direct_IO()
2797 io->blocking = true; in fuse_direct_IO()
2799 if (io->async && io->blocking) { in fuse_direct_IO()
2804 kref_get(&io->refcnt); in fuse_direct_IO()
2805 io->done = &wait; in fuse_direct_IO()
2809 ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE); in fuse_direct_IO()
2812 ret = __fuse_direct_read(io, iter, &pos); in fuse_direct_IO()
2816 if (io->async) { in fuse_direct_IO()
2817 bool blocking = io->blocking; in fuse_direct_IO()
2819 fuse_aio_complete(io, ret < 0 ? ret : 0, -1); in fuse_direct_IO()
2826 ret = fuse_get_res_by_io(io); in fuse_direct_IO()
2829 kref_put(&io->refcnt, fuse_io_release); in fuse_direct_IO()