42
42
#include <linux/slab.h>
43
43
#include <linux/migrate.h>
44
44
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 )
47
47
{
48
48
struct ubifs_info * c = inode -> i_sb -> s_fs_info ;
49
49
int err , len , out_len ;
@@ -55,7 +55,7 @@ static int read_block(struct inode *inode, void *addr, unsigned int block,
55
55
if (err ) {
56
56
if (err == - ENOENT )
57
57
/* Not found, so it must be a hole */
58
- memset ( addr , 0 , UBIFS_BLOCK_SIZE );
58
+ folio_zero_range ( folio , offset , UBIFS_BLOCK_SIZE );
59
59
return err ;
60
60
}
61
61
@@ -74,8 +74,8 @@ static int read_block(struct inode *inode, void *addr, unsigned int block,
74
74
}
75
75
76
76
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 ));
79
79
if (err || len != out_len )
80
80
goto dump ;
81
81
@@ -85,7 +85,7 @@ static int read_block(struct inode *inode, void *addr, unsigned int block,
85
85
* appending data). Ensure that the remainder is zeroed out.
86
86
*/
87
87
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 );
89
89
90
90
return 0 ;
91
91
@@ -98,27 +98,25 @@ static int read_block(struct inode *inode, void *addr, unsigned int block,
98
98
99
99
static int do_readpage (struct folio * folio )
100
100
{
101
- void * addr ;
102
101
int err = 0 , i ;
103
102
unsigned int block , beyond ;
104
103
struct ubifs_data_node * dn = NULL ;
105
104
struct inode * inode = folio -> mapping -> host ;
106
105
struct ubifs_info * c = inode -> i_sb -> s_fs_info ;
107
106
loff_t i_size = i_size_read (inode );
107
+ size_t offset = 0 ;
108
108
109
109
dbg_gen ("ino %lu, pg %lu, i_size %lld, flags %#lx" ,
110
110
inode -> i_ino , folio -> index , i_size , folio -> flags );
111
111
ubifs_assert (c , !folio_test_checked (folio ));
112
112
ubifs_assert (c , !folio -> private );
113
113
114
- addr = kmap_local_folio (folio , 0 );
115
-
116
114
block = folio -> index << UBIFS_BLOCKS_PER_PAGE_SHIFT ;
117
115
beyond = (i_size + UBIFS_BLOCK_SIZE - 1 ) >> UBIFS_BLOCK_SHIFT ;
118
116
if (block >= beyond ) {
119
117
/* Reading beyond inode */
120
118
folio_set_checked (folio );
121
- addr = folio_zero_tail (folio , 0 , addr );
119
+ folio_zero_range (folio , 0 , folio_size ( folio ) );
122
120
goto out ;
123
121
}
124
122
@@ -135,9 +133,9 @@ static int do_readpage(struct folio *folio)
135
133
if (block >= beyond ) {
136
134
/* Reading beyond inode */
137
135
err = - ENOENT ;
138
- memset ( addr , 0 , UBIFS_BLOCK_SIZE );
136
+ folio_zero_range ( folio , offset , UBIFS_BLOCK_SIZE );
139
137
} else {
140
- ret = read_block (inode , addr , block , dn );
138
+ ret = read_block (inode , folio , offset , block , dn );
141
139
if (ret ) {
142
140
err = ret ;
143
141
if (err != - ENOENT )
@@ -147,17 +145,13 @@ static int do_readpage(struct folio *folio)
147
145
int ilen = i_size & (UBIFS_BLOCK_SIZE - 1 );
148
146
149
147
if (ilen && ilen < dlen )
150
- memset ( addr + ilen , 0 , dlen - ilen );
148
+ folio_zero_range ( folio , offset + ilen , dlen - ilen );
151
149
}
152
150
}
153
151
if (++ i >= (UBIFS_BLOCKS_PER_PAGE << folio_order (folio )))
154
152
break ;
155
153
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 ;
161
155
}
162
156
163
157
if (err ) {
@@ -177,8 +171,6 @@ static int do_readpage(struct folio *folio)
177
171
kfree (dn );
178
172
if (!err )
179
173
folio_mark_uptodate (folio );
180
- flush_dcache_folio (folio );
181
- kunmap_local (addr );
182
174
return err ;
183
175
}
184
176
@@ -602,18 +594,16 @@ static int populate_page(struct ubifs_info *c, struct folio *folio,
602
594
struct inode * inode = folio -> mapping -> host ;
603
595
loff_t i_size = i_size_read (inode );
604
596
unsigned int page_block ;
605
- void * addr , * zaddr ;
597
+ size_t offset = 0 ;
606
598
pgoff_t end_index ;
607
599
608
600
dbg_gen ("ino %lu, pg %lu, i_size %lld, flags %#lx" ,
609
601
inode -> i_ino , folio -> index , i_size , folio -> flags );
610
602
611
- addr = zaddr = kmap_local_folio (folio , 0 );
612
-
613
603
end_index = (i_size - 1 ) >> PAGE_SHIFT ;
614
604
if (!i_size || folio -> index > end_index ) {
615
605
hole = 1 ;
616
- addr = folio_zero_tail (folio , 0 , addr );
606
+ folio_zero_range (folio , 0 , folio_size ( folio ) );
617
607
goto out_hole ;
618
608
}
619
609
@@ -623,7 +613,7 @@ static int populate_page(struct ubifs_info *c, struct folio *folio,
623
613
624
614
if (nn >= bu -> cnt ) {
625
615
hole = 1 ;
626
- memset ( addr , 0 , UBIFS_BLOCK_SIZE );
616
+ folio_zero_range ( folio , offset , UBIFS_BLOCK_SIZE );
627
617
} else if (key_block (c , & bu -> zbranch [nn ].key ) == page_block ) {
628
618
struct ubifs_data_node * dn ;
629
619
@@ -645,13 +635,15 @@ static int populate_page(struct ubifs_info *c, struct folio *folio,
645
635
goto out_err ;
646
636
}
647
637
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 ));
650
641
if (err || len != out_len )
651
642
goto out_err ;
652
643
653
644
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 );
655
647
656
648
nn += 1 ;
657
649
read = (i << UBIFS_BLOCK_SHIFT ) + len ;
@@ -660,23 +652,19 @@ static int populate_page(struct ubifs_info *c, struct folio *folio,
660
652
continue ;
661
653
} else {
662
654
hole = 1 ;
663
- memset ( addr , 0 , UBIFS_BLOCK_SIZE );
655
+ folio_zero_range ( folio , offset , UBIFS_BLOCK_SIZE );
664
656
}
665
657
if (++ i >= UBIFS_BLOCKS_PER_PAGE )
666
658
break ;
667
- addr += UBIFS_BLOCK_SIZE ;
659
+ offset += UBIFS_BLOCK_SIZE ;
668
660
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
- }
673
661
}
674
662
675
663
if (end_index == folio -> index ) {
676
664
int len = i_size & (PAGE_SIZE - 1 );
677
665
678
666
if (len && len < read )
679
- memset ( zaddr + len , 0 , read - len );
667
+ folio_zero_range ( folio , len , read - len );
680
668
}
681
669
682
670
out_hole :
@@ -686,14 +674,10 @@ static int populate_page(struct ubifs_info *c, struct folio *folio,
686
674
}
687
675
688
676
folio_mark_uptodate (folio );
689
- flush_dcache_folio (folio );
690
- kunmap_local (addr );
691
677
* n = nn ;
692
678
return 0 ;
693
679
694
680
out_err :
695
- flush_dcache_folio (folio );
696
- kunmap_local (addr );
697
681
ubifs_err (c , "bad data node (block %u, inode %lu)" ,
698
682
page_block , inode -> i_ino );
699
683
return - EINVAL ;
@@ -898,7 +882,6 @@ static int do_writepage(struct folio *folio, size_t len)
898
882
{
899
883
int err = 0 , blen ;
900
884
unsigned int block ;
901
- void * addr ;
902
885
size_t offset = 0 ;
903
886
union ubifs_key key ;
904
887
struct inode * inode = folio -> mapping -> host ;
@@ -913,26 +896,19 @@ static int do_writepage(struct folio *folio, size_t len)
913
896
914
897
folio_start_writeback (folio );
915
898
916
- addr = kmap_local_folio (folio , offset );
917
899
block = folio -> index << UBIFS_BLOCKS_PER_PAGE_SHIFT ;
918
900
for (;;) {
919
901
blen = min_t (size_t , len , UBIFS_BLOCK_SIZE );
920
902
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 );
922
904
if (err )
923
905
break ;
924
906
len -= blen ;
925
907
if (!len )
926
908
break ;
927
909
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 ;
934
911
}
935
- kunmap_local (addr );
936
912
if (err ) {
937
913
mapping_set_error (folio -> mapping , err );
938
914
ubifs_err (c , "cannot write folio %lu of inode %lu, error %d" ,
0 commit comments