libfs: Fix shift bug in generic_check_addressable()

generic_check_addressable() erroneously shifts pages down by a block
factor when it should be shifting up. To prevent overflow, we shift
blocks down to pages.

Signed-off-by: Joel Becker <joel.becker@oracle.com>

+4 -4
+4 -4
fs/libfs.c
··· 925 925 int generic_check_addressable(unsigned blocksize_bits, u64 num_blocks) 926 926 { 927 927 u64 last_fs_block = num_blocks - 1; 928 + u64 last_fs_page = 929 + last_fs_block >> (PAGE_CACHE_SHIFT - blocksize_bits); 928 930 929 931 if (unlikely(num_blocks == 0)) 930 932 return 0; ··· 934 932 if ((blocksize_bits < 9) || (blocksize_bits > PAGE_CACHE_SHIFT)) 935 933 return -EINVAL; 936 934 937 - if ((last_fs_block > 938 - (sector_t)(~0ULL) >> (blocksize_bits - 9)) || 939 - (last_fs_block > 940 - (pgoff_t)(~0ULL) >> (PAGE_CACHE_SHIFT - blocksize_bits))) { 935 + if ((last_fs_block > (sector_t)(~0ULL) >> (blocksize_bits - 9)) || 936 + (last_fs_page > (pgoff_t)(~0ULL))) { 941 937 return -EFBIG; 942 938 } 943 939 return 0;