* fs/ntfs/compress.c:588:1-11: second lock on line 588
@ 2026-07-19 15:02 kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2026-07-19 15:02 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Julia Lawall
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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-07-19 15:02 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-19 15:02 fs/ntfs/compress.c:588:1-11: second lock on line 588 kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.