• pengfuyuan's avatar
    btrfs: fix csum_tree_block page iteration to avoid tripping on -Werror=array-bounds · 5ad9b471
    pengfuyuan authored
    When compiling on a MIPS 64-bit machine we get these warnings:
    
        In file included from ./arch/mips/include/asm/cacheflush.h:13,
    	             from ./include/linux/cacheflush.h:5,
    	             from ./include/linux/highmem.h:8,
    		     from ./include/linux/bvec.h:10,
    		     from ./include/linux/blk_types.h:10,
                         from ./include/linux/blkdev.h:9,
    	             from fs/btrfs/disk-io.c:7:
        fs/btrfs/disk-io.c: In function ‘csum_tree_block’:
        fs/btrfs/disk-io.c:100:34: error: array subscript 1 is above array bounds of ‘struct page *[1]’ [-Werror=array-bounds]
          100 |   kaddr = page_address(buf->pages[i]);
              |                        ~~~~~~~~~~^~~
        ./include/linux/mm.h:2135:48: note: in definition of macro ‘page_address’
         2135 | #define page_address(page) lowmem_page_address(page)
              |                                                ^~~~
        cc1: all warnings being treated as errors
    
    We can check if i overflows to solve the problem. However, this doesn't make
    much sense, since i == 1 and num_pages == 1 doesn't execute the body of the loop.
    In addition, i < num_pages can also ensure that buf->pages[i] will not cross
    the boundary. Unfortunately, this doesn't help with the problem observed here:
    gcc still complains.
    
    To fix this add a compile-time condition for the extent buffer page
    array size limit, which would eventually lead to eliminating the whole
    for loop.
    
    CC: stable@vger.kernel.org # 5.10+
    Signed-off-by: default avatarpengfuyuan <pengfuyuan@kylinos.cn>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    5ad9b471
disk-io.c 145 KB