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