4242#include <linux/slab.h>
4343#include <linux/migrate.h>
4444
45- static int read_block (struct inode * inode , void * addr , unsigned int block ,
46- struct ubifs_data_node * dn )
45+ static int read_block (struct inode * inode , struct folio * folio , size_t offset ,
46+ unsigned int block , struct ubifs_data_node * dn )
4747{
4848 struct ubifs_info * c = inode -> i_sb -> s_fs_info ;
4949 int err , len , out_len ;
@@ -55,7 +55,7 @@ static int read_block(struct inode *inode, void *addr, unsigned int block,
5555 if (err ) {
5656 if (err == - ENOENT )
5757 /* Not found, so it must be a hole */
58- memset ( addr , 0 , UBIFS_BLOCK_SIZE );
58+ folio_zero_range ( folio , offset , UBIFS_BLOCK_SIZE );
5959 return err ;
6060 }
6161
@@ -74,8 +74,8 @@ static int read_block(struct inode *inode, void *addr, unsigned int block,
7474 }
7575
7676 out_len = UBIFS_BLOCK_SIZE ;
77- err = ubifs_decompress (c , & dn -> data , dlen , addr , & out_len ,
78- le16_to_cpu (dn -> compr_type ));
77+ err = ubifs_decompress_folio (c , & dn -> data , dlen , folio , offset ,
78+ & out_len , le16_to_cpu (dn -> compr_type ));
7979 if (err || len != out_len )
8080 goto dump ;
8181
@@ -85,7 +85,7 @@ static int read_block(struct inode *inode, void *addr, unsigned int block,
8585 * appending data). Ensure that the remainder is zeroed out.
8686 */
8787 if (len < UBIFS_BLOCK_SIZE )
88- memset ( addr + len , 0 , UBIFS_BLOCK_SIZE - len );
88+ folio_zero_range ( folio , offset + len , UBIFS_BLOCK_SIZE - len );
8989
9090 return 0 ;
9191
@@ -98,27 +98,25 @@ static int read_block(struct inode *inode, void *addr, unsigned int block,
9898
9999static int do_readpage (struct folio * folio )
100100{
101- void * addr ;
102101 int err = 0 , i ;
103102 unsigned int block , beyond ;
104103 struct ubifs_data_node * dn = NULL ;
105104 struct inode * inode = folio -> mapping -> host ;
106105 struct ubifs_info * c = inode -> i_sb -> s_fs_info ;
107106 loff_t i_size = i_size_read (inode );
107+ size_t offset = 0 ;
108108
109109 dbg_gen ("ino %lu, pg %lu, i_size %lld, flags %#lx" ,
110110 inode -> i_ino , folio -> index , i_size , folio -> flags );
111111 ubifs_assert (c , !folio_test_checked (folio ));
112112 ubifs_assert (c , !folio -> private );
113113
114- addr = kmap_local_folio (folio , 0 );
115-
116114 block = folio -> index << UBIFS_BLOCKS_PER_PAGE_SHIFT ;
117115 beyond = (i_size + UBIFS_BLOCK_SIZE - 1 ) >> UBIFS_BLOCK_SHIFT ;
118116 if (block >= beyond ) {
119117 /* Reading beyond inode */
120118 folio_set_checked (folio );
121- addr = folio_zero_tail (folio , 0 , addr );
119+ folio_zero_range (folio , 0 , folio_size ( folio ) );
122120 goto out ;
123121 }
124122
@@ -135,9 +133,9 @@ static int do_readpage(struct folio *folio)
135133 if (block >= beyond ) {
136134 /* Reading beyond inode */
137135 err = - ENOENT ;
138- memset ( addr , 0 , UBIFS_BLOCK_SIZE );
136+ folio_zero_range ( folio , offset , UBIFS_BLOCK_SIZE );
139137 } else {
140- ret = read_block (inode , addr , block , dn );
138+ ret = read_block (inode , folio , offset , block , dn );
141139 if (ret ) {
142140 err = ret ;
143141 if (err != - ENOENT )
@@ -147,17 +145,13 @@ static int do_readpage(struct folio *folio)
147145 int ilen = i_size & (UBIFS_BLOCK_SIZE - 1 );
148146
149147 if (ilen && ilen < dlen )
150- memset ( addr + ilen , 0 , dlen - ilen );
148+ folio_zero_range ( folio , offset + ilen , dlen - ilen );
151149 }
152150 }
153151 if (++ i >= (UBIFS_BLOCKS_PER_PAGE << folio_order (folio )))
154152 break ;
155153 block += 1 ;
156- addr += UBIFS_BLOCK_SIZE ;
157- if (folio_test_highmem (folio ) && (offset_in_page (addr ) == 0 )) {
158- kunmap_local (addr - UBIFS_BLOCK_SIZE );
159- addr = kmap_local_folio (folio , i * UBIFS_BLOCK_SIZE );
160- }
154+ offset += UBIFS_BLOCK_SIZE ;
161155 }
162156
163157 if (err ) {
@@ -177,8 +171,6 @@ static int do_readpage(struct folio *folio)
177171 kfree (dn );
178172 if (!err )
179173 folio_mark_uptodate (folio );
180- flush_dcache_folio (folio );
181- kunmap_local (addr );
182174 return err ;
183175}
184176
@@ -602,18 +594,16 @@ static int populate_page(struct ubifs_info *c, struct folio *folio,
602594 struct inode * inode = folio -> mapping -> host ;
603595 loff_t i_size = i_size_read (inode );
604596 unsigned int page_block ;
605- void * addr , * zaddr ;
597+ size_t offset = 0 ;
606598 pgoff_t end_index ;
607599
608600 dbg_gen ("ino %lu, pg %lu, i_size %lld, flags %#lx" ,
609601 inode -> i_ino , folio -> index , i_size , folio -> flags );
610602
611- addr = zaddr = kmap_local_folio (folio , 0 );
612-
613603 end_index = (i_size - 1 ) >> PAGE_SHIFT ;
614604 if (!i_size || folio -> index > end_index ) {
615605 hole = 1 ;
616- addr = folio_zero_tail (folio , 0 , addr );
606+ folio_zero_range (folio , 0 , folio_size ( folio ) );
617607 goto out_hole ;
618608 }
619609
@@ -623,7 +613,7 @@ static int populate_page(struct ubifs_info *c, struct folio *folio,
623613
624614 if (nn >= bu -> cnt ) {
625615 hole = 1 ;
626- memset ( addr , 0 , UBIFS_BLOCK_SIZE );
616+ folio_zero_range ( folio , offset , UBIFS_BLOCK_SIZE );
627617 } else if (key_block (c , & bu -> zbranch [nn ].key ) == page_block ) {
628618 struct ubifs_data_node * dn ;
629619
@@ -645,13 +635,15 @@ static int populate_page(struct ubifs_info *c, struct folio *folio,
645635 goto out_err ;
646636 }
647637
648- err = ubifs_decompress (c , & dn -> data , dlen , addr , & out_len ,
649- le16_to_cpu (dn -> compr_type ));
638+ err = ubifs_decompress_folio (
639+ c , & dn -> data , dlen , folio , offset , & out_len ,
640+ le16_to_cpu (dn -> compr_type ));
650641 if (err || len != out_len )
651642 goto out_err ;
652643
653644 if (len < UBIFS_BLOCK_SIZE )
654- memset (addr + len , 0 , UBIFS_BLOCK_SIZE - len );
645+ folio_zero_range (folio , offset + len ,
646+ UBIFS_BLOCK_SIZE - len );
655647
656648 nn += 1 ;
657649 read = (i << UBIFS_BLOCK_SHIFT ) + len ;
@@ -660,23 +652,19 @@ static int populate_page(struct ubifs_info *c, struct folio *folio,
660652 continue ;
661653 } else {
662654 hole = 1 ;
663- memset ( addr , 0 , UBIFS_BLOCK_SIZE );
655+ folio_zero_range ( folio , offset , UBIFS_BLOCK_SIZE );
664656 }
665657 if (++ i >= UBIFS_BLOCKS_PER_PAGE )
666658 break ;
667- addr += UBIFS_BLOCK_SIZE ;
659+ offset += UBIFS_BLOCK_SIZE ;
668660 page_block += 1 ;
669- if (folio_test_highmem (folio ) && (offset_in_page (addr ) == 0 )) {
670- kunmap_local (addr - UBIFS_BLOCK_SIZE );
671- addr = kmap_local_folio (folio , i * UBIFS_BLOCK_SIZE );
672- }
673661 }
674662
675663 if (end_index == folio -> index ) {
676664 int len = i_size & (PAGE_SIZE - 1 );
677665
678666 if (len && len < read )
679- memset ( zaddr + len , 0 , read - len );
667+ folio_zero_range ( folio , len , read - len );
680668 }
681669
682670out_hole :
@@ -686,14 +674,10 @@ static int populate_page(struct ubifs_info *c, struct folio *folio,
686674 }
687675
688676 folio_mark_uptodate (folio );
689- flush_dcache_folio (folio );
690- kunmap_local (addr );
691677 * n = nn ;
692678 return 0 ;
693679
694680out_err :
695- flush_dcache_folio (folio );
696- kunmap_local (addr );
697681 ubifs_err (c , "bad data node (block %u, inode %lu)" ,
698682 page_block , inode -> i_ino );
699683 return - EINVAL ;
@@ -898,7 +882,6 @@ static int do_writepage(struct folio *folio, size_t len)
898882{
899883 int err = 0 , blen ;
900884 unsigned int block ;
901- void * addr ;
902885 size_t offset = 0 ;
903886 union ubifs_key key ;
904887 struct inode * inode = folio -> mapping -> host ;
@@ -913,26 +896,19 @@ static int do_writepage(struct folio *folio, size_t len)
913896
914897 folio_start_writeback (folio );
915898
916- addr = kmap_local_folio (folio , offset );
917899 block = folio -> index << UBIFS_BLOCKS_PER_PAGE_SHIFT ;
918900 for (;;) {
919901 blen = min_t (size_t , len , UBIFS_BLOCK_SIZE );
920902 data_key_init (c , & key , inode -> i_ino , block );
921- err = ubifs_jnl_write_data (c , inode , & key , addr , blen );
903+ err = ubifs_jnl_write_data (c , inode , & key , folio , offset , blen );
922904 if (err )
923905 break ;
924906 len -= blen ;
925907 if (!len )
926908 break ;
927909 block += 1 ;
928- addr += blen ;
929- if (folio_test_highmem (folio ) && !offset_in_page (addr )) {
930- kunmap_local (addr - blen );
931- offset += PAGE_SIZE ;
932- addr = kmap_local_folio (folio , offset );
933- }
910+ offset += blen ;
934911 }
935- kunmap_local (addr );
936912 if (err ) {
937913 mapping_set_error (folio -> mapping , err );
938914 ubifs_err (c , "cannot write folio %lu of inode %lu, error %d" ,
0 commit comments