Skip to content
  • Keith Busch's avatar
    NVMe: Metadata format support · e1e5e564
    Keith Busch authored
    
    
    Adds support for NVMe metadata formats and exposes block devices for
    all namespaces regardless of their format. Namespace formats that are
    unusable will have disk capacity set to 0, but a handle to the block
    device is created to simplify device management. A namespace is not
    usable when the format requires host interleave block and metadata in
    single buffer, has no provisioned storage, or has better data but failed
    to register with blk integrity.
    
    The namespace has to be scanned in two phases to support separate
    metadata formats. The first establishes the sector size and capacity
    prior to invoking add_disk. If metadata is required, the capacity will
    be temporarilly set to 0 until it can be revalidated and registered with
    the integrity extenstions after add_disk completes.
    
    The driver relies on the integrity extensions to provide the metadata
    buffer. NVMe requires this be a single physically contiguous region,
    so only one integrity segment is allowed per command. If the metadata
    is used for T10 PI, the driver provides mappings to save and restore
    the reftag physical block translation. The driver provides no-op
    functions for generate and verify if metadata is not used for protection
    information. This way the setup is always provided by the block layer.
    
    If a request does not supply a required metadata buffer, the command
    is failed with bad address. This could only happen if a user manually
    disables verify/generate on such a disk. The only exception to where
    this is okay is if the controller is capable of stripping/generating
    the metadata, which is possible on some types of formats.
    
    The metadata scatter gather list now occupies the spot in the nvme_iod
    that used to be used to link retryable IOD's, but we don't do that
    anymore, so the field was unused.
    
    Signed-off-by: default avatarKeith Busch <keith.busch@intel.com>
    e1e5e564