• Anton Eidelman's avatar
    nvme-multipath: fix ana log nsid lookup when nsid is not found · e01f91df
    Anton Eidelman authored
    ANA log parsing invokes nvme_update_ana_state() per ANA group desc.
    This updates the state of namespaces with nsids in desc->nsids[].
    
    Both ctrl->namespaces list and desc->nsids[] array are sorted by nsid.
    Hence nvme_update_ana_state() performs a single walk over ctrl->namespaces:
    - if current namespace matches the current desc->nsids[n],
      this namespace is updated, and n is incremented.
    - the process stops when it encounters the end of either
      ctrl->namespaces end or desc->nsids[]
    
    In case desc->nsids[n] does not match any of ctrl->namespaces,
    the remaining nsids following desc->nsids[n] will not be updated.
    Such situation was considered abnormal and generated WARN_ON_ONCE.
    
    However ANA log MAY contain nsids not (yet) found in ctrl->namespaces.
    For example, lets consider the following scenario:
    - nvme0 exposes namespaces with nsids = [2, 3] to the host
    - a new namespace nsid = 1 is added dynamically
    - also, a ANA topology change is triggered
    - NS_CHANGED aen is generated and triggers scan_work
    - before scan_work discovers nsid=1 and creates a namespace, a NOTICE_ANA
      aen was issues and ana_work receives ANA log with nsids=[1, 2, 3]
    
    Result: ana_work fails to update ANA state on existing namespaces [2, 3]
    
    Solution:
    Change the way nvme_update_ana_state() namespace list walk
    checks the current namespace against desc->nsids[n] as follows:
    a) ns->head->ns_id < desc->nsids[n]: keep walking ctrl->namespaces.
    b) ns->head->ns_id == desc->nsids[n]: match, update the namespace
    c) ns->head->ns_id >= desc->nsids[n]: skip to desc->nsids[n+1]
    
    This enables correct operation in the scenario described above.
    This also allows ANA log to contain nsids currently invisible
    to the host, i.e. inactive nsids.
    Signed-off-by: default avatarAnton Eidelman <anton@lightbitslabs.com>
    Reviewed-by: default avatarJames Smart <james.smart@broadcom.com>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
    e01f91df
multipath.c 17.2 KB