• Sagi Grimberg's avatar
    IB/isert: Fix unaligned immediate-data handling · 0b089c1e
    Sagi Grimberg authored
    Currently we allocate rx buffers in a single contiguous buffers for
    headers (iser and iscsi) and data trailer. This means that most likely the
    data starting offset is aligned to 76 bytes (size of both headers).
    
    This worked fine for years, but at some point this broke, resulting in
    data corruptions in isert when a command comes with immediate data and the
    underlying backend device assumes 512 bytes buffer alignment.
    
    We assume a hard-requirement for all direct I/O buffers to be 512 bytes
    aligned. To fix this, we should avoid passing unaligned buffers for I/O.
    
    Instead, we allocate our recv buffers with some extra space such that we
    can have the data portion align to 512 byte boundary. This also means that
    we cannot reference headers or data using structure but rather
    accessors (as they may move based on alignment). Also, get rid of the
    wrong __packed annotation from iser_rx_desc as this has only harmful
    effects (not aligned to anything).
    
    This affects the rx descriptors for iscsi login and data plane.
    
    Fixes: 3d75ca0a ("block: introduce multi-page bvec helpers")
    Link: https://lore.kernel.org/r/20200904195039.31687-1-sagi@grimberg.meReported-by: default avatarStephen Rust <srust@blockbridge.com>
    Tested-by: default avatarDoug Dumitru <doug@dumitru.com>
    Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    0b089c1e
ib_isert.c 69.7 KB