2 * linux/fs/ext4/readpage.c
4 * Copyright (C) 2002, Linus Torvalds.
5 * Copyright (C) 2015, Google, Inc.
7 * This was originally taken from fs/mpage.c
9 * The intent is the ext4_mpage_readpages() function here is intended
10 * to replace mpage_readpages() in the general case, not just for
11 * encrypted files. It has some limitations (see below), where it
12 * will fall back to read_block_full_page(), but these limitations
13 * should only be hit when page_size != block_size.
15 * This will allow us to attach a callback function to support ext4
18 * If anything unusual happens, such as:
20 * - encountering a page which has buffers
21 * - encountering a page which has a non-hole after a hole
22 * - encountering a page with non-contiguous blocks
24 * then this code just gives up and calls the buffer_head-based read function.
25 * It does handle a page which has holes at the end - that is a common case:
26 * the end-of-file on blocksize < PAGE_SIZE setups.
30 #include <linux/kernel.h>
31 #include <linux/export.h>
33 #include <linux/kdev_t.h>
34 #include <linux/gfp.h>
35 #include <linux/bio.h>
37 #include <linux/buffer_head.h>
38 #include <linux/blkdev.h>
39 #include <linux/highmem.h>
40 #include <linux/prefetch.h>
41 #include <linux/mpage.h>
42 #include <linux/writeback.h>
43 #include <linux/backing-dev.h>
44 #include <linux/pagevec.h>
45 #include <linux/cleancache.h>
49 static inline bool ext4_bio_encrypted(struct bio
*bio
)
51 #ifdef CONFIG_EXT4_FS_ENCRYPTION
52 return unlikely(bio
->bi_private
!= NULL
);
59 * I/O completion handler for multipage BIOs.
61 * The mpage code never puts partial pages into a BIO (except for end-of-file).
62 * If a page does not map to a contiguous run of blocks then it simply falls
63 * back to block_read_full_page().
65 * Why is this? If a page's completion depends on a number of different BIOs
66 * which can complete in any order (or at the same time) then determining the
67 * status of that page is hard. See end_buffer_async_read() for the details.
68 * There is no point in duplicating all that complexity.
70 static void mpage_end_io(struct bio
*bio
)
75 if (ext4_bio_encrypted(bio
)) {
77 fscrypt_release_ctx(bio
->bi_private
);
79 fscrypt_decrypt_bio_pages(bio
->bi_private
, bio
);
83 bio_for_each_segment_all(bv
, bio
, i
) {
84 struct page
*page
= bv
->bv_page
;
87 SetPageUptodate(page
);
89 ClearPageUptodate(page
);
98 int ext4_mpage_readpages(struct address_space
*mapping
,
99 struct list_head
*pages
, struct page
*page
,
102 struct bio
*bio
= NULL
;
103 sector_t last_block_in_bio
= 0;
105 struct inode
*inode
= mapping
->host
;
106 const unsigned blkbits
= inode
->i_blkbits
;
107 const unsigned blocks_per_page
= PAGE_SIZE
>> blkbits
;
108 const unsigned blocksize
= 1 << blkbits
;
109 sector_t block_in_file
;
111 sector_t last_block_in_file
;
112 sector_t blocks
[MAX_BUF_PER_PAGE
];
114 struct block_device
*bdev
= inode
->i_sb
->s_bdev
;
116 unsigned relative_block
= 0;
117 struct ext4_map_blocks map
;
124 for (; nr_pages
; nr_pages
--) {
125 int fully_mapped
= 1;
126 unsigned first_hole
= blocks_per_page
;
128 prefetchw(&page
->flags
);
130 page
= list_entry(pages
->prev
, struct page
, lru
);
131 list_del(&page
->lru
);
132 if (add_to_page_cache_lru(page
, mapping
, page
->index
,
133 readahead_gfp_mask(mapping
)))
137 if (page_has_buffers(page
))
140 block_in_file
= (sector_t
)page
->index
<< (PAGE_SHIFT
- blkbits
);
141 last_block
= block_in_file
+ nr_pages
* blocks_per_page
;
142 last_block_in_file
= (i_size_read(inode
) + blocksize
- 1) >> blkbits
;
143 if (last_block
> last_block_in_file
)
144 last_block
= last_block_in_file
;
148 * Map blocks using the previous result first.
150 if ((map
.m_flags
& EXT4_MAP_MAPPED
) &&
151 block_in_file
> map
.m_lblk
&&
152 block_in_file
< (map
.m_lblk
+ map
.m_len
)) {
153 unsigned map_offset
= block_in_file
- map
.m_lblk
;
154 unsigned last
= map
.m_len
- map_offset
;
156 for (relative_block
= 0; ; relative_block
++) {
157 if (relative_block
== last
) {
159 map
.m_flags
&= ~EXT4_MAP_MAPPED
;
162 if (page_block
== blocks_per_page
)
164 blocks
[page_block
] = map
.m_pblk
+ map_offset
+
172 * Then do more ext4_map_blocks() calls until we are
173 * done with this page.
175 while (page_block
< blocks_per_page
) {
176 if (block_in_file
< last_block
) {
177 map
.m_lblk
= block_in_file
;
178 map
.m_len
= last_block
- block_in_file
;
180 if (ext4_map_blocks(NULL
, inode
, &map
, 0) < 0) {
183 zero_user_segment(page
, 0,
189 if ((map
.m_flags
& EXT4_MAP_MAPPED
) == 0) {
191 if (first_hole
== blocks_per_page
)
192 first_hole
= page_block
;
197 if (first_hole
!= blocks_per_page
)
198 goto confused
; /* hole -> non-hole */
200 /* Contiguous blocks? */
201 if (page_block
&& blocks
[page_block
-1] != map
.m_pblk
-1)
203 for (relative_block
= 0; ; relative_block
++) {
204 if (relative_block
== map
.m_len
) {
206 map
.m_flags
&= ~EXT4_MAP_MAPPED
;
208 } else if (page_block
== blocks_per_page
)
210 blocks
[page_block
] = map
.m_pblk
+relative_block
;
215 if (first_hole
!= blocks_per_page
) {
216 zero_user_segment(page
, first_hole
<< blkbits
,
218 if (first_hole
== 0) {
219 SetPageUptodate(page
);
223 } else if (fully_mapped
) {
224 SetPageMappedToDisk(page
);
226 if (fully_mapped
&& blocks_per_page
== 1 &&
227 !PageUptodate(page
) && cleancache_get_page(page
) == 0) {
228 SetPageUptodate(page
);
233 * This page will go to BIO. Do we need to send this
236 if (bio
&& (last_block_in_bio
!= blocks
[0] - 1)) {
242 struct fscrypt_ctx
*ctx
= NULL
;
244 if (ext4_encrypted_inode(inode
) &&
245 S_ISREG(inode
->i_mode
)) {
246 ctx
= fscrypt_get_ctx(inode
, GFP_NOFS
);
250 bio
= bio_alloc(GFP_KERNEL
,
251 min_t(int, nr_pages
, BIO_MAX_PAGES
));
254 fscrypt_release_ctx(ctx
);
258 bio
->bi_iter
.bi_sector
= blocks
[0] << (blkbits
- 9);
259 bio
->bi_end_io
= mpage_end_io
;
260 bio
->bi_private
= ctx
;
261 bio_set_op_attrs(bio
, REQ_OP_READ
, 0);
264 length
= first_hole
<< blkbits
;
265 if (bio_add_page(bio
, page
, length
, 0) < length
)
266 goto submit_and_realloc
;
268 if (((map
.m_flags
& EXT4_MAP_BOUNDARY
) &&
269 (relative_block
== map
.m_len
)) ||
270 (first_hole
!= blocks_per_page
)) {
274 last_block_in_bio
= blocks
[blocks_per_page
- 1];
281 if (!PageUptodate(page
))
282 block_read_full_page(page
, ext4_get_block
);
289 BUG_ON(pages
&& !list_empty(pages
));