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