]> git.baikalelectronics.ru Git - kernel.git/commit
nvme: don't schedule multiple resets
authorKeith Busch <keith.busch@intel.com>
Wed, 5 Oct 2016 20:32:45 +0000 (16:32 -0400)
committerJens Axboe <axboe@fb.com>
Wed, 12 Oct 2016 15:24:39 +0000 (09:24 -0600)
commita93056ce2e375b6b0072b878839db42d50f0046e
tree863e6e0ce1eff4684788e8214d43224ba80bd3e8
parent2a9a27c0d147990c70ccc32cbc466d0626a3603e
nvme: don't schedule multiple resets

The queue_work only fails if the work is pending, but not yet running. If
the work is running, the work item would get requeued, triggering a
double reset. If the first reset fails for any reason, the second
reset triggers:

WARN_ON(dev->ctrl.state == NVME_CTRL_RESETTING)

Hitting that schedules controller deletion for a second time, which
potentially takes a reference on the device that is being deleted.
If the reset occurs at the same time as a hot removal event, this causes
a double-free.

This patch has the reset helper function check if the work is busy
prior to queueing, and changes all places that schedule resets to use
this function. Since most users don't want to sync with that work, the
"flush_work" is moved to the only caller that wants to sync.

Signed-off-by: Keith Busch <keith.busch@intel.com>
Reviewed-by: Sagi Grimberg<sagi@grimberg.me>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/nvme/host/pci.c