Ubiquiti U6 Lite sysupgrade fails with resource busy

I am on my own custom build of OpenWRT, so it may be a custom configuration I have, but when I try and upgrade with sysupgrade I get the following crash:

root@ap:~# sysupgrade -n /tmp/openwrt-25.12.3-ramips-mt7621-ubnt_unifi-6-lite-squashfs-sysupgrade.bin
Thu May  7 01:32:32 UTC 2026 upgrade: Sending KILL to remaining processes ...
[  219.234607] stage2 (3076): drop_caches: 3
Thu May  7 01:32:39 UTC 2026 upgrade: Switching to ramdisk...
mount: mounting /dev/mtdblock9 on /overlay failed: Resource busy
[  222.529035] VFS: Busy inodes after unmount of jffs2 (jffs2)
[  222.529093] Kernel bug detected[#1]:
[  222.538214] CPU: 3 PID: 3076 Comm: busybox Tainted: G           O       6.6.119 #0
[  222.545762] $ 0   : 00000000 00000001 0000002f 00000000
[  222.550994] $ 4   : 00000000 00000000 00000000 00000000
[  222.556225] $ 8   : 00000000 00000000 00000000 00000000
[  222.561454] $12   : 00000000 00000000 00000000 72657466
[  222.566679] $16   : 838bd400 809ca0d8 81cb2a3c 80c33da0
[  222.571910] $20   : 8383fbf8 77ef33c8 00000000 7fe6adb0
[  222.577136] $24   : 00000000 00000000
[  222.582366] $28   : 8474a000 8474bdf8 00000000 802317d8
[  222.587591] Hi    : 00158bfe
[  222.590461] Lo    : fa4fd4f8
[  222.593325] epc   : 802317d8 generic_shutdown_super+0x124/0x128
[  222.599244] ra    : 802317d8 generic_shutdown_super+0x124/0x128
[  222.605150] Status: 1100fc03	KERNEL EXL IE
[  222.609332] Cause : 50800024 (ExcCode 09)
[  222.613326] PrId  : 0001992f (MIPS 1004Kc)
[  222.617402] Modules linked in: jitterentropy_rng pppoe ppp_async nft_fib_inet nf_flow_table_inet pppox ppp_generic nft_reject_ipv6 nft_reject_ipv4 nft_reject_inet nft_reject nft_redir nft_quota nft_numgen nft_nat nft_masq nft_log nft_limit nft_hash nft_flow_offload nft_fib_ipv6 nft_fib_ipv4 nft_fib nft_ct nft_chain_nat nf_tables nf_nat nf_flow_table nf_conntrack mt7915e(O) mt7603e(O) mt76_connac_lib(O) mt76(O) mac80211(O) cfg80211(O) slhc nfnetlink nf_reject_ipv6 nf_reject_ipv4 nf_log_syslog nf_defrag_ipv6 nf_defrag_ipv4 libcrc32c hwmon crc_ccitt compat(O) sha512_generic sha3_generic sha256_generic sha1_generic seqiv drbg md5 crypto_hw_eip93 hmac geniv rng des_generic libdes cmac authencesn authenc leds_gpio gpio_button_hotplug(O) crc32c_generic
[  222.683494] Process busybox (pid: 3076, threadinfo=754a4d2b, task=66018acf, tls=77efbdf4)
[  222.691656] Stack : 80c33da0 838bd630 809a9034 00000000 838bd400 838bd400 838b9000 805299c0
[  222.700028]         8383fbf8 77ef33c8 00000000 7fe6adb0 838bd400 802e7cd4 81cb2a3c 80286dc0
[  222.708399]         8383fbf8 80adad2c 00000000 838bd400 80adb684 802327f0 00000000 00000000
[  222.716770]         81d7b3c0 00000000 81d7b3c0 00000000 81d7b3c0 8025fae8 81d7b3e0 81cb2580
[  222.725137]         81d7b3e0 80895d18 8383fbf8 00000000 81cb2580 81cb2a3c 80c33da0 8005784c
[  222.733501]         ...
[  222.735947] Call Trace:
[  222.738379] [<802317d8>] generic_shutdown_super+0x124/0x128
[  222.743948] [<805299c0>] kill_mtd_super+0x14/0x34
[  222.748659] [<802e7cd4>] jffs2_kill_sb+0x5c/0x74
[  222.753278] [<802327f0>] deactivate_locked_super+0x4c/0xd8
[  222.758751] [<8025fae8>] cleanup_mnt+0xb0/0x15c
[  222.763274] [<8005784c>] task_work_run+0x9c/0xf4
[  222.767880] [<80007b00>] do_notify_resume+0x240/0x270
[  222.772937] [<80002ed0>] work_notifysig+0x10/0x18
[  222.777631]
[  222.779118] Code: 8c460000  0c024a46  248450dc <000c000d> 27bdffe0  afb00014  00808025  afbf001c  afb10018
[  222.788878]
[  222.790443] ---[ end trace 0000000000000000 ]---
[  222.795060] Kernel panic - not syncing: Fatal exception
[  222.800280] Rebooting in 3 seconds..

I’m not sure where to start troubleshooting this. I suppose I could TFTP recovery back to stock, then install stock and update to see if it’s caused by a change I made, but other than going through those one-by-one, I don’t actually have a good angle.

Does anyone have any tips or has seen this error before?

I was able to update to stock in failsafe mode without mounting root:

root@OpenWrt-failsafe:/# sysupgrade -n /tmp/fw.bin
Thu Jan  1 00:04:40 UTC 1970 upgrade: Commencing upgrade. Closing all shell sessions.
root@OpenWrt-failsafe:/# Watchdog handover: fd=3

watchdog -
Watchdog does not have CARDRESET support
Thu Jan  1 00:04:40 UTC 1970 upgrade: Sending TERM to remaining processes ...
Thu Jan  1 00:04:40 UTC 1970 upgrade: Sending signal TERM to sshd (546)
Thu Jan  1 00:04:44 UTC 1970 upgrade: Sending KILL to remaining processes ...
[  291.089425] stage2 (1286): drop_caches: 3
Thu Jan  1 00:04:51 UTC 1970 upgrade: Switching to ramdisk...
Thu Jan  1 00:04:54 UTC 1970 upgrade: Performing system upgrade...
[  294.509666] do_stage2 (1286): drop_caches: 3
Unlocking firmware ...

Writing from  to firmware ...
Thu Jan  1 00:05:39 UTC 1970 upgrade: Upgrade completed
Thu Jan  1 00:05:40 UTC 1970 upgrade: Rebooting system...
umount: can't unmount /tmp: Resource busy
umount: can't unmount /dev: Resource [  341.026318] mt7530-mdio mdio-bus:1f lan: Link is Down
busy
[  341.037194] mtk_soc_eth 1e100000.ethernet eth0: Link is Down
[  341.046002] reboot: Restarting system

and when updating on stock (to my build) I had the same error message and a kernel bug, but no panic and the update completed:

root@OpenWrt:~# sysupgrade -n /tmp/squashfs-sysupgrade-DEVICE_ubnt_unifi-6-lite.
new
Mon May  4 22:33:26 GMT 2026 upgrade: Commencing upgrade. Closing all shell sessions.
Watchdog handover: fd=3
- watchdog -
Watchdog does not have CARDRESET support
Mon May  4 22:33:27 GMT 2026 upgrade: Sending TERM to remaining processes ...
Mon May  4 22:33:27 GMT 2026 upgrade: Sending signal TERM to ntpd (2793)
Mon May  4 22:33:27 GMT 2026 upgrade: Sending signal TERM to ntpd (2820)
Mon May  4 22:33:31 GMT 2026 upgrade: Sending KILL to remaining processes ...
Mon May  4 22:33:32 GMT 2026 upgrade: Sending signal KILL to ntpd (2793)
Mon May  4 22:33:34 GMT 2026 upgrade: Sending signal KILL to ntpd (2820)
[  190.191047] stage2 (3079): drop_caches: 3
Mon May  4 22:33:42 GMT 2026 upgrade: Switching to ramdisk...
mount: mounting /dev/mtdblock9 on /overlay failed: Resource busy
[  193.340233] ------------[ cut here ]------------
[  193.344888] WARNING: CPU: 1 PID: 3079 at fs/super.c:650 0x8021e2dc
[  193.351126] VFS: Busy inodes after unmount of jffs2 (jffs2)
[  193.351137] Modules linked in: pppoe ppp_async nft_fib_inet nf_flow_table_inet pppox ppp_generic nft_reject_ipv6 nft_reject_ipv4 nft_reject_inet nft_reject nft_redir nft_quota nft_numgen nft_nat nft_masq nft_log nft_limit nft_hash nft_flow_offload nft_fib_ipv6 nft_fib_ipv4 nft_fib nft_ct nft_chain_nat nf_tables nf_nat nf_flow_table nf_conntrack mt7915e(O) mt7603e(O) mt76_connac_lib(O) mt76(O) mac80211(O) cfg80211(O) slhc nfnetlink nf_reject_ipv6 nf_reject_ipv4 nf_log_syslog nf_defrag_ipv6 nf_defrag_ipv4 libcrc32c hwmon crc_ccitt compat(O) sha512_generic sha256_generic sha1_generic seqiv sha3_generic jitterentropy_rng drbg md5 crypto_hw_eip93 hmac geniv rng des_generic libdes cmac authencesn authenc leds_gpio gpio_button_hotplug(O) crc32c_generic
[  193.423068] CPU: 1 UID: 0 PID: 3079 Comm: busybox Tainted: G           O       6.12.85 #0
[  193.423099] Tainted: [O]=OOT_MODULE
[  193.423104] Hardware name: Ubiquiti UniFi 6 Lite
[  193.423113] Stack : 00000000 8008dbac 00000114 00000004 00000000 00000000 00000000 00000000
[  193.423158]         00000000 00000000 00000000 00000000 00000000 00000001 841a3cb0 818aee40
[  193.423195]         841a3d48 00000000 00000000 841a3b40 00000038 808856c4 809c2b60 00000115
[  193.423234]         841a3b8c 00000117 809c2b90 fffffff9 808a7058 841a3c90 808a7058 841a3dc8
[  193.423273]         00000000 8021e2dc 809bb3c0 7f899570 00000003 fffc4633 00000004 80b80004
[  193.423312]         ...
[  193.423320] Call Trace:
[  193.423327] [<8008dbac>] 0x8008dbac
[  193.423433] [<808856c4>] 0x808856c4
[  193.423500] [<8021e2dc>] 0x8021e2dc
[  193.423549] [<800073d8>] 0x800073d8
[  193.423559] [<800073e0>] 0x800073e0
[  193.423568] [<80859ce4>] 0x80859ce4
[  193.423579] [<8002b6fc>] 0x8002b6fc
[  193.423589] [<8021e2dc>] 0x8021e2dc
[  193.423617] [<8021e2dc>] 0x8021e2dc
[  193.423626] [<8002b8f4>] 0x8002b8f4
[  193.423761] [<8383fbf8>] 0x8383fbf8 [cfg80211@dd05c11e+0x4b000]
[  193.423803] [<8021e2dc>] 0x8021e2dc
[  193.423944] [<8050b114>] 0x8050b114
[  193.423963] [<8383fbf8>] 0x8383fbf8 [cfg80211@dd05c11e+0x4b000]
[  193.424014] [<802d59bc>] 0x802d59bc
[  193.424052] [<8383fbf8>] 0x8383fbf8 [cfg80211@dd05c11e+0x4b000]
[  193.424104] [<8021cf54>] 0x8021cf54
[  193.424132] [<8023b358>] 0x8023b358
[  193.424198] [<80249338>] 0x80249338
[  193.424263] [<80888124>] 0x80888124
[  193.424282] [<8383fbf8>] 0x8383fbf8 [cfg80211@dd05c11e+0x4b000]
[  193.424352] [<8004fcc8>] 0x8004fcc8
[  193.424420] [<80006a30>] 0x80006a30
[  193.424448] [<80224054>] 0x80224054
[  193.424488] [<8383fbf8>] 0x8383fbf8 [cfg80211@dd05c11e+0x4b000]
[  193.424521] [<80225530>] 0x80225530
[  193.424540] [<8383fbf8>] 0x8383fbf8 [cfg80211@dd05c11e+0x4b000]
[  193.424574] [<80002c30>] 0x80002c30
[  193.424599] [<8383fbf8>] 0x8383fbf8 [cfg80211@dd05c11e+0x4b000]
[  193.424639]
[  193.424644] ---[ end trace 0000000000000000 ]---
Mon May  4 22:33:45 UTC 2026 upgrade: Performing system upgrade...
[  193.771943] do_stage2 (3079): drop_caches: 3
Unlocking firmware ...

Writing from <stdin> to firmware ...
Mon May  4 22:34:44 UTC 2026 upgrade: Upgrade completed
Mon May  4 22:34:45 UTC 2026 upgrade: Rebooting system...
umount: can't unmount /dev: Resource busy
[  253.212638] mt7530-mdio mdio-bus:1f lan: Link is Down
[  253.218372] br-lan: port 1(lan) entered disabled state
[  253.229541] mtk_soc_eth 1e100000.ethernet eth0: Link is Down
[  253.240859] reboot: Restarting system

I have CONFIG_BUG_ON_DATA_CORRUPTION=y set in my kernel, so that’s possibly the reason? But the “resource busy” happens on stock too.

FWIW, I always get that error when sysupgrading my U6 Lites. Haven't looked for the underlying cause. Just ignored the error.

I guess that explains your issue. This is what that symbol changes:

#define CHECK_DATA_CORRUPTION(condition, addr, fmt, ...)                 \
        check_data_corruption(({                                         \
                bool corruption = unlikely(condition);                   \
                if (corruption) {                                        \
                        if (addr)                                        \
                                mem_dump_obj(addr);                      \
                        if (IS_ENABLED(CONFIG_BUG_ON_DATA_CORRUPTION)) { \
                                pr_err(fmt, ##__VA_ARGS__);              \
                                BUG();                                   \
                        } else                                           \
                                WARN(1, fmt, ##__VA_ARGS__);             \
                }                                                        \
                corruption;                                              \
        }))

and the warning is wrapped in that macro

                if (CHECK_DATA_CORRUPTION(!list_empty(&sb->s_inodes), NULL,
                                "VFS: Busy inodes after unmount of %s (%s)",
                                sb->s_id, sb->s_type->name)) {

So, not a good idea to enable CONFIG_BUG_ON_DATA_CORRUPTION on U6 Lite. Or any other device where that test always hits on sysupgrade.

Among my devices I see that I also get it on Unfi AC Pro:

Sat Apr 11 17:21:51 CEST 2026 upgrade: Switching to ramdisk...
mount: mounting /dev/mtdblock5 on /overlay failed: Resource busy
[1835118.280478] ------------[ cut here ]------------
[1835118.285456] WARNING: CPU: 0 PID: 32555 at fs/super.c:650 generic_shutdown_super+0x12c/0x15c
[1835118.294359] VFS: Busy inodes after unmount of jffs2 (jffs2)
[1835118.294368] Modules linked in: ath9k(O) ath9k_common(O) nft_fib_inet nf_flow_table_inet ath9k_hw(O) ath10k_pci(O) ath10k_core(O) ath(O) pl2303 nft_reject_ipv6 nft_reject_ipv4 nft_reject_inet nft_reject nft_redir nft_quota nft_numgen nft_nat nft_masq nft_log nft_limit nft_hash nft_flow_offload nft_fib_ipv6 nft_fib_ipv4 nft_fib nft_ct nft_chain_nat nf_tables nf_nat nf_flow_table nf_conntrack mac80211(O) ftdi_sio cfg80211(O) usbserial rng_core rfcomm nfnetlink nf_reject_ipv6 nf_reject_ipv4 nf_log_syslog nf_d8.392201] Hardware name: Ubiquiti UniFi AC Pro
[1835118.397148] Stack : 00000000 00000004 0000000c 807fa284 82e0bd1c 80084504 00000001 00000100
[1835118.405990]         81bee428 807b99c0 8091951f 8018.456500] [<80084bcc>] __warn+0x9c/0x118
[1835118.460926] [<80084cd4>] warn_slowpath_fmt+0x8c/0xacd trace 0000000000000000 ]---
Sat Apr 11 15:21:54 UTC 2026 upgrade: Performing system upgrade...
[1835118.590762] do_stage2 (32555): drop_caches: 3
Unlocking firmware ...
 
Writing from <stdin> to firmware ...     

and Onti ONT-S508CL-8S (aka XikeStor SKS8300-8X):

[18015.356938] stage2 (2781): drop_caches: 3
Sun Nov  2 20:32:45 GMT 2025 upgrade: Switching to ramdisk...
mount: mountin[18019.066658] ------------[ cut here ]------------
g[18019.128576] WARNING: CPU: 0 PID: 2781 at fs/super.c:650 generic_shutdown_super+0x12c/0x16c
 [18019.238705] VFS: Busy inodes after unmount of jffs2 (jffs2)
/[18019.238727] Modules linked in: mdio_netlink(O) gpio_button_hotplug(O)
d[18019.399113] CPU: 0 UID: 0 PID: 2781 Comm: busybox Tainted: G           O       6.12.55 #0
e[18019.399150] Tainted: [O]=OOT_MODULE
v[18019.399155] Hardware name: XikeStor SKS8300-8X
/[18019.399163] Stack : 00000000 00000004 0000000c 8097fa24 83043d0c 8012bf18 00000001 00000001
m[18019.399208]         00000000 00000000 00000000 00000000 00000000 00000001 83043cb8 81846c60
t[18019.399243]         00000000 00000000 80930938 83043b68 00000000 ffffefff 00000001 000002a8
d[18019.399280]         000002aa 83043b2c 000002aa 00001ff8 00000001 00000000 80930938 83043dc8
b[18019.399317]         00000000 803213bc 80a31378 7fdceef0 00000000 80a389c0 00000000 80c10000
l[18019.399355]         ...
o[18019.399364] Call Trace:
c[18019.399368] [<80106604>] show_stack+0x28/0xf0
k[18019.399415] [<80829914>] dump_stack_lvl+0x70/0xb0
6[18019.399458] [<8012c784>] __warn+0x9c/0x114
 [18019.399497] [<8012c97c>] warn_slowpath_fmt+0x180/0x188
o[18019.399519] [<803213bc>] generic_shutdown_super+0x12c/0x16c
n[18019.399536] [<80520858>] kill_mtd_super+0x14/0x30
 [18019.399576] [<803d4804>] jffs2_kill_sb+0x5c/0x74
/[18019.399616] [<803215bc>] deactivate_locked_super+0x4c/0xd8
o[18019.399632] [<8034e630>] cleanup_mnt+0xb0/0x160
v[18019.399668] [<8015104c>] task_work_run+0x94/0xd8
e[18019.399691] [<80105b30>] do_notify_resume+0x15c/0x16c
r[18019.399715] [<801016d0>] work_notifysig+0x10/0x18
l[18019.399734] 
a[18019.399739] ---[ end trace 0000000000000000 ]---

Thanks for the reply and for confirming that that was indeed the cause with the source :), much appreciated. Good to know too about the other devices it happens on, I also have an AC Pro, so I’ll drop that from there too, but don’t think it happens on my U6+.

Would be nice to be able to keep it enabled, not sure if anyone’s looked into it or what the status is, but maybe not worth looking into though since it doesn’t break the update process.

A question for you, since you seem to have these update logs readily accessible - is there a good way to view them without having to open them up and attach to the UART, since unmounting everything kills the SSH session?

I keep a permanent uart connection to most of my devices, and log the output using conserver. Some of them are close enough to other devices to be connected by a cable. And I use Bluetooth uarts where cabling is incovenient or ugly, like for the access points. Opened once and then closed

So no, there isn't a good way to view the boot or update logs without console