@@ -494,7 +494,7 @@ enum z_erofs_pclustermode {
494494};
495495
496496struct z_erofs_frontend {
497- struct inode * const inode ;
497+ struct inode * inode , * sharedinode ;
498498 struct erofs_map_blocks map ;
499499 struct z_erofs_bvec_iter biter ;
500500
@@ -509,8 +509,8 @@ struct z_erofs_frontend {
509509 unsigned int icur ;
510510};
511511
512- #define Z_EROFS_DEFINE_FRONTEND (fe , i , ho ) struct z_erofs_frontend fe = { \
513- .inode = i, .head = Z_EROFS_PCLUSTER_TAIL, \
512+ #define Z_EROFS_DEFINE_FRONTEND (fe , i , si , ho ) struct z_erofs_frontend fe = { \
513+ .inode = i, .sharedinode = si, . head = Z_EROFS_PCLUSTER_TAIL, \
514514 .mode = Z_EROFS_PCLUSTER_FOLLOWED, .headoffset = ho }
515515
516516static bool z_erofs_should_alloc_cache (struct z_erofs_frontend * fe )
@@ -1858,7 +1858,7 @@ static void z_erofs_pcluster_readmore(struct z_erofs_frontend *f,
18581858 pgoff_t index = cur >> PAGE_SHIFT ;
18591859 struct folio * folio ;
18601860
1861- folio = erofs_grab_folio_nowait (inode -> i_mapping , index );
1861+ folio = erofs_grab_folio_nowait (f -> sharedinode -> i_mapping , index );
18621862 if (!IS_ERR_OR_NULL (folio )) {
18631863 if (folio_test_uptodate (folio ))
18641864 folio_unlock (folio );
@@ -1875,11 +1875,13 @@ static void z_erofs_pcluster_readmore(struct z_erofs_frontend *f,
18751875
18761876static int z_erofs_read_folio (struct file * file , struct folio * folio )
18771877{
1878- struct inode * const inode = folio -> mapping -> host ;
1879- Z_EROFS_DEFINE_FRONTEND (f , inode , folio_pos (folio ));
1878+ struct inode * sharedinode = folio -> mapping -> host ;
1879+ bool need_iput ;
1880+ struct inode * realinode = erofs_real_inode (sharedinode , & need_iput );
1881+ Z_EROFS_DEFINE_FRONTEND (f , realinode , sharedinode , folio_pos (folio ));
18801882 int err ;
18811883
1882- trace_erofs_read_folio (inode , folio , false);
1884+ trace_erofs_read_folio (realinode , folio , false);
18831885 z_erofs_pcluster_readmore (& f , NULL , true);
18841886 err = z_erofs_scan_folio (& f , folio , false);
18851887 z_erofs_pcluster_readmore (& f , NULL , false);
@@ -1888,23 +1890,28 @@ static int z_erofs_read_folio(struct file *file, struct folio *folio)
18881890 /* if some pclusters are ready, need submit them anyway */
18891891 err = z_erofs_runqueue (& f , 0 ) ?: err ;
18901892 if (err && err != - EINTR )
1891- erofs_err (inode -> i_sb , "read error %d @ %lu of nid %llu" ,
1892- err , folio -> index , EROFS_I (inode )-> nid );
1893+ erofs_err (realinode -> i_sb , "read error %d @ %lu of nid %llu" ,
1894+ err , folio -> index , EROFS_I (realinode )-> nid );
18931895
18941896 erofs_put_metabuf (& f .map .buf );
18951897 erofs_release_pages (& f .pagepool );
1898+
1899+ if (need_iput )
1900+ iput (realinode );
18961901 return err ;
18971902}
18981903
18991904static void z_erofs_readahead (struct readahead_control * rac )
19001905{
1901- struct inode * const inode = rac -> mapping -> host ;
1902- Z_EROFS_DEFINE_FRONTEND (f , inode , readahead_pos (rac ));
1906+ struct inode * sharedinode = rac -> mapping -> host ;
1907+ bool need_iput ;
1908+ struct inode * realinode = erofs_real_inode (sharedinode , & need_iput );
1909+ Z_EROFS_DEFINE_FRONTEND (f , realinode , sharedinode , readahead_pos (rac ));
19031910 unsigned int nrpages = readahead_count (rac );
19041911 struct folio * head = NULL , * folio ;
19051912 int err ;
19061913
1907- trace_erofs_readahead (inode , readahead_index (rac ), nrpages , false);
1914+ trace_erofs_readahead (realinode , readahead_index (rac ), nrpages , false);
19081915 z_erofs_pcluster_readmore (& f , rac , true);
19091916 while ((folio = readahead_folio (rac ))) {
19101917 folio -> private = head ;
@@ -1918,15 +1925,18 @@ static void z_erofs_readahead(struct readahead_control *rac)
19181925
19191926 err = z_erofs_scan_folio (& f , folio , true);
19201927 if (err && err != - EINTR )
1921- erofs_err (inode -> i_sb , "readahead error at folio %lu @ nid %llu" ,
1922- folio -> index , EROFS_I (inode )-> nid );
1928+ erofs_err (realinode -> i_sb , "readahead error at folio %lu @ nid %llu" ,
1929+ folio -> index , EROFS_I (realinode )-> nid );
19231930 }
19241931 z_erofs_pcluster_readmore (& f , rac , false);
19251932 z_erofs_pcluster_end (& f );
19261933
19271934 (void )z_erofs_runqueue (& f , nrpages << PAGE_SHIFT );
19281935 erofs_put_metabuf (& f .map .buf );
19291936 erofs_release_pages (& f .pagepool );
1937+
1938+ if (need_iput )
1939+ iput (realinode );
19301940}
19311941
19321942const struct address_space_operations z_erofs_aops = {
0 commit comments