nvme: remove ns sibling before clearing path
authorKeith Busch <keith.busch@intel.com>
Fri, 5 Oct 2018 14:57:06 +0000 (08:57 -0600)
committerChristoph Hellwig <hch@lst.de>
Mon, 8 Oct 2018 09:53:42 +0000 (11:53 +0200)
The code had been clearing a namespace being deleted as the current
path while that namespace was still in the path siblings list. It is
possible a new IO could set that namespace back to the current path
since it appeared to be an eligable path to select, which may result in
a use-after-free error.

This patch ensures a namespace being removed is not eligable to be reset
as a current path prior to clearing it as the current path.

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

index dd8ec1dd92190997f823e0bfb72389baea73b268..6bb9908bf46f1e2906f45af82be11684d18af444 100644 (file)
@@ -3143,8 +3143,8 @@ static void nvme_ns_remove(struct nvme_ns *ns)
        }
 
        mutex_lock(&ns->ctrl->subsys->lock);
-       nvme_mpath_clear_current_path(ns);
        list_del_rcu(&ns->siblings);
+       nvme_mpath_clear_current_path(ns);
        mutex_unlock(&ns->ctrl->subsys->lock);
 
        down_write(&ns->ctrl->namespaces_rwsem);