• Andre Noll's avatar
    md: Fix a bug in linear.c causing which_dev() to return the wrong device. · 852c8bf4
    Andre Noll authored
    ab5bd5cb introduced the following
    bug in linear software raid for large arrays on 32 bit machines:
    
    which_dev() computes the device holding a given sector by shifting
    down the sector number to a 32 bit range, dividing by the array
    spacing and looking up the resulting index in the hash table of
    the array.
    
    Because the computed index might be slightly too small, a loop at
    the end of which_dev() increases the index until the given sector
    actually falls into the range of the device associated with that index.
    
    The changes of the above mentioned commit caused this loop to check
    whether the _index_ rather than the sector number is small enough,
    effectively bypassing the loop and thus possibly returning the wrong
    device.
    
    As reported by Simon Kirby, this leads to errors such as
    
    	linear_make_request: Sector 2340486136 out of bounds on dev sdi: 156301312 sectors, offset 2109870464
    
    Fix this bug by introducing a local variable for the index so that
    the variable containing the passed sector is left unchanged.
    
    Cc: stable@kernel.org
    Signed-off-by: default avatarAndre Noll <maan@systemlinux.org>
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    852c8bf4
linear.c 10.1 KB