scsi: virtio_scsi: Move INIT_WORK calls to virtscsi_probe()
The last step of virtscsi_handle_event() is to call
virtscsi_kick_event(), which calls INIT_WORK on its own work
item. INIT_WORK resets the work item's data bits to 0.
If this occurs while the work item is being flushed by
cancel_work_sync(), then kernel/workqueue.c/work_offqd_enable triggers a
kernel warning, as it expects the "disable" bit to be 1:
[ 21.450115] workqueue: work disable count underflowed
[ 21.450117] WARNING: CPU: 1 PID: 56 at kernel/workqueue.c:4328 enable_work+0x10a/0x120
...
[ 21.450171] Call Trace:
[ 21.450173] [<
000003db2e5bdc3e>] enable_work+0x10e/0x120
[ 21.450176] ([<
000003db2e5bdc3a>] enable_work+0x10a/0x120)
[ 21.450178] [<
000003db2e5bdd86>] cancel_work_sync+0x86/0xa0
[ 21.450181] [<
000003daae97d9e4>] virtscsi_remove+0xb4/0xd0 [virtio_scsi]
[ 21.450184] [<
000003db2ef3b5ca>] virtio_dev_remove+0x6a/0xd0
[ 21.450186] [<
000003db2ef9106c>] device_release_driver_internal+0x1ac/0x260
[ 21.450190] [<
000003db2ef8edc8>] bus_remove_device+0xf8/0x190
[ 21.450192] [<
000003db2ef88d72>] device_del+0x142/0x340
[ 21.450194] [<
000003db2ef88fa0>] device_unregister+0x30/0xa0
[ 21.450196] [<
000003db2ef3b2fa>] unregister_virtio_device+0x2a/0x40
This warning may occur if a controller is detached immediately following
a disk detach.
Move the INIT_WORK call to prevent this. Don't re-init event list work
items in virtscsi_kick_event(), init them only once in virtscsi_probe()
instead.
Signed-off-by: Joshua Daley <jdaley@linux.ibm.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Link: https://patch.msgid.link/20260325180857.3675854-2-jdaley@linux.ibm.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>