Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

nilfs2: switch to kmap_local for directory handling

Match ext2 by using kmap_local() instead of kmap(). This is more
efficient. Also use unmap_and_put_page() instead of duplicating it as a
nilfs function.

[konishi.ryusuke: followed the change of page release helper call sites]
Link: https://lkml.kernel.org/r/20231127143036.2425-9-konishi.ryusuke@gmail.com
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Matthew Wilcox (Oracle) and committed by
Andrew Morton
9b77f66f a8e61035

+19 -26
+13 -14
fs/nilfs2/dir.c
··· 189 189 if (IS_ERR(page)) 190 190 return page; 191 191 192 - kaddr = kmap(page); 192 + kaddr = kmap_local_page(page); 193 193 if (unlikely(!PageChecked(page))) { 194 194 if (!nilfs_check_page(page, kaddr)) 195 195 goto fail; ··· 199 199 return kaddr; 200 200 201 201 fail: 202 - nilfs_put_page(page); 202 + unmap_and_put_page(page, kaddr); 203 203 return ERR_PTR(-EIO); 204 204 } 205 205 ··· 287 287 for ( ; (char *)de <= limit; de = nilfs_next_entry(de)) { 288 288 if (de->rec_len == 0) { 289 289 nilfs_error(sb, "zero-length directory entry"); 290 - nilfs_put_page(page); 290 + unmap_and_put_page(page, kaddr); 291 291 return -EIO; 292 292 } 293 293 if (de->inode) { ··· 300 300 301 301 if (!dir_emit(ctx, de->name, de->name_len, 302 302 le64_to_cpu(de->inode), t)) { 303 - nilfs_put_page(page); 303 + unmap_and_put_page(page, kaddr); 304 304 return 0; 305 305 } 306 306 } 307 307 ctx->pos += nilfs_rec_len_from_disk(de->rec_len); 308 308 } 309 - nilfs_put_page(page); 309 + unmap_and_put_page(page, kaddr); 310 310 } 311 311 return 0; 312 312 } ··· 352 352 if (de->rec_len == 0) { 353 353 nilfs_error(dir->i_sb, 354 354 "zero-length directory entry"); 355 - nilfs_put_page(page); 355 + unmap_and_put_page(page, kaddr); 356 356 goto out; 357 357 } 358 358 if (nilfs_match(namelen, name, de)) 359 359 goto found; 360 360 de = nilfs_next_entry(de); 361 361 } 362 - nilfs_put_page(page); 362 + unmap_and_put_page(page, kaddr); 363 363 } 364 364 if (++n >= npages) 365 365 n = 0; ··· 399 399 de = nilfs_find_entry(dir, qstr, &page); 400 400 if (de) { 401 401 res = le64_to_cpu(de->inode); 402 - kunmap(page); 403 - put_page(page); 402 + unmap_and_put_page(page, de); 404 403 } 405 404 return res; 406 405 } ··· 483 484 de = (struct nilfs_dir_entry *)((char *)de + rec_len); 484 485 } 485 486 unlock_page(page); 486 - nilfs_put_page(page); 487 + unmap_and_put_page(page, kaddr); 487 488 } 488 489 BUG(); 489 490 return -EINVAL; ··· 511 512 nilfs_mark_inode_dirty(dir); 512 513 /* OFFSET_CACHE */ 513 514 out_put: 514 - nilfs_put_page(page); 515 + unmap_and_put_page(page, de); 515 516 out: 516 517 return err; 517 518 out_unlock: ··· 608 609 int nilfs_empty_dir(struct inode *inode) 609 610 { 610 611 struct page *page = NULL; 612 + char *kaddr; 611 613 unsigned long i, npages = dir_pages(inode); 612 614 613 615 for (i = 0; i < npages; i++) { 614 - char *kaddr; 615 616 struct nilfs_dir_entry *de; 616 617 617 618 kaddr = nilfs_get_page(inode, i, &page); ··· 643 644 } 644 645 de = nilfs_next_entry(de); 645 646 } 646 - nilfs_put_page(page); 647 + unmap_and_put_page(page, kaddr); 647 648 } 648 649 return 1; 649 650 650 651 not_empty: 651 - nilfs_put_page(page); 652 + unmap_and_put_page(page, kaddr); 652 653 return 0; 653 654 } 654 655
+6 -6
fs/nilfs2/namei.c
··· 280 280 set_nlink(inode, 1); 281 281 } 282 282 err = nilfs_delete_entry(de, page); 283 - nilfs_put_page(page); 283 + unmap_and_put_page(page, de); 284 284 if (err) 285 285 goto out; 286 286 ··· 387 387 if (!new_de) 388 388 goto out_dir; 389 389 nilfs_set_link(new_dir, new_de, new_page, old_inode); 390 - nilfs_put_page(new_page); 390 + unmap_and_put_page(new_page, new_de); 391 391 nilfs_mark_inode_dirty(new_dir); 392 392 inode_set_ctime_current(new_inode); 393 393 if (dir_de) ··· 414 414 415 415 if (dir_de) { 416 416 nilfs_set_link(old_inode, dir_de, dir_page, new_dir); 417 - nilfs_put_page(dir_page); 417 + unmap_and_put_page(dir_page, dir_de); 418 418 drop_nlink(old_dir); 419 419 } 420 - nilfs_put_page(old_page); 420 + unmap_and_put_page(old_page, old_de); 421 421 422 422 nilfs_mark_inode_dirty(old_dir); 423 423 nilfs_mark_inode_dirty(old_inode); ··· 427 427 428 428 out_dir: 429 429 if (dir_de) 430 - nilfs_put_page(dir_page); 430 + unmap_and_put_page(dir_page, dir_de); 431 431 out_old: 432 - nilfs_put_page(old_page); 432 + unmap_and_put_page(old_page, old_de); 433 433 out: 434 434 nilfs_transaction_abort(old_dir->i_sb); 435 435 return err;
-6
fs/nilfs2/nilfs.h
··· 237 237 extern void nilfs_set_link(struct inode *, struct nilfs_dir_entry *, 238 238 struct page *, struct inode *); 239 239 240 - static inline void nilfs_put_page(struct page *page) 241 - { 242 - kunmap(page); 243 - put_page(page); 244 - } 245 - 246 240 /* file.c */ 247 241 extern int nilfs_sync_file(struct file *, loff_t, loff_t, int); 248 242