Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0 2 : : /* 3 : : * linux/fs/ext4/readpage.c 4 : : * 5 : : * Copyright (C) 2002, Linus Torvalds. 6 : : * Copyright (C) 2015, Google, Inc. 7 : : * 8 : : * This was originally taken from fs/mpage.c 9 : : * 10 : : * The intent is the ext4_mpage_readpages() function here is intended 11 : : * to replace mpage_readpages() in the general case, not just for 12 : : * encrypted files. It has some limitations (see below), where it 13 : : * will fall back to read_block_full_page(), but these limitations 14 : : * should only be hit when page_size != block_size. 15 : : * 16 : : * This will allow us to attach a callback function to support ext4 17 : : * encryption. 18 : : * 19 : : * If anything unusual happens, such as: 20 : : * 21 : : * - encountering a page which has buffers 22 : : * - encountering a page which has a non-hole after a hole 23 : : * - encountering a page with non-contiguous blocks 24 : : * 25 : : * then this code just gives up and calls the buffer_head-based read function. 26 : : * It does handle a page which has holes at the end - that is a common case: 27 : : * the end-of-file on blocksize < PAGE_SIZE setups. 28 : : * 29 : : */ 30 : : 31 : : #include <linux/kernel.h> 32 : : #include <linux/export.h> 33 : : #include <linux/mm.h> 34 : : #include <linux/kdev_t.h> 35 : : #include <linux/gfp.h> 36 : : #include <linux/bio.h> 37 : : #include <linux/fs.h> 38 : : #include <linux/buffer_head.h> 39 : : #include <linux/blkdev.h> 40 : : #include <linux/highmem.h> 41 : : #include <linux/prefetch.h> 42 : : #include <linux/mpage.h> 43 : : #include <linux/writeback.h> 44 : : #include <linux/backing-dev.h> 45 : : #include <linux/pagevec.h> 46 : : #include <linux/cleancache.h> 47 : : 48 : : #include "ext4.h" 49 : : 50 : : #define NUM_PREALLOC_POST_READ_CTXS 128 51 : : 52 : : static struct kmem_cache *bio_post_read_ctx_cache; 53 : : static mempool_t *bio_post_read_ctx_pool; 54 : : 55 : : /* postprocessing steps for read bios */ 56 : : enum bio_post_read_step { 57 : : STEP_INITIAL = 0, 58 : : STEP_DECRYPT, 59 : : STEP_VERITY, 60 : : STEP_MAX, 61 : : }; 62 : : 63 : : struct bio_post_read_ctx { 64 : : struct bio *bio; 65 : : struct work_struct work; 66 : : unsigned int cur_step; 67 : : unsigned int enabled_steps; 68 : : }; 69 : : 70 : 3 : static void __read_end_io(struct bio *bio) 71 : : { 72 : : struct page *page; 73 : : struct bio_vec *bv; 74 : : struct bvec_iter_all iter_all; 75 : : 76 : 3 : bio_for_each_segment_all(bv, bio, iter_all) { 77 : 3 : page = bv->bv_page; 78 : : 79 : : /* PG_error was set if any post_read step failed */ 80 : 3 : if (bio->bi_status || PageError(page)) { 81 : : ClearPageUptodate(page); 82 : : /* will re-read again later */ 83 : : ClearPageError(page); 84 : : } else { 85 : : SetPageUptodate(page); 86 : : } 87 : 3 : unlock_page(page); 88 : : } 89 : 3 : if (bio->bi_private) 90 : 0 : mempool_free(bio->bi_private, bio_post_read_ctx_pool); 91 : 3 : bio_put(bio); 92 : 3 : } 93 : : 94 : : static void bio_post_read_processing(struct bio_post_read_ctx *ctx); 95 : : 96 : 0 : static void decrypt_work(struct work_struct *work) 97 : : { 98 : : struct bio_post_read_ctx *ctx = 99 : 0 : container_of(work, struct bio_post_read_ctx, work); 100 : : 101 : 0 : fscrypt_decrypt_bio(ctx->bio); 102 : : 103 : 0 : bio_post_read_processing(ctx); 104 : 0 : } 105 : : 106 : 0 : static void verity_work(struct work_struct *work) 107 : : { 108 : : struct bio_post_read_ctx *ctx = 109 : 0 : container_of(work, struct bio_post_read_ctx, work); 110 : 0 : struct bio *bio = ctx->bio; 111 : : 112 : : /* 113 : : * fsverity_verify_bio() may call readpages() again, and although verity 114 : : * will be disabled for that, decryption may still be needed, causing 115 : : * another bio_post_read_ctx to be allocated. So to guarantee that 116 : : * mempool_alloc() never deadlocks we must free the current ctx first. 117 : : * This is safe because verity is the last post-read step. 118 : : */ 119 : : BUILD_BUG_ON(STEP_VERITY + 1 != STEP_MAX); 120 : 0 : mempool_free(ctx, bio_post_read_ctx_pool); 121 : 0 : bio->bi_private = NULL; 122 : : 123 : : fsverity_verify_bio(bio); 124 : : 125 : 0 : __read_end_io(bio); 126 : 0 : } 127 : : 128 : 0 : static void bio_post_read_processing(struct bio_post_read_ctx *ctx) 129 : : { 130 : : /* 131 : : * We use different work queues for decryption and for verity because 132 : : * verity may require reading metadata pages that need decryption, and 133 : : * we shouldn't recurse to the same workqueue. 134 : : */ 135 : 0 : switch (++ctx->cur_step) { 136 : : case STEP_DECRYPT: 137 : 0 : if (ctx->enabled_steps & (1 << STEP_DECRYPT)) { 138 : 0 : INIT_WORK(&ctx->work, decrypt_work); 139 : 0 : fscrypt_enqueue_decrypt_work(&ctx->work); 140 : 0 : return; 141 : : } 142 : 0 : ctx->cur_step++; 143 : : /* fall-through */ 144 : : case STEP_VERITY: 145 : 0 : if (ctx->enabled_steps & (1 << STEP_VERITY)) { 146 : 0 : INIT_WORK(&ctx->work, verity_work); 147 : : fsverity_enqueue_verify_work(&ctx->work); 148 : : return; 149 : : } 150 : 0 : ctx->cur_step++; 151 : : /* fall-through */ 152 : : default: 153 : 0 : __read_end_io(ctx->bio); 154 : : } 155 : : } 156 : : 157 : : static bool bio_post_read_required(struct bio *bio) 158 : : { 159 : 3 : return bio->bi_private && !bio->bi_status; 160 : : } 161 : : 162 : : /* 163 : : * I/O completion handler for multipage BIOs. 164 : : * 165 : : * The mpage code never puts partial pages into a BIO (except for end-of-file). 166 : : * If a page does not map to a contiguous run of blocks then it simply falls 167 : : * back to block_read_full_page(). 168 : : * 169 : : * Why is this? If a page's completion depends on a number of different BIOs 170 : : * which can complete in any order (or at the same time) then determining the 171 : : * status of that page is hard. See end_buffer_async_read() for the details. 172 : : * There is no point in duplicating all that complexity. 173 : : */ 174 : 3 : static void mpage_end_io(struct bio *bio) 175 : : { 176 : 3 : if (bio_post_read_required(bio)) { 177 : : struct bio_post_read_ctx *ctx = bio->bi_private; 178 : : 179 : 0 : ctx->cur_step = STEP_INITIAL; 180 : 0 : bio_post_read_processing(ctx); 181 : 3 : return; 182 : : } 183 : 3 : __read_end_io(bio); 184 : : } 185 : : 186 : : static inline bool ext4_need_verity(const struct inode *inode, pgoff_t idx) 187 : : { 188 : : return fsverity_active(inode) && 189 : : idx < DIV_ROUND_UP(inode->i_size, PAGE_SIZE); 190 : : } 191 : : 192 : 3 : static struct bio_post_read_ctx *get_bio_post_read_ctx(struct inode *inode, 193 : : struct bio *bio, 194 : : pgoff_t first_idx) 195 : : { 196 : : unsigned int post_read_steps = 0; 197 : : struct bio_post_read_ctx *ctx = NULL; 198 : : 199 : 3 : if (IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode)) 200 : : post_read_steps |= 1 << STEP_DECRYPT; 201 : : 202 : : if (ext4_need_verity(inode, first_idx)) 203 : : post_read_steps |= 1 << STEP_VERITY; 204 : : 205 : 3 : if (post_read_steps) { 206 : 0 : ctx = mempool_alloc(bio_post_read_ctx_pool, GFP_NOFS); 207 : 0 : if (!ctx) 208 : : return ERR_PTR(-ENOMEM); 209 : 0 : ctx->bio = bio; 210 : 0 : ctx->enabled_steps = post_read_steps; 211 : 0 : bio->bi_private = ctx; 212 : : } 213 : 3 : return ctx; 214 : : } 215 : : 216 : : static inline loff_t ext4_readpage_limit(struct inode *inode) 217 : : { 218 : : if (IS_ENABLED(CONFIG_FS_VERITY) && 219 : : (IS_VERITY(inode) || ext4_verity_in_progress(inode))) 220 : : return inode->i_sb->s_maxbytes; 221 : : 222 : : return i_size_read(inode); 223 : : } 224 : : 225 : 3 : int ext4_mpage_readpages(struct address_space *mapping, 226 : : struct list_head *pages, struct page *page, 227 : : unsigned nr_pages, bool is_readahead) 228 : : { 229 : : struct bio *bio = NULL; 230 : : sector_t last_block_in_bio = 0; 231 : : 232 : 3 : struct inode *inode = mapping->host; 233 : 3 : const unsigned blkbits = inode->i_blkbits; 234 : 3 : const unsigned blocks_per_page = PAGE_SIZE >> blkbits; 235 : 3 : const unsigned blocksize = 1 << blkbits; 236 : : sector_t block_in_file; 237 : : sector_t last_block; 238 : : sector_t last_block_in_file; 239 : : sector_t blocks[MAX_BUF_PER_PAGE]; 240 : : unsigned page_block; 241 : 3 : struct block_device *bdev = inode->i_sb->s_bdev; 242 : : int length; 243 : : unsigned relative_block = 0; 244 : : struct ext4_map_blocks map; 245 : : 246 : 3 : map.m_pblk = 0; 247 : 3 : map.m_lblk = 0; 248 : 3 : map.m_len = 0; 249 : 3 : map.m_flags = 0; 250 : : 251 : 3 : for (; nr_pages; nr_pages--) { 252 : : int fully_mapped = 1; 253 : : unsigned first_hole = blocks_per_page; 254 : : 255 : 3 : if (pages) { 256 : 3 : page = lru_to_page(pages); 257 : : 258 : 3 : prefetchw(&page->flags); 259 : : list_del(&page->lru); 260 : 3 : if (add_to_page_cache_lru(page, mapping, page->index, 261 : : readahead_gfp_mask(mapping))) 262 : : goto next_page; 263 : : } 264 : : 265 : 3 : if (page_has_buffers(page)) 266 : : goto confused; 267 : : 268 : 3 : block_in_file = (sector_t)page->index << (PAGE_SHIFT - blkbits); 269 : 3 : last_block = block_in_file + nr_pages * blocks_per_page; 270 : 3 : last_block_in_file = (ext4_readpage_limit(inode) + 271 : 3 : blocksize - 1) >> blkbits; 272 : 3 : if (last_block > last_block_in_file) 273 : : last_block = last_block_in_file; 274 : : page_block = 0; 275 : : 276 : : /* 277 : : * Map blocks using the previous result first. 278 : : */ 279 : 3 : if ((map.m_flags & EXT4_MAP_MAPPED) && 280 : 3 : block_in_file > map.m_lblk && 281 : 3 : block_in_file < (map.m_lblk + map.m_len)) { 282 : 3 : unsigned map_offset = block_in_file - map.m_lblk; 283 : 3 : unsigned last = map.m_len - map_offset; 284 : : 285 : 3 : for (relative_block = 0; ; relative_block++) { 286 : 3 : if (relative_block == last) { 287 : : /* needed? */ 288 : 3 : map.m_flags &= ~EXT4_MAP_MAPPED; 289 : 3 : break; 290 : : } 291 : 3 : if (page_block == blocks_per_page) 292 : : break; 293 : 3 : blocks[page_block] = map.m_pblk + map_offset + 294 : : relative_block; 295 : 3 : page_block++; 296 : 3 : block_in_file++; 297 : 3 : } 298 : : } 299 : : 300 : : /* 301 : : * Then do more ext4_map_blocks() calls until we are 302 : : * done with this page. 303 : : */ 304 : 3 : while (page_block < blocks_per_page) { 305 : 3 : if (block_in_file < last_block) { 306 : 3 : map.m_lblk = block_in_file; 307 : 3 : map.m_len = last_block - block_in_file; 308 : : 309 : 3 : if (ext4_map_blocks(NULL, inode, &map, 0) < 0) { 310 : : set_error_page: 311 : : SetPageError(page); 312 : : zero_user_segment(page, 0, 313 : : PAGE_SIZE); 314 : 0 : unlock_page(page); 315 : 0 : goto next_page; 316 : : } 317 : : } 318 : 3 : if ((map.m_flags & EXT4_MAP_MAPPED) == 0) { 319 : : fully_mapped = 0; 320 : 3 : if (first_hole == blocks_per_page) 321 : : first_hole = page_block; 322 : 3 : page_block++; 323 : 3 : block_in_file++; 324 : 3 : continue; 325 : : } 326 : 3 : if (first_hole != blocks_per_page) 327 : : goto confused; /* hole -> non-hole */ 328 : : 329 : : /* Contiguous blocks? */ 330 : 3 : if (page_block && blocks[page_block-1] != map.m_pblk-1) 331 : : goto confused; 332 : 3 : for (relative_block = 0; ; relative_block++) { 333 : 3 : if (relative_block == map.m_len) { 334 : : /* needed? */ 335 : 3 : map.m_flags &= ~EXT4_MAP_MAPPED; 336 : 3 : break; 337 : 3 : } else if (page_block == blocks_per_page) 338 : : break; 339 : 3 : blocks[page_block] = map.m_pblk+relative_block; 340 : 3 : page_block++; 341 : 3 : block_in_file++; 342 : 3 : } 343 : : } 344 : 3 : if (first_hole != blocks_per_page) { 345 : 3 : zero_user_segment(page, first_hole << blkbits, 346 : : PAGE_SIZE); 347 : 3 : if (first_hole == 0) { 348 : : if (ext4_need_verity(inode, page->index) && 349 : : !fsverity_verify_page(page)) 350 : : goto set_error_page; 351 : : SetPageUptodate(page); 352 : 3 : unlock_page(page); 353 : 3 : goto next_page; 354 : : } 355 : 3 : } else if (fully_mapped) { 356 : : SetPageMappedToDisk(page); 357 : : } 358 : 3 : if (fully_mapped && blocks_per_page == 1 && 359 : 3 : !PageUptodate(page) && cleancache_get_page(page) == 0) { 360 : : SetPageUptodate(page); 361 : : goto confused; 362 : : } 363 : : 364 : : /* 365 : : * This page will go to BIO. Do we need to send this 366 : : * BIO off first? 367 : : */ 368 : 3 : if (bio && (last_block_in_bio != blocks[0] - 1)) { 369 : : submit_and_realloc: 370 : 3 : submit_bio(bio); 371 : : bio = NULL; 372 : : } 373 : 3 : if (bio == NULL) { 374 : : struct bio_post_read_ctx *ctx; 375 : : 376 : 3 : bio = bio_alloc(GFP_KERNEL, 377 : 3 : min_t(int, nr_pages, BIO_MAX_PAGES)); 378 : 3 : if (!bio) 379 : : goto set_error_page; 380 : 3 : ctx = get_bio_post_read_ctx(inode, bio, page->index); 381 : 3 : if (IS_ERR(ctx)) { 382 : 0 : bio_put(bio); 383 : : bio = NULL; 384 : 0 : goto set_error_page; 385 : : } 386 : 3 : bio_set_dev(bio, bdev); 387 : 3 : bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9); 388 : 3 : bio->bi_end_io = mpage_end_io; 389 : 3 : bio->bi_private = ctx; 390 : 3 : bio_set_op_attrs(bio, REQ_OP_READ, 391 : : is_readahead ? REQ_RAHEAD : 0); 392 : : } 393 : : 394 : 3 : length = first_hole << blkbits; 395 : 3 : if (bio_add_page(bio, page, length, 0) < length) 396 : : goto submit_and_realloc; 397 : : 398 : 3 : if (((map.m_flags & EXT4_MAP_BOUNDARY) && 399 : 3 : (relative_block == map.m_len)) || 400 : : (first_hole != blocks_per_page)) { 401 : 3 : submit_bio(bio); 402 : 0 : bio = NULL; 403 : : } else 404 : 3 : last_block_in_bio = blocks[blocks_per_page - 1]; 405 : : goto next_page; 406 : : confused: 407 : 0 : if (bio) { 408 : 0 : submit_bio(bio); 409 : : bio = NULL; 410 : : } 411 : 0 : if (!PageUptodate(page)) 412 : 0 : block_read_full_page(page, ext4_get_block); 413 : : else 414 : 0 : unlock_page(page); 415 : : next_page: 416 : 3 : if (pages) 417 : 3 : put_page(page); 418 : : } 419 : 3 : BUG_ON(pages && !list_empty(pages)); 420 : 3 : if (bio) 421 : 3 : submit_bio(bio); 422 : 3 : return 0; 423 : : } 424 : : 425 : 3 : int __init ext4_init_post_read_processing(void) 426 : : { 427 : 3 : bio_post_read_ctx_cache = 428 : 3 : kmem_cache_create("ext4_bio_post_read_ctx", 429 : : sizeof(struct bio_post_read_ctx), 0, 0, NULL); 430 : 3 : if (!bio_post_read_ctx_cache) 431 : : goto fail; 432 : 3 : bio_post_read_ctx_pool = 433 : : mempool_create_slab_pool(NUM_PREALLOC_POST_READ_CTXS, 434 : : bio_post_read_ctx_cache); 435 : 3 : if (!bio_post_read_ctx_pool) 436 : : goto fail_free_cache; 437 : : return 0; 438 : : 439 : : fail_free_cache: 440 : 0 : kmem_cache_destroy(bio_post_read_ctx_cache); 441 : : fail: 442 : : return -ENOMEM; 443 : : } 444 : : 445 : 0 : void ext4_exit_post_read_processing(void) 446 : : { 447 : 0 : mempool_destroy(bio_post_read_ctx_pool); 448 : 0 : kmem_cache_destroy(bio_post_read_ctx_cache); 449 : 0 : }