LCOV - code coverage report
Current view: top level - fs/ext4 - readpage.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 139 209 66.5 %
Date: 2021-04-22 12:43:58 Functions: 4 8 50.0 %

          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 ext4_mpage_readpages() function here is intended to
      11             :  * replace mpage_readahead() 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        1677 : static void __read_end_io(struct bio *bio)
      71             : {
      72        1677 :         struct page *page;
      73        1677 :         struct bio_vec *bv;
      74        1677 :         struct bvec_iter_all iter_all;
      75             : 
      76       22696 :         bio_for_each_segment_all(bv, bio, iter_all) {
      77       21018 :                 page = bv->bv_page;
      78             : 
      79             :                 /* PG_error was set if any post_read step failed */
      80       42037 :                 if (bio->bi_status || PageError(page)) {
      81           0 :                         ClearPageUptodate(page);
      82             :                         /* will re-read again later */
      83           0 :                         ClearPageError(page);
      84             :                 } else {
      85       21019 :                         SetPageUptodate(page);
      86             :                 }
      87       21019 :                 unlock_page(page);
      88             :         }
      89        1677 :         if (bio->bi_private)
      90           0 :                 mempool_free(bio->bi_private, bio_post_read_ctx_pool);
      91        1677 :         bio_put(bio);
      92        1677 : }
      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           0 :         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           0 :         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           0 :         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           0 :         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           0 :         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           0 :                 fallthrough;
     144           0 :         case STEP_VERITY:
     145           0 :                 if (ctx->enabled_steps & (1 << STEP_VERITY)) {
     146           0 :                         INIT_WORK(&ctx->work, verity_work);
     147           0 :                         fsverity_enqueue_verify_work(&ctx->work);
     148           0 :                         return;
     149             :                 }
     150           0 :                 ctx->cur_step++;
     151           0 :                 fallthrough;
     152           0 :         default:
     153           0 :                 __read_end_io(ctx->bio);
     154             :         }
     155             : }
     156             : 
     157        1677 : static bool bio_post_read_required(struct bio *bio)
     158             : {
     159           0 :         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        1677 : static void mpage_end_io(struct bio *bio)
     175             : {
     176        3354 :         if (bio_post_read_required(bio)) {
     177           0 :                 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           0 :                 return;
     182             :         }
     183        1677 :         __read_end_io(bio);
     184             : }
     185             : 
     186        1724 : static inline bool ext4_need_verity(const struct inode *inode, pgoff_t idx)
     187             : {
     188        1724 :         return fsverity_active(inode) &&
     189             :                idx < DIV_ROUND_UP(inode->i_size, PAGE_SIZE);
     190             : }
     191             : 
     192        1677 : static void ext4_set_bio_post_read_ctx(struct bio *bio,
     193             :                                        const struct inode *inode,
     194             :                                        pgoff_t first_idx)
     195             : {
     196        1677 :         unsigned int post_read_steps = 0;
     197             : 
     198        1677 :         if (fscrypt_inode_uses_fs_layer_crypto(inode))
     199             :                 post_read_steps |= 1 << STEP_DECRYPT;
     200             : 
     201        1677 :         if (ext4_need_verity(inode, first_idx))
     202             :                 post_read_steps |= 1 << STEP_VERITY;
     203             : 
     204        1677 :         if (post_read_steps) {
     205             :                 /* Due to the mempool, this never fails. */
     206             :                 struct bio_post_read_ctx *ctx =
     207             :                         mempool_alloc(bio_post_read_ctx_pool, GFP_NOFS);
     208             : 
     209             :                 ctx->bio = bio;
     210             :                 ctx->enabled_steps = post_read_steps;
     211             :                 bio->bi_private = ctx;
     212             :         }
     213             : }
     214             : 
     215       21066 : static inline loff_t ext4_readpage_limit(struct inode *inode)
     216             : {
     217       21066 :         if (IS_ENABLED(CONFIG_FS_VERITY) &&
     218             :             (IS_VERITY(inode) || ext4_verity_in_progress(inode)))
     219             :                 return inode->i_sb->s_maxbytes;
     220             : 
     221       21066 :         return i_size_read(inode);
     222             : }
     223             : 
     224        1556 : int ext4_mpage_readpages(struct inode *inode,
     225             :                 struct readahead_control *rac, struct page *page)
     226             : {
     227        1556 :         struct bio *bio = NULL;
     228        1556 :         sector_t last_block_in_bio = 0;
     229             : 
     230        1556 :         const unsigned blkbits = inode->i_blkbits;
     231        1556 :         const unsigned blocks_per_page = PAGE_SIZE >> blkbits;
     232        1556 :         const unsigned blocksize = 1 << blkbits;
     233        1556 :         sector_t next_block;
     234        1556 :         sector_t block_in_file;
     235        1556 :         sector_t last_block;
     236        1556 :         sector_t last_block_in_file;
     237        1556 :         sector_t blocks[MAX_BUF_PER_PAGE];
     238        1556 :         unsigned page_block;
     239        1556 :         struct block_device *bdev = inode->i_sb->s_bdev;
     240        1556 :         int length;
     241        1556 :         unsigned relative_block = 0;
     242        1556 :         struct ext4_map_blocks map;
     243        1556 :         unsigned int nr_pages = rac ? readahead_count(rac) : 1;
     244             : 
     245        1556 :         map.m_pblk = 0;
     246        1556 :         map.m_lblk = 0;
     247        1556 :         map.m_len = 0;
     248        1556 :         map.m_flags = 0;
     249             : 
     250       22622 :         for (; nr_pages; nr_pages--) {
     251       21066 :                 int fully_mapped = 1;
     252       21066 :                 unsigned first_hole = blocks_per_page;
     253             : 
     254       21066 :                 if (rac) {
     255       21038 :                         page = readahead_page(rac);
     256       21038 :                         prefetchw(&page->flags);
     257             :                 }
     258             : 
     259       21066 :                 if (page_has_buffers(page))
     260           0 :                         goto confused;
     261             : 
     262       21066 :                 block_in_file = next_block =
     263       21066 :                         (sector_t)page->index << (PAGE_SHIFT - blkbits);
     264       21066 :                 last_block = block_in_file + nr_pages * blocks_per_page;
     265       21066 :                 last_block_in_file = (ext4_readpage_limit(inode) +
     266       21066 :                                       blocksize - 1) >> blkbits;
     267       21066 :                 if (last_block > last_block_in_file)
     268             :                         last_block = last_block_in_file;
     269       21066 :                 page_block = 0;
     270             : 
     271             :                 /*
     272             :                  * Map blocks using the previous result first.
     273             :                  */
     274       21066 :                 if ((map.m_flags & EXT4_MAP_MAPPED) &&
     275       19342 :                     block_in_file > map.m_lblk &&
     276       19342 :                     block_in_file < (map.m_lblk + map.m_len)) {
     277       19342 :                         unsigned map_offset = block_in_file - map.m_lblk;
     278       19342 :                         unsigned last = map.m_len - map_offset;
     279             : 
     280       19342 :                         for (relative_block = 0; ; relative_block++) {
     281       38684 :                                 if (relative_block == last) {
     282             :                                         /* needed? */
     283        1278 :                                         map.m_flags &= ~EXT4_MAP_MAPPED;
     284        1278 :                                         break;
     285             :                                 }
     286       37406 :                                 if (page_block == blocks_per_page)
     287             :                                         break;
     288       19342 :                                 blocks[page_block] = map.m_pblk + map_offset +
     289             :                                         relative_block;
     290       19342 :                                 page_block++;
     291       19342 :                                 block_in_file++;
     292             :                         }
     293             :                 }
     294             : 
     295             :                 /*
     296             :                  * Then do more ext4_map_blocks() calls until we are
     297             :                  * done with this page.
     298             :                  */
     299       22790 :                 while (page_block < blocks_per_page) {
     300        1724 :                         if (block_in_file < last_block) {
     301        1696 :                                 map.m_lblk = block_in_file;
     302        1696 :                                 map.m_len = last_block - block_in_file;
     303             : 
     304        1696 :                                 if (ext4_map_blocks(NULL, inode, &map, 0) < 0) {
     305           0 :                                 set_error_page:
     306           0 :                                         SetPageError(page);
     307           0 :                                         zero_user_segment(page, 0,
     308             :                                                           PAGE_SIZE);
     309           0 :                                         unlock_page(page);
     310           0 :                                         goto next_page;
     311             :                                 }
     312             :                         }
     313        1724 :                         if ((map.m_flags & EXT4_MAP_MAPPED) == 0) {
     314          47 :                                 fully_mapped = 0;
     315          47 :                                 if (first_hole == blocks_per_page)
     316          47 :                                         first_hole = page_block;
     317          47 :                                 page_block++;
     318          47 :                                 block_in_file++;
     319          47 :                                 continue;
     320             :                         }
     321        1677 :                         if (first_hole != blocks_per_page)
     322           0 :                                 goto confused;          /* hole -> non-hole */
     323             : 
     324             :                         /* Contiguous blocks? */
     325        1677 :                         if (page_block && blocks[page_block-1] != map.m_pblk-1)
     326           0 :                                 goto confused;
     327        1677 :                         for (relative_block = 0; ; relative_block++) {
     328        3354 :                                 if (relative_block == map.m_len) {
     329             :                                         /* needed? */
     330         399 :                                         map.m_flags &= ~EXT4_MAP_MAPPED;
     331         399 :                                         break;
     332        2955 :                                 } else if (page_block == blocks_per_page)
     333             :                                         break;
     334        1677 :                                 blocks[page_block] = map.m_pblk+relative_block;
     335        1677 :                                 page_block++;
     336        1677 :                                 block_in_file++;
     337             :                         }
     338             :                 }
     339       21066 :                 if (first_hole != blocks_per_page) {
     340          47 :                         zero_user_segment(page, first_hole << blkbits,
     341             :                                           PAGE_SIZE);
     342          47 :                         if (first_hole == 0) {
     343          47 :                                 if (ext4_need_verity(inode, page->index) &&
     344             :                                     !fsverity_verify_page(page))
     345             :                                         goto set_error_page;
     346          47 :                                 SetPageUptodate(page);
     347          47 :                                 unlock_page(page);
     348          47 :                                 goto next_page;
     349             :                         }
     350       21019 :                 } else if (fully_mapped) {
     351       21019 :                         SetPageMappedToDisk(page);
     352             :                 }
     353       42038 :                 if (fully_mapped && blocks_per_page == 1 &&
     354       42038 :                     !PageUptodate(page) && cleancache_get_page(page) == 0) {
     355           0 :                         SetPageUptodate(page);
     356           0 :                         goto confused;
     357             :                 }
     358             : 
     359             :                 /*
     360             :                  * This page will go to BIO.  Do we need to send this
     361             :                  * BIO off first?
     362             :                  */
     363       21019 :                 if (bio && (last_block_in_bio != blocks[0] - 1 ||
     364       21019 :                             !fscrypt_mergeable_bio(bio, inode, next_block))) {
     365         149 :                 submit_and_realloc:
     366         149 :                         submit_bio(bio);
     367         149 :                         bio = NULL;
     368             :                 }
     369       21019 :                 if (bio == NULL) {
     370             :                         /*
     371             :                          * bio_alloc will _always_ be able to allocate a bio if
     372             :                          * __GFP_DIRECT_RECLAIM is set, see bio_alloc_bioset().
     373             :                          */
     374        1677 :                         bio = bio_alloc(GFP_KERNEL, bio_max_segs(nr_pages));
     375        1677 :                         fscrypt_set_bio_crypt_ctx(bio, inode, next_block,
     376             :                                                   GFP_KERNEL);
     377        1677 :                         ext4_set_bio_post_read_ctx(bio, inode, page->index);
     378        1677 :                         bio_set_dev(bio, bdev);
     379        1677 :                         bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9);
     380        1677 :                         bio->bi_end_io = mpage_end_io;
     381        1677 :                         bio_set_op_attrs(bio, REQ_OP_READ,
     382             :                                                 rac ? REQ_RAHEAD : 0);
     383             :                 }
     384             : 
     385       21019 :                 length = first_hole << blkbits;
     386       21019 :                 if (bio_add_page(bio, page, length, 0) < length)
     387           0 :                         goto submit_and_realloc;
     388             : 
     389       21019 :                 if (((map.m_flags & EXT4_MAP_BOUNDARY) &&
     390       21019 :                      (relative_block == map.m_len)) ||
     391             :                     (first_hole != blocks_per_page)) {
     392           0 :                         submit_bio(bio);
     393           0 :                         bio = NULL;
     394             :                 } else
     395       21019 :                         last_block_in_bio = blocks[blocks_per_page - 1];
     396       21019 :                 goto next_page;
     397           0 :         confused:
     398           0 :                 if (bio) {
     399           0 :                         submit_bio(bio);
     400           0 :                         bio = NULL;
     401             :                 }
     402           0 :                 if (!PageUptodate(page))
     403           0 :                         block_read_full_page(page, ext4_get_block);
     404             :                 else
     405           0 :                         unlock_page(page);
     406       21066 :         next_page:
     407       21066 :                 if (rac)
     408       21038 :                         put_page(page);
     409             :         }
     410        1556 :         if (bio)
     411        1528 :                 submit_bio(bio);
     412        1556 :         return 0;
     413             : }
     414             : 
     415           1 : int __init ext4_init_post_read_processing(void)
     416             : {
     417           2 :         bio_post_read_ctx_cache =
     418           1 :                 kmem_cache_create("ext4_bio_post_read_ctx",
     419             :                                   sizeof(struct bio_post_read_ctx), 0, 0, NULL);
     420           1 :         if (!bio_post_read_ctx_cache)
     421           0 :                 goto fail;
     422           2 :         bio_post_read_ctx_pool =
     423           1 :                 mempool_create_slab_pool(NUM_PREALLOC_POST_READ_CTXS,
     424             :                                          bio_post_read_ctx_cache);
     425           1 :         if (!bio_post_read_ctx_pool)
     426           0 :                 goto fail_free_cache;
     427             :         return 0;
     428             : 
     429           0 : fail_free_cache:
     430           0 :         kmem_cache_destroy(bio_post_read_ctx_cache);
     431             : fail:
     432             :         return -ENOMEM;
     433             : }
     434             : 
     435           0 : void ext4_exit_post_read_processing(void)
     436             : {
     437           0 :         mempool_destroy(bio_post_read_ctx_pool);
     438           0 :         kmem_cache_destroy(bio_post_read_ctx_cache);
     439           0 : }

Generated by: LCOV version 1.14