* [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.