On Tue, Jan 26, 2021 at 03:32:36PM -0500, Josef Bacik wrote:
> On 1/26/21 1:36 PM, David Sterba wrote:
> > On Fri, Oct 09, 2020 at 09:28:18AM -0400, Josef Bacik wrote:
> >> I got a automated message from somebody who runs clang against our
> >> kernels and it's because I used the wrong enum type for what I passed
> >> into flush_space. Change the argument to be explicitly the enum we're
> >> expecting to make everything consistent. Maybe eventually gcc will
> >> catch errors like this.
> >
> > I can't find any such public report and none of the clang warnings seem
> > to be specific about that. Local run with clang 11 does not produce any
> > warning.
> >
>
> IDK, it was a private email just to me with the following output from clang
>
> s/btrfs/space-info.c:1115:12: warning: implicit conversion from
> enumeration type 'enum btrfs_flush_state' to different enumeration type
> 'enum btrfs_reserve_flush_enum' [-Wenum-conversion]
> flush = FLUSH_DELALLOC;
> ~ ^~~~~~~~~~~~~~
> fs/btrfs/space-info.c:1120:12: warning: implicit conversion from
> enumeration type 'enum btrfs_flush_state' to different enumeration type
> 'enum btrfs_reserve_flush_enum' [-Wenum-conversion]
> flush = FORCE_COMMIT_TRANS;
> ~ ^~~~~~~~~~~~~~~~~~
> fs/btrfs/space-info.c:1124:12: warning: implicit conversion from
> enumeration type 'enum btrfs_flush_state' to different enumeration type
> 'enum btrfs_reserve_flush_enum' [-Wenum-conversion]
> flush = FLUSH_DELAYED_ITEMS_NR;
> ~ ^~~~~~~~~~~~~~~~~~~~~~
> fs/btrfs/space-info.c:1127:12: warning: implicit conversion from
> enumeration type 'enum btrfs_flush_state' to different enumeration type
> 'enum btrfs_reserve_flush_enum' [-Wenum-conversion]
> flush = FLUSH_DELAYED_REFS_NR;
> ~ ^~~~~~~~~~~~~~~~~~~~~
>
> I figure it made sense, might as well fix it. Do we have that option for our
> shiny new -W build options? Thanks,
We can add -Wenum-conversion sure, but neither gcc (10.2.1) nor clang
(11.0.1) reproduces the warning for me so I wonder how useful it would
be. I've also tried adding -Wextra and -Wall and the build is clean.
Per gcc documentation, -Wenum-conversion is not exactly what the code
did:
"Warn when a value of enumerated type is implicitly converted to a
different enumerated type. This warning is enabled by -Wextra."
And now that I read the warning carefuly it does not apply to our code,
"btrfs_reserve_flush_enum = btrfs_flush_state" does not happen so it
must have been some older revision of the code.
Changing
@@ -1073,7 +1073,7 @@ static void btrfs_preempt_reclaim_metadata_space(struct
work_struct *work)
spin_lock(&space_info->lock);
while (need_preemptive_reclaim(fs_info, space_info)) {
- enum btrfs_flush_state flush;
+ enum btrfs_reserve_flush_enum flush;
---
gcc says (on misc-next without this patchset)
fs/btrfs/space-info.c: In function ‘btrfs_preempt_reclaim_metadata_space’:
fs/btrfs/space-info.c:1112:10: warning: implicit conversion from ‘enum
btrfs_flush_state’ to ‘enum btrfs_reserve_flush_enum’ [-Wenum-conversion]
1112 | flush = FLUSH_DELALLOC;
| ^
CC [M] fs/btrfs/block-group.o
fs/btrfs/space-info.c:1117:10: warning: implicit conversion from ‘enum
btrfs_flush_state’ to ‘enum btrfs_reserve_flush_enum’ [-Wenum-conversion]
1117 | flush = FORCE_COMMIT_TRANS;
| ^
fs/btrfs/space-info.c:1121:10: warning: implicit conversion from ‘enum
btrfs_flush_state’ to ‘enum btrfs_reserve_flush_enum’ [-Wenum-conversion]
1121 | flush = FLUSH_DELAYED_ITEMS_NR;
| ^
fs/btrfs/space-info.c:1124:10: warning: implicit conversion from ‘enum
btrfs_flush_state’ to ‘enum btrfs_reserve_flush_enum’ [-Wenum-conversion]
1124 | flush = FLUSH_DELAYED_REFS_NR;
| ^
fs/btrfs/space-info.c:1135:48: warning: implicit conversion from ‘enum
btrfs_reserve_flush_enum’ to ‘enum btrfs_flush_state’ [-Wenum-conversion]
1135 | flush_space(fs_info, space_info, to_reclaim, flush, true);
|
---
So you weren't fixing the reported problem by this patch. Assigning enum
to an int should be natural so thre's no reason to fix that but for
clarity I don't mind, the patch stays.