• Ming Lei's avatar
    block: fix splitting segments on boundary masks · 429120f3
    Ming Lei authored
    We ran into a problem with a mpt3sas based controller, where we would
    see random (and hard to reproduce) file corruption). The issue seemed
    specific to this controller, but wasn't specific to the file system.
    After a lot of debugging, we find out that it's caused by segments
    spanning a 4G memory boundary. This shouldn't happen, as the default
    setting for segment boundary masks is 4G.
    
    Turns out there are two issues in get_max_segment_size():
    
    1) The default segment boundary mask is bypassed
    
    2) The segment start address isn't taken into account when checking
       segment boundary limit
    
    Fix these two issues by removing the bypass of the segment boundary
    check even if the mask is set to the default value, and taking into
    account the actual start address of the request when checking if a
    segment needs splitting.
    
    Cc: stable@vger.kernel.org # v5.1+
    Reviewed-by: default avatarChris Mason <clm@fb.com>
    Tested-by: default avatarChris Mason <clm@fb.com>
    Fixes: dcebd755 ("block: use bio_for_each_bvec() to compute multi-page bvec count")
    Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
    
    Dropped const on the page pointer, ppc page_to_phys() doesn't mark the
    page as const...
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    429120f3
blk-merge.c 24.5 KB