1cd82cca7SChristoph Hellwig // SPDX-License-Identifier: GPL-2.0-only 2cd82cca7SChristoph Hellwig /* 3cd82cca7SChristoph Hellwig * Copyright (C) 1991, 1992 Linus Torvalds 4cd82cca7SChristoph Hellwig * Copyright (C) 2001 Andrea Arcangeli <[email protected]> SuSE 5cd82cca7SChristoph Hellwig * Copyright (C) 2016 - 2020 Christoph Hellwig 6cd82cca7SChristoph Hellwig */ 7cd82cca7SChristoph Hellwig #include <linux/init.h> 8cd82cca7SChristoph Hellwig #include <linux/mm.h> 9cd82cca7SChristoph Hellwig #include <linux/blkdev.h> 10cd82cca7SChristoph Hellwig #include <linux/buffer_head.h> 11cd82cca7SChristoph Hellwig #include <linux/mpage.h> 12cd82cca7SChristoph Hellwig #include <linux/uio.h> 13cd82cca7SChristoph Hellwig #include <linux/namei.h> 14cd82cca7SChristoph Hellwig #include <linux/task_io_accounting_ops.h> 15cd82cca7SChristoph Hellwig #include <linux/falloc.h> 16cd82cca7SChristoph Hellwig #include <linux/suspend.h> 17f278eb3dSMing Lei #include <linux/fs.h> 188581fd40SJakub Kicinski #include <linux/module.h> 19cd82cca7SChristoph Hellwig #include "blk.h" 20cd82cca7SChristoph Hellwig 21fac7c6d5SPavel Begunkov static inline struct inode *bdev_file_inode(struct file *file) 22cd82cca7SChristoph Hellwig { 23cd82cca7SChristoph Hellwig return file->f_mapping->host; 24cd82cca7SChristoph Hellwig } 25cd82cca7SChristoph Hellwig 26cd82cca7SChristoph Hellwig static int blkdev_get_block(struct inode *inode, sector_t iblock, 27cd82cca7SChristoph Hellwig struct buffer_head *bh, int create) 28cd82cca7SChristoph Hellwig { 29cd82cca7SChristoph Hellwig bh->b_bdev = I_BDEV(inode); 30cd82cca7SChristoph Hellwig bh->b_blocknr = iblock; 31cd82cca7SChristoph Hellwig set_buffer_mapped(bh); 32cd82cca7SChristoph Hellwig return 0; 33cd82cca7SChristoph Hellwig } 34cd82cca7SChristoph Hellwig 3516458cf3SBart Van Assche static blk_opf_t dio_bio_write_op(struct kiocb *iocb) 36cd82cca7SChristoph Hellwig { 3716458cf3SBart Van Assche blk_opf_t opf = REQ_OP_WRITE | REQ_SYNC | REQ_IDLE; 38cd82cca7SChristoph Hellwig 39cd82cca7SChristoph Hellwig /* avoid the need for a I/O completion work item */ 4091b94c5dSAl Viro if (iocb_is_dsync(iocb)) 4116458cf3SBart Van Assche opf |= REQ_FUA; 4216458cf3SBart Van Assche return opf; 43cd82cca7SChristoph Hellwig } 44cd82cca7SChristoph Hellwig 4537fee2e4SKeith Busch static bool blkdev_dio_unaligned(struct block_device *bdev, loff_t pos, 4637fee2e4SKeith Busch struct iov_iter *iter) 4737fee2e4SKeith Busch { 48b1a000d3SKeith Busch return pos & (bdev_logical_block_size(bdev) - 1) || 49b1a000d3SKeith Busch !bdev_iter_is_aligned(bdev, iter); 5037fee2e4SKeith Busch } 5137fee2e4SKeith Busch 52cd82cca7SChristoph Hellwig #define DIO_INLINE_BIO_VECS 4 53cd82cca7SChristoph Hellwig 54cd82cca7SChristoph Hellwig static ssize_t __blkdev_direct_IO_simple(struct kiocb *iocb, 55cd82cca7SChristoph Hellwig struct iov_iter *iter, unsigned int nr_pages) 56cd82cca7SChristoph Hellwig { 57fac7c6d5SPavel Begunkov struct block_device *bdev = iocb->ki_filp->private_data; 58cd82cca7SChristoph Hellwig struct bio_vec inline_vecs[DIO_INLINE_BIO_VECS], *vecs; 59cd82cca7SChristoph Hellwig loff_t pos = iocb->ki_pos; 60cd82cca7SChristoph Hellwig bool should_dirty = false; 61cd82cca7SChristoph Hellwig struct bio bio; 62cd82cca7SChristoph Hellwig ssize_t ret; 63cd82cca7SChristoph Hellwig 6437fee2e4SKeith Busch if (blkdev_dio_unaligned(bdev, pos, iter)) 65cd82cca7SChristoph Hellwig return -EINVAL; 66cd82cca7SChristoph Hellwig 67cd82cca7SChristoph Hellwig if (nr_pages <= DIO_INLINE_BIO_VECS) 68cd82cca7SChristoph Hellwig vecs = inline_vecs; 69cd82cca7SChristoph Hellwig else { 70cd82cca7SChristoph Hellwig vecs = kmalloc_array(nr_pages, sizeof(struct bio_vec), 71cd82cca7SChristoph Hellwig GFP_KERNEL); 72cd82cca7SChristoph Hellwig if (!vecs) 73cd82cca7SChristoph Hellwig return -ENOMEM; 74cd82cca7SChristoph Hellwig } 75cd82cca7SChristoph Hellwig 7649add496SChristoph Hellwig if (iov_iter_rw(iter) == READ) { 7749add496SChristoph Hellwig bio_init(&bio, bdev, vecs, nr_pages, REQ_OP_READ); 78*fcb14cb1SAl Viro if (user_backed_iter(iter)) 7949add496SChristoph Hellwig should_dirty = true; 8049add496SChristoph Hellwig } else { 8149add496SChristoph Hellwig bio_init(&bio, bdev, vecs, nr_pages, dio_bio_write_op(iocb)); 8249add496SChristoph Hellwig } 836549a874SPavel Begunkov bio.bi_iter.bi_sector = pos >> SECTOR_SHIFT; 84cd82cca7SChristoph Hellwig bio.bi_ioprio = iocb->ki_ioprio; 85cd82cca7SChristoph Hellwig 86cd82cca7SChristoph Hellwig ret = bio_iov_iter_get_pages(&bio, iter); 87cd82cca7SChristoph Hellwig if (unlikely(ret)) 88cd82cca7SChristoph Hellwig goto out; 89cd82cca7SChristoph Hellwig ret = bio.bi_iter.bi_size; 90cd82cca7SChristoph Hellwig 9149add496SChristoph Hellwig if (iov_iter_rw(iter) == WRITE) 92cd82cca7SChristoph Hellwig task_io_account_write(ret); 9349add496SChristoph Hellwig 94cd82cca7SChristoph Hellwig if (iocb->ki_flags & IOCB_NOWAIT) 95cd82cca7SChristoph Hellwig bio.bi_opf |= REQ_NOWAIT; 96cd82cca7SChristoph Hellwig 979650b453SMing Lei submit_bio_wait(&bio); 98cd82cca7SChristoph Hellwig 99cd82cca7SChristoph Hellwig bio_release_pages(&bio, should_dirty); 100cd82cca7SChristoph Hellwig if (unlikely(bio.bi_status)) 101cd82cca7SChristoph Hellwig ret = blk_status_to_errno(bio.bi_status); 102cd82cca7SChristoph Hellwig 103cd82cca7SChristoph Hellwig out: 104cd82cca7SChristoph Hellwig if (vecs != inline_vecs) 105cd82cca7SChristoph Hellwig kfree(vecs); 106cd82cca7SChristoph Hellwig 107cd82cca7SChristoph Hellwig bio_uninit(&bio); 108cd82cca7SChristoph Hellwig 109cd82cca7SChristoph Hellwig return ret; 110cd82cca7SChristoph Hellwig } 111cd82cca7SChristoph Hellwig 11209ce8744SJens Axboe enum { 113e71aa913SPavel Begunkov DIO_SHOULD_DIRTY = 1, 114e71aa913SPavel Begunkov DIO_IS_SYNC = 2, 11509ce8744SJens Axboe }; 11609ce8744SJens Axboe 117cd82cca7SChristoph Hellwig struct blkdev_dio { 118cd82cca7SChristoph Hellwig union { 119cd82cca7SChristoph Hellwig struct kiocb *iocb; 120cd82cca7SChristoph Hellwig struct task_struct *waiter; 121cd82cca7SChristoph Hellwig }; 122cd82cca7SChristoph Hellwig size_t size; 123cd82cca7SChristoph Hellwig atomic_t ref; 12409ce8744SJens Axboe unsigned int flags; 1256155631aSJens Axboe struct bio bio ____cacheline_aligned_in_smp; 126cd82cca7SChristoph Hellwig }; 127cd82cca7SChristoph Hellwig 128cd82cca7SChristoph Hellwig static struct bio_set blkdev_dio_pool; 129cd82cca7SChristoph Hellwig 130cd82cca7SChristoph Hellwig static void blkdev_bio_end_io(struct bio *bio) 131cd82cca7SChristoph Hellwig { 132cd82cca7SChristoph Hellwig struct blkdev_dio *dio = bio->bi_private; 13309ce8744SJens Axboe bool should_dirty = dio->flags & DIO_SHOULD_DIRTY; 134cd82cca7SChristoph Hellwig 135cd82cca7SChristoph Hellwig if (bio->bi_status && !dio->bio.bi_status) 136cd82cca7SChristoph Hellwig dio->bio.bi_status = bio->bi_status; 137cd82cca7SChristoph Hellwig 138e71aa913SPavel Begunkov if (atomic_dec_and_test(&dio->ref)) { 13909ce8744SJens Axboe if (!(dio->flags & DIO_IS_SYNC)) { 140cd82cca7SChristoph Hellwig struct kiocb *iocb = dio->iocb; 141cd82cca7SChristoph Hellwig ssize_t ret; 142cd82cca7SChristoph Hellwig 1433e08773cSChristoph Hellwig WRITE_ONCE(iocb->private, NULL); 1443e08773cSChristoph Hellwig 145cd82cca7SChristoph Hellwig if (likely(!dio->bio.bi_status)) { 146cd82cca7SChristoph Hellwig ret = dio->size; 147cd82cca7SChristoph Hellwig iocb->ki_pos += ret; 148cd82cca7SChristoph Hellwig } else { 149cd82cca7SChristoph Hellwig ret = blk_status_to_errno(dio->bio.bi_status); 150cd82cca7SChristoph Hellwig } 151cd82cca7SChristoph Hellwig 1526b19b766SJens Axboe dio->iocb->ki_complete(iocb, ret); 153cd82cca7SChristoph Hellwig bio_put(&dio->bio); 154cd82cca7SChristoph Hellwig } else { 155cd82cca7SChristoph Hellwig struct task_struct *waiter = dio->waiter; 156cd82cca7SChristoph Hellwig 157cd82cca7SChristoph Hellwig WRITE_ONCE(dio->waiter, NULL); 158cd82cca7SChristoph Hellwig blk_wake_io_task(waiter); 159cd82cca7SChristoph Hellwig } 160cd82cca7SChristoph Hellwig } 161cd82cca7SChristoph Hellwig 162cd82cca7SChristoph Hellwig if (should_dirty) { 163cd82cca7SChristoph Hellwig bio_check_pages_dirty(bio); 164cd82cca7SChristoph Hellwig } else { 165cd82cca7SChristoph Hellwig bio_release_pages(bio, false); 166cd82cca7SChristoph Hellwig bio_put(bio); 167cd82cca7SChristoph Hellwig } 168cd82cca7SChristoph Hellwig } 169cd82cca7SChristoph Hellwig 170cd82cca7SChristoph Hellwig static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 171cd82cca7SChristoph Hellwig unsigned int nr_pages) 172cd82cca7SChristoph Hellwig { 173fac7c6d5SPavel Begunkov struct block_device *bdev = iocb->ki_filp->private_data; 174cd82cca7SChristoph Hellwig struct blk_plug plug; 175cd82cca7SChristoph Hellwig struct blkdev_dio *dio; 176cd82cca7SChristoph Hellwig struct bio *bio; 177cd82cca7SChristoph Hellwig bool is_read = (iov_iter_rw(iter) == READ), is_sync; 17816458cf3SBart Van Assche blk_opf_t opf = is_read ? REQ_OP_READ : dio_bio_write_op(iocb); 179cd82cca7SChristoph Hellwig loff_t pos = iocb->ki_pos; 180cd82cca7SChristoph Hellwig int ret = 0; 181cd82cca7SChristoph Hellwig 18237fee2e4SKeith Busch if (blkdev_dio_unaligned(bdev, pos, iter)) 183cd82cca7SChristoph Hellwig return -EINVAL; 184cd82cca7SChristoph Hellwig 1850df71650SMike Snitzer if (iocb->ki_flags & IOCB_ALLOC_CACHE) 1860df71650SMike Snitzer opf |= REQ_ALLOC_CACHE; 1870df71650SMike Snitzer bio = bio_alloc_bioset(bdev, nr_pages, opf, GFP_KERNEL, 1880df71650SMike Snitzer &blkdev_dio_pool); 189cd82cca7SChristoph Hellwig dio = container_of(bio, struct blkdev_dio, bio); 190e71aa913SPavel Begunkov atomic_set(&dio->ref, 1); 191e71aa913SPavel Begunkov /* 192e71aa913SPavel Begunkov * Grab an extra reference to ensure the dio structure which is embedded 193e71aa913SPavel Begunkov * into the first bio stays around. 194e71aa913SPavel Begunkov */ 195e71aa913SPavel Begunkov bio_get(bio); 196e71aa913SPavel Begunkov 19709ce8744SJens Axboe is_sync = is_sync_kiocb(iocb); 19809ce8744SJens Axboe if (is_sync) { 19909ce8744SJens Axboe dio->flags = DIO_IS_SYNC; 200cd82cca7SChristoph Hellwig dio->waiter = current; 201cd82cca7SChristoph Hellwig } else { 20209ce8744SJens Axboe dio->flags = 0; 203cd82cca7SChristoph Hellwig dio->iocb = iocb; 204cd82cca7SChristoph Hellwig } 205cd82cca7SChristoph Hellwig 206cd82cca7SChristoph Hellwig dio->size = 0; 207*fcb14cb1SAl Viro if (is_read && user_backed_iter(iter)) 20809ce8744SJens Axboe dio->flags |= DIO_SHOULD_DIRTY; 209cd82cca7SChristoph Hellwig 210cd82cca7SChristoph Hellwig blk_start_plug(&plug); 211cd82cca7SChristoph Hellwig 212cd82cca7SChristoph Hellwig for (;;) { 2136549a874SPavel Begunkov bio->bi_iter.bi_sector = pos >> SECTOR_SHIFT; 214cd82cca7SChristoph Hellwig bio->bi_private = dio; 215cd82cca7SChristoph Hellwig bio->bi_end_io = blkdev_bio_end_io; 216cd82cca7SChristoph Hellwig bio->bi_ioprio = iocb->ki_ioprio; 217cd82cca7SChristoph Hellwig 218cd82cca7SChristoph Hellwig ret = bio_iov_iter_get_pages(bio, iter); 219cd82cca7SChristoph Hellwig if (unlikely(ret)) { 220cd82cca7SChristoph Hellwig bio->bi_status = BLK_STS_IOERR; 221cd82cca7SChristoph Hellwig bio_endio(bio); 222cd82cca7SChristoph Hellwig break; 223cd82cca7SChristoph Hellwig } 224cd82cca7SChristoph Hellwig 225cd82cca7SChristoph Hellwig if (is_read) { 22609ce8744SJens Axboe if (dio->flags & DIO_SHOULD_DIRTY) 227cd82cca7SChristoph Hellwig bio_set_pages_dirty(bio); 228cd82cca7SChristoph Hellwig } else { 229cd82cca7SChristoph Hellwig task_io_account_write(bio->bi_iter.bi_size); 230cd82cca7SChristoph Hellwig } 231cd82cca7SChristoph Hellwig if (iocb->ki_flags & IOCB_NOWAIT) 232cd82cca7SChristoph Hellwig bio->bi_opf |= REQ_NOWAIT; 233cd82cca7SChristoph Hellwig 234cd82cca7SChristoph Hellwig dio->size += bio->bi_iter.bi_size; 235cd82cca7SChristoph Hellwig pos += bio->bi_iter.bi_size; 236cd82cca7SChristoph Hellwig 237cd82cca7SChristoph Hellwig nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS); 238cd82cca7SChristoph Hellwig if (!nr_pages) { 2393e08773cSChristoph Hellwig submit_bio(bio); 240cd82cca7SChristoph Hellwig break; 241cd82cca7SChristoph Hellwig } 242cd82cca7SChristoph Hellwig atomic_inc(&dio->ref); 243cd82cca7SChristoph Hellwig submit_bio(bio); 24407888c66SChristoph Hellwig bio = bio_alloc(bdev, nr_pages, opf, GFP_KERNEL); 245cd82cca7SChristoph Hellwig } 246cd82cca7SChristoph Hellwig 247cd82cca7SChristoph Hellwig blk_finish_plug(&plug); 248cd82cca7SChristoph Hellwig 249cd82cca7SChristoph Hellwig if (!is_sync) 250cd82cca7SChristoph Hellwig return -EIOCBQUEUED; 251cd82cca7SChristoph Hellwig 252cd82cca7SChristoph Hellwig for (;;) { 253cd82cca7SChristoph Hellwig set_current_state(TASK_UNINTERRUPTIBLE); 254cd82cca7SChristoph Hellwig if (!READ_ONCE(dio->waiter)) 255cd82cca7SChristoph Hellwig break; 256cd82cca7SChristoph Hellwig blk_io_schedule(); 257cd82cca7SChristoph Hellwig } 258cd82cca7SChristoph Hellwig __set_current_state(TASK_RUNNING); 259cd82cca7SChristoph Hellwig 260cd82cca7SChristoph Hellwig if (!ret) 261cd82cca7SChristoph Hellwig ret = blk_status_to_errno(dio->bio.bi_status); 262cd82cca7SChristoph Hellwig if (likely(!ret)) 263cd82cca7SChristoph Hellwig ret = dio->size; 264cd82cca7SChristoph Hellwig 265cd82cca7SChristoph Hellwig bio_put(&dio->bio); 266cd82cca7SChristoph Hellwig return ret; 267cd82cca7SChristoph Hellwig } 268cd82cca7SChristoph Hellwig 26954a88eb8SPavel Begunkov static void blkdev_bio_end_io_async(struct bio *bio) 27054a88eb8SPavel Begunkov { 27154a88eb8SPavel Begunkov struct blkdev_dio *dio = container_of(bio, struct blkdev_dio, bio); 27254a88eb8SPavel Begunkov struct kiocb *iocb = dio->iocb; 27354a88eb8SPavel Begunkov ssize_t ret; 27454a88eb8SPavel Begunkov 275bb49c6faSStefano Garzarella WRITE_ONCE(iocb->private, NULL); 276bb49c6faSStefano Garzarella 27754a88eb8SPavel Begunkov if (likely(!bio->bi_status)) { 27854a88eb8SPavel Begunkov ret = dio->size; 27954a88eb8SPavel Begunkov iocb->ki_pos += ret; 28054a88eb8SPavel Begunkov } else { 28154a88eb8SPavel Begunkov ret = blk_status_to_errno(bio->bi_status); 28254a88eb8SPavel Begunkov } 28354a88eb8SPavel Begunkov 284b6773cdbSLinus Torvalds iocb->ki_complete(iocb, ret); 28554a88eb8SPavel Begunkov 28654a88eb8SPavel Begunkov if (dio->flags & DIO_SHOULD_DIRTY) { 28754a88eb8SPavel Begunkov bio_check_pages_dirty(bio); 28854a88eb8SPavel Begunkov } else { 28954a88eb8SPavel Begunkov bio_release_pages(bio, false); 29054a88eb8SPavel Begunkov bio_put(bio); 29154a88eb8SPavel Begunkov } 29254a88eb8SPavel Begunkov } 29354a88eb8SPavel Begunkov 29454a88eb8SPavel Begunkov static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb, 29554a88eb8SPavel Begunkov struct iov_iter *iter, 29654a88eb8SPavel Begunkov unsigned int nr_pages) 29754a88eb8SPavel Begunkov { 29854a88eb8SPavel Begunkov struct block_device *bdev = iocb->ki_filp->private_data; 299b77c88c2SChristoph Hellwig bool is_read = iov_iter_rw(iter) == READ; 30016458cf3SBart Van Assche blk_opf_t opf = is_read ? REQ_OP_READ : dio_bio_write_op(iocb); 30154a88eb8SPavel Begunkov struct blkdev_dio *dio; 30254a88eb8SPavel Begunkov struct bio *bio; 30354a88eb8SPavel Begunkov loff_t pos = iocb->ki_pos; 30454a88eb8SPavel Begunkov int ret = 0; 30554a88eb8SPavel Begunkov 30637fee2e4SKeith Busch if (blkdev_dio_unaligned(bdev, pos, iter)) 30754a88eb8SPavel Begunkov return -EINVAL; 30854a88eb8SPavel Begunkov 3090df71650SMike Snitzer if (iocb->ki_flags & IOCB_ALLOC_CACHE) 3100df71650SMike Snitzer opf |= REQ_ALLOC_CACHE; 3110df71650SMike Snitzer bio = bio_alloc_bioset(bdev, nr_pages, opf, GFP_KERNEL, 3120df71650SMike Snitzer &blkdev_dio_pool); 31354a88eb8SPavel Begunkov dio = container_of(bio, struct blkdev_dio, bio); 31454a88eb8SPavel Begunkov dio->flags = 0; 31554a88eb8SPavel Begunkov dio->iocb = iocb; 31654a88eb8SPavel Begunkov bio->bi_iter.bi_sector = pos >> SECTOR_SHIFT; 31754a88eb8SPavel Begunkov bio->bi_end_io = blkdev_bio_end_io_async; 31854a88eb8SPavel Begunkov bio->bi_ioprio = iocb->ki_ioprio; 31954a88eb8SPavel Begunkov 3201bb6b810SPavel Begunkov if (iov_iter_is_bvec(iter)) { 3211bb6b810SPavel Begunkov /* 3221bb6b810SPavel Begunkov * Users don't rely on the iterator being in any particular 3231bb6b810SPavel Begunkov * state for async I/O returning -EIOCBQUEUED, hence we can 3241bb6b810SPavel Begunkov * avoid expensive iov_iter_advance(). Bypass 3251bb6b810SPavel Begunkov * bio_iov_iter_get_pages() and set the bvec directly. 3261bb6b810SPavel Begunkov */ 3271bb6b810SPavel Begunkov bio_iov_bvec_set(bio, iter); 3281bb6b810SPavel Begunkov } else { 32954a88eb8SPavel Begunkov ret = bio_iov_iter_get_pages(bio, iter); 33054a88eb8SPavel Begunkov if (unlikely(ret)) { 33175feae73SPavel Begunkov bio_put(bio); 33254a88eb8SPavel Begunkov return ret; 33354a88eb8SPavel Begunkov } 3341bb6b810SPavel Begunkov } 33554a88eb8SPavel Begunkov dio->size = bio->bi_iter.bi_size; 33654a88eb8SPavel Begunkov 337b77c88c2SChristoph Hellwig if (is_read) { 338*fcb14cb1SAl Viro if (user_backed_iter(iter)) { 33954a88eb8SPavel Begunkov dio->flags |= DIO_SHOULD_DIRTY; 34054a88eb8SPavel Begunkov bio_set_pages_dirty(bio); 34154a88eb8SPavel Begunkov } 34254a88eb8SPavel Begunkov } else { 34354a88eb8SPavel Begunkov task_io_account_write(bio->bi_iter.bi_size); 34454a88eb8SPavel Begunkov } 34554a88eb8SPavel Begunkov 34654a88eb8SPavel Begunkov if (iocb->ki_flags & IOCB_HIPRI) { 347842e39b0SPavel Begunkov bio->bi_opf |= REQ_POLLED | REQ_NOWAIT; 34854a88eb8SPavel Begunkov submit_bio(bio); 34954a88eb8SPavel Begunkov WRITE_ONCE(iocb->private, bio); 35054a88eb8SPavel Begunkov } else { 351842e39b0SPavel Begunkov if (iocb->ki_flags & IOCB_NOWAIT) 352842e39b0SPavel Begunkov bio->bi_opf |= REQ_NOWAIT; 35354a88eb8SPavel Begunkov submit_bio(bio); 35454a88eb8SPavel Begunkov } 35554a88eb8SPavel Begunkov return -EIOCBQUEUED; 35654a88eb8SPavel Begunkov } 35754a88eb8SPavel Begunkov 358cd82cca7SChristoph Hellwig static ssize_t blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter) 359cd82cca7SChristoph Hellwig { 360cd82cca7SChristoph Hellwig unsigned int nr_pages; 361cd82cca7SChristoph Hellwig 362cd82cca7SChristoph Hellwig if (!iov_iter_count(iter)) 363cd82cca7SChristoph Hellwig return 0; 364cd82cca7SChristoph Hellwig 365cd82cca7SChristoph Hellwig nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS + 1); 36654a88eb8SPavel Begunkov if (likely(nr_pages <= BIO_MAX_VECS)) { 36754a88eb8SPavel Begunkov if (is_sync_kiocb(iocb)) 368cd82cca7SChristoph Hellwig return __blkdev_direct_IO_simple(iocb, iter, nr_pages); 36954a88eb8SPavel Begunkov return __blkdev_direct_IO_async(iocb, iter, nr_pages); 37054a88eb8SPavel Begunkov } 371cd82cca7SChristoph Hellwig return __blkdev_direct_IO(iocb, iter, bio_max_segs(nr_pages)); 372cd82cca7SChristoph Hellwig } 373cd82cca7SChristoph Hellwig 374cd82cca7SChristoph Hellwig static int blkdev_writepage(struct page *page, struct writeback_control *wbc) 375cd82cca7SChristoph Hellwig { 376cd82cca7SChristoph Hellwig return block_write_full_page(page, blkdev_get_block, wbc); 377cd82cca7SChristoph Hellwig } 378cd82cca7SChristoph Hellwig 3792c69e205SMatthew Wilcox (Oracle) static int blkdev_read_folio(struct file *file, struct folio *folio) 380cd82cca7SChristoph Hellwig { 3812c69e205SMatthew Wilcox (Oracle) return block_read_full_folio(folio, blkdev_get_block); 382cd82cca7SChristoph Hellwig } 383cd82cca7SChristoph Hellwig 384cd82cca7SChristoph Hellwig static void blkdev_readahead(struct readahead_control *rac) 385cd82cca7SChristoph Hellwig { 386cd82cca7SChristoph Hellwig mpage_readahead(rac, blkdev_get_block); 387cd82cca7SChristoph Hellwig } 388cd82cca7SChristoph Hellwig 389cd82cca7SChristoph Hellwig static int blkdev_write_begin(struct file *file, struct address_space *mapping, 3909d6b0cd7SMatthew Wilcox (Oracle) loff_t pos, unsigned len, struct page **pagep, void **fsdata) 391cd82cca7SChristoph Hellwig { 392b3992d1eSMatthew Wilcox (Oracle) return block_write_begin(mapping, pos, len, pagep, blkdev_get_block); 393cd82cca7SChristoph Hellwig } 394cd82cca7SChristoph Hellwig 395cd82cca7SChristoph Hellwig static int blkdev_write_end(struct file *file, struct address_space *mapping, 396cd82cca7SChristoph Hellwig loff_t pos, unsigned len, unsigned copied, struct page *page, 397cd82cca7SChristoph Hellwig void *fsdata) 398cd82cca7SChristoph Hellwig { 399cd82cca7SChristoph Hellwig int ret; 400cd82cca7SChristoph Hellwig ret = block_write_end(file, mapping, pos, len, copied, page, fsdata); 401cd82cca7SChristoph Hellwig 402cd82cca7SChristoph Hellwig unlock_page(page); 403cd82cca7SChristoph Hellwig put_page(page); 404cd82cca7SChristoph Hellwig 405cd82cca7SChristoph Hellwig return ret; 406cd82cca7SChristoph Hellwig } 407cd82cca7SChristoph Hellwig 408cd82cca7SChristoph Hellwig static int blkdev_writepages(struct address_space *mapping, 409cd82cca7SChristoph Hellwig struct writeback_control *wbc) 410cd82cca7SChristoph Hellwig { 411cd82cca7SChristoph Hellwig return generic_writepages(mapping, wbc); 412cd82cca7SChristoph Hellwig } 413cd82cca7SChristoph Hellwig 414cd82cca7SChristoph Hellwig const struct address_space_operations def_blk_aops = { 415e621900aSMatthew Wilcox (Oracle) .dirty_folio = block_dirty_folio, 4167ba13abbSMatthew Wilcox (Oracle) .invalidate_folio = block_invalidate_folio, 4172c69e205SMatthew Wilcox (Oracle) .read_folio = blkdev_read_folio, 418cd82cca7SChristoph Hellwig .readahead = blkdev_readahead, 419cd82cca7SChristoph Hellwig .writepage = blkdev_writepage, 420cd82cca7SChristoph Hellwig .write_begin = blkdev_write_begin, 421cd82cca7SChristoph Hellwig .write_end = blkdev_write_end, 422cd82cca7SChristoph Hellwig .writepages = blkdev_writepages, 423cd82cca7SChristoph Hellwig .direct_IO = blkdev_direct_IO, 42467235182SMatthew Wilcox (Oracle) .migrate_folio = buffer_migrate_folio_norefs, 425cd82cca7SChristoph Hellwig .is_dirty_writeback = buffer_check_dirty_writeback, 426cd82cca7SChristoph Hellwig }; 427cd82cca7SChristoph Hellwig 428cd82cca7SChristoph Hellwig /* 429cd82cca7SChristoph Hellwig * for a block special file file_inode(file)->i_size is zero 430cd82cca7SChristoph Hellwig * so we compute the size by hand (just as in block_read/write above) 431cd82cca7SChristoph Hellwig */ 432cd82cca7SChristoph Hellwig static loff_t blkdev_llseek(struct file *file, loff_t offset, int whence) 433cd82cca7SChristoph Hellwig { 434cd82cca7SChristoph Hellwig struct inode *bd_inode = bdev_file_inode(file); 435cd82cca7SChristoph Hellwig loff_t retval; 436cd82cca7SChristoph Hellwig 437cd82cca7SChristoph Hellwig inode_lock(bd_inode); 438cd82cca7SChristoph Hellwig retval = fixed_size_llseek(file, offset, whence, i_size_read(bd_inode)); 439cd82cca7SChristoph Hellwig inode_unlock(bd_inode); 440cd82cca7SChristoph Hellwig return retval; 441cd82cca7SChristoph Hellwig } 442cd82cca7SChristoph Hellwig 443cd82cca7SChristoph Hellwig static int blkdev_fsync(struct file *filp, loff_t start, loff_t end, 444cd82cca7SChristoph Hellwig int datasync) 445cd82cca7SChristoph Hellwig { 446fac7c6d5SPavel Begunkov struct block_device *bdev = filp->private_data; 447cd82cca7SChristoph Hellwig int error; 448cd82cca7SChristoph Hellwig 449cd82cca7SChristoph Hellwig error = file_write_and_wait_range(filp, start, end); 450cd82cca7SChristoph Hellwig if (error) 451cd82cca7SChristoph Hellwig return error; 452cd82cca7SChristoph Hellwig 453cd82cca7SChristoph Hellwig /* 454cd82cca7SChristoph Hellwig * There is no need to serialise calls to blkdev_issue_flush with 455cd82cca7SChristoph Hellwig * i_mutex and doing so causes performance issues with concurrent 456cd82cca7SChristoph Hellwig * O_SYNC writers to a block device. 457cd82cca7SChristoph Hellwig */ 458cd82cca7SChristoph Hellwig error = blkdev_issue_flush(bdev); 459cd82cca7SChristoph Hellwig if (error == -EOPNOTSUPP) 460cd82cca7SChristoph Hellwig error = 0; 461cd82cca7SChristoph Hellwig 462cd82cca7SChristoph Hellwig return error; 463cd82cca7SChristoph Hellwig } 464cd82cca7SChristoph Hellwig 465cd82cca7SChristoph Hellwig static int blkdev_open(struct inode *inode, struct file *filp) 466cd82cca7SChristoph Hellwig { 467cd82cca7SChristoph Hellwig struct block_device *bdev; 468cd82cca7SChristoph Hellwig 469cd82cca7SChristoph Hellwig /* 470cd82cca7SChristoph Hellwig * Preserve backwards compatibility and allow large file access 471cd82cca7SChristoph Hellwig * even if userspace doesn't ask for it explicitly. Some mkfs 472cd82cca7SChristoph Hellwig * binary needs it. We might want to drop this workaround 473cd82cca7SChristoph Hellwig * during an unstable branch. 474cd82cca7SChristoph Hellwig */ 475cd82cca7SChristoph Hellwig filp->f_flags |= O_LARGEFILE; 476cd82cca7SChristoph Hellwig filp->f_mode |= FMODE_NOWAIT | FMODE_BUF_RASYNC; 477cd82cca7SChristoph Hellwig 478cd82cca7SChristoph Hellwig if (filp->f_flags & O_NDELAY) 479cd82cca7SChristoph Hellwig filp->f_mode |= FMODE_NDELAY; 480cd82cca7SChristoph Hellwig if (filp->f_flags & O_EXCL) 481cd82cca7SChristoph Hellwig filp->f_mode |= FMODE_EXCL; 482cd82cca7SChristoph Hellwig if ((filp->f_flags & O_ACCMODE) == 3) 483cd82cca7SChristoph Hellwig filp->f_mode |= FMODE_WRITE_IOCTL; 484cd82cca7SChristoph Hellwig 485cd82cca7SChristoph Hellwig bdev = blkdev_get_by_dev(inode->i_rdev, filp->f_mode, filp); 486cd82cca7SChristoph Hellwig if (IS_ERR(bdev)) 487cd82cca7SChristoph Hellwig return PTR_ERR(bdev); 488fac7c6d5SPavel Begunkov 489fac7c6d5SPavel Begunkov filp->private_data = bdev; 490cd82cca7SChristoph Hellwig filp->f_mapping = bdev->bd_inode->i_mapping; 491cd82cca7SChristoph Hellwig filp->f_wb_err = filemap_sample_wb_err(filp->f_mapping); 492cd82cca7SChristoph Hellwig return 0; 493cd82cca7SChristoph Hellwig } 494cd82cca7SChristoph Hellwig 495cd82cca7SChristoph Hellwig static int blkdev_close(struct inode *inode, struct file *filp) 496cd82cca7SChristoph Hellwig { 497fac7c6d5SPavel Begunkov struct block_device *bdev = filp->private_data; 498cd82cca7SChristoph Hellwig 499cd82cca7SChristoph Hellwig blkdev_put(bdev, filp->f_mode); 500cd82cca7SChristoph Hellwig return 0; 501cd82cca7SChristoph Hellwig } 502cd82cca7SChristoph Hellwig 503cd82cca7SChristoph Hellwig /* 504cd82cca7SChristoph Hellwig * Write data to the block device. Only intended for the block device itself 505cd82cca7SChristoph Hellwig * and the raw driver which basically is a fake block device. 506cd82cca7SChristoph Hellwig * 507cd82cca7SChristoph Hellwig * Does not take i_mutex for the write and thus is not for general purpose 508cd82cca7SChristoph Hellwig * use. 509cd82cca7SChristoph Hellwig */ 510cd82cca7SChristoph Hellwig static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from) 511cd82cca7SChristoph Hellwig { 512fac7c6d5SPavel Begunkov struct block_device *bdev = iocb->ki_filp->private_data; 513fac7c6d5SPavel Begunkov struct inode *bd_inode = bdev->bd_inode; 514138c1a38SJens Axboe loff_t size = bdev_nr_bytes(bdev); 515cd82cca7SChristoph Hellwig struct blk_plug plug; 516cd82cca7SChristoph Hellwig size_t shorted = 0; 517cd82cca7SChristoph Hellwig ssize_t ret; 518cd82cca7SChristoph Hellwig 519fac7c6d5SPavel Begunkov if (bdev_read_only(bdev)) 520cd82cca7SChristoph Hellwig return -EPERM; 521cd82cca7SChristoph Hellwig 522cd82cca7SChristoph Hellwig if (IS_SWAPFILE(bd_inode) && !is_hibernate_resume_dev(bd_inode->i_rdev)) 523cd82cca7SChristoph Hellwig return -ETXTBSY; 524cd82cca7SChristoph Hellwig 525cd82cca7SChristoph Hellwig if (!iov_iter_count(from)) 526cd82cca7SChristoph Hellwig return 0; 527cd82cca7SChristoph Hellwig 528cd82cca7SChristoph Hellwig if (iocb->ki_pos >= size) 529cd82cca7SChristoph Hellwig return -ENOSPC; 530cd82cca7SChristoph Hellwig 531cd82cca7SChristoph Hellwig if ((iocb->ki_flags & (IOCB_NOWAIT | IOCB_DIRECT)) == IOCB_NOWAIT) 532cd82cca7SChristoph Hellwig return -EOPNOTSUPP; 533cd82cca7SChristoph Hellwig 534cd82cca7SChristoph Hellwig size -= iocb->ki_pos; 535cd82cca7SChristoph Hellwig if (iov_iter_count(from) > size) { 536cd82cca7SChristoph Hellwig shorted = iov_iter_count(from) - size; 537cd82cca7SChristoph Hellwig iov_iter_truncate(from, size); 538cd82cca7SChristoph Hellwig } 539cd82cca7SChristoph Hellwig 540cd82cca7SChristoph Hellwig blk_start_plug(&plug); 541cd82cca7SChristoph Hellwig ret = __generic_file_write_iter(iocb, from); 542cd82cca7SChristoph Hellwig if (ret > 0) 543cd82cca7SChristoph Hellwig ret = generic_write_sync(iocb, ret); 544cd82cca7SChristoph Hellwig iov_iter_reexpand(from, iov_iter_count(from) + shorted); 545cd82cca7SChristoph Hellwig blk_finish_plug(&plug); 546cd82cca7SChristoph Hellwig return ret; 547cd82cca7SChristoph Hellwig } 548cd82cca7SChristoph Hellwig 549cd82cca7SChristoph Hellwig static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to) 550cd82cca7SChristoph Hellwig { 551fac7c6d5SPavel Begunkov struct block_device *bdev = iocb->ki_filp->private_data; 552138c1a38SJens Axboe loff_t size = bdev_nr_bytes(bdev); 553cd82cca7SChristoph Hellwig loff_t pos = iocb->ki_pos; 554cd82cca7SChristoph Hellwig size_t shorted = 0; 555ceaa7625SJens Axboe ssize_t ret = 0; 5563e1f941dSIlya Dryomov size_t count; 557cd82cca7SChristoph Hellwig 5583e1f941dSIlya Dryomov if (unlikely(pos + iov_iter_count(to) > size)) { 559cd82cca7SChristoph Hellwig if (pos >= size) 560cd82cca7SChristoph Hellwig return 0; 561cd82cca7SChristoph Hellwig size -= pos; 5623e1f941dSIlya Dryomov shorted = iov_iter_count(to) - size; 563cd82cca7SChristoph Hellwig iov_iter_truncate(to, size); 564cd82cca7SChristoph Hellwig } 5653e1f941dSIlya Dryomov 5663e1f941dSIlya Dryomov count = iov_iter_count(to); 5673e1f941dSIlya Dryomov if (!count) 5683e1f941dSIlya Dryomov goto reexpand; /* skip atime */ 569cd82cca7SChristoph Hellwig 570ceaa7625SJens Axboe if (iocb->ki_flags & IOCB_DIRECT) { 571ceaa7625SJens Axboe struct address_space *mapping = iocb->ki_filp->f_mapping; 572ceaa7625SJens Axboe 573ceaa7625SJens Axboe if (iocb->ki_flags & IOCB_NOWAIT) { 5743e1f941dSIlya Dryomov if (filemap_range_needs_writeback(mapping, pos, 5753e1f941dSIlya Dryomov pos + count - 1)) { 5763e1f941dSIlya Dryomov ret = -EAGAIN; 5773e1f941dSIlya Dryomov goto reexpand; 5783e1f941dSIlya Dryomov } 579ceaa7625SJens Axboe } else { 5803e1f941dSIlya Dryomov ret = filemap_write_and_wait_range(mapping, pos, 5813e1f941dSIlya Dryomov pos + count - 1); 582ceaa7625SJens Axboe if (ret < 0) 5833e1f941dSIlya Dryomov goto reexpand; 584ceaa7625SJens Axboe } 585ceaa7625SJens Axboe 586ceaa7625SJens Axboe file_accessed(iocb->ki_filp); 587ceaa7625SJens Axboe 588ceaa7625SJens Axboe ret = blkdev_direct_IO(iocb, to); 589ceaa7625SJens Axboe if (ret >= 0) { 590ceaa7625SJens Axboe iocb->ki_pos += ret; 591ceaa7625SJens Axboe count -= ret; 592ceaa7625SJens Axboe } 5933e1f941dSIlya Dryomov iov_iter_revert(to, count - iov_iter_count(to)); 594ceaa7625SJens Axboe if (ret < 0 || !count) 5953e1f941dSIlya Dryomov goto reexpand; 596ceaa7625SJens Axboe } 597ceaa7625SJens Axboe 598ceaa7625SJens Axboe ret = filemap_read(iocb, to, ret); 5996450fe1fSPavel Begunkov 6003e1f941dSIlya Dryomov reexpand: 6016450fe1fSPavel Begunkov if (unlikely(shorted)) 602cd82cca7SChristoph Hellwig iov_iter_reexpand(to, iov_iter_count(to) + shorted); 603cd82cca7SChristoph Hellwig return ret; 604cd82cca7SChristoph Hellwig } 605cd82cca7SChristoph Hellwig 606cd82cca7SChristoph Hellwig #define BLKDEV_FALLOC_FL_SUPPORTED \ 607cd82cca7SChristoph Hellwig (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \ 608cd82cca7SChristoph Hellwig FALLOC_FL_ZERO_RANGE | FALLOC_FL_NO_HIDE_STALE) 609cd82cca7SChristoph Hellwig 610cd82cca7SChristoph Hellwig static long blkdev_fallocate(struct file *file, int mode, loff_t start, 611cd82cca7SChristoph Hellwig loff_t len) 612cd82cca7SChristoph Hellwig { 613f278eb3dSMing Lei struct inode *inode = bdev_file_inode(file); 614f278eb3dSMing Lei struct block_device *bdev = I_BDEV(inode); 615cd82cca7SChristoph Hellwig loff_t end = start + len - 1; 616cd82cca7SChristoph Hellwig loff_t isize; 617cd82cca7SChristoph Hellwig int error; 618cd82cca7SChristoph Hellwig 619cd82cca7SChristoph Hellwig /* Fail if we don't recognize the flags. */ 620cd82cca7SChristoph Hellwig if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) 621cd82cca7SChristoph Hellwig return -EOPNOTSUPP; 622cd82cca7SChristoph Hellwig 623cd82cca7SChristoph Hellwig /* Don't go off the end of the device. */ 6242a93ad8fSChristoph Hellwig isize = bdev_nr_bytes(bdev); 625cd82cca7SChristoph Hellwig if (start >= isize) 626cd82cca7SChristoph Hellwig return -EINVAL; 627cd82cca7SChristoph Hellwig if (end >= isize) { 628cd82cca7SChristoph Hellwig if (mode & FALLOC_FL_KEEP_SIZE) { 629cd82cca7SChristoph Hellwig len = isize - start; 630cd82cca7SChristoph Hellwig end = start + len - 1; 631cd82cca7SChristoph Hellwig } else 632cd82cca7SChristoph Hellwig return -EINVAL; 633cd82cca7SChristoph Hellwig } 634cd82cca7SChristoph Hellwig 635cd82cca7SChristoph Hellwig /* 636cd82cca7SChristoph Hellwig * Don't allow IO that isn't aligned to logical block size. 637cd82cca7SChristoph Hellwig */ 638cd82cca7SChristoph Hellwig if ((start | len) & (bdev_logical_block_size(bdev) - 1)) 639cd82cca7SChristoph Hellwig return -EINVAL; 640cd82cca7SChristoph Hellwig 641f278eb3dSMing Lei filemap_invalidate_lock(inode->i_mapping); 642f278eb3dSMing Lei 643cd82cca7SChristoph Hellwig /* Invalidate the page cache, including dirty pages. */ 644cd82cca7SChristoph Hellwig error = truncate_bdev_range(bdev, file->f_mode, start, end); 645cd82cca7SChristoph Hellwig if (error) 646f278eb3dSMing Lei goto fail; 647cd82cca7SChristoph Hellwig 648cd82cca7SChristoph Hellwig switch (mode) { 649cd82cca7SChristoph Hellwig case FALLOC_FL_ZERO_RANGE: 650cd82cca7SChristoph Hellwig case FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE: 6516549a874SPavel Begunkov error = blkdev_issue_zeroout(bdev, start >> SECTOR_SHIFT, 6526549a874SPavel Begunkov len >> SECTOR_SHIFT, GFP_KERNEL, 6536549a874SPavel Begunkov BLKDEV_ZERO_NOUNMAP); 654cd82cca7SChristoph Hellwig break; 655cd82cca7SChristoph Hellwig case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE: 6566549a874SPavel Begunkov error = blkdev_issue_zeroout(bdev, start >> SECTOR_SHIFT, 6576549a874SPavel Begunkov len >> SECTOR_SHIFT, GFP_KERNEL, 6586549a874SPavel Begunkov BLKDEV_ZERO_NOFALLBACK); 659cd82cca7SChristoph Hellwig break; 660cd82cca7SChristoph Hellwig case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | FALLOC_FL_NO_HIDE_STALE: 6616549a874SPavel Begunkov error = blkdev_issue_discard(bdev, start >> SECTOR_SHIFT, 66244abff2cSChristoph Hellwig len >> SECTOR_SHIFT, GFP_KERNEL); 663cd82cca7SChristoph Hellwig break; 664cd82cca7SChristoph Hellwig default: 665f278eb3dSMing Lei error = -EOPNOTSUPP; 666cd82cca7SChristoph Hellwig } 667cd82cca7SChristoph Hellwig 668f278eb3dSMing Lei fail: 669f278eb3dSMing Lei filemap_invalidate_unlock(inode->i_mapping); 670f278eb3dSMing Lei return error; 671cd82cca7SChristoph Hellwig } 672cd82cca7SChristoph Hellwig 673cd82cca7SChristoph Hellwig const struct file_operations def_blk_fops = { 674cd82cca7SChristoph Hellwig .open = blkdev_open, 675cd82cca7SChristoph Hellwig .release = blkdev_close, 676cd82cca7SChristoph Hellwig .llseek = blkdev_llseek, 677cd82cca7SChristoph Hellwig .read_iter = blkdev_read_iter, 678cd82cca7SChristoph Hellwig .write_iter = blkdev_write_iter, 6793e08773cSChristoph Hellwig .iopoll = iocb_bio_iopoll, 680cd82cca7SChristoph Hellwig .mmap = generic_file_mmap, 681cd82cca7SChristoph Hellwig .fsync = blkdev_fsync, 6828a709512SChristoph Hellwig .unlocked_ioctl = blkdev_ioctl, 683cd82cca7SChristoph Hellwig #ifdef CONFIG_COMPAT 684cd82cca7SChristoph Hellwig .compat_ioctl = compat_blkdev_ioctl, 685cd82cca7SChristoph Hellwig #endif 686cd82cca7SChristoph Hellwig .splice_read = generic_file_splice_read, 687cd82cca7SChristoph Hellwig .splice_write = iter_file_splice_write, 688cd82cca7SChristoph Hellwig .fallocate = blkdev_fallocate, 689cd82cca7SChristoph Hellwig }; 690cd82cca7SChristoph Hellwig 691cd82cca7SChristoph Hellwig static __init int blkdev_init(void) 692cd82cca7SChristoph Hellwig { 693cd82cca7SChristoph Hellwig return bioset_init(&blkdev_dio_pool, 4, 694cd82cca7SChristoph Hellwig offsetof(struct blkdev_dio, bio), 695cd82cca7SChristoph Hellwig BIOSET_NEED_BVECS|BIOSET_PERCPU_CACHE); 696cd82cca7SChristoph Hellwig } 697cd82cca7SChristoph Hellwig module_init(blkdev_init); 698