• Solganik Alexander's avatar
    nvmet: Fix possible infinite loop triggered on hot namespace removal · e4fcf07c
    Solganik Alexander authored
    When removing a namespace we delete it from the subsystem namespaces
    list with list_del_init which allows us to know if it is enabled or
    not.
    
    The problem is that list_del_init initialize the list next and does
    not respect the RCU list-traversal we do on the IO path for locating
    a namespace. Instead we need to use list_del_rcu which is allowed to
    run concurrently with the _rcu list-traversal primitives (keeps list
    next intact) and guarantees concurrent nvmet_find_naespace forward
    progress.
    
    By changing that, we cannot rely on ns->dev_link for knowing if the
    namspace is enabled, so add enabled indicator entry to nvmet_ns for
    that.
    Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
    Signed-off-by: default avatarSolganik Alexander <sashas@lightbitslabs.com>
    Cc: <stable@vger.kernel.org> # v4.8+
    e4fcf07c
core.c 22.3 KB