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> 18cd82cca7SChristoph Hellwig #include "blk.h" 19cd82cca7SChristoph Hellwig 20cd82cca7SChristoph Hellwig static struct inode *bdev_file_inode(struct file *file) 21cd82cca7SChristoph Hellwig { 22cd82cca7SChristoph Hellwig return file->f_mapping->host; 23cd82cca7SChristoph Hellwig } 24cd82cca7SChristoph Hellwig 25cd82cca7SChristoph Hellwig static int blkdev_get_block(struct inode *inode, sector_t iblock, 26cd82cca7SChristoph Hellwig struct buffer_head *bh, int create) 27cd82cca7SChristoph Hellwig { 28cd82cca7SChristoph Hellwig bh->b_bdev = I_BDEV(inode); 29cd82cca7SChristoph Hellwig bh->b_blocknr = iblock; 30cd82cca7SChristoph Hellwig set_buffer_mapped(bh); 31cd82cca7SChristoph Hellwig return 0; 32cd82cca7SChristoph Hellwig } 33cd82cca7SChristoph Hellwig 34cd82cca7SChristoph Hellwig static unsigned int dio_bio_write_op(struct kiocb *iocb) 35cd82cca7SChristoph Hellwig { 36cd82cca7SChristoph Hellwig unsigned int op = REQ_OP_WRITE | REQ_SYNC | REQ_IDLE; 37cd82cca7SChristoph Hellwig 38cd82cca7SChristoph Hellwig /* avoid the need for a I/O completion work item */ 39cd82cca7SChristoph Hellwig if (iocb->ki_flags & IOCB_DSYNC) 40cd82cca7SChristoph Hellwig op |= REQ_FUA; 41cd82cca7SChristoph Hellwig return op; 42cd82cca7SChristoph Hellwig } 43cd82cca7SChristoph Hellwig 44cd82cca7SChristoph Hellwig #define DIO_INLINE_BIO_VECS 4 45cd82cca7SChristoph Hellwig 46cd82cca7SChristoph Hellwig static void blkdev_bio_end_io_simple(struct bio *bio) 47cd82cca7SChristoph Hellwig { 48cd82cca7SChristoph Hellwig struct task_struct *waiter = bio->bi_private; 49cd82cca7SChristoph Hellwig 50cd82cca7SChristoph Hellwig WRITE_ONCE(bio->bi_private, NULL); 51cd82cca7SChristoph Hellwig blk_wake_io_task(waiter); 52cd82cca7SChristoph Hellwig } 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 { 57cd82cca7SChristoph Hellwig struct file *file = iocb->ki_filp; 58cd82cca7SChristoph Hellwig struct block_device *bdev = I_BDEV(bdev_file_inode(file)); 59cd82cca7SChristoph Hellwig struct bio_vec inline_vecs[DIO_INLINE_BIO_VECS], *vecs; 60cd82cca7SChristoph Hellwig loff_t pos = iocb->ki_pos; 61cd82cca7SChristoph Hellwig bool should_dirty = false; 62cd82cca7SChristoph Hellwig struct bio bio; 63cd82cca7SChristoph Hellwig ssize_t ret; 64cd82cca7SChristoph Hellwig blk_qc_t qc; 65cd82cca7SChristoph Hellwig 66cd82cca7SChristoph Hellwig if ((pos | iov_iter_alignment(iter)) & 67cd82cca7SChristoph Hellwig (bdev_logical_block_size(bdev) - 1)) 68cd82cca7SChristoph Hellwig return -EINVAL; 69cd82cca7SChristoph Hellwig 70cd82cca7SChristoph Hellwig if (nr_pages <= DIO_INLINE_BIO_VECS) 71cd82cca7SChristoph Hellwig vecs = inline_vecs; 72cd82cca7SChristoph Hellwig else { 73cd82cca7SChristoph Hellwig vecs = kmalloc_array(nr_pages, sizeof(struct bio_vec), 74cd82cca7SChristoph Hellwig GFP_KERNEL); 75cd82cca7SChristoph Hellwig if (!vecs) 76cd82cca7SChristoph Hellwig return -ENOMEM; 77cd82cca7SChristoph Hellwig } 78cd82cca7SChristoph Hellwig 79cd82cca7SChristoph Hellwig bio_init(&bio, vecs, nr_pages); 80cd82cca7SChristoph Hellwig bio_set_dev(&bio, bdev); 81cd82cca7SChristoph Hellwig bio.bi_iter.bi_sector = pos >> 9; 82cd82cca7SChristoph Hellwig bio.bi_write_hint = iocb->ki_hint; 83cd82cca7SChristoph Hellwig bio.bi_private = current; 84cd82cca7SChristoph Hellwig bio.bi_end_io = blkdev_bio_end_io_simple; 85cd82cca7SChristoph Hellwig bio.bi_ioprio = iocb->ki_ioprio; 86cd82cca7SChristoph Hellwig 87cd82cca7SChristoph Hellwig ret = bio_iov_iter_get_pages(&bio, iter); 88cd82cca7SChristoph Hellwig if (unlikely(ret)) 89cd82cca7SChristoph Hellwig goto out; 90cd82cca7SChristoph Hellwig ret = bio.bi_iter.bi_size; 91cd82cca7SChristoph Hellwig 92cd82cca7SChristoph Hellwig if (iov_iter_rw(iter) == READ) { 93cd82cca7SChristoph Hellwig bio.bi_opf = REQ_OP_READ; 94cd82cca7SChristoph Hellwig if (iter_is_iovec(iter)) 95cd82cca7SChristoph Hellwig should_dirty = true; 96cd82cca7SChristoph Hellwig } else { 97cd82cca7SChristoph Hellwig bio.bi_opf = dio_bio_write_op(iocb); 98cd82cca7SChristoph Hellwig task_io_account_write(ret); 99cd82cca7SChristoph Hellwig } 100cd82cca7SChristoph Hellwig if (iocb->ki_flags & IOCB_NOWAIT) 101cd82cca7SChristoph Hellwig bio.bi_opf |= REQ_NOWAIT; 102cd82cca7SChristoph Hellwig if (iocb->ki_flags & IOCB_HIPRI) 103cd82cca7SChristoph Hellwig bio_set_polled(&bio, iocb); 104cd82cca7SChristoph Hellwig 105cd82cca7SChristoph Hellwig qc = submit_bio(&bio); 106cd82cca7SChristoph Hellwig for (;;) { 107cd82cca7SChristoph Hellwig set_current_state(TASK_UNINTERRUPTIBLE); 108cd82cca7SChristoph Hellwig if (!READ_ONCE(bio.bi_private)) 109cd82cca7SChristoph Hellwig break; 110cd82cca7SChristoph Hellwig if (!(iocb->ki_flags & IOCB_HIPRI) || 111cd82cca7SChristoph Hellwig !blk_poll(bdev_get_queue(bdev), qc, true)) 112cd82cca7SChristoph Hellwig blk_io_schedule(); 113cd82cca7SChristoph Hellwig } 114cd82cca7SChristoph Hellwig __set_current_state(TASK_RUNNING); 115cd82cca7SChristoph Hellwig 116cd82cca7SChristoph Hellwig bio_release_pages(&bio, should_dirty); 117cd82cca7SChristoph Hellwig if (unlikely(bio.bi_status)) 118cd82cca7SChristoph Hellwig ret = blk_status_to_errno(bio.bi_status); 119cd82cca7SChristoph Hellwig 120cd82cca7SChristoph Hellwig out: 121cd82cca7SChristoph Hellwig if (vecs != inline_vecs) 122cd82cca7SChristoph Hellwig kfree(vecs); 123cd82cca7SChristoph Hellwig 124cd82cca7SChristoph Hellwig bio_uninit(&bio); 125cd82cca7SChristoph Hellwig 126cd82cca7SChristoph Hellwig return ret; 127cd82cca7SChristoph Hellwig } 128cd82cca7SChristoph Hellwig 129cd82cca7SChristoph Hellwig struct blkdev_dio { 130cd82cca7SChristoph Hellwig union { 131cd82cca7SChristoph Hellwig struct kiocb *iocb; 132cd82cca7SChristoph Hellwig struct task_struct *waiter; 133cd82cca7SChristoph Hellwig }; 134cd82cca7SChristoph Hellwig size_t size; 135cd82cca7SChristoph Hellwig atomic_t ref; 136cd82cca7SChristoph Hellwig bool multi_bio : 1; 137cd82cca7SChristoph Hellwig bool should_dirty : 1; 138cd82cca7SChristoph Hellwig bool is_sync : 1; 139cd82cca7SChristoph Hellwig struct bio bio; 140cd82cca7SChristoph Hellwig }; 141cd82cca7SChristoph Hellwig 142cd82cca7SChristoph Hellwig static struct bio_set blkdev_dio_pool; 143cd82cca7SChristoph Hellwig 144cd82cca7SChristoph Hellwig static int blkdev_iopoll(struct kiocb *kiocb, bool wait) 145cd82cca7SChristoph Hellwig { 146cd82cca7SChristoph Hellwig struct block_device *bdev = I_BDEV(kiocb->ki_filp->f_mapping->host); 147cd82cca7SChristoph Hellwig struct request_queue *q = bdev_get_queue(bdev); 148cd82cca7SChristoph Hellwig 149cd82cca7SChristoph Hellwig return blk_poll(q, READ_ONCE(kiocb->ki_cookie), wait); 150cd82cca7SChristoph Hellwig } 151cd82cca7SChristoph Hellwig 152cd82cca7SChristoph Hellwig static void blkdev_bio_end_io(struct bio *bio) 153cd82cca7SChristoph Hellwig { 154cd82cca7SChristoph Hellwig struct blkdev_dio *dio = bio->bi_private; 155cd82cca7SChristoph Hellwig bool should_dirty = dio->should_dirty; 156cd82cca7SChristoph Hellwig 157cd82cca7SChristoph Hellwig if (bio->bi_status && !dio->bio.bi_status) 158cd82cca7SChristoph Hellwig dio->bio.bi_status = bio->bi_status; 159cd82cca7SChristoph Hellwig 160cd82cca7SChristoph Hellwig if (!dio->multi_bio || atomic_dec_and_test(&dio->ref)) { 161cd82cca7SChristoph Hellwig if (!dio->is_sync) { 162cd82cca7SChristoph Hellwig struct kiocb *iocb = dio->iocb; 163cd82cca7SChristoph Hellwig ssize_t ret; 164cd82cca7SChristoph Hellwig 165cd82cca7SChristoph Hellwig if (likely(!dio->bio.bi_status)) { 166cd82cca7SChristoph Hellwig ret = dio->size; 167cd82cca7SChristoph Hellwig iocb->ki_pos += ret; 168cd82cca7SChristoph Hellwig } else { 169cd82cca7SChristoph Hellwig ret = blk_status_to_errno(dio->bio.bi_status); 170cd82cca7SChristoph Hellwig } 171cd82cca7SChristoph Hellwig 172cd82cca7SChristoph Hellwig dio->iocb->ki_complete(iocb, ret, 0); 173cd82cca7SChristoph Hellwig if (dio->multi_bio) 174cd82cca7SChristoph Hellwig bio_put(&dio->bio); 175cd82cca7SChristoph Hellwig } else { 176cd82cca7SChristoph Hellwig struct task_struct *waiter = dio->waiter; 177cd82cca7SChristoph Hellwig 178cd82cca7SChristoph Hellwig WRITE_ONCE(dio->waiter, NULL); 179cd82cca7SChristoph Hellwig blk_wake_io_task(waiter); 180cd82cca7SChristoph Hellwig } 181cd82cca7SChristoph Hellwig } 182cd82cca7SChristoph Hellwig 183cd82cca7SChristoph Hellwig if (should_dirty) { 184cd82cca7SChristoph Hellwig bio_check_pages_dirty(bio); 185cd82cca7SChristoph Hellwig } else { 186cd82cca7SChristoph Hellwig bio_release_pages(bio, false); 187cd82cca7SChristoph Hellwig bio_put(bio); 188cd82cca7SChristoph Hellwig } 189cd82cca7SChristoph Hellwig } 190cd82cca7SChristoph Hellwig 191cd82cca7SChristoph Hellwig static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 192cd82cca7SChristoph Hellwig unsigned int nr_pages) 193cd82cca7SChristoph Hellwig { 194cd82cca7SChristoph Hellwig struct file *file = iocb->ki_filp; 195cd82cca7SChristoph Hellwig struct inode *inode = bdev_file_inode(file); 196cd82cca7SChristoph Hellwig struct block_device *bdev = I_BDEV(inode); 197cd82cca7SChristoph Hellwig struct blk_plug plug; 198cd82cca7SChristoph Hellwig struct blkdev_dio *dio; 199cd82cca7SChristoph Hellwig struct bio *bio; 200cd82cca7SChristoph Hellwig bool is_poll = (iocb->ki_flags & IOCB_HIPRI) != 0; 201cd82cca7SChristoph Hellwig bool is_read = (iov_iter_rw(iter) == READ), is_sync; 202cd82cca7SChristoph Hellwig loff_t pos = iocb->ki_pos; 203cd82cca7SChristoph Hellwig blk_qc_t qc = BLK_QC_T_NONE; 204cd82cca7SChristoph Hellwig int ret = 0; 205cd82cca7SChristoph Hellwig 206cd82cca7SChristoph Hellwig if ((pos | iov_iter_alignment(iter)) & 207cd82cca7SChristoph Hellwig (bdev_logical_block_size(bdev) - 1)) 208cd82cca7SChristoph Hellwig return -EINVAL; 209cd82cca7SChristoph Hellwig 210cd82cca7SChristoph Hellwig bio = bio_alloc_kiocb(iocb, nr_pages, &blkdev_dio_pool); 211cd82cca7SChristoph Hellwig 212cd82cca7SChristoph Hellwig dio = container_of(bio, struct blkdev_dio, bio); 213cd82cca7SChristoph Hellwig dio->is_sync = is_sync = is_sync_kiocb(iocb); 214cd82cca7SChristoph Hellwig if (dio->is_sync) { 215cd82cca7SChristoph Hellwig dio->waiter = current; 216cd82cca7SChristoph Hellwig bio_get(bio); 217cd82cca7SChristoph Hellwig } else { 218cd82cca7SChristoph Hellwig dio->iocb = iocb; 219cd82cca7SChristoph Hellwig } 220cd82cca7SChristoph Hellwig 221cd82cca7SChristoph Hellwig dio->size = 0; 222cd82cca7SChristoph Hellwig dio->multi_bio = false; 223cd82cca7SChristoph Hellwig dio->should_dirty = is_read && iter_is_iovec(iter); 224cd82cca7SChristoph Hellwig 225cd82cca7SChristoph Hellwig /* 226cd82cca7SChristoph Hellwig * Don't plug for HIPRI/polled IO, as those should go straight 227cd82cca7SChristoph Hellwig * to issue 228cd82cca7SChristoph Hellwig */ 229cd82cca7SChristoph Hellwig if (!is_poll) 230cd82cca7SChristoph Hellwig blk_start_plug(&plug); 231cd82cca7SChristoph Hellwig 232cd82cca7SChristoph Hellwig for (;;) { 233cd82cca7SChristoph Hellwig bio_set_dev(bio, bdev); 234cd82cca7SChristoph Hellwig bio->bi_iter.bi_sector = pos >> 9; 235cd82cca7SChristoph Hellwig bio->bi_write_hint = iocb->ki_hint; 236cd82cca7SChristoph Hellwig bio->bi_private = dio; 237cd82cca7SChristoph Hellwig bio->bi_end_io = blkdev_bio_end_io; 238cd82cca7SChristoph Hellwig bio->bi_ioprio = iocb->ki_ioprio; 239cd82cca7SChristoph Hellwig 240cd82cca7SChristoph Hellwig ret = bio_iov_iter_get_pages(bio, iter); 241cd82cca7SChristoph Hellwig if (unlikely(ret)) { 242cd82cca7SChristoph Hellwig bio->bi_status = BLK_STS_IOERR; 243cd82cca7SChristoph Hellwig bio_endio(bio); 244cd82cca7SChristoph Hellwig break; 245cd82cca7SChristoph Hellwig } 246cd82cca7SChristoph Hellwig 247cd82cca7SChristoph Hellwig if (is_read) { 248cd82cca7SChristoph Hellwig bio->bi_opf = REQ_OP_READ; 249cd82cca7SChristoph Hellwig if (dio->should_dirty) 250cd82cca7SChristoph Hellwig bio_set_pages_dirty(bio); 251cd82cca7SChristoph Hellwig } else { 252cd82cca7SChristoph Hellwig bio->bi_opf = dio_bio_write_op(iocb); 253cd82cca7SChristoph Hellwig task_io_account_write(bio->bi_iter.bi_size); 254cd82cca7SChristoph Hellwig } 255cd82cca7SChristoph Hellwig if (iocb->ki_flags & IOCB_NOWAIT) 256cd82cca7SChristoph Hellwig bio->bi_opf |= REQ_NOWAIT; 257cd82cca7SChristoph Hellwig 258cd82cca7SChristoph Hellwig dio->size += bio->bi_iter.bi_size; 259cd82cca7SChristoph Hellwig pos += bio->bi_iter.bi_size; 260cd82cca7SChristoph Hellwig 261cd82cca7SChristoph Hellwig nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS); 262cd82cca7SChristoph Hellwig if (!nr_pages) { 263cd82cca7SChristoph Hellwig bool polled = false; 264cd82cca7SChristoph Hellwig 265cd82cca7SChristoph Hellwig if (iocb->ki_flags & IOCB_HIPRI) { 266cd82cca7SChristoph Hellwig bio_set_polled(bio, iocb); 267cd82cca7SChristoph Hellwig polled = true; 268cd82cca7SChristoph Hellwig } 269cd82cca7SChristoph Hellwig 270cd82cca7SChristoph Hellwig qc = submit_bio(bio); 271cd82cca7SChristoph Hellwig 272cd82cca7SChristoph Hellwig if (polled) 273cd82cca7SChristoph Hellwig WRITE_ONCE(iocb->ki_cookie, qc); 274cd82cca7SChristoph Hellwig break; 275cd82cca7SChristoph Hellwig } 276cd82cca7SChristoph Hellwig 277cd82cca7SChristoph Hellwig if (!dio->multi_bio) { 278cd82cca7SChristoph Hellwig /* 279cd82cca7SChristoph Hellwig * AIO needs an extra reference to ensure the dio 280cd82cca7SChristoph Hellwig * structure which is embedded into the first bio 281cd82cca7SChristoph Hellwig * stays around. 282cd82cca7SChristoph Hellwig */ 283cd82cca7SChristoph Hellwig if (!is_sync) 284cd82cca7SChristoph Hellwig bio_get(bio); 285cd82cca7SChristoph Hellwig dio->multi_bio = true; 286cd82cca7SChristoph Hellwig atomic_set(&dio->ref, 2); 287cd82cca7SChristoph Hellwig } else { 288cd82cca7SChristoph Hellwig atomic_inc(&dio->ref); 289cd82cca7SChristoph Hellwig } 290cd82cca7SChristoph Hellwig 291cd82cca7SChristoph Hellwig submit_bio(bio); 292cd82cca7SChristoph Hellwig bio = bio_alloc(GFP_KERNEL, nr_pages); 293cd82cca7SChristoph Hellwig } 294cd82cca7SChristoph Hellwig 295cd82cca7SChristoph Hellwig if (!is_poll) 296cd82cca7SChristoph Hellwig blk_finish_plug(&plug); 297cd82cca7SChristoph Hellwig 298cd82cca7SChristoph Hellwig if (!is_sync) 299cd82cca7SChristoph Hellwig return -EIOCBQUEUED; 300cd82cca7SChristoph Hellwig 301cd82cca7SChristoph Hellwig for (;;) { 302cd82cca7SChristoph Hellwig set_current_state(TASK_UNINTERRUPTIBLE); 303cd82cca7SChristoph Hellwig if (!READ_ONCE(dio->waiter)) 304cd82cca7SChristoph Hellwig break; 305cd82cca7SChristoph Hellwig 306cd82cca7SChristoph Hellwig if (!(iocb->ki_flags & IOCB_HIPRI) || 307cd82cca7SChristoph Hellwig !blk_poll(bdev_get_queue(bdev), qc, true)) 308cd82cca7SChristoph Hellwig blk_io_schedule(); 309cd82cca7SChristoph Hellwig } 310cd82cca7SChristoph Hellwig __set_current_state(TASK_RUNNING); 311cd82cca7SChristoph Hellwig 312cd82cca7SChristoph Hellwig if (!ret) 313cd82cca7SChristoph Hellwig ret = blk_status_to_errno(dio->bio.bi_status); 314cd82cca7SChristoph Hellwig if (likely(!ret)) 315cd82cca7SChristoph Hellwig ret = dio->size; 316cd82cca7SChristoph Hellwig 317cd82cca7SChristoph Hellwig bio_put(&dio->bio); 318cd82cca7SChristoph Hellwig return ret; 319cd82cca7SChristoph Hellwig } 320cd82cca7SChristoph Hellwig 321cd82cca7SChristoph Hellwig static ssize_t blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter) 322cd82cca7SChristoph Hellwig { 323cd82cca7SChristoph Hellwig unsigned int nr_pages; 324cd82cca7SChristoph Hellwig 325cd82cca7SChristoph Hellwig if (!iov_iter_count(iter)) 326cd82cca7SChristoph Hellwig return 0; 327cd82cca7SChristoph Hellwig 328cd82cca7SChristoph Hellwig nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS + 1); 329cd82cca7SChristoph Hellwig if (is_sync_kiocb(iocb) && nr_pages <= BIO_MAX_VECS) 330cd82cca7SChristoph Hellwig return __blkdev_direct_IO_simple(iocb, iter, nr_pages); 331cd82cca7SChristoph Hellwig 332cd82cca7SChristoph Hellwig return __blkdev_direct_IO(iocb, iter, bio_max_segs(nr_pages)); 333cd82cca7SChristoph Hellwig } 334cd82cca7SChristoph Hellwig 335cd82cca7SChristoph Hellwig static int blkdev_writepage(struct page *page, struct writeback_control *wbc) 336cd82cca7SChristoph Hellwig { 337cd82cca7SChristoph Hellwig return block_write_full_page(page, blkdev_get_block, wbc); 338cd82cca7SChristoph Hellwig } 339cd82cca7SChristoph Hellwig 340cd82cca7SChristoph Hellwig static int blkdev_readpage(struct file * file, struct page * page) 341cd82cca7SChristoph Hellwig { 342cd82cca7SChristoph Hellwig return block_read_full_page(page, blkdev_get_block); 343cd82cca7SChristoph Hellwig } 344cd82cca7SChristoph Hellwig 345cd82cca7SChristoph Hellwig static void blkdev_readahead(struct readahead_control *rac) 346cd82cca7SChristoph Hellwig { 347cd82cca7SChristoph Hellwig mpage_readahead(rac, blkdev_get_block); 348cd82cca7SChristoph Hellwig } 349cd82cca7SChristoph Hellwig 350cd82cca7SChristoph Hellwig static int blkdev_write_begin(struct file *file, struct address_space *mapping, 351cd82cca7SChristoph Hellwig loff_t pos, unsigned len, unsigned flags, struct page **pagep, 352cd82cca7SChristoph Hellwig void **fsdata) 353cd82cca7SChristoph Hellwig { 354cd82cca7SChristoph Hellwig return block_write_begin(mapping, pos, len, flags, pagep, 355cd82cca7SChristoph Hellwig blkdev_get_block); 356cd82cca7SChristoph Hellwig } 357cd82cca7SChristoph Hellwig 358cd82cca7SChristoph Hellwig static int blkdev_write_end(struct file *file, struct address_space *mapping, 359cd82cca7SChristoph Hellwig loff_t pos, unsigned len, unsigned copied, struct page *page, 360cd82cca7SChristoph Hellwig void *fsdata) 361cd82cca7SChristoph Hellwig { 362cd82cca7SChristoph Hellwig int ret; 363cd82cca7SChristoph Hellwig ret = block_write_end(file, mapping, pos, len, copied, page, fsdata); 364cd82cca7SChristoph Hellwig 365cd82cca7SChristoph Hellwig unlock_page(page); 366cd82cca7SChristoph Hellwig put_page(page); 367cd82cca7SChristoph Hellwig 368cd82cca7SChristoph Hellwig return ret; 369cd82cca7SChristoph Hellwig } 370cd82cca7SChristoph Hellwig 371cd82cca7SChristoph Hellwig static int blkdev_writepages(struct address_space *mapping, 372cd82cca7SChristoph Hellwig struct writeback_control *wbc) 373cd82cca7SChristoph Hellwig { 374cd82cca7SChristoph Hellwig return generic_writepages(mapping, wbc); 375cd82cca7SChristoph Hellwig } 376cd82cca7SChristoph Hellwig 377cd82cca7SChristoph Hellwig const struct address_space_operations def_blk_aops = { 378cd82cca7SChristoph Hellwig .set_page_dirty = __set_page_dirty_buffers, 379cd82cca7SChristoph Hellwig .readpage = blkdev_readpage, 380cd82cca7SChristoph Hellwig .readahead = blkdev_readahead, 381cd82cca7SChristoph Hellwig .writepage = blkdev_writepage, 382cd82cca7SChristoph Hellwig .write_begin = blkdev_write_begin, 383cd82cca7SChristoph Hellwig .write_end = blkdev_write_end, 384cd82cca7SChristoph Hellwig .writepages = blkdev_writepages, 385cd82cca7SChristoph Hellwig .direct_IO = blkdev_direct_IO, 386cd82cca7SChristoph Hellwig .migratepage = buffer_migrate_page_norefs, 387cd82cca7SChristoph Hellwig .is_dirty_writeback = buffer_check_dirty_writeback, 388cd82cca7SChristoph Hellwig }; 389cd82cca7SChristoph Hellwig 390cd82cca7SChristoph Hellwig /* 391cd82cca7SChristoph Hellwig * for a block special file file_inode(file)->i_size is zero 392cd82cca7SChristoph Hellwig * so we compute the size by hand (just as in block_read/write above) 393cd82cca7SChristoph Hellwig */ 394cd82cca7SChristoph Hellwig static loff_t blkdev_llseek(struct file *file, loff_t offset, int whence) 395cd82cca7SChristoph Hellwig { 396cd82cca7SChristoph Hellwig struct inode *bd_inode = bdev_file_inode(file); 397cd82cca7SChristoph Hellwig loff_t retval; 398cd82cca7SChristoph Hellwig 399cd82cca7SChristoph Hellwig inode_lock(bd_inode); 400cd82cca7SChristoph Hellwig retval = fixed_size_llseek(file, offset, whence, i_size_read(bd_inode)); 401cd82cca7SChristoph Hellwig inode_unlock(bd_inode); 402cd82cca7SChristoph Hellwig return retval; 403cd82cca7SChristoph Hellwig } 404cd82cca7SChristoph Hellwig 405cd82cca7SChristoph Hellwig static int blkdev_fsync(struct file *filp, loff_t start, loff_t end, 406cd82cca7SChristoph Hellwig int datasync) 407cd82cca7SChristoph Hellwig { 408cd82cca7SChristoph Hellwig struct inode *bd_inode = bdev_file_inode(filp); 409cd82cca7SChristoph Hellwig struct block_device *bdev = I_BDEV(bd_inode); 410cd82cca7SChristoph Hellwig int error; 411cd82cca7SChristoph Hellwig 412cd82cca7SChristoph Hellwig error = file_write_and_wait_range(filp, start, end); 413cd82cca7SChristoph Hellwig if (error) 414cd82cca7SChristoph Hellwig return error; 415cd82cca7SChristoph Hellwig 416cd82cca7SChristoph Hellwig /* 417cd82cca7SChristoph Hellwig * There is no need to serialise calls to blkdev_issue_flush with 418cd82cca7SChristoph Hellwig * i_mutex and doing so causes performance issues with concurrent 419cd82cca7SChristoph Hellwig * O_SYNC writers to a block device. 420cd82cca7SChristoph Hellwig */ 421cd82cca7SChristoph Hellwig error = blkdev_issue_flush(bdev); 422cd82cca7SChristoph Hellwig if (error == -EOPNOTSUPP) 423cd82cca7SChristoph Hellwig error = 0; 424cd82cca7SChristoph Hellwig 425cd82cca7SChristoph Hellwig return error; 426cd82cca7SChristoph Hellwig } 427cd82cca7SChristoph Hellwig 428cd82cca7SChristoph Hellwig static int blkdev_open(struct inode *inode, struct file *filp) 429cd82cca7SChristoph Hellwig { 430cd82cca7SChristoph Hellwig struct block_device *bdev; 431cd82cca7SChristoph Hellwig 432cd82cca7SChristoph Hellwig /* 433cd82cca7SChristoph Hellwig * Preserve backwards compatibility and allow large file access 434cd82cca7SChristoph Hellwig * even if userspace doesn't ask for it explicitly. Some mkfs 435cd82cca7SChristoph Hellwig * binary needs it. We might want to drop this workaround 436cd82cca7SChristoph Hellwig * during an unstable branch. 437cd82cca7SChristoph Hellwig */ 438cd82cca7SChristoph Hellwig filp->f_flags |= O_LARGEFILE; 439cd82cca7SChristoph Hellwig filp->f_mode |= FMODE_NOWAIT | FMODE_BUF_RASYNC; 440cd82cca7SChristoph Hellwig 441cd82cca7SChristoph Hellwig if (filp->f_flags & O_NDELAY) 442cd82cca7SChristoph Hellwig filp->f_mode |= FMODE_NDELAY; 443cd82cca7SChristoph Hellwig if (filp->f_flags & O_EXCL) 444cd82cca7SChristoph Hellwig filp->f_mode |= FMODE_EXCL; 445cd82cca7SChristoph Hellwig if ((filp->f_flags & O_ACCMODE) == 3) 446cd82cca7SChristoph Hellwig filp->f_mode |= FMODE_WRITE_IOCTL; 447cd82cca7SChristoph Hellwig 448cd82cca7SChristoph Hellwig bdev = blkdev_get_by_dev(inode->i_rdev, filp->f_mode, filp); 449cd82cca7SChristoph Hellwig if (IS_ERR(bdev)) 450cd82cca7SChristoph Hellwig return PTR_ERR(bdev); 451cd82cca7SChristoph Hellwig filp->f_mapping = bdev->bd_inode->i_mapping; 452cd82cca7SChristoph Hellwig filp->f_wb_err = filemap_sample_wb_err(filp->f_mapping); 453cd82cca7SChristoph Hellwig return 0; 454cd82cca7SChristoph Hellwig } 455cd82cca7SChristoph Hellwig 456cd82cca7SChristoph Hellwig static int blkdev_close(struct inode *inode, struct file *filp) 457cd82cca7SChristoph Hellwig { 458cd82cca7SChristoph Hellwig struct block_device *bdev = I_BDEV(bdev_file_inode(filp)); 459cd82cca7SChristoph Hellwig 460cd82cca7SChristoph Hellwig blkdev_put(bdev, filp->f_mode); 461cd82cca7SChristoph Hellwig return 0; 462cd82cca7SChristoph Hellwig } 463cd82cca7SChristoph Hellwig 464cd82cca7SChristoph Hellwig /* 465cd82cca7SChristoph Hellwig * Write data to the block device. Only intended for the block device itself 466cd82cca7SChristoph Hellwig * and the raw driver which basically is a fake block device. 467cd82cca7SChristoph Hellwig * 468cd82cca7SChristoph Hellwig * Does not take i_mutex for the write and thus is not for general purpose 469cd82cca7SChristoph Hellwig * use. 470cd82cca7SChristoph Hellwig */ 471cd82cca7SChristoph Hellwig static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from) 472cd82cca7SChristoph Hellwig { 473cd82cca7SChristoph Hellwig struct file *file = iocb->ki_filp; 474cd82cca7SChristoph Hellwig struct inode *bd_inode = bdev_file_inode(file); 475cd82cca7SChristoph Hellwig loff_t size = i_size_read(bd_inode); 476cd82cca7SChristoph Hellwig struct blk_plug plug; 477cd82cca7SChristoph Hellwig size_t shorted = 0; 478cd82cca7SChristoph Hellwig ssize_t ret; 479cd82cca7SChristoph Hellwig 480cd82cca7SChristoph Hellwig if (bdev_read_only(I_BDEV(bd_inode))) 481cd82cca7SChristoph Hellwig return -EPERM; 482cd82cca7SChristoph Hellwig 483cd82cca7SChristoph Hellwig if (IS_SWAPFILE(bd_inode) && !is_hibernate_resume_dev(bd_inode->i_rdev)) 484cd82cca7SChristoph Hellwig return -ETXTBSY; 485cd82cca7SChristoph Hellwig 486cd82cca7SChristoph Hellwig if (!iov_iter_count(from)) 487cd82cca7SChristoph Hellwig return 0; 488cd82cca7SChristoph Hellwig 489cd82cca7SChristoph Hellwig if (iocb->ki_pos >= size) 490cd82cca7SChristoph Hellwig return -ENOSPC; 491cd82cca7SChristoph Hellwig 492cd82cca7SChristoph Hellwig if ((iocb->ki_flags & (IOCB_NOWAIT | IOCB_DIRECT)) == IOCB_NOWAIT) 493cd82cca7SChristoph Hellwig return -EOPNOTSUPP; 494cd82cca7SChristoph Hellwig 495cd82cca7SChristoph Hellwig size -= iocb->ki_pos; 496cd82cca7SChristoph Hellwig if (iov_iter_count(from) > size) { 497cd82cca7SChristoph Hellwig shorted = iov_iter_count(from) - size; 498cd82cca7SChristoph Hellwig iov_iter_truncate(from, size); 499cd82cca7SChristoph Hellwig } 500cd82cca7SChristoph Hellwig 501cd82cca7SChristoph Hellwig blk_start_plug(&plug); 502cd82cca7SChristoph Hellwig ret = __generic_file_write_iter(iocb, from); 503cd82cca7SChristoph Hellwig if (ret > 0) 504cd82cca7SChristoph Hellwig ret = generic_write_sync(iocb, ret); 505cd82cca7SChristoph Hellwig iov_iter_reexpand(from, iov_iter_count(from) + shorted); 506cd82cca7SChristoph Hellwig blk_finish_plug(&plug); 507cd82cca7SChristoph Hellwig return ret; 508cd82cca7SChristoph Hellwig } 509cd82cca7SChristoph Hellwig 510cd82cca7SChristoph Hellwig static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to) 511cd82cca7SChristoph Hellwig { 512cd82cca7SChristoph Hellwig struct file *file = iocb->ki_filp; 513cd82cca7SChristoph Hellwig struct inode *bd_inode = bdev_file_inode(file); 514cd82cca7SChristoph Hellwig loff_t size = i_size_read(bd_inode); 515cd82cca7SChristoph Hellwig loff_t pos = iocb->ki_pos; 516cd82cca7SChristoph Hellwig size_t shorted = 0; 517cd82cca7SChristoph Hellwig ssize_t ret; 518cd82cca7SChristoph Hellwig 519cd82cca7SChristoph Hellwig if (pos >= size) 520cd82cca7SChristoph Hellwig return 0; 521cd82cca7SChristoph Hellwig 522cd82cca7SChristoph Hellwig size -= pos; 523cd82cca7SChristoph Hellwig if (iov_iter_count(to) > size) { 524cd82cca7SChristoph Hellwig shorted = iov_iter_count(to) - size; 525cd82cca7SChristoph Hellwig iov_iter_truncate(to, size); 526cd82cca7SChristoph Hellwig } 527cd82cca7SChristoph Hellwig 528cd82cca7SChristoph Hellwig ret = generic_file_read_iter(iocb, to); 529cd82cca7SChristoph Hellwig iov_iter_reexpand(to, iov_iter_count(to) + shorted); 530cd82cca7SChristoph Hellwig return ret; 531cd82cca7SChristoph Hellwig } 532cd82cca7SChristoph Hellwig 533cd82cca7SChristoph Hellwig #define BLKDEV_FALLOC_FL_SUPPORTED \ 534cd82cca7SChristoph Hellwig (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \ 535cd82cca7SChristoph Hellwig FALLOC_FL_ZERO_RANGE | FALLOC_FL_NO_HIDE_STALE) 536cd82cca7SChristoph Hellwig 537cd82cca7SChristoph Hellwig static long blkdev_fallocate(struct file *file, int mode, loff_t start, 538cd82cca7SChristoph Hellwig loff_t len) 539cd82cca7SChristoph Hellwig { 540f278eb3dSMing Lei struct inode *inode = bdev_file_inode(file); 541f278eb3dSMing Lei struct block_device *bdev = I_BDEV(inode); 542cd82cca7SChristoph Hellwig loff_t end = start + len - 1; 543cd82cca7SChristoph Hellwig loff_t isize; 544cd82cca7SChristoph Hellwig int error; 545cd82cca7SChristoph Hellwig 546cd82cca7SChristoph Hellwig /* Fail if we don't recognize the flags. */ 547cd82cca7SChristoph Hellwig if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) 548cd82cca7SChristoph Hellwig return -EOPNOTSUPP; 549cd82cca7SChristoph Hellwig 550cd82cca7SChristoph Hellwig /* Don't go off the end of the device. */ 551cd82cca7SChristoph Hellwig isize = i_size_read(bdev->bd_inode); 552cd82cca7SChristoph Hellwig if (start >= isize) 553cd82cca7SChristoph Hellwig return -EINVAL; 554cd82cca7SChristoph Hellwig if (end >= isize) { 555cd82cca7SChristoph Hellwig if (mode & FALLOC_FL_KEEP_SIZE) { 556cd82cca7SChristoph Hellwig len = isize - start; 557cd82cca7SChristoph Hellwig end = start + len - 1; 558cd82cca7SChristoph Hellwig } else 559cd82cca7SChristoph Hellwig return -EINVAL; 560cd82cca7SChristoph Hellwig } 561cd82cca7SChristoph Hellwig 562cd82cca7SChristoph Hellwig /* 563cd82cca7SChristoph Hellwig * Don't allow IO that isn't aligned to logical block size. 564cd82cca7SChristoph Hellwig */ 565cd82cca7SChristoph Hellwig if ((start | len) & (bdev_logical_block_size(bdev) - 1)) 566cd82cca7SChristoph Hellwig return -EINVAL; 567cd82cca7SChristoph Hellwig 568f278eb3dSMing Lei filemap_invalidate_lock(inode->i_mapping); 569f278eb3dSMing Lei 570cd82cca7SChristoph Hellwig /* Invalidate the page cache, including dirty pages. */ 571cd82cca7SChristoph Hellwig error = truncate_bdev_range(bdev, file->f_mode, start, end); 572cd82cca7SChristoph Hellwig if (error) 573f278eb3dSMing Lei goto fail; 574cd82cca7SChristoph Hellwig 575cd82cca7SChristoph Hellwig switch (mode) { 576cd82cca7SChristoph Hellwig case FALLOC_FL_ZERO_RANGE: 577cd82cca7SChristoph Hellwig case FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE: 578cd82cca7SChristoph Hellwig error = blkdev_issue_zeroout(bdev, start >> 9, len >> 9, 579cd82cca7SChristoph Hellwig GFP_KERNEL, BLKDEV_ZERO_NOUNMAP); 580cd82cca7SChristoph Hellwig break; 581cd82cca7SChristoph Hellwig case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE: 582cd82cca7SChristoph Hellwig error = blkdev_issue_zeroout(bdev, start >> 9, len >> 9, 583cd82cca7SChristoph Hellwig GFP_KERNEL, BLKDEV_ZERO_NOFALLBACK); 584cd82cca7SChristoph Hellwig break; 585cd82cca7SChristoph Hellwig case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | FALLOC_FL_NO_HIDE_STALE: 586cd82cca7SChristoph Hellwig error = blkdev_issue_discard(bdev, start >> 9, len >> 9, 587cd82cca7SChristoph Hellwig GFP_KERNEL, 0); 588cd82cca7SChristoph Hellwig break; 589cd82cca7SChristoph Hellwig default: 590f278eb3dSMing Lei error = -EOPNOTSUPP; 591cd82cca7SChristoph Hellwig } 592cd82cca7SChristoph Hellwig 593f278eb3dSMing Lei fail: 594f278eb3dSMing Lei filemap_invalidate_unlock(inode->i_mapping); 595f278eb3dSMing Lei return error; 596cd82cca7SChristoph Hellwig } 597cd82cca7SChristoph Hellwig 598cd82cca7SChristoph Hellwig const struct file_operations def_blk_fops = { 599cd82cca7SChristoph Hellwig .open = blkdev_open, 600cd82cca7SChristoph Hellwig .release = blkdev_close, 601cd82cca7SChristoph Hellwig .llseek = blkdev_llseek, 602cd82cca7SChristoph Hellwig .read_iter = blkdev_read_iter, 603cd82cca7SChristoph Hellwig .write_iter = blkdev_write_iter, 604cd82cca7SChristoph Hellwig .iopoll = blkdev_iopoll, 605cd82cca7SChristoph Hellwig .mmap = generic_file_mmap, 606cd82cca7SChristoph Hellwig .fsync = blkdev_fsync, 607*8a709512SChristoph Hellwig .unlocked_ioctl = blkdev_ioctl, 608cd82cca7SChristoph Hellwig #ifdef CONFIG_COMPAT 609cd82cca7SChristoph Hellwig .compat_ioctl = compat_blkdev_ioctl, 610cd82cca7SChristoph Hellwig #endif 611cd82cca7SChristoph Hellwig .splice_read = generic_file_splice_read, 612cd82cca7SChristoph Hellwig .splice_write = iter_file_splice_write, 613cd82cca7SChristoph Hellwig .fallocate = blkdev_fallocate, 614cd82cca7SChristoph Hellwig }; 615cd82cca7SChristoph Hellwig 616cd82cca7SChristoph Hellwig static __init int blkdev_init(void) 617cd82cca7SChristoph Hellwig { 618cd82cca7SChristoph Hellwig return bioset_init(&blkdev_dio_pool, 4, 619cd82cca7SChristoph Hellwig offsetof(struct blkdev_dio, bio), 620cd82cca7SChristoph Hellwig BIOSET_NEED_BVECS|BIOSET_PERCPU_CACHE); 621cd82cca7SChristoph Hellwig } 622cd82cca7SChristoph Hellwig module_init(blkdev_init); 623