In the Linux kernel, the following vulnerability has been resolved:
scsi: lpfc: Move cfglogverbose check before calling lpfcdmpdbg()
In an attempt to log message 0126 with LOGTRACEEVENT, the following hard lockup call trace hangs the system.
Call Trace: rawspinlockirqsave+0x32/0x40 lpfcdmpdbg.part.32+0x28/0x220 [lpfc] lpfccmplelsfdisc+0x145/0x460 [lpfc] lpfcslicanceljobs+0x92/0xd0 [lpfc] lpfcelsflushcmd+0x43c/0x670 [lpfc] lpfcelsflushallcmd+0x37/0x60 [lpfc] lpfcsli4asynceventproc+0x956/0x1720 [lpfc] lpfcdowork+0x1485/0x1d70 [lpfc] kthread+0x112/0x130 retfrom_fork+0x1f/0x40 Kernel panic - not syncing: Hard LOCKUP
The same CPU tries to claim the phba->portlistlock twice.
Move the cfglogverbose checks as part of the lpfcprintfvlog() and lpfcprintflog() macros before calling lpfcdmpdbg(). There is no need to take the phba->portlistlock within lpfcdmpdbg().