@@ -35,7 +35,7 @@ static int z_erofs_fill_inode_lazy(struct inode *inode)
3535 struct super_block * const sb = inode -> i_sb ;
3636 int err , headnr ;
3737 erofs_off_t pos ;
38- struct page * page ;
38+ struct erofs_buf buf = __EROFS_BUF_INITIALIZER ;
3939 void * kaddr ;
4040 struct z_erofs_map_header * h ;
4141
@@ -61,14 +61,13 @@ static int z_erofs_fill_inode_lazy(struct inode *inode)
6161
6262 pos = ALIGN (iloc (EROFS_SB (sb ), vi -> nid ) + vi -> inode_isize +
6363 vi -> xattr_isize , 8 );
64- page = erofs_get_meta_page (sb , erofs_blknr (pos ));
65- if (IS_ERR (page )) {
66- err = PTR_ERR (page );
64+ kaddr = erofs_read_metabuf (& buf , sb , erofs_blknr (pos ),
65+ EROFS_KMAP_ATOMIC );
66+ if (IS_ERR (kaddr )) {
67+ err = PTR_ERR (kaddr );
6768 goto out_unlock ;
6869 }
6970
70- kaddr = kmap_atomic (page );
71-
7271 h = kaddr + erofs_blkoff (pos );
7372 vi -> z_advise = le16_to_cpu (h -> h_advise );
7473 vi -> z_algorithmtype [0 ] = h -> h_algorithmtype & 15 ;
@@ -101,20 +100,19 @@ static int z_erofs_fill_inode_lazy(struct inode *inode)
101100 goto unmap_done ;
102101 }
103102unmap_done :
104- kunmap_atomic (kaddr );
105- unlock_page (page );
106- put_page (page );
103+ erofs_put_metabuf (& buf );
107104 if (err )
108105 goto out_unlock ;
109106
110107 if (vi -> z_advise & Z_EROFS_ADVISE_INLINE_PCLUSTER ) {
111- struct erofs_map_blocks map = { .mpage = NULL };
108+ struct erofs_map_blocks map = {
109+ .buf = __EROFS_BUF_INITIALIZER
110+ };
112111
113112 vi -> z_idata_size = le16_to_cpu (h -> h_idata_size );
114113 err = z_erofs_do_map_blocks (inode , & map ,
115114 EROFS_GET_BLOCKS_FINDTAIL );
116- if (map .mpage )
117- put_page (map .mpage );
115+ erofs_put_metabuf (& map .buf );
118116
119117 if (!map .m_plen ||
120118 erofs_blkoff (map .m_pa ) + map .m_plen > EROFS_BLKSIZ ) {
@@ -151,31 +149,11 @@ static int z_erofs_reload_indexes(struct z_erofs_maprecorder *m,
151149 erofs_blk_t eblk )
152150{
153151 struct super_block * const sb = m -> inode -> i_sb ;
154- struct erofs_map_blocks * const map = m -> map ;
155- struct page * mpage = map -> mpage ;
156-
157- if (mpage ) {
158- if (mpage -> index == eblk ) {
159- if (!m -> kaddr )
160- m -> kaddr = kmap_atomic (mpage );
161- return 0 ;
162- }
163152
164- if (m -> kaddr ) {
165- kunmap_atomic (m -> kaddr );
166- m -> kaddr = NULL ;
167- }
168- put_page (mpage );
169- }
170-
171- mpage = erofs_get_meta_page (sb , eblk );
172- if (IS_ERR (mpage )) {
173- map -> mpage = NULL ;
174- return PTR_ERR (mpage );
175- }
176- m -> kaddr = kmap_atomic (mpage );
177- unlock_page (mpage );
178- map -> mpage = mpage ;
153+ m -> kaddr = erofs_read_metabuf (& m -> map -> buf , sb , eblk ,
154+ EROFS_KMAP_ATOMIC );
155+ if (IS_ERR (m -> kaddr ))
156+ return PTR_ERR (m -> kaddr );
179157 return 0 ;
180158}
181159
@@ -711,8 +689,7 @@ static int z_erofs_do_map_blocks(struct inode *inode,
711689 map -> m_flags |= EROFS_MAP_FULL_MAPPED ;
712690 }
713691unmap_out :
714- if (m .kaddr )
715- kunmap_atomic (m .kaddr );
692+ erofs_unmap_metabuf (& m .map -> buf );
716693
717694out :
718695 erofs_dbg ("%s, m_la %llu m_pa %llu m_llen %llu m_plen %llu m_flags 0%o" ,
@@ -759,8 +736,7 @@ static int z_erofs_iomap_begin_report(struct inode *inode, loff_t offset,
759736 struct erofs_map_blocks map = { .m_la = offset };
760737
761738 ret = z_erofs_map_blocks_iter (inode , & map , EROFS_GET_BLOCKS_FIEMAP );
762- if (map .mpage )
763- put_page (map .mpage );
739+ erofs_put_metabuf (& map .buf );
764740 if (ret < 0 )
765741 return ret ;
766742
0 commit comments