• Vishal Verma's avatar
    libnvdimm/btt: Fix LBA masking during 'free list' population · 9dedc73a
    Vishal Verma authored
    The Linux BTT implementation assumes that log entries will never have
    the 'zero' flag set, and indeed it never sets that flag for log entries
    itself.
    
    However, the UEFI spec is ambiguous on the exact format of the LBA field
    of a log entry, specifically as to whether it should include the
    additional flag bits or not. While a zero bit doesn't make sense in the
    context of a log entry, other BTT implementations might still have it set.
    
    If an implementation does happen to have it set, we would happily read
    it in as the next block to write to for writes. Since a high bit is set,
    it pushes the block number out of the range of an 'arena', and we fail
    such a write with an EIO.
    
    Follow the robustness principle, and tolerate such implementations by
    stripping out the zero flag when populating the free list during
    initialization. Additionally, use the same stripped out entries for
    detection of incomplete writes and map restoration that happens at this
    stage.
    
    Add a sysfs file 'log_zero_flags' that indicates the ability to accept
    such a layout to userspace applications. This enables 'ndctl
    check-namespace' to recognize whether the kernel is able to handle zero
    flags, or whether it should attempt a fix-up under the --repair option.
    
    Cc: Dan Williams <dan.j.williams@intel.com>
    Reported-by: default avatarDexuan Cui <decui@microsoft.com>
    Reported-by: default avatarPedro d'Aquino Filocre F S Barbuda <pbarbuda@microsoft.com>
    Tested-by: default avatarDexuan Cui <decui@microsoft.com>
    Signed-off-by: default avatarVishal Verma <vishal.l.verma@intel.com>
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    9dedc73a
btt.c 43.3 KB