megaraid: fix BUG_ON() from incorrect use of delayed work
authorXiaotian Feng <xtfeng@gmail.com>
Tue, 4 Dec 2012 11:33:54 +0000 (19:33 +0800)
committerTejun Heo <tj@kernel.org>
Tue, 4 Dec 2012 15:29:47 +0000 (07:29 -0800)
commitc1d390d8e6128b050f0f66b1c33d390760deb3f4
treeedbdf78f783da84eeacb7041a8b64d3096ce1f81
parent8852aac25e79e38cc6529f20298eed154f60b574
megaraid: fix BUG_ON() from incorrect use of delayed work

megaraid use INIT_WORK to declare a hotplug_work, but cast the
hotplug_work from work_struct to delayed_work and
schedule_delayed_work on it.  This is very dangerous, as other part of
delayed_work might be kernel memories allocated by others.

With commit 8852aac ("workqueue: mod_delayed_work_on() shouldn't queue
timer on 0 delay"), schedule_delayed_work() will check dwork->timer
before queue_work even when @delay is 0, this causes megaraid code to
hit the BUG_ON() in workqueue code.  Change megaraid code to use
delayed work.

Signed-off-by: Xiaotian Feng <dannyfeng@tencent.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Neela Syam Kolli <megaraidlinux@lsi.com>
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-scsi@vger.kernel.org
drivers/scsi/megaraid/megaraid_sas.h
drivers/scsi/megaraid/megaraid_sas_base.c