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 unsigned int *eblks, 133 bool ra) 134 { 135 struct inode *const inode = mapping->host; 136 struct super_block *const sb = inode->i_sb; 137 erofs_off_t current_block = (erofs_off_t)page->index; 138 int err; 139 140 DBG_BUGON(!nblocks); 141 142 if (PageUptodate(page)) { 143 err = 0; 144 goto has_updated; 145 } 146 147 /* note that for readpage case, bio also equals to NULL */ 148 if (bio && 149 (*last_block + 1 != current_block || !*eblks)) { 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 *eblks = bio_max_segs(nblocks); 220 bio = bio_alloc(GFP_NOIO, *eblks); 221 222 bio->bi_end_io = erofs_readendio; 223 bio_set_dev(bio, sb->s_bdev); 224 bio->bi_iter.bi_sector = (sector_t)blknr << 225 LOG_SECTORS_PER_BLOCK; 226 bio->bi_opf = REQ_OP_READ | (ra ? REQ_RAHEAD : 0); 227 } 228 229 err = bio_add_page(bio, page, PAGE_SIZE, 0); 230 /* out of the extent or bio is full */ 231 if (err < PAGE_SIZE) 232 goto submit_bio_retry; 233 --*eblks; 234 *last_block = current_block; 235 return bio; 236 237 err_out: 238 /* for sync reading, set page error immediately */ 239 if (!ra) { 240 SetPageError(page); 241 ClearPageUptodate(page); 242 } 243 has_updated: 244 unlock_page(page); 245 246 /* if updated manually, continuous pages has a gap */ 247 if (bio) 248 submit_bio(bio); 249 return err ? ERR_PTR(err) : NULL; 250 } 251 252 /* 253 * since we dont have write or truncate flows, so no inode 254 * locking needs to be held at the moment. 255 */ 256 static int erofs_raw_access_readpage(struct file *file, struct page *page) 257 { 258 erofs_off_t last_block; 259 unsigned int eblks; 260 struct bio *bio; 261 262 trace_erofs_readpage(page, true); 263 264 bio = erofs_read_raw_page(NULL, page->mapping, 265 page, &last_block, 1, &eblks, false); 266 267 if (IS_ERR(bio)) 268 return PTR_ERR(bio); 269 270 if (bio) 271 submit_bio(bio); 272 return 0; 273 } 274 275 static void erofs_raw_access_readahead(struct readahead_control *rac) 276 { 277 erofs_off_t last_block; 278 unsigned int eblks; 279 struct bio *bio = NULL; 280 struct page *page; 281 282 trace_erofs_readpages(rac->mapping->host, readahead_index(rac), 283 readahead_count(rac), true); 284 285 while ((page = readahead_page(rac))) { 286 prefetchw(&page->flags); 287 288 bio = erofs_read_raw_page(bio, rac->mapping, page, &last_block, 289 readahead_count(rac), &eblks, true); 290 291 /* all the page errors are ignored when readahead */ 292 if (IS_ERR(bio)) { 293 pr_err("%s, readahead error at page %lu of nid %llu\n", 294 __func__, page->index, 295 EROFS_I(rac->mapping->host)->nid); 296 297 bio = NULL; 298 } 299 300 put_page(page); 301 } 302 303 if (bio) 304 submit_bio(bio); 305 } 306 307 static sector_t erofs_bmap(struct address_space *mapping, sector_t block) 308 { 309 struct inode *inode = mapping->host; 310 struct erofs_map_blocks map = { 311 .m_la = blknr_to_addr(block), 312 }; 313 314 if (EROFS_I(inode)->datalayout == EROFS_INODE_FLAT_INLINE) { 315 erofs_blk_t blks = i_size_read(inode) >> LOG_BLOCK_SIZE; 316 317 if (block >> LOG_SECTORS_PER_BLOCK >= blks) 318 return 0; 319 } 320 321 if (!erofs_map_blocks(inode, &map, EROFS_GET_BLOCKS_RAW)) 322 return erofs_blknr(map.m_pa); 323 324 return 0; 325 } 326 327 /* for uncompressed (aligned) files and raw access for other files */ 328 const struct address_space_operations erofs_raw_access_aops = { 329 .readpage = erofs_raw_access_readpage, 330 .readahead = erofs_raw_access_readahead, 331 .bmap = erofs_bmap, 332 }; 333 334