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

Merge tag 'fs_for_v6.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs

Pull ext2, udf, and quota updates from Jan Kara:

- conversion of ext2 directory code to use folios

- cleanups in UDF declarations

- bugfix for quota interaction with file encryption

* tag 'fs_for_v6.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
ext2: Convert ext2_prepare_chunk and ext2_commit_chunk to folios
ext2: Convert ext2_make_empty() to use a folio
ext2: Convert ext2_unlink() and ext2_rename() to use folios
ext2: Convert ext2_delete_entry() to use folios
ext2: Convert ext2_empty_dir() to use a folio
ext2: Convert ext2_add_link() to use a folio
ext2: Convert ext2_readdir to use a folio
ext2: Add ext2_get_folio()
ext2: Convert ext2_check_page to ext2_check_folio
highmem: Add folio_release_kmap()
udf: Avoid unneeded variable length array in struct fileIdentDesc
udf: Annotate struct udf_bitmap with __counted_by
quota: explicitly forbid quota files from being encrypted

+164 -141
+107 -107
fs/ext2/dir.c
··· 81 81 return last_byte; 82 82 } 83 83 84 - static void ext2_commit_chunk(struct page *page, loff_t pos, unsigned len) 84 + static void ext2_commit_chunk(struct folio *folio, loff_t pos, unsigned len) 85 85 { 86 - struct address_space *mapping = page->mapping; 86 + struct address_space *mapping = folio->mapping; 87 87 struct inode *dir = mapping->host; 88 88 89 89 inode_inc_iversion(dir); 90 - block_write_end(NULL, mapping, pos, len, len, page, NULL); 90 + block_write_end(NULL, mapping, pos, len, len, &folio->page, NULL); 91 91 92 92 if (pos+len > dir->i_size) { 93 93 i_size_write(dir, pos+len); 94 94 mark_inode_dirty(dir); 95 95 } 96 - unlock_page(page); 96 + folio_unlock(folio); 97 97 } 98 98 99 - static bool ext2_check_page(struct page *page, int quiet, char *kaddr) 99 + static bool ext2_check_folio(struct folio *folio, int quiet, char *kaddr) 100 100 { 101 - struct inode *dir = page->mapping->host; 101 + struct inode *dir = folio->mapping->host; 102 102 struct super_block *sb = dir->i_sb; 103 103 unsigned chunk_size = ext2_chunk_size(dir); 104 104 u32 max_inumber = le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count); 105 105 unsigned offs, rec_len; 106 - unsigned limit = PAGE_SIZE; 106 + unsigned limit = folio_size(folio); 107 107 ext2_dirent *p; 108 108 char *error; 109 109 110 - if ((dir->i_size >> PAGE_SHIFT) == page->index) { 111 - limit = dir->i_size & ~PAGE_MASK; 110 + if (dir->i_size < folio_pos(folio) + limit) { 111 + limit = offset_in_folio(folio, dir->i_size); 112 112 if (limit & (chunk_size - 1)) 113 113 goto Ebadsize; 114 114 if (!limit) ··· 132 132 if (offs != limit) 133 133 goto Eend; 134 134 out: 135 - SetPageChecked(page); 135 + folio_set_checked(folio); 136 136 return true; 137 137 138 138 /* Too bad, we had an error */ ··· 160 160 bad_entry: 161 161 if (!quiet) 162 162 ext2_error(sb, __func__, "bad entry in directory #%lu: : %s - " 163 - "offset=%lu, inode=%lu, rec_len=%d, name_len=%d", 164 - dir->i_ino, error, (page->index<<PAGE_SHIFT)+offs, 163 + "offset=%llu, inode=%lu, rec_len=%d, name_len=%d", 164 + dir->i_ino, error, folio_pos(folio) + offs, 165 165 (unsigned long) le32_to_cpu(p->inode), 166 166 rec_len, p->name_len); 167 167 goto fail; 168 168 Eend: 169 169 if (!quiet) { 170 170 p = (ext2_dirent *)(kaddr + offs); 171 - ext2_error(sb, "ext2_check_page", 171 + ext2_error(sb, "ext2_check_folio", 172 172 "entry in directory #%lu spans the page boundary" 173 - "offset=%lu, inode=%lu", 174 - dir->i_ino, (page->index<<PAGE_SHIFT)+offs, 173 + "offset=%llu, inode=%lu", 174 + dir->i_ino, folio_pos(folio) + offs, 175 175 (unsigned long) le32_to_cpu(p->inode)); 176 176 } 177 177 fail: 178 - SetPageError(page); 178 + folio_set_error(folio); 179 179 return false; 180 180 } 181 181 182 182 /* 183 - * Calls to ext2_get_page()/ext2_put_page() must be nested according to the 184 - * rules documented in kmap_local_page()/kunmap_local(). 183 + * Calls to ext2_get_folio()/folio_release_kmap() must be nested according 184 + * to the rules documented in kmap_local_folio()/kunmap_local(). 185 185 * 186 - * NOTE: ext2_find_entry() and ext2_dotdot() act as a call to ext2_get_page() 187 - * and should be treated as a call to ext2_get_page() for nesting purposes. 186 + * NOTE: ext2_find_entry() and ext2_dotdot() act as a call 187 + * to folio_release_kmap() and should be treated as a call to 188 + * folio_release_kmap() for nesting purposes. 188 189 */ 189 - static void *ext2_get_page(struct inode *dir, unsigned long n, 190 - int quiet, struct page **page) 190 + static void *ext2_get_folio(struct inode *dir, unsigned long n, 191 + int quiet, struct folio **foliop) 191 192 { 192 193 struct address_space *mapping = dir->i_mapping; 193 194 struct folio *folio = read_mapping_folio(mapping, n, NULL); 194 - void *page_addr; 195 + void *kaddr; 195 196 196 197 if (IS_ERR(folio)) 197 198 return ERR_CAST(folio); 198 - page_addr = kmap_local_folio(folio, n & (folio_nr_pages(folio) - 1)); 199 + kaddr = kmap_local_folio(folio, 0); 199 200 if (unlikely(!folio_test_checked(folio))) { 200 - if (!ext2_check_page(&folio->page, quiet, page_addr)) 201 + if (!ext2_check_folio(folio, quiet, kaddr)) 201 202 goto fail; 202 203 } 203 - *page = &folio->page; 204 - return page_addr; 204 + *foliop = folio; 205 + return kaddr; 205 206 206 207 fail: 207 - ext2_put_page(&folio->page, page_addr); 208 + folio_release_kmap(folio, kaddr); 208 209 return ERR_PTR(-EIO); 209 210 } 210 211 ··· 275 274 276 275 for ( ; n < npages; n++, offset = 0) { 277 276 ext2_dirent *de; 278 - struct page *page; 279 - char *kaddr = ext2_get_page(inode, n, 0, &page); 277 + struct folio *folio; 278 + char *kaddr = ext2_get_folio(inode, n, 0, &folio); 280 279 char *limit; 281 280 282 281 if (IS_ERR(kaddr)) { ··· 300 299 if (de->rec_len == 0) { 301 300 ext2_error(sb, __func__, 302 301 "zero-length directory entry"); 303 - ext2_put_page(page, de); 302 + folio_release_kmap(folio, de); 304 303 return -EIO; 305 304 } 306 305 if (de->inode) { ··· 312 311 if (!dir_emit(ctx, de->name, de->name_len, 313 312 le32_to_cpu(de->inode), 314 313 d_type)) { 315 - ext2_put_page(page, de); 314 + folio_release_kmap(folio, de); 316 315 return 0; 317 316 } 318 317 } 319 318 ctx->pos += ext2_rec_len_from_disk(de->rec_len); 320 319 } 321 - ext2_put_page(page, kaddr); 320 + folio_release_kmap(folio, kaddr); 322 321 } 323 322 return 0; 324 323 } ··· 331 330 * and the entry itself. Page is returned mapped and unlocked. 332 331 * Entry is guaranteed to be valid. 333 332 * 334 - * On Success ext2_put_page() should be called on *res_page. 333 + * On Success folio_release_kmap() should be called on *foliop. 335 334 * 336 - * NOTE: Calls to ext2_get_page()/ext2_put_page() must be nested according to 337 - * the rules documented in kmap_local_page()/kunmap_local(). 335 + * NOTE: Calls to ext2_get_folio()/folio_release_kmap() must be nested 336 + * according to the rules documented in kmap_local_folio()/kunmap_local(). 338 337 * 339 - * ext2_find_entry() and ext2_dotdot() act as a call to ext2_get_page() and 340 - * should be treated as a call to ext2_get_page() for nesting purposes. 338 + * ext2_find_entry() and ext2_dotdot() act as a call to ext2_get_folio() 339 + * and should be treated as a call to ext2_get_folio() for nesting 340 + * purposes. 341 341 */ 342 342 struct ext2_dir_entry_2 *ext2_find_entry (struct inode *dir, 343 - const struct qstr *child, struct page **res_page) 343 + const struct qstr *child, struct folio **foliop) 344 344 { 345 345 const char *name = child->name; 346 346 int namelen = child->len; 347 347 unsigned reclen = EXT2_DIR_REC_LEN(namelen); 348 348 unsigned long start, n; 349 349 unsigned long npages = dir_pages(dir); 350 - struct page *page = NULL; 351 350 struct ext2_inode_info *ei = EXT2_I(dir); 352 351 ext2_dirent * de; 353 352 354 353 if (npages == 0) 355 354 goto out; 356 355 357 - /* OFFSET_CACHE */ 358 - *res_page = NULL; 359 - 360 356 start = ei->i_dir_start_lookup; 361 357 if (start >= npages) 362 358 start = 0; 363 359 n = start; 364 360 do { 365 - char *kaddr = ext2_get_page(dir, n, 0, &page); 361 + char *kaddr = ext2_get_folio(dir, n, 0, foliop); 366 362 if (IS_ERR(kaddr)) 367 363 return ERR_CAST(kaddr); 368 364 ··· 369 371 if (de->rec_len == 0) { 370 372 ext2_error(dir->i_sb, __func__, 371 373 "zero-length directory entry"); 372 - ext2_put_page(page, de); 374 + folio_release_kmap(*foliop, de); 373 375 goto out; 374 376 } 375 377 if (ext2_match(namelen, name, de)) 376 378 goto found; 377 379 de = ext2_next_entry(de); 378 380 } 379 - ext2_put_page(page, kaddr); 381 + folio_release_kmap(*foliop, kaddr); 380 382 381 383 if (++n >= npages) 382 384 n = 0; 383 - /* next page is past the blocks we've got */ 385 + /* next folio is past the blocks we've got */ 384 386 if (unlikely(n > (dir->i_blocks >> (PAGE_SHIFT - 9)))) { 385 387 ext2_error(dir->i_sb, __func__, 386 388 "dir %lu size %lld exceeds block count %llu", ··· 393 395 return ERR_PTR(-ENOENT); 394 396 395 397 found: 396 - *res_page = page; 397 398 ei->i_dir_start_lookup = n; 398 399 return de; 399 400 } ··· 401 404 * Return the '..' directory entry and the page in which the entry was found 402 405 * (as a parameter - p). 403 406 * 404 - * On Success ext2_put_page() should be called on *p. 407 + * On Success folio_release_kmap() should be called on *foliop. 405 408 * 406 - * NOTE: Calls to ext2_get_page()/ext2_put_page() must be nested according to 407 - * the rules documented in kmap_local_page()/kunmap_local(). 409 + * NOTE: Calls to ext2_get_folio()/folio_release_kmap() must be nested 410 + * according to the rules documented in kmap_local_folio()/kunmap_local(). 408 411 * 409 - * ext2_find_entry() and ext2_dotdot() act as a call to ext2_get_page() and 410 - * should be treated as a call to ext2_get_page() for nesting purposes. 412 + * ext2_find_entry() and ext2_dotdot() act as a call to ext2_get_folio() 413 + * and should be treated as a call to ext2_get_folio() for nesting 414 + * purposes. 411 415 */ 412 - struct ext2_dir_entry_2 *ext2_dotdot(struct inode *dir, struct page **p) 416 + struct ext2_dir_entry_2 *ext2_dotdot(struct inode *dir, struct folio **foliop) 413 417 { 414 - ext2_dirent *de = ext2_get_page(dir, 0, 0, p); 418 + ext2_dirent *de = ext2_get_folio(dir, 0, 0, foliop); 415 419 416 420 if (!IS_ERR(de)) 417 421 return ext2_next_entry(de); ··· 422 424 int ext2_inode_by_name(struct inode *dir, const struct qstr *child, ino_t *ino) 423 425 { 424 426 struct ext2_dir_entry_2 *de; 425 - struct page *page; 426 - 427 - de = ext2_find_entry(dir, child, &page); 427 + struct folio *folio; 428 + 429 + de = ext2_find_entry(dir, child, &folio); 428 430 if (IS_ERR(de)) 429 431 return PTR_ERR(de); 430 432 431 433 *ino = le32_to_cpu(de->inode); 432 - ext2_put_page(page, de); 434 + folio_release_kmap(folio, de); 433 435 return 0; 434 436 } 435 437 436 - static int ext2_prepare_chunk(struct page *page, loff_t pos, unsigned len) 438 + static int ext2_prepare_chunk(struct folio *folio, loff_t pos, unsigned len) 437 439 { 438 - return __block_write_begin(page, pos, len, ext2_get_block); 440 + return __block_write_begin(&folio->page, pos, len, ext2_get_block); 439 441 } 440 - 441 442 442 443 static int ext2_handle_dirsync(struct inode *dir) 443 444 { ··· 449 452 } 450 453 451 454 int ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de, 452 - struct page *page, struct inode *inode, bool update_times) 455 + struct folio *folio, struct inode *inode, bool update_times) 453 456 { 454 - loff_t pos = page_offset(page) + offset_in_page(de); 457 + loff_t pos = folio_pos(folio) + offset_in_folio(folio, de); 455 458 unsigned len = ext2_rec_len_from_disk(de->rec_len); 456 459 int err; 457 460 458 - lock_page(page); 459 - err = ext2_prepare_chunk(page, pos, len); 461 + folio_lock(folio); 462 + err = ext2_prepare_chunk(folio, pos, len); 460 463 if (err) { 461 - unlock_page(page); 464 + folio_unlock(folio); 462 465 return err; 463 466 } 464 467 de->inode = cpu_to_le32(inode->i_ino); 465 468 ext2_set_de_type(de, inode); 466 - ext2_commit_chunk(page, pos, len); 469 + ext2_commit_chunk(folio, pos, len); 467 470 if (update_times) 468 471 inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir)); 469 472 EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL; ··· 482 485 unsigned chunk_size = ext2_chunk_size(dir); 483 486 unsigned reclen = EXT2_DIR_REC_LEN(namelen); 484 487 unsigned short rec_len, name_len; 485 - struct page *page = NULL; 488 + struct folio *folio = NULL; 486 489 ext2_dirent * de; 487 490 unsigned long npages = dir_pages(dir); 488 491 unsigned long n; ··· 491 494 492 495 /* 493 496 * We take care of directory expansion in the same loop. 494 - * This code plays outside i_size, so it locks the page 497 + * This code plays outside i_size, so it locks the folio 495 498 * to protect that region. 496 499 */ 497 500 for (n = 0; n <= npages; n++) { 498 - char *kaddr = ext2_get_page(dir, n, 0, &page); 501 + char *kaddr = ext2_get_folio(dir, n, 0, &folio); 499 502 char *dir_end; 500 503 501 504 if (IS_ERR(kaddr)) 502 505 return PTR_ERR(kaddr); 503 - lock_page(page); 506 + folio_lock(folio); 504 507 dir_end = kaddr + ext2_last_byte(dir, n); 505 508 de = (ext2_dirent *)kaddr; 506 - kaddr += PAGE_SIZE - reclen; 509 + kaddr += folio_size(folio) - reclen; 507 510 while ((char *)de <= kaddr) { 508 511 if ((char *)de == dir_end) { 509 512 /* We hit i_size */ ··· 530 533 goto got_it; 531 534 de = (ext2_dirent *) ((char *) de + rec_len); 532 535 } 533 - unlock_page(page); 534 - ext2_put_page(page, kaddr); 536 + folio_unlock(folio); 537 + folio_release_kmap(folio, kaddr); 535 538 } 536 539 BUG(); 537 540 return -EINVAL; 538 541 539 542 got_it: 540 - pos = page_offset(page) + offset_in_page(de); 541 - err = ext2_prepare_chunk(page, pos, rec_len); 543 + pos = folio_pos(folio) + offset_in_folio(folio, de); 544 + err = ext2_prepare_chunk(folio, pos, rec_len); 542 545 if (err) 543 546 goto out_unlock; 544 547 if (de->inode) { ··· 551 554 memcpy(de->name, name, namelen); 552 555 de->inode = cpu_to_le32(inode->i_ino); 553 556 ext2_set_de_type (de, inode); 554 - ext2_commit_chunk(page, pos, rec_len); 557 + ext2_commit_chunk(folio, pos, rec_len); 555 558 inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir)); 556 559 EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL; 557 560 mark_inode_dirty(dir); 558 561 err = ext2_handle_dirsync(dir); 559 562 /* OFFSET_CACHE */ 560 563 out_put: 561 - ext2_put_page(page, de); 564 + folio_release_kmap(folio, de); 562 565 return err; 563 566 out_unlock: 564 - unlock_page(page); 567 + folio_unlock(folio); 565 568 goto out_put; 566 569 } 567 570 ··· 569 572 * ext2_delete_entry deletes a directory entry by merging it with the 570 573 * previous entry. Page is up-to-date. 571 574 */ 572 - int ext2_delete_entry(struct ext2_dir_entry_2 *dir, struct page *page) 575 + int ext2_delete_entry(struct ext2_dir_entry_2 *dir, struct folio *folio) 573 576 { 574 - struct inode *inode = page->mapping->host; 575 - char *kaddr = (char *)((unsigned long)dir & PAGE_MASK); 576 - unsigned from = offset_in_page(dir) & ~(ext2_chunk_size(inode)-1); 577 - unsigned to = offset_in_page(dir) + 578 - ext2_rec_len_from_disk(dir->rec_len); 577 + struct inode *inode = folio->mapping->host; 578 + size_t from, to; 579 + char *kaddr; 579 580 loff_t pos; 580 - ext2_dirent *pde = NULL; 581 - ext2_dirent *de = (ext2_dirent *)(kaddr + from); 581 + ext2_dirent *de, *pde = NULL; 582 582 int err; 583 + 584 + from = offset_in_folio(folio, dir); 585 + to = from + ext2_rec_len_from_disk(dir->rec_len); 586 + kaddr = (char *)dir - from; 587 + from &= ~(ext2_chunk_size(inode)-1); 588 + de = (ext2_dirent *)(kaddr + from); 583 589 584 590 while ((char*)de < (char*)dir) { 585 591 if (de->rec_len == 0) { ··· 594 594 de = ext2_next_entry(de); 595 595 } 596 596 if (pde) 597 - from = offset_in_page(pde); 598 - pos = page_offset(page) + from; 599 - lock_page(page); 600 - err = ext2_prepare_chunk(page, pos, to - from); 597 + from = offset_in_folio(folio, pde); 598 + pos = folio_pos(folio) + from; 599 + folio_lock(folio); 600 + err = ext2_prepare_chunk(folio, pos, to - from); 601 601 if (err) { 602 - unlock_page(page); 602 + folio_unlock(folio); 603 603 return err; 604 604 } 605 605 if (pde) 606 606 pde->rec_len = ext2_rec_len_to_disk(to - from); 607 607 dir->inode = 0; 608 - ext2_commit_chunk(page, pos, to - from); 608 + ext2_commit_chunk(folio, pos, to - from); 609 609 inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); 610 610 EXT2_I(inode)->i_flags &= ~EXT2_BTREE_FL; 611 611 mark_inode_dirty(inode); ··· 617 617 */ 618 618 int ext2_make_empty(struct inode *inode, struct inode *parent) 619 619 { 620 - struct page *page = grab_cache_page(inode->i_mapping, 0); 620 + struct folio *folio = filemap_grab_folio(inode->i_mapping, 0); 621 621 unsigned chunk_size = ext2_chunk_size(inode); 622 622 struct ext2_dir_entry_2 * de; 623 623 int err; 624 624 void *kaddr; 625 625 626 - if (!page) 627 - return -ENOMEM; 626 + if (IS_ERR(folio)) 627 + return PTR_ERR(folio); 628 628 629 - err = ext2_prepare_chunk(page, 0, chunk_size); 629 + err = ext2_prepare_chunk(folio, 0, chunk_size); 630 630 if (err) { 631 - unlock_page(page); 631 + folio_unlock(folio); 632 632 goto fail; 633 633 } 634 - kaddr = kmap_local_page(page); 634 + kaddr = kmap_local_folio(folio, 0); 635 635 memset(kaddr, 0, chunk_size); 636 636 de = (struct ext2_dir_entry_2 *)kaddr; 637 637 de->name_len = 1; ··· 647 647 memcpy (de->name, "..\0", 4); 648 648 ext2_set_de_type (de, inode); 649 649 kunmap_local(kaddr); 650 - ext2_commit_chunk(page, 0, chunk_size); 650 + ext2_commit_chunk(folio, 0, chunk_size); 651 651 err = ext2_handle_dirsync(inode); 652 652 fail: 653 - put_page(page); 653 + folio_put(folio); 654 654 return err; 655 655 } 656 656 657 657 /* 658 658 * routine to check that the specified directory is empty (for rmdir) 659 659 */ 660 - int ext2_empty_dir (struct inode * inode) 660 + int ext2_empty_dir(struct inode *inode) 661 661 { 662 - struct page *page; 662 + struct folio *folio; 663 663 char *kaddr; 664 664 unsigned long i, npages = dir_pages(inode); 665 665 666 666 for (i = 0; i < npages; i++) { 667 667 ext2_dirent *de; 668 668 669 - kaddr = ext2_get_page(inode, i, 0, &page); 669 + kaddr = ext2_get_folio(inode, i, 0, &folio); 670 670 if (IS_ERR(kaddr)) 671 671 return 0; 672 672 ··· 695 695 } 696 696 de = ext2_next_entry(de); 697 697 } 698 - ext2_put_page(page, kaddr); 698 + folio_release_kmap(folio, kaddr); 699 699 } 700 700 return 1; 701 701 702 702 not_empty: 703 - ext2_put_page(page, kaddr); 703 + folio_release_kmap(folio, kaddr); 704 704 return 0; 705 705 } 706 706
+9 -14
fs/ext2/ext2.h
··· 717 717 extern void ext2_rsv_window_add(struct super_block *sb, struct ext2_reserve_window_node *rsv); 718 718 719 719 /* dir.c */ 720 - extern int ext2_add_link (struct dentry *, struct inode *); 721 - extern int ext2_inode_by_name(struct inode *dir, 720 + int ext2_add_link(struct dentry *, struct inode *); 721 + int ext2_inode_by_name(struct inode *dir, 722 722 const struct qstr *child, ino_t *ino); 723 - extern int ext2_make_empty(struct inode *, struct inode *); 724 - extern struct ext2_dir_entry_2 *ext2_find_entry(struct inode *, const struct qstr *, 725 - struct page **); 726 - extern int ext2_delete_entry(struct ext2_dir_entry_2 *dir, struct page *page); 727 - extern int ext2_empty_dir (struct inode *); 728 - extern struct ext2_dir_entry_2 *ext2_dotdot(struct inode *dir, struct page **p); 723 + int ext2_make_empty(struct inode *, struct inode *); 724 + struct ext2_dir_entry_2 *ext2_find_entry(struct inode *, const struct qstr *, 725 + struct folio **foliop); 726 + int ext2_delete_entry(struct ext2_dir_entry_2 *dir, struct folio *folio); 727 + int ext2_empty_dir(struct inode *); 728 + struct ext2_dir_entry_2 *ext2_dotdot(struct inode *dir, struct folio **foliop); 729 729 int ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de, 730 - struct page *page, struct inode *inode, bool update_times); 731 - static inline void ext2_put_page(struct page *page, void *page_addr) 732 - { 733 - kunmap_local(page_addr); 734 - put_page(page); 735 - } 730 + struct folio *folio, struct inode *inode, bool update_times); 736 731 737 732 /* ialloc.c */ 738 733 extern struct inode * ext2_new_inode (struct inode *, umode_t, const struct qstr *);
+16 -16
fs/ext2/namei.c
··· 273 273 { 274 274 struct inode *inode = d_inode(dentry); 275 275 struct ext2_dir_entry_2 *de; 276 - struct page *page; 276 + struct folio *folio; 277 277 int err; 278 278 279 279 err = dquot_initialize(dir); 280 280 if (err) 281 281 goto out; 282 282 283 - de = ext2_find_entry(dir, &dentry->d_name, &page); 283 + de = ext2_find_entry(dir, &dentry->d_name, &folio); 284 284 if (IS_ERR(de)) { 285 285 err = PTR_ERR(de); 286 286 goto out; 287 287 } 288 288 289 - err = ext2_delete_entry(de, page); 290 - ext2_put_page(page, de); 289 + err = ext2_delete_entry(de, folio); 290 + folio_release_kmap(folio, de); 291 291 if (err) 292 292 goto out; 293 293 ··· 321 321 { 322 322 struct inode * old_inode = d_inode(old_dentry); 323 323 struct inode * new_inode = d_inode(new_dentry); 324 - struct page * dir_page = NULL; 324 + struct folio *dir_folio = NULL; 325 325 struct ext2_dir_entry_2 * dir_de = NULL; 326 - struct page * old_page; 326 + struct folio * old_folio; 327 327 struct ext2_dir_entry_2 * old_de; 328 328 int err; 329 329 ··· 338 338 if (err) 339 339 return err; 340 340 341 - old_de = ext2_find_entry(old_dir, &old_dentry->d_name, &old_page); 341 + old_de = ext2_find_entry(old_dir, &old_dentry->d_name, &old_folio); 342 342 if (IS_ERR(old_de)) 343 343 return PTR_ERR(old_de); 344 344 345 345 if (S_ISDIR(old_inode->i_mode)) { 346 346 err = -EIO; 347 - dir_de = ext2_dotdot(old_inode, &dir_page); 347 + dir_de = ext2_dotdot(old_inode, &dir_folio); 348 348 if (!dir_de) 349 349 goto out_old; 350 350 } 351 351 352 352 if (new_inode) { 353 - struct page *new_page; 353 + struct folio *new_folio; 354 354 struct ext2_dir_entry_2 *new_de; 355 355 356 356 err = -ENOTEMPTY; ··· 358 358 goto out_dir; 359 359 360 360 new_de = ext2_find_entry(new_dir, &new_dentry->d_name, 361 - &new_page); 361 + &new_folio); 362 362 if (IS_ERR(new_de)) { 363 363 err = PTR_ERR(new_de); 364 364 goto out_dir; 365 365 } 366 - err = ext2_set_link(new_dir, new_de, new_page, old_inode, true); 367 - ext2_put_page(new_page, new_de); 366 + err = ext2_set_link(new_dir, new_de, new_folio, old_inode, true); 367 + folio_release_kmap(new_folio, new_de); 368 368 if (err) 369 369 goto out_dir; 370 370 inode_set_ctime_current(new_inode); ··· 386 386 inode_set_ctime_current(old_inode); 387 387 mark_inode_dirty(old_inode); 388 388 389 - err = ext2_delete_entry(old_de, old_page); 389 + err = ext2_delete_entry(old_de, old_folio); 390 390 if (!err && dir_de) { 391 391 if (old_dir != new_dir) 392 - err = ext2_set_link(old_inode, dir_de, dir_page, 392 + err = ext2_set_link(old_inode, dir_de, dir_folio, 393 393 new_dir, false); 394 394 395 395 inode_dec_link_count(old_dir); 396 396 } 397 397 out_dir: 398 398 if (dir_de) 399 - ext2_put_page(dir_page, dir_de); 399 + folio_release_kmap(dir_folio, dir_de); 400 400 out_old: 401 - ext2_put_page(old_page, old_de); 401 + folio_release_kmap(old_folio, old_de); 402 402 return err; 403 403 } 404 404
+14
fs/quota/dquot.c
··· 2351 2351 if (sb_has_quota_loaded(sb, type)) 2352 2352 return -EBUSY; 2353 2353 2354 + /* 2355 + * Quota files should never be encrypted. They should be thought of as 2356 + * filesystem metadata, not user data. New-style internal quota files 2357 + * cannot be encrypted by users anyway, but old-style external quota 2358 + * files could potentially be incorrectly created in an encrypted 2359 + * directory, hence this explicit check. Some reasons why encrypted 2360 + * quota files don't work include: (1) some filesystems that support 2361 + * encryption don't handle it in their quota_read and quota_write, and 2362 + * (2) cleaning up encrypted quota files at unmount would need special 2363 + * consideration, as quota files are cleaned up later than user files. 2364 + */ 2365 + if (IS_ENCRYPTED(inode)) 2366 + return -EINVAL; 2367 + 2354 2368 dqopt->files[type] = igrab(inode); 2355 2369 if (!dqopt->files[type]) 2356 2370 return -EIO;
+1 -1
fs/udf/ecma_167.h
··· 471 471 uint8_t lengthFileIdent; 472 472 struct long_ad icb; 473 473 __le16 lengthOfImpUse; 474 - uint8_t impUse[]; 474 + /* uint8_t impUse[]; */ 475 475 /* uint8_t fileIdent[]; */ 476 476 /* uint8_t padding[]; */ 477 477 } __packed;
+1 -1
fs/udf/udf_sb.h
··· 86 86 struct udf_bitmap { 87 87 __u32 s_extPosition; 88 88 int s_nr_groups; 89 - struct buffer_head *s_block_bitmap[]; 89 + struct buffer_head *s_block_bitmap[] __counted_by(s_nr_groups); 90 90 }; 91 91 92 92 struct udf_part_map {
+16 -2
include/linux/highmem.h
··· 551 551 zero_user_segments(&folio->page, start, start + length, 0, 0); 552 552 } 553 553 554 - static inline void unmap_and_put_page(struct page *page, void *addr) 554 + /** 555 + * folio_release_kmap - Unmap a folio and drop a refcount. 556 + * @folio: The folio to release. 557 + * @addr: The address previously returned by a call to kmap_local_folio(). 558 + * 559 + * It is common, eg in directory handling to kmap a folio. This function 560 + * unmaps the folio and drops the refcount that was being held to keep the 561 + * folio alive while we accessed it. 562 + */ 563 + static inline void folio_release_kmap(struct folio *folio, void *addr) 555 564 { 556 565 kunmap_local(addr); 557 - put_page(page); 566 + folio_put(folio); 567 + } 568 + 569 + static inline void unmap_and_put_page(struct page *page, void *addr) 570 + { 571 + folio_release_kmap(page_folio(page), addr); 558 572 } 559 573 560 574 #endif /* _LINUX_HIGHMEM_H */