@@ -146,119 +146,113 @@ static int generic_remap_check_len(struct inode *inode_in,
146
146
}
147
147
148
148
/* Read a page's worth of file data into the page cache. */
149
- static struct page * vfs_dedupe_get_page (struct inode * inode , loff_t offset )
149
+ static struct folio * vfs_dedupe_get_folio (struct inode * inode , loff_t pos )
150
150
{
151
- struct page * page ;
151
+ struct folio * folio ;
152
152
153
- page = read_mapping_page (inode -> i_mapping , offset >> PAGE_SHIFT , NULL );
154
- if (IS_ERR (page ))
155
- return page ;
156
- if (!PageUptodate ( page )) {
157
- put_page ( page );
153
+ folio = read_mapping_folio (inode -> i_mapping , pos >> PAGE_SHIFT , NULL );
154
+ if (IS_ERR (folio ))
155
+ return folio ;
156
+ if (!folio_test_uptodate ( folio )) {
157
+ folio_put ( folio );
158
158
return ERR_PTR (- EIO );
159
159
}
160
- return page ;
160
+ return folio ;
161
161
}
162
162
163
163
/*
164
- * Lock two pages , ensuring that we lock in offset order if the pages are from
165
- * the same file.
164
+ * Lock two folios , ensuring that we lock in offset order if the folios
165
+ * are from the same file.
166
166
*/
167
- static void vfs_lock_two_pages (struct page * page1 , struct page * page2 )
167
+ static void vfs_lock_two_folios (struct folio * folio1 , struct folio * folio2 )
168
168
{
169
169
/* Always lock in order of increasing index. */
170
- if (page1 -> index > page2 -> index )
171
- swap (page1 , page2 );
170
+ if (folio1 -> index > folio2 -> index )
171
+ swap (folio1 , folio2 );
172
172
173
- lock_page ( page1 );
174
- if (page1 != page2 )
175
- lock_page ( page2 );
173
+ folio_lock ( folio1 );
174
+ if (folio1 != folio2 )
175
+ folio_lock ( folio2 );
176
176
}
177
177
178
- /* Unlock two pages , being careful not to unlock the same page twice. */
179
- static void vfs_unlock_two_pages (struct page * page1 , struct page * page2 )
178
+ /* Unlock two folios , being careful not to unlock the same folio twice. */
179
+ static void vfs_unlock_two_folios (struct folio * folio1 , struct folio * folio2 )
180
180
{
181
- unlock_page ( page1 );
182
- if (page1 != page2 )
183
- unlock_page ( page2 );
181
+ folio_unlock ( folio1 );
182
+ if (folio1 != folio2 )
183
+ folio_unlock ( folio2 );
184
184
}
185
185
186
186
/*
187
187
* Compare extents of two files to see if they are the same.
188
188
* Caller must have locked both inodes to prevent write races.
189
189
*/
190
190
static int vfs_dedupe_file_range_compare (struct inode * src , loff_t srcoff ,
191
- struct inode * dest , loff_t destoff ,
191
+ struct inode * dest , loff_t dstoff ,
192
192
loff_t len , bool * is_same )
193
193
{
194
- loff_t src_poff ;
195
- loff_t dest_poff ;
196
- void * src_addr ;
197
- void * dest_addr ;
198
- struct page * src_page ;
199
- struct page * dest_page ;
200
- loff_t cmp_len ;
201
- bool same ;
202
- int error ;
203
-
204
- error = - EINVAL ;
205
- same = true;
194
+ bool same = true;
195
+ int error = - EINVAL ;
196
+
206
197
while (len ) {
207
- src_poff = srcoff & (PAGE_SIZE - 1 );
208
- dest_poff = destoff & (PAGE_SIZE - 1 );
209
- cmp_len = min (PAGE_SIZE - src_poff ,
210
- PAGE_SIZE - dest_poff );
198
+ struct folio * src_folio , * dst_folio ;
199
+ void * src_addr , * dst_addr ;
200
+ loff_t cmp_len = min (PAGE_SIZE - offset_in_page (srcoff ),
201
+ PAGE_SIZE - offset_in_page (dstoff ));
202
+
211
203
cmp_len = min (cmp_len , len );
212
204
if (cmp_len <= 0 )
213
205
goto out_error ;
214
206
215
- src_page = vfs_dedupe_get_page (src , srcoff );
216
- if (IS_ERR (src_page )) {
217
- error = PTR_ERR (src_page );
207
+ src_folio = vfs_dedupe_get_folio (src , srcoff );
208
+ if (IS_ERR (src_folio )) {
209
+ error = PTR_ERR (src_folio );
218
210
goto out_error ;
219
211
}
220
- dest_page = vfs_dedupe_get_page (dest , destoff );
221
- if (IS_ERR (dest_page )) {
222
- error = PTR_ERR (dest_page );
223
- put_page ( src_page );
212
+ dst_folio = vfs_dedupe_get_folio (dest , dstoff );
213
+ if (IS_ERR (dst_folio )) {
214
+ error = PTR_ERR (dst_folio );
215
+ folio_put ( src_folio );
224
216
goto out_error ;
225
217
}
226
218
227
- vfs_lock_two_pages ( src_page , dest_page );
219
+ vfs_lock_two_folios ( src_folio , dst_folio );
228
220
229
221
/*
230
- * Now that we've locked both pages , make sure they're still
222
+ * Now that we've locked both folios , make sure they're still
231
223
* mapped to the file data we're interested in. If not,
232
224
* someone is invalidating pages on us and we lose.
233
225
*/
234
- if (!PageUptodate ( src_page ) || !PageUptodate ( dest_page ) ||
235
- src_page -> mapping != src -> i_mapping ||
236
- dest_page -> mapping != dest -> i_mapping ) {
226
+ if (!folio_test_uptodate ( src_folio ) || !folio_test_uptodate ( dst_folio ) ||
227
+ src_folio -> mapping != src -> i_mapping ||
228
+ dst_folio -> mapping != dest -> i_mapping ) {
237
229
same = false;
238
230
goto unlock ;
239
231
}
240
232
241
- src_addr = kmap_atomic (src_page );
242
- dest_addr = kmap_atomic (dest_page );
233
+ src_addr = kmap_local_folio (src_folio ,
234
+ offset_in_folio (src_folio , srcoff ));
235
+ dst_addr = kmap_local_folio (dst_folio ,
236
+ offset_in_folio (dst_folio , dstoff ));
243
237
244
- flush_dcache_page ( src_page );
245
- flush_dcache_page ( dest_page );
238
+ flush_dcache_folio ( src_folio );
239
+ flush_dcache_folio ( dst_folio );
246
240
247
- if (memcmp (src_addr + src_poff , dest_addr + dest_poff , cmp_len ))
241
+ if (memcmp (src_addr , dst_addr , cmp_len ))
248
242
same = false;
249
243
250
- kunmap_atomic ( dest_addr );
251
- kunmap_atomic (src_addr );
244
+ kunmap_local ( dst_addr );
245
+ kunmap_local (src_addr );
252
246
unlock :
253
- vfs_unlock_two_pages ( src_page , dest_page );
254
- put_page ( dest_page );
255
- put_page ( src_page );
247
+ vfs_unlock_two_folios ( src_folio , dst_folio );
248
+ folio_put ( dst_folio );
249
+ folio_put ( src_folio );
256
250
257
251
if (!same )
258
252
break ;
259
253
260
254
srcoff += cmp_len ;
261
- destoff += cmp_len ;
255
+ dstoff += cmp_len ;
262
256
len -= cmp_len ;
263
257
}
264
258
0 commit comments