• K
    hw/block/nvme: fix handling of private namespaces · e5489356
    Klaus Jensen 提交于
    Prior to this patch, if a private nvme-ns device (that is, a namespace
    that is not linked to a subsystem) is wired up to an nvme-subsys linked
    nvme controller device, the device fails to verify that the namespace id
    is unique within the subsystem. NVM Express v1.4b, Section 6.1.6 ("NSID
    and Namespace Usage") states that because the device supports Namespace
    Management, "NSIDs *shall* be unique within the NVM subsystem".
    
    Additionally, prior to this patch, private namespaces are not known to
    the subsystem and the namespace is considered exclusive to the
    controller with which it is initially wired up to. However, this is not
    the definition of a private namespace; per Section 1.6.33 ("private
    namespace"), a private namespace is just a namespace that does not
    support multipath I/O or namespace sharing, which means "that it is only
    able to be attached to one controller at a time".
    
    Fix this by always allocating namespaces in the subsystem (if one is
    linked to the controller), regardless of the shared/private status of
    the namespace. Whether or not the namespace is shareable is controlled
    by a new `shared` nvme-ns parameter.
    
    Finally, this fix allows the nvme-ns `subsys` parameter to be removed,
    since the `shared` parameter now serves the purpose of attaching the
    namespace to all controllers in the subsystem upon device realization.
    It is invalid to have an nvme-ns namespace device with a linked
    subsystem without the parent nvme controller device also being linked to
    one and since the nvme-ns devices will unconditionally be "attached" (in
    QEMU terms that is) to an nvme controller device through an NvmeBus, the
    nvme-ns namespace device can always get a reference to the subsystem of
    the controller it is explicitly (using 'bus=' parameter) or implicitly
    attaching to.
    
    Fixes: e5707685 ("hw/block/nvme: support for shared namespace in subsystem")
    Cc: Minwoo Im <minwoo.im.dev@gmail.com>
    Signed-off-by: NKlaus Jensen <k.jensen@samsung.com>
    Reviewed-by: NGollu Appalanaidu <anaidu.gollu@samsung.com>
    Reviewed-by: NKeith Busch <kbusch@kernel.org>
    Reviewed-by: NMinwoo Im <minwoo.im.dev@gmail.com>
    e5489356
nvme-ns.h 5.3 KB