@@ -269,21 +269,23 @@ void erofs_onlinefolio_end(struct folio *folio, int err, bool dirty)
269269struct erofs_iomap_iter_ctx {
270270 struct page * page ;
271271 void * base ;
272+ struct inode * realinode ;
272273};
273274
274275static int erofs_iomap_begin (struct inode * inode , loff_t offset , loff_t length ,
275276 unsigned int flags , struct iomap * iomap , struct iomap * srcmap )
276277{
277278 struct iomap_iter * iter = container_of (iomap , struct iomap_iter , iomap );
278279 struct erofs_iomap_iter_ctx * ctx = iter -> private ;
279- struct super_block * sb = inode -> i_sb ;
280+ struct inode * realinode = ctx ? ctx -> realinode : inode ;
281+ struct super_block * sb = realinode -> i_sb ;
280282 struct erofs_map_blocks map ;
281283 struct erofs_map_dev mdev ;
282284 int ret ;
283285
284286 map .m_la = offset ;
285287 map .m_llen = length ;
286- ret = erofs_map_blocks (inode , & map );
288+ ret = erofs_map_blocks (realinode , & map );
287289 if (ret < 0 )
288290 return ret ;
289291
@@ -296,7 +298,7 @@ static int erofs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
296298 return 0 ;
297299 }
298300
299- if (!(map .m_flags & EROFS_MAP_META ) || !erofs_inode_in_metabox (inode )) {
301+ if (!(map .m_flags & EROFS_MAP_META ) || !erofs_inode_in_metabox (realinode )) {
300302 mdev = (struct erofs_map_dev ) {
301303 .m_deviceid = map .m_deviceid ,
302304 .m_pa = map .m_pa ,
@@ -322,7 +324,7 @@ static int erofs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
322324 void * ptr ;
323325
324326 ptr = erofs_read_metabuf (& buf , sb , map .m_pa ,
325- erofs_inode_in_metabox (inode ));
327+ erofs_inode_in_metabox (realinode ));
326328 if (IS_ERR (ptr ))
327329 return PTR_ERR (ptr );
328330 iomap -> inline_data = ptr ;
@@ -383,10 +385,15 @@ static int erofs_read_folio(struct file *file, struct folio *folio)
383385 .ops = & iomap_bio_read_ops ,
384386 .cur_folio = folio ,
385387 };
386- struct erofs_iomap_iter_ctx iter_ctx = {};
388+ bool need_iput ;
389+ struct erofs_iomap_iter_ctx iter_ctx = {
390+ .realinode = erofs_real_inode (folio_inode (folio ), & need_iput ),
391+ };
387392
388- trace_erofs_read_folio (folio_inode ( folio ) , folio , true);
393+ trace_erofs_read_folio (iter_ctx . realinode , folio , true);
389394 iomap_read_folio (& erofs_iomap_ops , & read_ctx , & iter_ctx );
395+ if (need_iput )
396+ iput (iter_ctx .realinode );
390397 return 0 ;
391398}
392399
@@ -396,11 +403,16 @@ static void erofs_readahead(struct readahead_control *rac)
396403 .ops = & iomap_bio_read_ops ,
397404 .rac = rac ,
398405 };
399- struct erofs_iomap_iter_ctx iter_ctx = {};
406+ bool need_iput ;
407+ struct erofs_iomap_iter_ctx iter_ctx = {
408+ .realinode = erofs_real_inode (rac -> mapping -> host , & need_iput ),
409+ };
400410
401- trace_erofs_readahead (rac -> mapping -> host , readahead_index (rac ),
411+ trace_erofs_readahead (iter_ctx . realinode , readahead_index (rac ),
402412 readahead_count (rac ), true);
403413 iomap_readahead (& erofs_iomap_ops , & read_ctx , & iter_ctx );
414+ if (need_iput )
415+ iput (iter_ctx .realinode );
404416}
405417
406418static sector_t erofs_bmap (struct address_space * mapping , sector_t block )
@@ -421,7 +433,9 @@ static ssize_t erofs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
421433 return dax_iomap_rw (iocb , to , & erofs_iomap_ops );
422434#endif
423435 if ((iocb -> ki_flags & IOCB_DIRECT ) && inode -> i_sb -> s_bdev ) {
424- struct erofs_iomap_iter_ctx iter_ctx = {};
436+ struct erofs_iomap_iter_ctx iter_ctx = {
437+ .realinode = inode ,
438+ };
425439
426440 return iomap_dio_rw (iocb , to , & erofs_iomap_ops ,
427441 NULL , 0 , & iter_ctx , 0 );
0 commit comments