1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2017-2018 HUAWEI, Inc. 4 * https://www.huawei.com/ 5 * Created by Gao Xiang <gaoxiang25@huawei.com> 6 */ 7 #include "internal.h" 8 #include <linux/prefetch.h> 9 10 #include <trace/events/erofs.h> 11 12 static void erofs_readendio(struct bio *bio) 13 { 14 struct bio_vec *bvec; 15 blk_status_t err = bio->bi_status; 16 struct bvec_iter_all iter_all; 17 18 bio_for_each_segment_all(bvec, bio, iter_all) { 19 struct page *page = bvec->bv_page; 20 21 /* page is already locked */ 22 DBG_BUGON(PageUptodate(page)); 23 24 if (err) 25 SetPageError(page); 26 else 27 SetPageUptodate(page); 28 29 unlock_page(page); 30 /* page could be reclaimed now */ 31 } 32 bio_put(bio); 33 } 34 35 struct page *erofs_get_meta_page(struct super_block *sb, erofs_blk_t blkaddr) 36 { 37 struct address_space *const mapping = sb->s_bdev->bd_inode->i_mapping; 38 struct page *page; 39 40 page = read_cache_page_gfp(mapping, blkaddr, 41 mapping_gfp_constraint(mapping, ~__GFP_FS)); 42 /* should already be PageUptodate */ 43 if (!IS_ERR(page)) 44 lock_page(page); 45 return page; 46 } 47 48 static int erofs_map_blocks_flatmode(struct inode *inode, 49 struct erofs_map_blocks *map, 50 int flags) 51 { 52 int err = 0; 53 erofs_blk_t nblocks, lastblk; 54 u64 offset = map->m_la; 55 struct erofs_inode *vi = EROFS_I(inode); 56 bool tailendpacking = (vi->datalayout == EROFS_INODE_FLAT_INLINE); 57 58 trace_erofs_map_blocks_flatmode_enter(inode, map, flags); 59 60 nblocks = DIV_ROUND_UP(inode->i_size, PAGE_SIZE); 61 lastblk = nblocks - tailendpacking; 62 63 if (offset >= inode->i_size) { 64 /* leave out-of-bound access unmapped */ 65 map->m_flags = 0; 66 map->m_plen = 0; 67 goto out; 68 } 69 70 /* there is no hole in flatmode */ 71 map->m_flags = EROFS_MAP_MAPPED; 72 73 if (offset < blknr_to_addr(lastblk)) { 74 map->m_pa = blknr_to_addr(vi->raw_blkaddr) + map->m_la; 75 map->m_plen = blknr_to_addr(lastblk) - offset; 76 } else if (tailendpacking) { 77 /* 2 - inode inline B: inode, [xattrs], inline last blk... */ 78 struct erofs_sb_info *sbi = EROFS_SB(inode->i_sb); 79 80 map->m_pa = iloc(sbi, vi->nid) + vi->inode_isize + 81 vi->xattr_isize + erofs_blkoff(map->m_la); 82 map->m_plen = inode->i_size - offset; 83 84 /* inline data should be located in one meta block */ 85 if (erofs_blkoff(map->m_pa) + map->m_plen > PAGE_SIZE) { 86 erofs_err(inode->i_sb, 87 "inline data cross block boundary @ nid %llu", 88 vi->nid); 89 DBG_BUGON(1); 90 err = -EFSCORRUPTED; 91 goto err_out; 92 } 93 94 map->m_flags |= EROFS_MAP_META; 95 } else { 96 erofs_err(inode->i_sb, 97 "internal error @ nid: %llu (size %llu), m_la 0x%llx", 98 vi->nid, inode->i_size, map->m_la); 99 DBG_BUGON(1); 100 err = -EIO; 101 goto err_out; 102 } 103 104 out: 105 map->m_llen = map->m_plen; 106 107 err_out: 108 trace_erofs_map_blocks_flatmode_exit(inode, map, flags, 0); 109 return err; 110 } 111 112 int erofs_map_blocks(struct inode *inode, 113 struct erofs_map_blocks *map, int flags) 114 { 115 if (erofs_inode_is_data_compressed(EROFS_I(inode)->datalayout)) { 116 int err = z_erofs_map_blocks_iter(inode, map, flags); 117 118 if (map->mpage) { 119 put_page(map->mpage); 120 map->mpage = NULL; 121 } 122 return err; 123 } 124 return erofs_map_blocks_flatmode(inode, map, flags); 125 } 126 127 static inline struct bio *erofs_read_raw_page(struct bio *bio, 128 struct address_space *mapping, 129 struct page *page, 130 erofs_off_t *last_block, 131 unsigned int nblocks, 132 bool ra) 133 { 134 struct inode *const inode = mapping->host; 135 struct super_block *const sb = inode->i_sb; 136 erofs_off_t current_block = (erofs_off_t)page->index; 137 int err; 138 139 DBG_BUGON(!nblocks); 140 141 if (PageUptodate(page)) { 142 err = 0; 143 goto has_updated; 144 } 145 146 /* note that for readpage case, bio also equals to NULL */ 147 if (bio && 148 /* not continuous */ 149 *last_block + 1 != current_block) { 150 submit_bio_retry: 151 submit_bio(bio); 152 bio = NULL; 153 } 154 155 if (!bio) { 156 struct erofs_map_blocks map = { 157 .m_la = blknr_to_addr(current_block), 158 }; 159 erofs_blk_t blknr; 160 unsigned int blkoff; 161 162 err = erofs_map_blocks(inode, &map, EROFS_GET_BLOCKS_RAW); 163 if (err) 164 goto err_out; 165 166 /* zero out the holed page */ 167 if (!(map.m_flags & EROFS_MAP_MAPPED)) { 168 zero_user_segment(page, 0, PAGE_SIZE); 169 SetPageUptodate(page); 170 171 /* imply err = 0, see erofs_map_blocks */ 172 goto has_updated; 173 } 174 175 /* for RAW access mode, m_plen must be equal to m_llen */ 176 DBG_BUGON(map.m_plen != map.m_llen); 177 178 blknr = erofs_blknr(map.m_pa); 179 blkoff = erofs_blkoff(map.m_pa); 180 181 /* deal with inline page */ 182 if (map.m_flags & EROFS_MAP_META) { 183 void *vsrc, *vto; 184 struct page *ipage; 185 186 DBG_BUGON(map.m_plen > PAGE_SIZE); 187 188 ipage = erofs_get_meta_page(inode->i_sb, blknr); 189 190 if (IS_ERR(ipage)) { 191 err = PTR_ERR(ipage); 192 goto err_out; 193 } 194 195 vsrc = kmap_atomic(ipage); 196 vto = kmap_atomic(page); 197 memcpy(vto, vsrc + blkoff, map.m_plen); 198 memset(vto + map.m_plen, 0, PAGE_SIZE - map.m_plen); 199 kunmap_atomic(vto); 200 kunmap_atomic(vsrc); 201 flush_dcache_page(page); 202 203 SetPageUptodate(page); 204 /* TODO: could we unlock the page earlier? */ 205 unlock_page(ipage); 206 put_page(ipage); 207 208 /* imply err = 0, see erofs_map_blocks */ 209 goto has_updated; 210 } 211 212 /* pa must be block-aligned for raw reading */ 213 DBG_BUGON(erofs_blkoff(map.m_pa)); 214 215 /* max # of continuous pages */ 216 if (nblocks > DIV_ROUND_UP(map.m_plen, PAGE_SIZE)) 217 nblocks = DIV_ROUND_UP(map.m_plen, PAGE_SIZE); 218 219 bio = bio_alloc(GFP_NOIO, bio_max_segs(nblocks)); 220 221 bio->bi_end_io = erofs_readendio; 222 bio_set_dev(bio, sb->s_bdev); 223 bio->bi_iter.bi_sector = (sector_t)blknr << 224 LOG_SECTORS_PER_BLOCK; 225 bio->bi_opf = REQ_OP_READ | (ra ? REQ_RAHEAD : 0); 226 } 227 228 err = bio_add_page(bio, page, PAGE_SIZE, 0); 229 /* out of the extent or bio is full */ 230 if (err < PAGE_SIZE) 231 goto submit_bio_retry; 232 233 *last_block = current_block; 234 235 /* shift in advance in case of it followed by too many gaps */ 236 if (bio->bi_iter.bi_size >= bio->bi_max_vecs * PAGE_SIZE) { 237 /* err should reassign to 0 after submitting */ 238 err = 0; 239 goto submit_bio_out; 240 } 241 242 return bio; 243 244 err_out: 245 /* for sync reading, set page error immediately */ 246 if (!ra) { 247 SetPageError(page); 248 ClearPageUptodate(page); 249 } 250 has_updated: 251 unlock_page(page); 252 253 /* if updated manually, continuous pages has a gap */ 254 if (bio) 255 submit_bio_out: 256 submit_bio(bio); 257 return err ? ERR_PTR(err) : NULL; 258 } 259 260 /* 261 * since we dont have write or truncate flows, so no inode 262 * locking needs to be held at the moment. 263 */ 264 static int erofs_raw_access_readpage(struct file *file, struct page *page) 265 { 266 erofs_off_t last_block; 267 struct bio *bio; 268 269 trace_erofs_readpage(page, true); 270 271 bio = erofs_read_raw_page(NULL, page->mapping, 272 page, &last_block, 1, false); 273 274 if (IS_ERR(bio)) 275 return PTR_ERR(bio); 276 277 DBG_BUGON(bio); /* since we have only one bio -- must be NULL */ 278 return 0; 279 } 280 281 static void erofs_raw_access_readahead(struct readahead_control *rac) 282 { 283 erofs_off_t last_block; 284 struct bio *bio = NULL; 285 struct page *page; 286 287 trace_erofs_readpages(rac->mapping->host, readahead_index(rac), 288 readahead_count(rac), true); 289 290 while ((page = readahead_page(rac))) { 291 prefetchw(&page->flags); 292 293 bio = erofs_read_raw_page(bio, rac->mapping, page, &last_block, 294 readahead_count(rac), true); 295 296 /* all the page errors are ignored when readahead */ 297 if (IS_ERR(bio)) { 298 pr_err("%s, readahead error at page %lu of nid %llu\n", 299 __func__, page->index, 300 EROFS_I(rac->mapping->host)->nid); 301 302 bio = NULL; 303 } 304 305 put_page(page); 306 } 307 308 /* the rare case (end in gaps) */ 309 if (bio) 310 submit_bio(bio); 311 } 312 313 static sector_t erofs_bmap(struct address_space *mapping, sector_t block) 314 { 315 struct inode *inode = mapping->host; 316 struct erofs_map_blocks map = { 317 .m_la = blknr_to_addr(block), 318 }; 319 320 if (EROFS_I(inode)->datalayout == EROFS_INODE_FLAT_INLINE) { 321 erofs_blk_t blks = i_size_read(inode) >> LOG_BLOCK_SIZE; 322 323 if (block >> LOG_SECTORS_PER_BLOCK >= blks) 324 return 0; 325 } 326 327 if (!erofs_map_blocks(inode, &map, EROFS_GET_BLOCKS_RAW)) 328 return erofs_blknr(map.m_pa); 329 330 return 0; 331 } 332 333 /* for uncompressed (aligned) files and raw access for other files */ 334 const struct address_space_operations erofs_raw_access_aops = { 335 .readpage = erofs_raw_access_readpage, 336 .readahead = erofs_raw_access_readahead, 337 .bmap = erofs_bmap, 338 }; 339 340