All of lore.kernel.org
 help / color / mirror / Atom feed
* 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.