All of lore.kernel.org
 help / color / mirror / Atom feed
* [linux-next:master 13161/14242] fs/ntfs/attrib.c:4719 ntfs_non_resident_attr_expand() warn: missing unwind goto?
@ 2026-10-05 18:46 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2026-10-05 18:46 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Dan Carpenter

Unfiltered warning: this smatch report is sent as-is and has not been
reviewed for false positives, so please treat it with due skepticism.

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
TO: Matthias Goergens <matthias.goergens@gmail.com>
CC: Namjae Jeon <linkinjeon@kernel.org>
CC: Baolin Liu <liubaolin@kylinos.cn>
CC: Hyunchul Lee <hyc.lee@gmail.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head:   bf1ee2bd5c2da8992f33c8950ef194aaff74ed6c
commit: e29de9195f6424a3728580e836c32f80e94d2254 [13161/14242] ntfs: hold the runlist lock while expanding a non-resident attribute
:::::: branch date: 6 hours ago
:::::: commit date: 3 days ago
config: x86_64-randconfig-2200-20261005 (https://download.01.org/0day-ci/archive/20261005/202610052015.jmbMsWHP-lkp@intel.com/config)
compiler: clang version 22.1.8 (https://github.com/llvm/llvm-project ca7933e47d3a3451d81e72ac174dcb5aa28b59d1)
smatch: v0.5.0-9187-g5189e3fb

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
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202610052015.jmbMsWHP-lkp@intel.com/

smatch warnings:
fs/ntfs/attrib.c:4719 ntfs_non_resident_attr_expand() warn: missing unwind goto?

vim +4719 fs/ntfs/attrib.c

495e90fa334828d Namjae Jeon       2026-02-13  4463  
495e90fa334828d Namjae Jeon       2026-02-13  4464  /*
495e90fa334828d Namjae Jeon       2026-02-13  4465   * ntfs_non_resident_attr_expand - expand a non-resident, open ntfs attribute
495e90fa334828d Namjae Jeon       2026-02-13  4466   * @ni:			non-resident ntfs attribute to expand
495e90fa334828d Namjae Jeon       2026-02-13  4467   * @prealloc_size:	preallocation size (in bytes) to which to expand the attribute
495e90fa334828d Namjae Jeon       2026-02-13  4468   * @newsize:		new size (in bytes) to which to expand the attribute
495e90fa334828d Namjae Jeon       2026-02-13  4469   * @holes:		how to create a hole if expanding
91709ba5d6d709b Namjae Jeon       2026-09-06  4470   * @locked_ni:		inode whose runlist lock is already held
495e90fa334828d Namjae Jeon       2026-02-13  4471   *
495e90fa334828d Namjae Jeon       2026-02-13  4472   * Expand the size of a non-resident, open ntfs attribute @na to @newsize bytes,
495e90fa334828d Namjae Jeon       2026-02-13  4473   * by allocating new clusters.
495e90fa334828d Namjae Jeon       2026-02-13  4474   */
495e90fa334828d Namjae Jeon       2026-02-13  4475  static int ntfs_non_resident_attr_expand(struct ntfs_inode *ni, const s64 newsize,
91709ba5d6d709b Namjae Jeon       2026-09-06  4476  		const s64 prealloc_size, unsigned int holes,
91709ba5d6d709b Namjae Jeon       2026-09-06  4477  		struct ntfs_inode *locked_ni)
495e90fa334828d Namjae Jeon       2026-02-13  4478  {
495e90fa334828d Namjae Jeon       2026-02-13  4479  	s64 lcn_seek_from;
495e90fa334828d Namjae Jeon       2026-02-13  4480  	s64 first_free_vcn;
495e90fa334828d Namjae Jeon       2026-02-13  4481  	struct ntfs_volume *vol;
495e90fa334828d Namjae Jeon       2026-02-13  4482  	struct ntfs_attr_search_ctx *ctx = NULL;
495e90fa334828d Namjae Jeon       2026-02-13  4483  	struct runlist_element *rl, *rln;
495e90fa334828d Namjae Jeon       2026-02-13  4484  	s64 org_alloc_size, org_compressed_size;
495e90fa334828d Namjae Jeon       2026-02-13  4485  	int err, err2;
495e90fa334828d Namjae Jeon       2026-02-13  4486  	struct ntfs_inode *base_ni;
495e90fa334828d Namjae Jeon       2026-02-13  4487  	struct super_block *sb = ni->vol->sb;
495e90fa334828d Namjae Jeon       2026-02-13  4488  	size_t new_rl_count;
e43715851cf184a Matthias Goergens 2026-09-30  4489  	unsigned long flags;
e29de9195f6424a Matthias Goergens 2026-10-01  4490  	bool runlist_locked = locked_ni == ni;
495e90fa334828d Namjae Jeon       2026-02-13  4491  
495e90fa334828d Namjae Jeon       2026-02-13  4492  	ntfs_debug("Inode 0x%llx, attr 0x%x, new size %lld old size %lld\n",
495e90fa334828d Namjae Jeon       2026-02-13  4493  			(unsigned long long)ni->mft_no, ni->type,
495e90fa334828d Namjae Jeon       2026-02-13  4494  			(long long)newsize, (long long)ni->data_size);
495e90fa334828d Namjae Jeon       2026-02-13  4495  
495e90fa334828d Namjae Jeon       2026-02-13  4496  	vol = ni->vol;
495e90fa334828d Namjae Jeon       2026-02-13  4497  
495e90fa334828d Namjae Jeon       2026-02-13  4498  	if (NInoAttr(ni))
495e90fa334828d Namjae Jeon       2026-02-13  4499  		base_ni = ni->ext.base_ntfs_ino;
495e90fa334828d Namjae Jeon       2026-02-13  4500  	else
495e90fa334828d Namjae Jeon       2026-02-13  4501  		base_ni = ni;
495e90fa334828d Namjae Jeon       2026-02-13  4502  
495e90fa334828d Namjae Jeon       2026-02-13  4503  	/*
495e90fa334828d Namjae Jeon       2026-02-13  4504  	 * Check the attribute type and the corresponding maximum size
495e90fa334828d Namjae Jeon       2026-02-13  4505  	 * against @newsize and fail if @newsize is too big.
495e90fa334828d Namjae Jeon       2026-02-13  4506  	 */
495e90fa334828d Namjae Jeon       2026-02-13  4507  	err = ntfs_attr_size_bounds_check(vol, ni->type, newsize);
495e90fa334828d Namjae Jeon       2026-02-13  4508  	if (err	< 0) {
495e90fa334828d Namjae Jeon       2026-02-13  4509  		ntfs_error(sb, "%s: bounds check failed", __func__);
495e90fa334828d Namjae Jeon       2026-02-13  4510  		return err;
495e90fa334828d Namjae Jeon       2026-02-13  4511  	}
495e90fa334828d Namjae Jeon       2026-02-13  4512  
495e90fa334828d Namjae Jeon       2026-02-13  4513  	/* Save for future use. */
495e90fa334828d Namjae Jeon       2026-02-13  4514  	org_alloc_size = ni->allocated_size;
495e90fa334828d Namjae Jeon       2026-02-13  4515  	org_compressed_size = ni->itype.compressed.size;
495e90fa334828d Namjae Jeon       2026-02-13  4516  
495e90fa334828d Namjae Jeon       2026-02-13  4517  	/* The first cluster outside the new allocation. */
495e90fa334828d Namjae Jeon       2026-02-13  4518  	if (prealloc_size)
495e90fa334828d Namjae Jeon       2026-02-13  4519  		first_free_vcn =
495e90fa334828d Namjae Jeon       2026-02-13  4520  			ntfs_bytes_to_cluster(vol, prealloc_size + vol->cluster_size - 1);
495e90fa334828d Namjae Jeon       2026-02-13  4521  	else
495e90fa334828d Namjae Jeon       2026-02-13  4522  		first_free_vcn =
495e90fa334828d Namjae Jeon       2026-02-13  4523  			ntfs_bytes_to_cluster(vol, newsize + vol->cluster_size - 1);
495e90fa334828d Namjae Jeon       2026-02-13  4524  	if (first_free_vcn < 0)
495e90fa334828d Namjae Jeon       2026-02-13  4525  		return -EFBIG;
495e90fa334828d Namjae Jeon       2026-02-13  4526  
495e90fa334828d Namjae Jeon       2026-02-13  4527  	/*
495e90fa334828d Namjae Jeon       2026-02-13  4528  	 * Compare the new allocation with the old one and only allocate
495e90fa334828d Namjae Jeon       2026-02-13  4529  	 * clusters if there is a change.
495e90fa334828d Namjae Jeon       2026-02-13  4530  	 */
495e90fa334828d Namjae Jeon       2026-02-13  4531  	if (ntfs_bytes_to_cluster(vol, ni->allocated_size) < first_free_vcn) {
e29de9195f6424a Matthias Goergens 2026-10-01  4532  		/*
e29de9195f6424a Matthias Goergens 2026-10-01  4533  		 * The runlist array is replaced below.  Readers such as the
e29de9195f6424a Matthias Goergens 2026-10-01  4534  		 * iomap read path hold only the runlist lock, not mrec_lock.
e29de9195f6424a Matthias Goergens 2026-10-01  4535  		 */
e29de9195f6424a Matthias Goergens 2026-10-01  4536  		if (runlist_locked)
e29de9195f6424a Matthias Goergens 2026-10-01  4537  			lockdep_assert_held_write(&ni->runlist.lock);
e29de9195f6424a Matthias Goergens 2026-10-01  4538  		else
e29de9195f6424a Matthias Goergens 2026-10-01  4539  			down_write(&ni->runlist.lock);
e29de9195f6424a Matthias Goergens 2026-10-01  4540  
495e90fa334828d Namjae Jeon       2026-02-13  4541  		err = ntfs_attr_map_whole_runlist(ni);
495e90fa334828d Namjae Jeon       2026-02-13  4542  		if (err) {
495e90fa334828d Namjae Jeon       2026-02-13  4543  			ntfs_error(sb, "ntfs_attr_map_whole_runlist failed");
e29de9195f6424a Matthias Goergens 2026-10-01  4544  			goto unlock_runlist;
495e90fa334828d Namjae Jeon       2026-02-13  4545  		}
495e90fa334828d Namjae Jeon       2026-02-13  4546  
495e90fa334828d Namjae Jeon       2026-02-13  4547  		/*
495e90fa334828d Namjae Jeon       2026-02-13  4548  		 * If we extend $DATA attribute on NTFS 3+ volume, we can add
495e90fa334828d Namjae Jeon       2026-02-13  4549  		 * sparse runs instead of real allocation of clusters.
495e90fa334828d Namjae Jeon       2026-02-13  4550  		 */
495e90fa334828d Namjae Jeon       2026-02-13  4551  		if ((ni->type == AT_DATA && (vol->major_ver >= 3 || !NInoSparseDisabled(ni))) &&
495e90fa334828d Namjae Jeon       2026-02-13  4552  		    (holes != HOLES_NO)) {
495e90fa334828d Namjae Jeon       2026-02-13  4553  			if (NInoCompressed(ni)) {
495e90fa334828d Namjae Jeon       2026-02-13  4554  				int last = 0, i = 0;
495e90fa334828d Namjae Jeon       2026-02-13  4555  				s64 alloc_size;
495e90fa334828d Namjae Jeon       2026-02-13  4556  				u64 more_entries = round_up(first_free_vcn -
495e90fa334828d Namjae Jeon       2026-02-13  4557  						 ntfs_bytes_to_cluster(vol, ni->allocated_size),
495e90fa334828d Namjae Jeon       2026-02-13  4558  						 ni->itype.compressed.block_clusters);
495e90fa334828d Namjae Jeon       2026-02-13  4559  
495e90fa334828d Namjae Jeon       2026-02-13  4560  				do_div(more_entries, ni->itype.compressed.block_clusters);
495e90fa334828d Namjae Jeon       2026-02-13  4561  
495e90fa334828d Namjae Jeon       2026-02-13  4562  				while (ni->runlist.rl[last].length)
495e90fa334828d Namjae Jeon       2026-02-13  4563  					last++;
495e90fa334828d Namjae Jeon       2026-02-13  4564  
495e90fa334828d Namjae Jeon       2026-02-13  4565  				rl = ntfs_rl_realloc(ni->runlist.rl, last + 1,
495e90fa334828d Namjae Jeon       2026-02-13  4566  						last + more_entries + 1);
495e90fa334828d Namjae Jeon       2026-02-13  4567  				if (IS_ERR(rl)) {
495e90fa334828d Namjae Jeon       2026-02-13  4568  					err = -ENOMEM;
e29de9195f6424a Matthias Goergens 2026-10-01  4569  					goto unlock_runlist;
495e90fa334828d Namjae Jeon       2026-02-13  4570  				}
495e90fa334828d Namjae Jeon       2026-02-13  4571  
495e90fa334828d Namjae Jeon       2026-02-13  4572  				alloc_size = ni->allocated_size;
495e90fa334828d Namjae Jeon       2026-02-13  4573  				while (i++ < more_entries) {
495e90fa334828d Namjae Jeon       2026-02-13  4574  					rl[last].vcn = ntfs_bytes_to_cluster(vol,
495e90fa334828d Namjae Jeon       2026-02-13  4575  							round_up(alloc_size, vol->cluster_size));
495e90fa334828d Namjae Jeon       2026-02-13  4576  					rl[last].length = ni->itype.compressed.block_clusters -
495e90fa334828d Namjae Jeon       2026-02-13  4577  						(rl[last].vcn &
495e90fa334828d Namjae Jeon       2026-02-13  4578  						 (ni->itype.compressed.block_clusters - 1));
495e90fa334828d Namjae Jeon       2026-02-13  4579  					rl[last].lcn = LCN_HOLE;
495e90fa334828d Namjae Jeon       2026-02-13  4580  					last++;
495e90fa334828d Namjae Jeon       2026-02-13  4581  					alloc_size += ni->itype.compressed.block_size;
495e90fa334828d Namjae Jeon       2026-02-13  4582  				}
495e90fa334828d Namjae Jeon       2026-02-13  4583  
495e90fa334828d Namjae Jeon       2026-02-13  4584  				rl[last].vcn = first_free_vcn;
495e90fa334828d Namjae Jeon       2026-02-13  4585  				rl[last].lcn = LCN_ENOENT;
495e90fa334828d Namjae Jeon       2026-02-13  4586  				rl[last].length = 0;
495e90fa334828d Namjae Jeon       2026-02-13  4587  
495e90fa334828d Namjae Jeon       2026-02-13  4588  				ni->runlist.rl = rl;
495e90fa334828d Namjae Jeon       2026-02-13  4589  				ni->runlist.count += more_entries;
495e90fa334828d Namjae Jeon       2026-02-13  4590  			} else {
495e90fa334828d Namjae Jeon       2026-02-13  4591  				rl = kmalloc(sizeof(struct runlist_element) * 2, GFP_NOFS);
495e90fa334828d Namjae Jeon       2026-02-13  4592  				if (!rl) {
495e90fa334828d Namjae Jeon       2026-02-13  4593  					err = -ENOMEM;
e29de9195f6424a Matthias Goergens 2026-10-01  4594  					goto unlock_runlist;
495e90fa334828d Namjae Jeon       2026-02-13  4595  				}
495e90fa334828d Namjae Jeon       2026-02-13  4596  
495e90fa334828d Namjae Jeon       2026-02-13  4597  				rl[0].vcn = ntfs_bytes_to_cluster(vol, ni->allocated_size);
495e90fa334828d Namjae Jeon       2026-02-13  4598  				rl[0].lcn = LCN_HOLE;
495e90fa334828d Namjae Jeon       2026-02-13  4599  				rl[0].length = first_free_vcn -
495e90fa334828d Namjae Jeon       2026-02-13  4600  					ntfs_bytes_to_cluster(vol, ni->allocated_size);
495e90fa334828d Namjae Jeon       2026-02-13  4601  				rl[1].vcn = first_free_vcn;
495e90fa334828d Namjae Jeon       2026-02-13  4602  				rl[1].lcn = LCN_ENOENT;
495e90fa334828d Namjae Jeon       2026-02-13  4603  				rl[1].length = 0;
495e90fa334828d Namjae Jeon       2026-02-13  4604  			}
495e90fa334828d Namjae Jeon       2026-02-13  4605  		} else {
495e90fa334828d Namjae Jeon       2026-02-13  4606  			/*
495e90fa334828d Namjae Jeon       2026-02-13  4607  			 * Determine first after last LCN of attribute.
495e90fa334828d Namjae Jeon       2026-02-13  4608  			 * We will start seek clusters from this LCN to avoid
495e90fa334828d Namjae Jeon       2026-02-13  4609  			 * fragmentation.  If there are no valid LCNs in the
495e90fa334828d Namjae Jeon       2026-02-13  4610  			 * attribute let the cluster allocator choose the
495e90fa334828d Namjae Jeon       2026-02-13  4611  			 * starting LCN.
495e90fa334828d Namjae Jeon       2026-02-13  4612  			 */
495e90fa334828d Namjae Jeon       2026-02-13  4613  			lcn_seek_from = -1;
495e90fa334828d Namjae Jeon       2026-02-13  4614  			if (ni->runlist.rl->length) {
495e90fa334828d Namjae Jeon       2026-02-13  4615  				/* Seek to the last run list element. */
495e90fa334828d Namjae Jeon       2026-02-13  4616  				for (rl = ni->runlist.rl; (rl + 1)->length; rl++)
495e90fa334828d Namjae Jeon       2026-02-13  4617  					;
495e90fa334828d Namjae Jeon       2026-02-13  4618  				/*
495e90fa334828d Namjae Jeon       2026-02-13  4619  				 * If the last LCN is a hole or similar seek
495e90fa334828d Namjae Jeon       2026-02-13  4620  				 * back to last valid LCN.
495e90fa334828d Namjae Jeon       2026-02-13  4621  				 */
495e90fa334828d Namjae Jeon       2026-02-13  4622  				while (rl->lcn < 0 && rl != ni->runlist.rl)
495e90fa334828d Namjae Jeon       2026-02-13  4623  					rl--;
495e90fa334828d Namjae Jeon       2026-02-13  4624  				/*
495e90fa334828d Namjae Jeon       2026-02-13  4625  				 * Only set lcn_seek_from it the LCN is valid.
495e90fa334828d Namjae Jeon       2026-02-13  4626  				 */
495e90fa334828d Namjae Jeon       2026-02-13  4627  				if (rl->lcn >= 0)
495e90fa334828d Namjae Jeon       2026-02-13  4628  					lcn_seek_from = rl->lcn + rl->length;
495e90fa334828d Namjae Jeon       2026-02-13  4629  			}
495e90fa334828d Namjae Jeon       2026-02-13  4630  
495e90fa334828d Namjae Jeon       2026-02-13  4631  			rl = ntfs_cluster_alloc(vol,
495e90fa334828d Namjae Jeon       2026-02-13  4632  					ntfs_bytes_to_cluster(vol, ni->allocated_size),
495e90fa334828d Namjae Jeon       2026-02-13  4633  					first_free_vcn -
495e90fa334828d Namjae Jeon       2026-02-13  4634  					ntfs_bytes_to_cluster(vol, ni->allocated_size),
b1d732e62a5b394 Namjae Jeon       2026-09-06  4635  					lcn_seek_from, DATA_ZONE, false,
b1d732e62a5b394 Namjae Jeon       2026-09-06  4636  					ni->type == AT_ATTRIBUTE_LIST, false);
495e90fa334828d Namjae Jeon       2026-02-13  4637  			if (IS_ERR(rl)) {
495e90fa334828d Namjae Jeon       2026-02-13  4638  				ntfs_debug("Cluster allocation failed (%lld)",
495e90fa334828d Namjae Jeon       2026-02-13  4639  						(long long)first_free_vcn -
495e90fa334828d Namjae Jeon       2026-02-13  4640  						ntfs_bytes_to_cluster(vol, ni->allocated_size));
e29de9195f6424a Matthias Goergens 2026-10-01  4641  				err = PTR_ERR(rl);
e29de9195f6424a Matthias Goergens 2026-10-01  4642  				goto unlock_runlist;
495e90fa334828d Namjae Jeon       2026-02-13  4643  			}
b1d732e62a5b394 Namjae Jeon       2026-09-06  4644  			/*
b1d732e62a5b394 Namjae Jeon       2026-09-06  4645  			 * A contiguous ATTRIBUTE_LIST allocation keeps its mapping
b1d732e62a5b394 Namjae Jeon       2026-09-06  4646  			 * pairs small enough to fit in the base MFT record. The
b1d732e62a5b394 Namjae Jeon       2026-09-06  4647  			 * allocator can return a short run when contiguity was
b1d732e62a5b394 Namjae Jeon       2026-09-06  4648  			 * requested, so discard it and retry normally if necessary.
b1d732e62a5b394 Namjae Jeon       2026-09-06  4649  			 */
b1d732e62a5b394 Namjae Jeon       2026-09-06  4650  			if (ni->type == AT_ATTRIBUTE_LIST &&
b1d732e62a5b394 Namjae Jeon       2026-09-06  4651  				(rl->vcn != ntfs_bytes_to_cluster(vol,
b1d732e62a5b394 Namjae Jeon       2026-09-06  4652  						ni->allocated_size) ||
b1d732e62a5b394 Namjae Jeon       2026-09-06  4653  				 rl->length != first_free_vcn -
b1d732e62a5b394 Namjae Jeon       2026-09-06  4654  					ntfs_bytes_to_cluster(vol, ni->allocated_size) ||
b1d732e62a5b394 Namjae Jeon       2026-09-06  4655  				 rl[1].length)) {
b1d732e62a5b394 Namjae Jeon       2026-09-06  4656  				ntfs_cluster_free_from_rl(vol, rl);
b1d732e62a5b394 Namjae Jeon       2026-09-06  4657  				kvfree(rl);
b1d732e62a5b394 Namjae Jeon       2026-09-06  4658  				rl = ntfs_cluster_alloc(vol,
b1d732e62a5b394 Namjae Jeon       2026-09-06  4659  						ntfs_bytes_to_cluster(vol,
b1d732e62a5b394 Namjae Jeon       2026-09-06  4660  								ni->allocated_size),
b1d732e62a5b394 Namjae Jeon       2026-09-06  4661  						first_free_vcn -
b1d732e62a5b394 Namjae Jeon       2026-09-06  4662  						ntfs_bytes_to_cluster(vol,
b1d732e62a5b394 Namjae Jeon       2026-09-06  4663  								ni->allocated_size),
b1d732e62a5b394 Namjae Jeon       2026-09-06  4664  						lcn_seek_from, DATA_ZONE, false,
b1d732e62a5b394 Namjae Jeon       2026-09-06  4665  						false, false);
e29de9195f6424a Matthias Goergens 2026-10-01  4666  				if (IS_ERR(rl)) {
e29de9195f6424a Matthias Goergens 2026-10-01  4667  					err = PTR_ERR(rl);
e29de9195f6424a Matthias Goergens 2026-10-01  4668  					goto unlock_runlist;
e29de9195f6424a Matthias Goergens 2026-10-01  4669  				}
b1d732e62a5b394 Namjae Jeon       2026-09-06  4670  			}
495e90fa334828d Namjae Jeon       2026-02-13  4671  		}
495e90fa334828d Namjae Jeon       2026-02-13  4672  
495e90fa334828d Namjae Jeon       2026-02-13  4673  		if (!NInoCompressed(ni)) {
495e90fa334828d Namjae Jeon       2026-02-13  4674  			/* Append new clusters to attribute runlist. */
495e90fa334828d Namjae Jeon       2026-02-13  4675  			rln = ntfs_runlists_merge(&ni->runlist, rl, 0, &new_rl_count);
495e90fa334828d Namjae Jeon       2026-02-13  4676  			if (IS_ERR(rln)) {
495e90fa334828d Namjae Jeon       2026-02-13  4677  				/* Failed, free just allocated clusters. */
495e90fa334828d Namjae Jeon       2026-02-13  4678  				ntfs_error(sb, "Run list merge failed");
495e90fa334828d Namjae Jeon       2026-02-13  4679  				ntfs_cluster_free_from_rl(vol, rl);
495e90fa334828d Namjae Jeon       2026-02-13  4680  				kvfree(rl);
e29de9195f6424a Matthias Goergens 2026-10-01  4681  				err = -EIO;
e29de9195f6424a Matthias Goergens 2026-10-01  4682  				goto unlock_runlist;
495e90fa334828d Namjae Jeon       2026-02-13  4683  			}
495e90fa334828d Namjae Jeon       2026-02-13  4684  			ni->runlist.rl = rln;
495e90fa334828d Namjae Jeon       2026-02-13  4685  			ni->runlist.count = new_rl_count;
495e90fa334828d Namjae Jeon       2026-02-13  4686  		}
495e90fa334828d Namjae Jeon       2026-02-13  4687  
495e90fa334828d Namjae Jeon       2026-02-13  4688  		/* Prepare to mapping pairs update. */
495e90fa334828d Namjae Jeon       2026-02-13  4689  		ni->allocated_size = ntfs_cluster_to_bytes(vol, first_free_vcn);
e29de9195f6424a Matthias Goergens 2026-10-01  4690  		if (ni->type == AT_ATTRIBUTE_LIST && !runlist_locked) {
e29de9195f6424a Matthias Goergens 2026-10-01  4691  			/*
e29de9195f6424a Matthias Goergens 2026-10-01  4692  			 * Making room for the list's mapping pairs can resize
e29de9195f6424a Matthias Goergens 2026-10-01  4693  			 * this attribute list again through
e29de9195f6424a Matthias Goergens 2026-10-01  4694  			 * ntfs_attrlist_update_locked(), which takes its
e29de9195f6424a Matthias Goergens 2026-10-01  4695  			 * runlist lock.
e29de9195f6424a Matthias Goergens 2026-10-01  4696  			 */
e29de9195f6424a Matthias Goergens 2026-10-01  4697  			up_write(&ni->runlist.lock);
e29de9195f6424a Matthias Goergens 2026-10-01  4698  			err = ntfs_attr_update_mapping_pairs_locked(ni, 0,
e29de9195f6424a Matthias Goergens 2026-10-01  4699  								    locked_ni);
495e90fa334828d Namjae Jeon       2026-02-13  4700  			if (err) {
495e90fa334828d Namjae Jeon       2026-02-13  4701  				ntfs_debug("Mapping pairs update failed");
495e90fa334828d Namjae Jeon       2026-02-13  4702  				goto rollback;
495e90fa334828d Namjae Jeon       2026-02-13  4703  			}
e29de9195f6424a Matthias Goergens 2026-10-01  4704  		} else {
e29de9195f6424a Matthias Goergens 2026-10-01  4705  			err = ntfs_attr_update_mapping_pairs_locked(ni, 0, ni);
e29de9195f6424a Matthias Goergens 2026-10-01  4706  			if (err) {
e29de9195f6424a Matthias Goergens 2026-10-01  4707  				ntfs_debug("Mapping pairs update failed");
e29de9195f6424a Matthias Goergens 2026-10-01  4708  				goto rollback_locked;
e29de9195f6424a Matthias Goergens 2026-10-01  4709  			}
e29de9195f6424a Matthias Goergens 2026-10-01  4710  			if (!runlist_locked)
e29de9195f6424a Matthias Goergens 2026-10-01  4711  				up_write(&ni->runlist.lock);
e29de9195f6424a Matthias Goergens 2026-10-01  4712  		}
495e90fa334828d Namjae Jeon       2026-02-13  4713  	}
495e90fa334828d Namjae Jeon       2026-02-13  4714  
495e90fa334828d Namjae Jeon       2026-02-13  4715  	ctx = ntfs_attr_get_search_ctx(base_ni, NULL);
495e90fa334828d Namjae Jeon       2026-02-13  4716  	if (!ctx) {
495e90fa334828d Namjae Jeon       2026-02-13  4717  		err = -ENOMEM;
495e90fa334828d Namjae Jeon       2026-02-13  4718  		if (ni->allocated_size == org_alloc_size)
495e90fa334828d Namjae Jeon       2026-02-13 @4719  			return err;
495e90fa334828d Namjae Jeon       2026-02-13  4720  		goto rollback;
495e90fa334828d Namjae Jeon       2026-02-13  4721  	}
495e90fa334828d Namjae Jeon       2026-02-13  4722  
495e90fa334828d Namjae Jeon       2026-02-13  4723  	err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len, CASE_SENSITIVE,
495e90fa334828d Namjae Jeon       2026-02-13  4724  			       0, NULL, 0, ctx);
495e90fa334828d Namjae Jeon       2026-02-13  4725  	if (err) {
495e90fa334828d Namjae Jeon       2026-02-13  4726  		if (err == -ENOENT)
495e90fa334828d Namjae Jeon       2026-02-13  4727  			err = -EIO;
495e90fa334828d Namjae Jeon       2026-02-13  4728  		if (ni->allocated_size != org_alloc_size)
495e90fa334828d Namjae Jeon       2026-02-13  4729  			goto rollback;
495e90fa334828d Namjae Jeon       2026-02-13  4730  		goto put_err_out;
495e90fa334828d Namjae Jeon       2026-02-13  4731  	}
495e90fa334828d Namjae Jeon       2026-02-13  4732  
495e90fa334828d Namjae Jeon       2026-02-13  4733  	/* Update data size. */
495e90fa334828d Namjae Jeon       2026-02-13  4734  	ni->data_size = newsize;
495e90fa334828d Namjae Jeon       2026-02-13  4735  	ctx->attr->data.non_resident.data_size = cpu_to_le64(newsize);
495e90fa334828d Namjae Jeon       2026-02-13  4736  	/* Update data size in the index. */
495e90fa334828d Namjae Jeon       2026-02-13  4737  	if (ni->type == AT_DATA && ni->name == AT_UNNAMED)
495e90fa334828d Namjae Jeon       2026-02-13  4738  		NInoSetFileNameDirty(ni);
495e90fa334828d Namjae Jeon       2026-02-13  4739  	/* Set the inode dirty so it is written out later. */
495e90fa334828d Namjae Jeon       2026-02-13  4740  	mark_mft_record_dirty(ctx->ntfs_ino);
495e90fa334828d Namjae Jeon       2026-02-13  4741  	/* Done! */
495e90fa334828d Namjae Jeon       2026-02-13  4742  	ntfs_attr_put_search_ctx(ctx);
495e90fa334828d Namjae Jeon       2026-02-13  4743  	return 0;
495e90fa334828d Namjae Jeon       2026-02-13  4744  rollback:
e29de9195f6424a Matthias Goergens 2026-10-01  4745  	if (!runlist_locked)
e29de9195f6424a Matthias Goergens 2026-10-01  4746  		down_write(&ni->runlist.lock);
e29de9195f6424a Matthias Goergens 2026-10-01  4747  rollback_locked:
495e90fa334828d Namjae Jeon       2026-02-13  4748  	/* Free allocated clusters. */
495e90fa334828d Namjae Jeon       2026-02-13  4749  	err2 = ntfs_cluster_free(ni, ntfs_bytes_to_cluster(vol, org_alloc_size),
495e90fa334828d Namjae Jeon       2026-02-13  4750  				-1, ctx);
495e90fa334828d Namjae Jeon       2026-02-13  4751  	if (err2)
495e90fa334828d Namjae Jeon       2026-02-13  4752  		ntfs_debug("Leaking clusters");
495e90fa334828d Namjae Jeon       2026-02-13  4753  
e43715851cf184a Matthias Goergens 2026-09-30  4754  	/*
e43715851cf184a Matthias Goergens 2026-09-30  4755  	 * Now, truncate the runlist itself.  Restore allocated_size before
e43715851cf184a Matthias Goergens 2026-09-30  4756  	 * dropping the lock: ntfs_attr_vcn_to_rl() fails a lookup below the
e43715851cf184a Matthias Goergens 2026-09-30  4757  	 * allocated size that falls past the end of the runlist.
e43715851cf184a Matthias Goergens 2026-09-30  4758  	 */
495e90fa334828d Namjae Jeon       2026-02-13  4759  	err2 = ntfs_rl_truncate_nolock(vol, &ni->runlist,
495e90fa334828d Namjae Jeon       2026-02-13  4760  			ntfs_bytes_to_cluster(vol, org_alloc_size));
e43715851cf184a Matthias Goergens 2026-09-30  4761  	if (!err2) {
e43715851cf184a Matthias Goergens 2026-09-30  4762  		write_lock_irqsave(&ni->size_lock, flags);
e43715851cf184a Matthias Goergens 2026-09-30  4763  		ni->allocated_size = org_alloc_size;
e43715851cf184a Matthias Goergens 2026-09-30  4764  		write_unlock_irqrestore(&ni->size_lock, flags);
e43715851cf184a Matthias Goergens 2026-09-30  4765  	}
495e90fa334828d Namjae Jeon       2026-02-13  4766  	if (err2) {
495e90fa334828d Namjae Jeon       2026-02-13  4767  		/*
495e90fa334828d Namjae Jeon       2026-02-13  4768  		 * Failed to truncate the runlist, so just throw it away, it
495e90fa334828d Namjae Jeon       2026-02-13  4769  		 * will be mapped afresh on next use.
495e90fa334828d Namjae Jeon       2026-02-13  4770  		 */
495e90fa334828d Namjae Jeon       2026-02-13  4771  		kvfree(ni->runlist.rl);
495e90fa334828d Namjae Jeon       2026-02-13  4772  		ni->runlist.rl = NULL;
495e90fa334828d Namjae Jeon       2026-02-13  4773  		ntfs_error(sb, "Couldn't truncate runlist. Rollback failed");
495e90fa334828d Namjae Jeon       2026-02-13  4774  	} else {
495e90fa334828d Namjae Jeon       2026-02-13  4775  		/* Restore mapping pairs. */
e29de9195f6424a Matthias Goergens 2026-10-01  4776  		if (__ntfs_attr_update_mapping_pairs(ni, 0, ni, true))
495e90fa334828d Namjae Jeon       2026-02-13  4777  			ntfs_error(sb, "Failed to restore old mapping pairs");
495e90fa334828d Namjae Jeon       2026-02-13  4778  
495e90fa334828d Namjae Jeon       2026-02-13  4779  		if (NInoSparse(ni) || NInoCompressed(ni)) {
495e90fa334828d Namjae Jeon       2026-02-13  4780  			ni->itype.compressed.size =  org_compressed_size;
495e90fa334828d Namjae Jeon       2026-02-13  4781  			VFS_I(base_ni)->i_blocks = ni->itype.compressed.size >> 9;
495e90fa334828d Namjae Jeon       2026-02-13  4782  		} else
495e90fa334828d Namjae Jeon       2026-02-13  4783  			VFS_I(base_ni)->i_blocks = ni->allocated_size >> 9;
495e90fa334828d Namjae Jeon       2026-02-13  4784  	}
e29de9195f6424a Matthias Goergens 2026-10-01  4785  	if (!runlist_locked)
e29de9195f6424a Matthias Goergens 2026-10-01  4786  		up_write(&ni->runlist.lock);
495e90fa334828d Namjae Jeon       2026-02-13  4787  	if (ctx)
495e90fa334828d Namjae Jeon       2026-02-13  4788  		ntfs_attr_put_search_ctx(ctx);
495e90fa334828d Namjae Jeon       2026-02-13  4789  	return err;
495e90fa334828d Namjae Jeon       2026-02-13  4790  put_err_out:
495e90fa334828d Namjae Jeon       2026-02-13  4791  	if (ctx)
495e90fa334828d Namjae Jeon       2026-02-13  4792  		ntfs_attr_put_search_ctx(ctx);
495e90fa334828d Namjae Jeon       2026-02-13  4793  	return err;
e29de9195f6424a Matthias Goergens 2026-10-01  4794  unlock_runlist:
e29de9195f6424a Matthias Goergens 2026-10-01  4795  	if (!runlist_locked)
e29de9195f6424a Matthias Goergens 2026-10-01  4796  		up_write(&ni->runlist.lock);
e29de9195f6424a Matthias Goergens 2026-10-01  4797  	return err;
495e90fa334828d Namjae Jeon       2026-02-13  4798  }
495e90fa334828d Namjae Jeon       2026-02-13  4799  

:::::: The code at line 4719 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-10-05 18:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-05 18:46 [linux-next:master 13161/14242] fs/ntfs/attrib.c:4719 ntfs_non_resident_attr_expand() warn: missing unwind goto? 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.