Re: [PATCH] btrfs: Fix csum_tree_block to avoid tripping on -Werror=array-bounds

From: pengfuyuan
Date: Sun May 28 2023 - 23:29:27 EST



On 2023/5/26 22:35, David Sterba wrote:
On Tue, May 23, 2023 at 09:32:12PM +0200, David Sterba wrote:
On Tue, May 23, 2023 at 03:33:22PM +0800, Qu Wenruo wrote:
On 2023/5/23 15:09, pengfuyuan wrote:
Although even with such change, I'm still not sure if it's any better or
worse, as most of the calculation can still be bulky.
Yeah I think the calculations would have to be conditional or keeping
some state. I'd like to keep the structure of the first page and the
rest.

Possible ways is to add extra condition

for (i = 1; i < num_pages && i < INLINE_EXTENT_BUFFER_PAGES; i++)
The final version is

for (i = 1; i < num_pages && INLINE_EXTENT_BUFFER_PAGES > 1; i++)

ie. 'INLINE_EXTENT_BUFFER_PAGES > 1' can be evaluated at compile time
and result in removing the for loop completely.

Pengfuyuan, can you please do a build test that it does not report the
warning anymore? The diff is:

--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -88,7 +88,6 @@ static void csum_tree_block(struct extent_buffer *buf, u8 *result)
const int first_page_part = min_t(u32, PAGE_SIZE, fs_info->nodesize);
SHASH_DESC_ON_STACK(shash, fs_info->csum_shash);
char *kaddr;
- int i;
shash->tfm = fs_info->csum_shash;
crypto_shash_init(shash);
@@ -96,7 +95,7 @@ static void csum_tree_block(struct extent_buffer *buf, u8 *result)
crypto_shash_update(shash, kaddr + BTRFS_CSUM_SIZE,
first_page_part - BTRFS_CSUM_SIZE);
- for (i = 1; i < num_pages; i++) {
+ for (int i = 1; i < num_pages && INLINE_EXTENT_BUFFER_PAGES > 1; i++) {
kaddr = page_address(buf->pages[i]);
crypto_shash_update(shash, kaddr, PAGE_SIZE);
}
---

I did a build test on the mips64 architecture, the compilation passed, and it no longer reported warnings.

Thank you very much and wish you a happy life.


Thanks.