From: kernel test robot <lkp@intel.com>
To: oe-kbuild@lists.linux.dev
Cc: lkp@intel.com, Dan Carpenter <error27@gmail.com>
Subject: [linux-next:master 13161/14242] fs/ntfs/attrib.c:4719 ntfs_non_resident_attr_expand() warn: missing unwind goto?
Date: Mon, 05 Oct 2026 20:46:44 +0200 [thread overview]
Message-ID: <202610052015.jmbMsWHP-lkp@intel.com> (raw)
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
reply other threads:[~2026-10-05 18:47 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202610052015.jmbMsWHP-lkp@intel.com \
--to=lkp@intel.com \
--cc=error27@gmail.com \
--cc=oe-kbuild@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox