Re: [PROBLEM linux-next] fs/reiserfs/do_balan.c:1147:13: error: variable ‘leaf_mi’ set but not used [-Werror=unused-but-set-variable]

From: Mirsad Todorovac
Date: Wed Jul 10 2024 - 15:14:23 EST


On 7/10/24 20:17, Kees Cook wrote:
> On Wed, Jul 10, 2024 at 08:09:27PM +0200, Mirsad Todorovac wrote:
>> Dear all,
>>
>> On the linux-next vanilla next-20240709 tree, I have attempted the seed KCONFIG_SEED=0xEE7AB52F
>> which was known from before to trigger various errors in compile and build process.
>>
>> Though this might seem as contributing to channel noise, Linux refuses to build this config,
>> treating warnings as errors, using this build line:
>>
>> $ time nice make W=1 -k -j 36 |& tee ../err-next-20230709-01a.log; date
>>
>> As I know that the Chief Penguin doesn't like warnings, but I am also aware that there are plenty
>> left, there seems to be more tedious work ahead to make the compilers happy.
>>
>> The compiler output is:
>>
>> ---------------------------------------------------------------------------------------------------------
>> fs/reiserfs/do_balan.c: In function ‘balance_leaf_new_nodes_paste_whole’:
>> fs/reiserfs/do_balan.c:1147:13: error: variable ‘leaf_mi’ set but not used [-Werror=unused-but-set-variable]
>> 1147 | int leaf_mi;
>> | ^~~~~~~
>> CC fs/reiserfs/lbalance.o
>> fs/reiserfs/fix_node.c: In function ‘dc_check_balance_leaf’:
>> fs/reiserfs/fix_node.c:1938:13: error: variable ‘maxsize’ set but not used [-Werror=unused-but-set-variable]
>> 1938 | int maxsize, ret;
>> | ^~~~~~~
>> fs/reiserfs/fix_node.c:1935:13: error: variable ‘levbytes’ set but not used [-Werror=unused-but-set-variable]
>> 1935 | int levbytes;
>> | ^~~~~~~~
>> fs/reiserfs/prints.c: In function ‘prepare_error_buf’:
>> fs/reiserfs/prints.c:221:17: error: function ‘prepare_error_buf’ might be a candidate for ‘gnu_printf’ format attribute [-Werror=suggest-attribute=format]
>> 221 | p += vscnprintf(p, end - p, fmt1, args);
>> | ^
>> fs/reiserfs/prints.c:260:9: error: function ‘prepare_error_buf’ might be a candidate for ‘gnu_printf’ format attribute [-Werror=suggest-attribute=format]
>> 260 | p += vscnprintf(p, end - p, fmt1, args);
>> | ^
>> make[4]: Target 'arch/x86/kernel/' not remade because of errors.
>> make[3]: *** [scripts/Makefile.build:485: arch/x86/kernel] Error 2
>> make[3]: Target 'arch/x86/' not remade because of errors.
>> make[2]: *** [scripts/Makefile.build:485: arch/x86] Error 2
>> fs/reiserfs/lbalance.c: In function ‘leaf_copy_items’:
>> fs/reiserfs/lbalance.c:524:29: error: variable ‘dest’ set but not used [-Werror=unused-but-set-variable]
>> 524 | struct buffer_head *dest;
>> | ^~~~
>> cc1: all warnings being treated as errors
>> make[4]: *** [scripts/Makefile.build:244: fs/reiserfs/do_balan.o] Error 1
>> cc1: all warnings being treated as errors
>> make[4]: *** [scripts/Makefile.build:244: fs/reiserfs/prints.o] Error 1
>> cc1: all warnings being treated as errors
>> make[4]: *** [scripts/Makefile.build:244: fs/reiserfs/fix_node.o] Error 1
>> ---------------------------------------------------------------------------------------------------------
>>
>> In fs/reiserfs/fix_node.c:1938:13, fs/reiserfs/fix_node.c:1935:13, and fs/reiserfs/lbalance.c:524:29,
>> the problem seem to lie within the construct RFALSE(), like
>>
>> 521 static int leaf_copy_items(struct buffer_info *dest_bi, struct buffer_head *src,
>> 522 int last_first, int cpy_num, int cpy_bytes)
>> 523 {
>> 524 struct buffer_head *dest;
>> 525 int pos, i, src_nr_item, bytes;
>> 526
>> 527 dest = dest_bi->bi_bh;
>> 528 RFALSE(!dest || !src, "vs-10210: !dest || !src");
>> 529 RFALSE(last_first != FIRST_TO_LAST && last_first != LAST_TO_FIRST,
>> 530 "vs-10220:last_first != FIRST_TO_LAST && last_first != LAST_TO_FIRST");
>> 531 RFALSE(B_NR_ITEMS(src) < cpy_num,
>> 532 "vs-10230: No enough items: %d, req. %d", B_NR_ITEMS(src),
>> 533 cpy_num);
>> 534 RFALSE(cpy_num < 0, "vs-10240: cpy_num < 0 (%d)", cpy_num);
>
> Can you prepare a patch to solve these? It should be possible to just
> wrap the offending variables as done for RFALSE itself:
>
> #ifdef CONFIG_REISERFS_CHECK
> struct buffer_head *dest;
> #endif
>
> etc...

Hi, Mr. Kees,

Well, i sort fo did it but I am not happy with it (it is not elegant like the original code):

-----><------------------
$ git diff fs/reiserfs
diff --git a/fs/reiserfs/do_balan.c b/fs/reiserfs/do_balan.c
index 5129efc6f2e6..fbe73f267853 100644
--- a/fs/reiserfs/do_balan.c
+++ b/fs/reiserfs/do_balan.c
@@ -1144,7 +1144,9 @@ static void balance_leaf_new_nodes_paste_whole(struct tree_balance *tb,
{
struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path);
int n = B_NR_ITEMS(tbS0);
+#ifdef CONFIG_REISERFS_CHECK
int leaf_mi;
+#endif
struct item_head *pasted;
struct buffer_info bi;

@@ -1157,7 +1159,6 @@ static void balance_leaf_new_nodes_paste_whole(struct tree_balance *tb,
reiserfs_panic(tb->tb_sb,
"PAP-12235",
"pos_in_item must be equal to ih_item_len");
-#endif

leaf_mi = leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i],
tb->sbytes[i], tb->S_new[i]);
@@ -1165,6 +1166,7 @@ static void balance_leaf_new_nodes_paste_whole(struct tree_balance *tb,
RFALSE(leaf_mi,
"PAP-12240: unexpected value returned by leaf_move_items (%d)",
leaf_mi);
+#endif

/* paste into item */
buffer_info_init_bh(tb, &bi, tb->S_new[i]);
diff --git a/fs/reiserfs/fix_node.c b/fs/reiserfs/fix_node.c
index 6c13a8d9a73c..0ad41751eca5 100644
--- a/fs/reiserfs/fix_node.c
+++ b/fs/reiserfs/fix_node.c
@@ -1926,6 +1926,7 @@ static int dc_check_balance_leaf(struct tree_balance *tb, int h)
{
struct virtual_node *vn = tb->tb_vn;

+#ifdef CONFIG_REISERFS_CHECK
/*
* Number of bytes that must be deleted from
* (value is negative if bytes are deleted) buffer which
@@ -1935,21 +1936,32 @@ static int dc_check_balance_leaf(struct tree_balance *tb, int h)
int levbytes;

/* the maximal item size */
- int maxsize, ret;
+ int maxsize;
+#endif

/*
* S0 is the node whose balance is currently being checked,
* and F0 is its father.
*/
- struct buffer_head *S0, *F0;
+
+#ifdef CONFIG_REISERFS_CHECK
+ struct buffer_head *S0;
+#endif
+ struct buffer_head *F0;
+
int lfree, rfree /* free space in L and R */ ;
+ int ret;

+#ifdef CONFIG_REISERFS_CHECK
S0 = PATH_H_PBUFFER(tb->tb_path, 0);
+#endif
F0 = PATH_H_PPARENT(tb->tb_path, 0);

+#ifdef CONFIG_REISERFS_CHECK
levbytes = tb->insert_size[h];

maxsize = MAX_CHILD_SIZE(S0); /* maximal possible size of an item */
+#endif

if (!F0) { /* S[0] is the root now. */

diff --git a/fs/reiserfs/lbalance.c b/fs/reiserfs/lbalance.c
index 7f868569d4d0..aa8d897368da 100644
--- a/fs/reiserfs/lbalance.c
+++ b/fs/reiserfs/lbalance.c
@@ -521,10 +521,14 @@ static void leaf_item_bottle(struct buffer_info *dest_bi,
static int leaf_copy_items(struct buffer_info *dest_bi, struct buffer_head *src,
int last_first, int cpy_num, int cpy_bytes)
{
+#ifdef CONFIG_REISERFS_CHECK
struct buffer_head *dest;
+#endif
int pos, i, src_nr_item, bytes;

+#ifdef CONFIG_REISERFS_CHECK
dest = dest_bi->bi_bh;
+#endif
RFALSE(!dest || !src, "vs-10210: !dest || !src");
RFALSE(last_first != FIRST_TO_LAST && last_first != LAST_TO_FIRST,
"vs-10220:last_first != FIRST_TO_LAST && last_first != LAST_TO_FIRST");
--

P.S.

I could not find a mitigation for these:

fs/reiserfs/prints.c: In function ‘prepare_error_buf’:
fs/reiserfs/prints.c:221:17: error: function ‘prepare_error_buf’ might be a candidate for ‘gnu_printf’ format attribute [-Werror=suggest-attribute=format]
221 | p += vscnprintf(p, end - p, fmt1, args);
| ^
fs/reiserfs/prints.c:260:9: error: function ‘prepare_error_buf’ might be a candidate for ‘gnu_printf’ format attribute [-Werror=suggest-attribute=format]
260 | p += vscnprintf(p, end - p, fmt1, args);
| ^

221 p += vscnprintf(p, end - p, fmt1, args);

Hope this helps.

Best regards,
Mirsad Todorovac