Skip to content
  • Omar Sandoval's avatar
    bitmap: fix memset optimization on big-endian systems · 21035965
    Omar Sandoval authored
    Commit 2a98dc02 ("include/linux/bitmap.h: turn bitmap_set and
    bitmap_clear into memset when possible") introduced an optimization to
    bitmap_{set,clear}() which uses memset() when the start and length are
    constants aligned to a byte.
    
    This is wrong on big-endian systems; our bitmaps are arrays of unsigned
    long, so bit n is not at byte n / 8 in memory.  This was caught by the
    Btrfs selftests, but the bitmap selftests also fail when run on a
    big-endian machine.
    
    We can still use memset if the start and length are aligned to an
    unsigned long, so do that on big-endian.  The same problem applies to
    the memcmp in bitmap_equal(), so fix it there, too.
    
    Fixes: 2a98dc02 ("include/linux/bitmap.h: turn bitmap_set and bitmap_clear into memset when possible")
    Fixes: 2c6deb01
    
     ("bitmap: use memcmp optimisation in more situations")
    Cc: stable@kernel.org
    Reported-by: default avatar"Erhard F." <erhard_f@mailbox.org>
    Cc: Matthew Wilcox <mawilcox@microsoft.com>
    Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    21035965