From: kernel test robot <lkp@intel.com>
To: oe-kbuild@lists.linux.dev
Cc: lkp@intel.com, Julia Lawall <julia.lawall@inria.fr>
Subject: fs/ntfs/compress.c:588:1-11: second lock on line 588
Date: Sun, 19 Jul 2026 23:02:38 +0800 [thread overview]
Message-ID: <202607192246.hCy6XxKK-lkp@intel.com> (raw)
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Namjae Jeon <linkinjeon@kernel.org>
CC: Amir Goldstein <amir73il@gmail.com>
CC: Christoph Hellwig <hch@lst.de>
Hi Namjae,
First bad commit (maybe != root cause):
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 94515f3a7d4256a5062176b7d6ed0471938cd51a
commit: 47503f989736d6c4c9f8bfca1c28d267473ccd4b ntfs: add Kconfig and Makefile
date: 5 months ago
:::::: branch date: 2 days ago
:::::: commit date: 5 months ago
config: alpha-randconfig-r062-20260719 (https://download.01.org/0day-ci/archive/20260719/202607192246.hCy6XxKK-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 10.5.0
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Fixes: 47503f989736 ("ntfs: add Kconfig and Makefile")
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Julia Lawall <julia.lawall@inria.fr>
| Closes: https://lore.kernel.org/r/202607192246.hCy6XxKK-lkp@intel.com/
cocci warnings: (new ones prefixed by >>)
>> fs/ntfs/compress.c:588:1-11: second lock on line 588
--
>> fs/ntfs/ea.c:348:17-18: WARNING kmalloc is used to allocate this memory at line 218
fs/ntfs/ea.c:347:14-15: WARNING kmalloc is used to allocate this memory at line 289
--
>> fs/ntfs/iomap.c:481:14-15: WARNING kmalloc is used to allocate this memory at line 460
--
>> fs/ntfs/compress.c:843:2-8: preceding lock on line 588
fs/ntfs/compress.c:847:1-7: preceding lock on line 588
vim +588 fs/ntfs/compress.c
1e9ea7e04472d4 Namjae Jeon 2025-12-30 444
495e90fa334828 Namjae Jeon 2026-02-13 445 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 446 * ntfs_read_compressed_block - read a compressed block into the page cache
495e90fa334828 Namjae Jeon 2026-02-13 447 * @folio: locked folio in the compression block(s) we need to read
1e9ea7e04472d4 Namjae Jeon 2025-12-30 448 *
1e9ea7e04472d4 Namjae Jeon 2025-12-30 449 * When we are called the page has already been verified to be locked and the
1e9ea7e04472d4 Namjae Jeon 2025-12-30 450 * attribute is known to be non-resident, not encrypted, but compressed.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 451 *
1e9ea7e04472d4 Namjae Jeon 2025-12-30 452 * 1. Determine which compression block(s) @page is in.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 453 * 2. Get hold of all pages corresponding to this/these compression block(s).
1e9ea7e04472d4 Namjae Jeon 2025-12-30 454 * 3. Read the (first) compression block.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 455 * 4. Decompress it into the corresponding pages.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 456 * 5. Throw the compressed data away and proceed to 3. for the next compression
1e9ea7e04472d4 Namjae Jeon 2025-12-30 457 * block or return success if no more compression blocks left.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 458 *
1e9ea7e04472d4 Namjae Jeon 2025-12-30 459 * Warning: We have to be careful what we do about existing pages. They might
1e9ea7e04472d4 Namjae Jeon 2025-12-30 460 * have been written to so that we would lose data if we were to just overwrite
1e9ea7e04472d4 Namjae Jeon 2025-12-30 461 * them with the out-of-date uncompressed data.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 462 */
495e90fa334828 Namjae Jeon 2026-02-13 463 int ntfs_read_compressed_block(struct folio *folio)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 464 {
495e90fa334828 Namjae Jeon 2026-02-13 465 struct page *page = &folio->page;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 466 loff_t i_size;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 467 s64 initialized_size;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 468 struct address_space *mapping = page->mapping;
495e90fa334828 Namjae Jeon 2026-02-13 469 struct ntfs_inode *ni = NTFS_I(mapping->host);
495e90fa334828 Namjae Jeon 2026-02-13 470 struct ntfs_volume *vol = ni->vol;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 471 struct super_block *sb = vol->sb;
495e90fa334828 Namjae Jeon 2026-02-13 472 struct runlist_element *rl;
495e90fa334828 Namjae Jeon 2026-02-13 473 unsigned long flags;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 474 u8 *cb, *cb_pos, *cb_end;
495e90fa334828 Namjae Jeon 2026-02-13 475 unsigned long offset, index = page->__folio_index;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 476 u32 cb_size = ni->itype.compressed.block_size;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 477 u64 cb_size_mask = cb_size - 1UL;
495e90fa334828 Namjae Jeon 2026-02-13 478 s64 vcn;
495e90fa334828 Namjae Jeon 2026-02-13 479 s64 lcn;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 480 /* The first wanted vcn (minimum alignment is PAGE_SIZE). */
495e90fa334828 Namjae Jeon 2026-02-13 481 s64 start_vcn = (((s64)index << PAGE_SHIFT) & ~cb_size_mask) >>
1e9ea7e04472d4 Namjae Jeon 2025-12-30 482 vol->cluster_size_bits;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 483 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 484 * The first vcn after the last wanted vcn (minimum alignment is again
1e9ea7e04472d4 Namjae Jeon 2025-12-30 485 * PAGE_SIZE.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 486 */
495e90fa334828 Namjae Jeon 2026-02-13 487 s64 end_vcn = ((((s64)(index + 1UL) << PAGE_SHIFT) + cb_size - 1)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 488 & ~cb_size_mask) >> vol->cluster_size_bits;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 489 /* Number of compression blocks (cbs) in the wanted vcn range. */
495e90fa334828 Namjae Jeon 2026-02-13 490 unsigned int nr_cbs = ntfs_cluster_to_bytes(vol, end_vcn - start_vcn) >>
495e90fa334828 Namjae Jeon 2026-02-13 491 ni->itype.compressed.block_size_bits;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 492 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 493 * Number of pages required to store the uncompressed data from all
1e9ea7e04472d4 Namjae Jeon 2025-12-30 494 * compression blocks (cbs) overlapping @page. Due to alignment
1e9ea7e04472d4 Namjae Jeon 2025-12-30 495 * guarantees of start_vcn and end_vcn, no need to round up here.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 496 */
495e90fa334828 Namjae Jeon 2026-02-13 497 unsigned int nr_pages = ntfs_cluster_to_pidx(vol, end_vcn - start_vcn);
495e90fa334828 Namjae Jeon 2026-02-13 498 unsigned int xpage, max_page, cur_page, cur_ofs, i, page_ofs, page_index;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 499 unsigned int cb_clusters, cb_max_ofs;
495e90fa334828 Namjae Jeon 2026-02-13 500 int cb_max_page, err = 0;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 501 struct page **pages;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 502 int *completed_pages;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 503 unsigned char xpage_done = 0;
495e90fa334828 Namjae Jeon 2026-02-13 504 struct page *lpage;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 505
495e90fa334828 Namjae Jeon 2026-02-13 506 ntfs_debug("Entering, page->index = 0x%lx, cb_size = 0x%x, nr_pages = %i.",
495e90fa334828 Namjae Jeon 2026-02-13 507 index, cb_size, nr_pages);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 508 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 509 * Bad things happen if we get here for anything that is not an
1e9ea7e04472d4 Namjae Jeon 2025-12-30 510 * unnamed $DATA attribute.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 511 */
495e90fa334828 Namjae Jeon 2026-02-13 512 if (ni->type != AT_DATA || ni->name_len) {
495e90fa334828 Namjae Jeon 2026-02-13 513 unlock_page(page);
495e90fa334828 Namjae Jeon 2026-02-13 514 return -EIO;
495e90fa334828 Namjae Jeon 2026-02-13 515 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 516
1e9ea7e04472d4 Namjae Jeon 2025-12-30 517 pages = kmalloc_array(nr_pages, sizeof(struct page *), GFP_NOFS);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 518 completed_pages = kmalloc_array(nr_pages + 1, sizeof(int), GFP_NOFS);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 519
495e90fa334828 Namjae Jeon 2026-02-13 520 if (unlikely(!pages || !completed_pages)) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 521 kfree(pages);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 522 kfree(completed_pages);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 523 unlock_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 524 ntfs_error(vol->sb, "Failed to allocate internal buffers.");
1e9ea7e04472d4 Namjae Jeon 2025-12-30 525 return -ENOMEM;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 526 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 527
1e9ea7e04472d4 Namjae Jeon 2025-12-30 528 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 529 * We have already been given one page, this is the one we must do.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 530 * Once again, the alignment guarantees keep it simple.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 531 */
495e90fa334828 Namjae Jeon 2026-02-13 532 offset = ntfs_cluster_to_pidx(vol, start_vcn);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 533 xpage = index - offset;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 534 pages[xpage] = page;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 535 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 536 * The remaining pages need to be allocated and inserted into the page
1e9ea7e04472d4 Namjae Jeon 2025-12-30 537 * cache, alignment guarantees keep all the below much simpler. (-8
1e9ea7e04472d4 Namjae Jeon 2025-12-30 538 */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 539 read_lock_irqsave(&ni->size_lock, flags);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 540 i_size = i_size_read(VFS_I(ni));
1e9ea7e04472d4 Namjae Jeon 2025-12-30 541 initialized_size = ni->initialized_size;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 542 read_unlock_irqrestore(&ni->size_lock, flags);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 543 max_page = ((i_size + PAGE_SIZE - 1) >> PAGE_SHIFT) -
1e9ea7e04472d4 Namjae Jeon 2025-12-30 544 offset;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 545 /* Is the page fully outside i_size? (truncate in progress) */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 546 if (xpage >= max_page) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 547 kfree(pages);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 548 kfree(completed_pages);
495e90fa334828 Namjae Jeon 2026-02-13 549 zero_user_segments(page, 0, PAGE_SIZE, 0, 0);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 550 ntfs_debug("Compressed read outside i_size - truncated?");
1e9ea7e04472d4 Namjae Jeon 2025-12-30 551 SetPageUptodate(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 552 unlock_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 553 return 0;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 554 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 555 if (nr_pages < max_page)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 556 max_page = nr_pages;
495e90fa334828 Namjae Jeon 2026-02-13 557
1e9ea7e04472d4 Namjae Jeon 2025-12-30 558 for (i = 0; i < max_page; i++, offset++) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 559 if (i != xpage)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 560 pages[i] = grab_cache_page_nowait(mapping, offset);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 561 page = pages[i];
1e9ea7e04472d4 Namjae Jeon 2025-12-30 562 if (page) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 563 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 564 * We only (re)read the page if it isn't already read
1e9ea7e04472d4 Namjae Jeon 2025-12-30 565 * in and/or dirty or we would be losing data or at
1e9ea7e04472d4 Namjae Jeon 2025-12-30 566 * least wasting our time.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 567 */
495e90fa334828 Namjae Jeon 2026-02-13 568 if (!PageDirty(page) && (!PageUptodate(page))) {
495e90fa334828 Namjae Jeon 2026-02-13 569 kmap_local_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 570 continue;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 571 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 572 unlock_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 573 put_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 574 pages[i] = NULL;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 575 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 576 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 577
1e9ea7e04472d4 Namjae Jeon 2025-12-30 578 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 579 * We have the runlist, and all the destination pages we need to fill.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 580 * Now read the first compression block.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 581 */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 582 cur_page = 0;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 583 cur_ofs = 0;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 584 cb_clusters = ni->itype.compressed.block_clusters;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 585 do_next_cb:
1e9ea7e04472d4 Namjae Jeon 2025-12-30 586 nr_cbs--;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 587
495e90fa334828 Namjae Jeon 2026-02-13 @588 mutex_lock(&ntfs_cb_lock);
495e90fa334828 Namjae Jeon 2026-02-13 589 if (!ntfs_compression_buffer)
495e90fa334828 Namjae Jeon 2026-02-13 590 if (allocate_compression_buffers()) {
495e90fa334828 Namjae Jeon 2026-02-13 591 mutex_unlock(&ntfs_cb_lock);
495e90fa334828 Namjae Jeon 2026-02-13 592 goto err_out;
495e90fa334828 Namjae Jeon 2026-02-13 593 }
495e90fa334828 Namjae Jeon 2026-02-13 594
495e90fa334828 Namjae Jeon 2026-02-13 595
495e90fa334828 Namjae Jeon 2026-02-13 596 cb = ntfs_compression_buffer;
495e90fa334828 Namjae Jeon 2026-02-13 597 cb_pos = cb;
495e90fa334828 Namjae Jeon 2026-02-13 598 cb_end = cb + cb_size;
495e90fa334828 Namjae Jeon 2026-02-13 599
1e9ea7e04472d4 Namjae Jeon 2025-12-30 600 rl = NULL;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 601 for (vcn = start_vcn, start_vcn += cb_clusters; vcn < start_vcn;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 602 vcn++) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 603 bool is_retry = false;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 604
1e9ea7e04472d4 Namjae Jeon 2025-12-30 605 if (!rl) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 606 lock_retry_remap:
1e9ea7e04472d4 Namjae Jeon 2025-12-30 607 down_read(&ni->runlist.lock);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 608 rl = ni->runlist.rl;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 609 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 610 if (likely(rl != NULL)) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 611 /* Seek to element containing target vcn. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 612 while (rl->length && rl[1].vcn <= vcn)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 613 rl++;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 614 lcn = ntfs_rl_vcn_to_lcn(rl, vcn);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 615 } else
1e9ea7e04472d4 Namjae Jeon 2025-12-30 616 lcn = LCN_RL_NOT_MAPPED;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 617 ntfs_debug("Reading vcn = 0x%llx, lcn = 0x%llx.",
1e9ea7e04472d4 Namjae Jeon 2025-12-30 618 (unsigned long long)vcn,
1e9ea7e04472d4 Namjae Jeon 2025-12-30 619 (unsigned long long)lcn);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 620 if (lcn < 0) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 621 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 622 * When we reach the first sparse cluster we have
1e9ea7e04472d4 Namjae Jeon 2025-12-30 623 * finished with the cb.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 624 */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 625 if (lcn == LCN_HOLE)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 626 break;
495e90fa334828 Namjae Jeon 2026-02-13 627 if (is_retry || lcn != LCN_RL_NOT_MAPPED) {
495e90fa334828 Namjae Jeon 2026-02-13 628 mutex_unlock(&ntfs_cb_lock);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 629 goto rl_err;
495e90fa334828 Namjae Jeon 2026-02-13 630 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 631 is_retry = true;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 632 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 633 * Attempt to map runlist, dropping lock for the
1e9ea7e04472d4 Namjae Jeon 2025-12-30 634 * duration.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 635 */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 636 up_read(&ni->runlist.lock);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 637 if (!ntfs_map_runlist(ni, vcn))
1e9ea7e04472d4 Namjae Jeon 2025-12-30 638 goto lock_retry_remap;
495e90fa334828 Namjae Jeon 2026-02-13 639 mutex_unlock(&ntfs_cb_lock);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 640 goto map_rl_err;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 641 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 642
495e90fa334828 Namjae Jeon 2026-02-13 643 page_ofs = ntfs_cluster_to_poff(vol, lcn);
495e90fa334828 Namjae Jeon 2026-02-13 644 page_index = ntfs_cluster_to_pidx(vol, lcn);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 645
495e90fa334828 Namjae Jeon 2026-02-13 646 lpage = read_mapping_page(sb->s_bdev->bd_mapping,
495e90fa334828 Namjae Jeon 2026-02-13 647 page_index, NULL);
495e90fa334828 Namjae Jeon 2026-02-13 648 if (IS_ERR(lpage)) {
495e90fa334828 Namjae Jeon 2026-02-13 649 err = PTR_ERR(lpage);
495e90fa334828 Namjae Jeon 2026-02-13 650 mutex_unlock(&ntfs_cb_lock);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 651 goto read_err;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 652 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 653
495e90fa334828 Namjae Jeon 2026-02-13 654 lock_page(lpage);
495e90fa334828 Namjae Jeon 2026-02-13 655 memcpy(cb_pos, page_address(lpage) + page_ofs,
495e90fa334828 Namjae Jeon 2026-02-13 656 vol->cluster_size);
495e90fa334828 Namjae Jeon 2026-02-13 657 unlock_page(lpage);
495e90fa334828 Namjae Jeon 2026-02-13 658 put_page(lpage);
495e90fa334828 Namjae Jeon 2026-02-13 659 cb_pos += vol->cluster_size;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 660 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 661
495e90fa334828 Namjae Jeon 2026-02-13 662 /* Release the lock if we took it. */
495e90fa334828 Namjae Jeon 2026-02-13 663 if (rl)
495e90fa334828 Namjae Jeon 2026-02-13 664 up_read(&ni->runlist.lock);
495e90fa334828 Namjae Jeon 2026-02-13 665
1e9ea7e04472d4 Namjae Jeon 2025-12-30 666 /* Just a precaution. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 667 if (cb_pos + 2 <= cb + cb_size)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 668 *(u16 *)cb_pos = 0;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 669
1e9ea7e04472d4 Namjae Jeon 2025-12-30 670 /* Reset cb_pos back to the beginning. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 671 cb_pos = cb;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 672
1e9ea7e04472d4 Namjae Jeon 2025-12-30 673 /* We now have both source (if present) and destination. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 674 ntfs_debug("Successfully read the compression block.");
1e9ea7e04472d4 Namjae Jeon 2025-12-30 675
1e9ea7e04472d4 Namjae Jeon 2025-12-30 676 /* The last page and maximum offset within it for the current cb. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 677 cb_max_page = (cur_page << PAGE_SHIFT) + cur_ofs + cb_size;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 678 cb_max_ofs = cb_max_page & ~PAGE_MASK;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 679 cb_max_page >>= PAGE_SHIFT;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 680
1e9ea7e04472d4 Namjae Jeon 2025-12-30 681 /* Catch end of file inside a compression block. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 682 if (cb_max_page > max_page)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 683 cb_max_page = max_page;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 684
1e9ea7e04472d4 Namjae Jeon 2025-12-30 685 if (vcn == start_vcn - cb_clusters) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 686 /* Sparse cb, zero out page range overlapping the cb. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 687 ntfs_debug("Found sparse compression block.");
1e9ea7e04472d4 Namjae Jeon 2025-12-30 688 /* We can sleep from now on, so we drop lock. */
495e90fa334828 Namjae Jeon 2026-02-13 689 mutex_unlock(&ntfs_cb_lock);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 690 if (cb_max_ofs)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 691 cb_max_page--;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 692 for (; cur_page < cb_max_page; cur_page++) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 693 page = pages[cur_page];
1e9ea7e04472d4 Namjae Jeon 2025-12-30 694 if (page) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 695 if (likely(!cur_ofs))
1e9ea7e04472d4 Namjae Jeon 2025-12-30 696 clear_page(page_address(page));
1e9ea7e04472d4 Namjae Jeon 2025-12-30 697 else
1e9ea7e04472d4 Namjae Jeon 2025-12-30 698 memset(page_address(page) + cur_ofs, 0,
1e9ea7e04472d4 Namjae Jeon 2025-12-30 699 PAGE_SIZE -
1e9ea7e04472d4 Namjae Jeon 2025-12-30 700 cur_ofs);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 701 flush_dcache_page(page);
495e90fa334828 Namjae Jeon 2026-02-13 702 kunmap_local(page_address(page));
1e9ea7e04472d4 Namjae Jeon 2025-12-30 703 SetPageUptodate(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 704 unlock_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 705 if (cur_page == xpage)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 706 xpage_done = 1;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 707 else
1e9ea7e04472d4 Namjae Jeon 2025-12-30 708 put_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 709 pages[cur_page] = NULL;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 710 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 711 cb_pos += PAGE_SIZE - cur_ofs;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 712 cur_ofs = 0;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 713 if (cb_pos >= cb_end)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 714 break;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 715 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 716 /* If we have a partial final page, deal with it now. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 717 if (cb_max_ofs && cb_pos < cb_end) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 718 page = pages[cur_page];
1e9ea7e04472d4 Namjae Jeon 2025-12-30 719 if (page)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 720 memset(page_address(page) + cur_ofs, 0,
1e9ea7e04472d4 Namjae Jeon 2025-12-30 721 cb_max_ofs - cur_ofs);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 722 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 723 * No need to update cb_pos at this stage:
1e9ea7e04472d4 Namjae Jeon 2025-12-30 724 * cb_pos += cb_max_ofs - cur_ofs;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 725 */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 726 cur_ofs = cb_max_ofs;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 727 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 728 } else if (vcn == start_vcn) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 729 /* We can't sleep so we need two stages. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 730 unsigned int cur2_page = cur_page;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 731 unsigned int cur_ofs2 = cur_ofs;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 732 u8 *cb_pos2 = cb_pos;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 733
1e9ea7e04472d4 Namjae Jeon 2025-12-30 734 ntfs_debug("Found uncompressed compression block.");
1e9ea7e04472d4 Namjae Jeon 2025-12-30 735 /* Uncompressed cb, copy it to the destination pages. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 736 if (cb_max_ofs)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 737 cb_max_page--;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 738 /* First stage: copy data into destination pages. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 739 for (; cur_page < cb_max_page; cur_page++) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 740 page = pages[cur_page];
1e9ea7e04472d4 Namjae Jeon 2025-12-30 741 if (page)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 742 memcpy(page_address(page) + cur_ofs, cb_pos,
1e9ea7e04472d4 Namjae Jeon 2025-12-30 743 PAGE_SIZE - cur_ofs);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 744 cb_pos += PAGE_SIZE - cur_ofs;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 745 cur_ofs = 0;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 746 if (cb_pos >= cb_end)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 747 break;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 748 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 749 /* If we have a partial final page, deal with it now. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 750 if (cb_max_ofs && cb_pos < cb_end) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 751 page = pages[cur_page];
1e9ea7e04472d4 Namjae Jeon 2025-12-30 752 if (page)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 753 memcpy(page_address(page) + cur_ofs, cb_pos,
1e9ea7e04472d4 Namjae Jeon 2025-12-30 754 cb_max_ofs - cur_ofs);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 755 cb_pos += cb_max_ofs - cur_ofs;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 756 cur_ofs = cb_max_ofs;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 757 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 758 /* We can sleep from now on, so drop lock. */
495e90fa334828 Namjae Jeon 2026-02-13 759 mutex_unlock(&ntfs_cb_lock);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 760 /* Second stage: finalize pages. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 761 for (; cur2_page < cb_max_page; cur2_page++) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 762 page = pages[cur2_page];
1e9ea7e04472d4 Namjae Jeon 2025-12-30 763 if (page) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 764 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 765 * If we are outside the initialized size, zero
1e9ea7e04472d4 Namjae Jeon 2025-12-30 766 * the out of bounds page range.
1e9ea7e04472d4 Namjae Jeon 2025-12-30 767 */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 768 handle_bounds_compressed_page(page, i_size,
1e9ea7e04472d4 Namjae Jeon 2025-12-30 769 initialized_size);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 770 flush_dcache_page(page);
495e90fa334828 Namjae Jeon 2026-02-13 771 kunmap_local(page_address(page));
1e9ea7e04472d4 Namjae Jeon 2025-12-30 772 SetPageUptodate(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 773 unlock_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 774 if (cur2_page == xpage)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 775 xpage_done = 1;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 776 else
1e9ea7e04472d4 Namjae Jeon 2025-12-30 777 put_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 778 pages[cur2_page] = NULL;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 779 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 780 cb_pos2 += PAGE_SIZE - cur_ofs2;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 781 cur_ofs2 = 0;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 782 if (cb_pos2 >= cb_end)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 783 break;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 784 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 785 } else {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 786 /* Compressed cb, decompress it into the destination page(s). */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 787 unsigned int prev_cur_page = cur_page;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 788
1e9ea7e04472d4 Namjae Jeon 2025-12-30 789 ntfs_debug("Found compressed compression block.");
1e9ea7e04472d4 Namjae Jeon 2025-12-30 790 err = ntfs_decompress(pages, completed_pages, &cur_page,
1e9ea7e04472d4 Namjae Jeon 2025-12-30 791 &cur_ofs, cb_max_page, cb_max_ofs, xpage,
1e9ea7e04472d4 Namjae Jeon 2025-12-30 792 &xpage_done, cb_pos, cb_size - (cb_pos - cb),
1e9ea7e04472d4 Namjae Jeon 2025-12-30 793 i_size, initialized_size);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 794 /*
1e9ea7e04472d4 Namjae Jeon 2025-12-30 795 * We can sleep from now on, lock already dropped by
1e9ea7e04472d4 Namjae Jeon 2025-12-30 796 * ntfs_decompress().
1e9ea7e04472d4 Namjae Jeon 2025-12-30 797 */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 798 if (err) {
495e90fa334828 Namjae Jeon 2026-02-13 799 ntfs_error(vol->sb,
495e90fa334828 Namjae Jeon 2026-02-13 800 "ntfs_decompress() failed in inode 0x%lx with error code %i. Skipping this compression block.",
1e9ea7e04472d4 Namjae Jeon 2025-12-30 801 ni->mft_no, -err);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 802 /* Release the unfinished pages. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 803 for (; prev_cur_page < cur_page; prev_cur_page++) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 804 page = pages[prev_cur_page];
1e9ea7e04472d4 Namjae Jeon 2025-12-30 805 if (page) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 806 flush_dcache_page(page);
495e90fa334828 Namjae Jeon 2026-02-13 807 kunmap_local(page_address(page));
1e9ea7e04472d4 Namjae Jeon 2025-12-30 808 unlock_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 809 if (prev_cur_page != xpage)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 810 put_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 811 pages[prev_cur_page] = NULL;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 812 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 813 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 814 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 815 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 816
1e9ea7e04472d4 Namjae Jeon 2025-12-30 817 /* Do we have more work to do? */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 818 if (nr_cbs)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 819 goto do_next_cb;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 820
1e9ea7e04472d4 Namjae Jeon 2025-12-30 821 /* Clean up if we have any pages left. Should never happen. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 822 for (cur_page = 0; cur_page < max_page; cur_page++) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 823 page = pages[cur_page];
1e9ea7e04472d4 Namjae Jeon 2025-12-30 824 if (page) {
495e90fa334828 Namjae Jeon 2026-02-13 825 ntfs_error(vol->sb,
495e90fa334828 Namjae Jeon 2026-02-13 826 "Still have pages left! Terminating them with extreme prejudice. Inode 0x%lx, page index 0x%lx.",
495e90fa334828 Namjae Jeon 2026-02-13 827 ni->mft_no, page->__folio_index);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 828 flush_dcache_page(page);
495e90fa334828 Namjae Jeon 2026-02-13 829 kunmap_local(page_address(page));
1e9ea7e04472d4 Namjae Jeon 2025-12-30 830 unlock_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 831 if (cur_page != xpage)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 832 put_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 833 pages[cur_page] = NULL;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 834 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 835 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 836
1e9ea7e04472d4 Namjae Jeon 2025-12-30 837 /* We no longer need the list of pages. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 838 kfree(pages);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 839 kfree(completed_pages);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 840
1e9ea7e04472d4 Namjae Jeon 2025-12-30 841 /* If we have completed the requested page, we return success. */
1e9ea7e04472d4 Namjae Jeon 2025-12-30 842 if (likely(xpage_done))
1e9ea7e04472d4 Namjae Jeon 2025-12-30 843 return 0;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 844
1e9ea7e04472d4 Namjae Jeon 2025-12-30 845 ntfs_debug("Failed. Returning error code %s.", err == -EOVERFLOW ?
1e9ea7e04472d4 Namjae Jeon 2025-12-30 846 "EOVERFLOW" : (!err ? "EIO" : "unknown error"));
1e9ea7e04472d4 Namjae Jeon 2025-12-30 847 return err < 0 ? err : -EIO;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 848
1e9ea7e04472d4 Namjae Jeon 2025-12-30 849 map_rl_err:
495e90fa334828 Namjae Jeon 2026-02-13 850 ntfs_error(vol->sb, "ntfs_map_runlist() failed. Cannot read compression block.");
1e9ea7e04472d4 Namjae Jeon 2025-12-30 851 goto err_out;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 852
1e9ea7e04472d4 Namjae Jeon 2025-12-30 853 rl_err:
1e9ea7e04472d4 Namjae Jeon 2025-12-30 854 up_read(&ni->runlist.lock);
495e90fa334828 Namjae Jeon 2026-02-13 855 ntfs_error(vol->sb, "ntfs_rl_vcn_to_lcn() failed. Cannot read compression block.");
1e9ea7e04472d4 Namjae Jeon 2025-12-30 856 goto err_out;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 857
495e90fa334828 Namjae Jeon 2026-02-13 858 read_err:
1e9ea7e04472d4 Namjae Jeon 2025-12-30 859 up_read(&ni->runlist.lock);
495e90fa334828 Namjae Jeon 2026-02-13 860 ntfs_error(vol->sb, "IO error while reading compressed data.");
1e9ea7e04472d4 Namjae Jeon 2025-12-30 861
1e9ea7e04472d4 Namjae Jeon 2025-12-30 862 err_out:
1e9ea7e04472d4 Namjae Jeon 2025-12-30 863 for (i = cur_page; i < max_page; i++) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 864 page = pages[i];
1e9ea7e04472d4 Namjae Jeon 2025-12-30 865 if (page) {
1e9ea7e04472d4 Namjae Jeon 2025-12-30 866 flush_dcache_page(page);
495e90fa334828 Namjae Jeon 2026-02-13 867 kunmap_local(page_address(page));
1e9ea7e04472d4 Namjae Jeon 2025-12-30 868 unlock_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 869 if (i != xpage)
1e9ea7e04472d4 Namjae Jeon 2025-12-30 870 put_page(page);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 871 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 872 }
1e9ea7e04472d4 Namjae Jeon 2025-12-30 873 kfree(pages);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 874 kfree(completed_pages);
1e9ea7e04472d4 Namjae Jeon 2025-12-30 875 return -EIO;
1e9ea7e04472d4 Namjae Jeon 2025-12-30 876 }
495e90fa334828 Namjae Jeon 2026-02-13 877
:::::: The code at line 588 was first introduced by commit
:::::: 495e90fa334828d4119061e2726af51d0a0fb4ed ntfs: update attrib operations
:::::: TO: Namjae Jeon <linkinjeon@kernel.org>
:::::: CC: Namjae Jeon <linkinjeon@kernel.org>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2026-07-19 15:02 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202607192246.hCy6XxKK-lkp@intel.com \
--to=lkp@intel.com \
--cc=julia.lawall@inria.fr \
--cc=oe-kbuild@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox