Lines Matching refs:iocb

28 static blk_opf_t dio_bio_write_op(struct kiocb *iocb)  in dio_bio_write_op()  argument
33 if (iocb_is_dsync(iocb)) in dio_bio_write_op()
50 static ssize_t __blkdev_direct_IO_simple(struct kiocb *iocb, in __blkdev_direct_IO_simple() argument
55 loff_t pos = iocb->ki_pos; in __blkdev_direct_IO_simple()
74 bio_init(&bio, bdev, vecs, nr_pages, dio_bio_write_op(iocb)); in __blkdev_direct_IO_simple()
77 bio.bi_write_hint = file_inode(iocb->ki_filp)->i_write_hint; in __blkdev_direct_IO_simple()
78 bio.bi_ioprio = iocb->ki_ioprio; in __blkdev_direct_IO_simple()
79 if (iocb->ki_flags & IOCB_ATOMIC) in __blkdev_direct_IO_simple()
90 if (iocb->ki_flags & IOCB_NOWAIT) in __blkdev_direct_IO_simple()
115 struct kiocb *iocb; member
136 struct kiocb *iocb = dio->iocb; in blkdev_bio_end_io() local
139 WRITE_ONCE(iocb->private, NULL); in blkdev_bio_end_io()
143 iocb->ki_pos += ret; in blkdev_bio_end_io()
148 dio->iocb->ki_complete(iocb, ret); in blkdev_bio_end_io()
166 static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, in __blkdev_direct_IO() argument
173 blk_opf_t opf = is_read ? REQ_OP_READ : dio_bio_write_op(iocb); in __blkdev_direct_IO()
174 loff_t pos = iocb->ki_pos; in __blkdev_direct_IO()
177 if (iocb->ki_flags & IOCB_ALLOC_CACHE) in __blkdev_direct_IO()
189 is_sync = is_sync_kiocb(iocb); in __blkdev_direct_IO()
195 dio->iocb = iocb; in __blkdev_direct_IO()
206 bio->bi_write_hint = file_inode(iocb->ki_filp)->i_write_hint; in __blkdev_direct_IO()
209 bio->bi_ioprio = iocb->ki_ioprio; in __blkdev_direct_IO()
217 if (iocb->ki_flags & IOCB_NOWAIT) { in __blkdev_direct_IO()
280 struct kiocb *iocb = dio->iocb; in blkdev_bio_end_io_async() local
283 WRITE_ONCE(iocb->private, NULL); in blkdev_bio_end_io_async()
287 iocb->ki_pos += ret; in blkdev_bio_end_io_async()
292 iocb->ki_complete(iocb, ret); in blkdev_bio_end_io_async()
302 static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb, in __blkdev_direct_IO_async() argument
308 blk_opf_t opf = is_read ? REQ_OP_READ : dio_bio_write_op(iocb); in __blkdev_direct_IO_async()
311 loff_t pos = iocb->ki_pos; in __blkdev_direct_IO_async()
314 if (iocb->ki_flags & IOCB_ALLOC_CACHE) in __blkdev_direct_IO_async()
320 dio->iocb = iocb; in __blkdev_direct_IO_async()
322 bio->bi_write_hint = file_inode(iocb->ki_filp)->i_write_hint; in __blkdev_direct_IO_async()
324 bio->bi_ioprio = iocb->ki_ioprio; in __blkdev_direct_IO_async()
352 if (iocb->ki_flags & IOCB_ATOMIC) in __blkdev_direct_IO_async()
355 if (iocb->ki_flags & IOCB_NOWAIT) in __blkdev_direct_IO_async()
358 if (iocb->ki_flags & IOCB_HIPRI) { in __blkdev_direct_IO_async()
361 WRITE_ONCE(iocb->private, bio); in __blkdev_direct_IO_async()
368 static ssize_t blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter) in blkdev_direct_IO() argument
370 struct block_device *bdev = I_BDEV(iocb->ki_filp->f_mapping->host); in blkdev_direct_IO()
371 bool is_atomic = iocb->ki_flags & IOCB_ATOMIC; in blkdev_direct_IO()
377 if (blkdev_dio_invalid(bdev, iocb->ki_pos, iter, is_atomic)) in blkdev_direct_IO()
382 if (is_sync_kiocb(iocb)) in blkdev_direct_IO()
383 return __blkdev_direct_IO_simple(iocb, iter, bdev, in blkdev_direct_IO()
385 return __blkdev_direct_IO_async(iocb, iter, bdev, nr_pages); in blkdev_direct_IO()
389 return __blkdev_direct_IO(iocb, iter, bdev, bio_max_segs(nr_pages)); in blkdev_direct_IO()
644 blkdev_direct_write(struct kiocb *iocb, struct iov_iter *from) in blkdev_direct_write() argument
649 written = kiocb_invalidate_pages(iocb, count); in blkdev_direct_write()
656 written = blkdev_direct_IO(iocb, from); in blkdev_direct_write()
658 kiocb_invalidate_post_direct_write(iocb, count); in blkdev_direct_write()
659 iocb->ki_pos += written; in blkdev_direct_write()
667 static ssize_t blkdev_buffered_write(struct kiocb *iocb, struct iov_iter *from) in blkdev_buffered_write() argument
669 return iomap_file_buffered_write(iocb, from, &blkdev_iomap_ops, NULL); in blkdev_buffered_write()
679 static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from) in blkdev_write_iter() argument
681 struct file *file = iocb->ki_filp; in blkdev_write_iter()
697 if (iocb->ki_pos >= size) in blkdev_write_iter()
700 if ((iocb->ki_flags & (IOCB_NOWAIT | IOCB_DIRECT)) == IOCB_NOWAIT) in blkdev_write_iter()
703 size -= iocb->ki_pos; in blkdev_write_iter()
713 if (iocb->ki_flags & IOCB_DIRECT) { in blkdev_write_iter()
714 ret = blkdev_direct_write(iocb, from); in blkdev_write_iter()
716 ret = direct_write_fallback(iocb, from, ret, in blkdev_write_iter()
717 blkdev_buffered_write(iocb, from)); in blkdev_write_iter()
719 ret = blkdev_buffered_write(iocb, from); in blkdev_write_iter()
723 ret = generic_write_sync(iocb, ret); in blkdev_write_iter()
728 static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to) in blkdev_read_iter() argument
730 struct block_device *bdev = I_BDEV(iocb->ki_filp->f_mapping->host); in blkdev_read_iter()
732 loff_t pos = iocb->ki_pos; in blkdev_read_iter()
749 if (iocb->ki_flags & IOCB_DIRECT) { in blkdev_read_iter()
750 ret = kiocb_write_and_wait(iocb, count); in blkdev_read_iter()
753 file_accessed(iocb->ki_filp); in blkdev_read_iter()
755 ret = blkdev_direct_IO(iocb, to); in blkdev_read_iter()
757 iocb->ki_pos += ret; in blkdev_read_iter()
765 ret = filemap_read(iocb, to, ret); in blkdev_read_iter()