• G
    nvme: Fix cntlid validation when not using NVMEoF · a89fcca8
    Guilherme G. Piccoli 提交于
    Commit 1b1031ca ("nvme: validate cntlid during controller initialisation")
    introduced a validation for controllers with duplicate cntlid that runs
    on nvme_init_subsystem(). The problem is that the validation relies on
    ctrl->cntlid, and this value is assigned (from id_ctrl value) after the
    call for nvme_init_subsystem() in nvme_init_identify() for non-fabrics
    scenario. That leads to ctrl->cntlid always being 0 in case we have a
    physical set of controllers in the same subsystem.
    
    This patch fixes that by loading the discovered cntlid id_ctrl value into
    ctrl->cntlid before the subsystem initialization, only for the non-fabrics
    case. The patch was tested with emulated nvme devices (qemu) having two
    controllers in a single subsystem. Without the patch, we couldn't make
    it work failing in the duplicate check; when running with the patch, we
    could see the subsystem holding both controllers.
    
    For the fabrics case we see ctrl->cntlid has a more intricate relation
    with the admin connect, so we didn't change that.
    
    Fixes: 1b1031ca ("nvme: validate cntlid during controller initialisation")
    Signed-off-by: NGuilherme G. Piccoli <gpiccoli@canonical.com>
    Reviewed-by: NSagi Grimberg <sagi@grimberg.me>
    Signed-off-by: NSagi Grimberg <sagi@grimberg.me>
    Signed-off-by: NJens Axboe <axboe@kernel.dk>
    a89fcca8
core.c 102.3 KB