• Keith Busch's avatar
    nvme: don't schedule multiple resets · c5f6ce97
    Keith Busch authored
    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: default avatarKeith Busch <keith.busch@intel.com>
    Reviewed-by: Sagi Grimberg<sagi@grimberg.me>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    c5f6ce97
pci.c 53.1 KB