Unable to upgrade linux-firmware error unpacking rpm scriptlet stuck in infinite loop

When I do ‘sudo dnf update -y’ on Rocky Linux 8.10 Minimal, it gets stuck on updating linux-firmware.
Looks like on the other VMs or Docker images, the update goes well. Not sure what the issue is.

cat /etc/os-release
NAME="Rocky Linux"
VERSION="8.10 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.10"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Rocky Linux 8.10 (Green Obsidian)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:8:GA"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
SUPPORT_END="2029-05-31"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-8"
ROCKY_SUPPORT_PRODUCT_VERSION="8.10"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.10"
sudo rpm -qa | grep linux-fir
linux-firmware-20241014-125.git06bad2f1.el8_10.noarch
sudo dnf update -y
from the log
linux-firmware                       noarch         20250626-131.gitb05fabcd.el8_10                     baseos                   529 M
from strace of the update process
r
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942594") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942595") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942596") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942597") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942598") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942599") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942600") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942601") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942602") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942603") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942604") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942605") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942606") = -1 ENOENT (No such file or director
rename("/usr/lib/firmware/nvidia/ad103.rpmmoved", "/usr/lib/firmware/nvidia/ad103.rpmmoved.30942607") = -1 ENOENT (No such file or director
r

Diff from the spec file

diff linux-firmware-20250515-130.git9f8e520f.el8_10/linux-firmware.spec linux-firmware-20250626-131.gitb05fabcd.el8_10/linux-firmware.spec
1c1
< %global checkout 9f8e520f
---
> %global checkout b05fabcd
3c3
< %global firmware_release 130
---
> %global firmware_release 131
9c9
< Version:      20250515
---
> Version:      20250626
323c323
<       linux-firmware.files
---
>       linux-firmware.{files,dirs}
437a438,492
> # workaround for directory->symlink changes
> %pretrans -n linux-firmware -p <lua>
> path = "/usr/lib/firmware/nvidia/ad103"
> st = posix.stat(path)
> if st and st.type == "directory" then
>   status = os.rename(path, path .. ".rpmmoved")
>   if not status then
>     suffix = 0
>     while not status do
>       suffix = suffix + 1
>       status = os.rename(path .. ".rpmmoved", path .. ".rpmmoved." .. suffix)
>     end
>     os.rename(path, path .. ".rpmmoved")
>   end
> end
> path = "/usr/lib/firmware/nvidia/ad104"
> st = posix.stat(path)
> if st and st.type == "directory" then
>   status = os.rename(path, path .. ".rpmmoved")
>   if not status then
>     suffix = 0
>     while not status do
>       suffix = suffix + 1
>       status = os.rename(path .. ".rpmmoved", path .. ".rpmmoved." .. suffix)
>     end
>     os.rename(path, path .. ".rpmmoved")
>   end
> end
> path = "/usr/lib/firmware/nvidia/ad106"
> st = posix.stat(path)
> if st and st.type == "directory" then
>   status = os.rename(path, path .. ".rpmmoved")
>   if not status then
>     suffix = 0
>     while not status do
>       suffix = suffix + 1
>       status = os.rename(path .. ".rpmmoved", path .. ".rpmmoved." .. suffix)
>     end
>     os.rename(path, path .. ".rpmmoved")
>   end
> end
> path = "/usr/lib/firmware/nvidia/ad107"
> st = posix.stat(path)
> if st and st.type == "directory" then
>   status = os.rename(path, path .. ".rpmmoved")
>   if not status then
>     suffix = 0
>     while not status do
>       suffix = suffix + 1
>       status = os.rename(path .. ".rpmmoved", path .. ".rpmmoved." .. suffix)
>     end
>     os.rename(path, path .. ".rpmmoved")
>   end
> end
>

So, the problem in the script

Yes - related to this, I’ve found that trying to downgrade from the rocky linux 9.6 script for linux-firmware-20250604-151.2.el9_6 to -20240905-146.el9 gives errors complaining of conflicting files e.g. /usr/lib/firmware/nvidia/ad103/gsp which is used in both packages, but for some reason it can’t tell that it’s OK because it will remove one version and replace it with the other.