* [PATCH 0/2] Fix some -Wmaybe-uninitialized errors
@ 2023-09-05 16:15 Josef Bacik
2023-09-05 16:15 ` [PATCH 1/2] btrfs: make sure to initialize start and len in find_free_dev_extent Josef Bacik
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Josef Bacik @ 2023-09-05 16:15 UTC (permalink / raw)
To: linux-btrfs, kernel-team
Hello,
Jens reported to me two warnings he was seeing with
CONFIG_CC_OPTIMIZE_FOR_SIZE=y set in his .config. We don't see these errors
without this option, and they're not correct warnings. However we've had issues
where -Wmaybe-uninitialized would have caught a real bug, so this warning is
generally valuable. Fix these warnings so we have a clean build. Thanks,
Josef
Josef Bacik (2):
btrfs: make sure to initialize start and len in find_free_dev_extent
btrfs: initialize start_slot in btrfs_log_prealloc_extents
fs/btrfs/tree-log.c | 2 +-
fs/btrfs/volumes.c | 14 ++++++--------
2 files changed, 7 insertions(+), 9 deletions(-)
--
2.41.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] btrfs: make sure to initialize start and len in find_free_dev_extent
2023-09-05 16:15 [PATCH 0/2] Fix some -Wmaybe-uninitialized errors Josef Bacik
@ 2023-09-05 16:15 ` Josef Bacik
2023-09-05 17:30 ` Jens Axboe
2023-09-05 22:48 ` Qu Wenruo
2023-09-05 16:15 ` [PATCH 2/2] btrfs: initialize start_slot in btrfs_log_prealloc_extents Josef Bacik
2023-09-06 16:18 ` [PATCH 0/2] Fix some -Wmaybe-uninitialized errors David Sterba
2 siblings, 2 replies; 10+ messages in thread
From: Josef Bacik @ 2023-09-05 16:15 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Jens Axboe
Jens reported a compiler error when using CONFIG_CC_OPTIMIZE_FOR_SIZE=y
that looks like this
In function ‘gather_device_info’,
inlined from ‘btrfs_create_chunk’ at fs/btrfs/volumes.c:5507:8:
fs/btrfs/volumes.c:5245:48: warning: ‘dev_offset’ may be used uninitialized [-Wmaybe-uninitialized]
5245 | devices_info[ndevs].dev_offset = dev_offset;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
fs/btrfs/volumes.c: In function ‘btrfs_create_chunk’:
fs/btrfs/volumes.c:5196:13: note: ‘dev_offset’ was declared here
5196 | u64 dev_offset;
This occurs because find_free_dev_extent is responsible for setting
dev_offset, however if we get an -ENOMEM at the top of the function
we'll return without setting the value.
This isn't actually a problem because we will see the -ENOMEM in
gather_device_info() and return and not use the uninitialized value,
however we also just don't want the compiler warning so rework the code
slightly in find_free_dev_extent() to make sure it's always setting
*start and *len to avoid the compiler error.
Reported-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
fs/btrfs/volumes.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 4b0e441227b2..08dba911212c 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1594,25 +1594,23 @@ static int find_free_dev_extent(struct btrfs_device *device, u64 num_bytes,
u64 search_start;
u64 hole_size;
u64 max_hole_start;
- u64 max_hole_size;
+ u64 max_hole_size = 0;
u64 extent_end;
u64 search_end = device->total_bytes;
int ret;
int slot;
struct extent_buffer *l;
- search_start = dev_extent_search_start(device);
+ max_hole_start = search_start = dev_extent_search_start(device);
WARN_ON(device->zone_info &&
!IS_ALIGNED(num_bytes, device->zone_info->zone_size));
path = btrfs_alloc_path();
- if (!path)
- return -ENOMEM;
-
- max_hole_start = search_start;
- max_hole_size = 0;
-
+ if (!path) {
+ ret = -ENOMEM;
+ goto out;
+ }
again:
if (search_start >= search_end ||
test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) {
--
2.41.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/2] btrfs: initialize start_slot in btrfs_log_prealloc_extents
2023-09-05 16:15 [PATCH 0/2] Fix some -Wmaybe-uninitialized errors Josef Bacik
2023-09-05 16:15 ` [PATCH 1/2] btrfs: make sure to initialize start and len in find_free_dev_extent Josef Bacik
@ 2023-09-05 16:15 ` Josef Bacik
2023-09-05 17:31 ` Jens Axboe
2023-09-05 22:51 ` Qu Wenruo
2023-09-06 16:18 ` [PATCH 0/2] Fix some -Wmaybe-uninitialized errors David Sterba
2 siblings, 2 replies; 10+ messages in thread
From: Josef Bacik @ 2023-09-05 16:15 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Jens Axboe
Jens reported a compiler warning when using
CONFIG_CC_OPTIMIZE_FOR_SIZE=y that looks like this
fs/btrfs/tree-log.c: In function ‘btrfs_log_prealloc_extents’:
fs/btrfs/tree-log.c:4828:23: warning: ‘start_slot’ may be used
uninitialized [-Wmaybe-uninitialized]
4828 | ret = copy_items(trans, inode, dst_path, path,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4829 | start_slot, ins_nr, 1, 0);
| ~~~~~~~~~~~~~~~~~~~~~~~~~
fs/btrfs/tree-log.c:4725:13: note: ‘start_slot’ was declared here
4725 | int start_slot;
| ^~~~~~~~~~
The compiler is incorrect, as we only use this code when ins_len > 0,
and when ins_len > 0 we have start_slot properly initialized. However
we generally find the -Wmaybe-uninitialized warnings valuable, so
initialize start_slot to get rid of the warning.
Reported-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
fs/btrfs/tree-log.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index d1e46b839519..cbb17b542131 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -4722,7 +4722,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans,
struct extent_buffer *leaf;
int slot;
int ins_nr = 0;
- int start_slot;
+ int start_slot = 0;
int ret;
if (!(inode->flags & BTRFS_INODE_PREALLOC))
--
2.41.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] btrfs: make sure to initialize start and len in find_free_dev_extent
2023-09-05 16:15 ` [PATCH 1/2] btrfs: make sure to initialize start and len in find_free_dev_extent Josef Bacik
@ 2023-09-05 17:30 ` Jens Axboe
2023-09-05 22:48 ` Qu Wenruo
1 sibling, 0 replies; 10+ messages in thread
From: Jens Axboe @ 2023-09-05 17:30 UTC (permalink / raw)
To: Josef Bacik, linux-btrfs, kernel-team
Tested-by: Jens Axboe <axboe@kernel.dk>
--
Jens Axboe
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] btrfs: initialize start_slot in btrfs_log_prealloc_extents
2023-09-05 16:15 ` [PATCH 2/2] btrfs: initialize start_slot in btrfs_log_prealloc_extents Josef Bacik
@ 2023-09-05 17:31 ` Jens Axboe
2023-09-05 22:51 ` Qu Wenruo
1 sibling, 0 replies; 10+ messages in thread
From: Jens Axboe @ 2023-09-05 17:31 UTC (permalink / raw)
To: Josef Bacik, linux-btrfs, kernel-team
Tested-by: Jens Axboe <axboe@kernel.dk>
--
Jens Axboe
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] btrfs: make sure to initialize start and len in find_free_dev_extent
2023-09-05 16:15 ` [PATCH 1/2] btrfs: make sure to initialize start and len in find_free_dev_extent Josef Bacik
2023-09-05 17:30 ` Jens Axboe
@ 2023-09-05 22:48 ` Qu Wenruo
2023-09-06 16:13 ` David Sterba
1 sibling, 1 reply; 10+ messages in thread
From: Qu Wenruo @ 2023-09-05 22:48 UTC (permalink / raw)
To: Josef Bacik, linux-btrfs, kernel-team; +Cc: Jens Axboe
On 2023/9/6 00:15, Josef Bacik wrote:
> Jens reported a compiler error when using CONFIG_CC_OPTIMIZE_FOR_SIZE=y
> that looks like this
>
> In function ‘gather_device_info’,
> inlined from ‘btrfs_create_chunk’ at fs/btrfs/volumes.c:5507:8:
> fs/btrfs/volumes.c:5245:48: warning: ‘dev_offset’ may be used uninitialized [-Wmaybe-uninitialized]
> 5245 | devices_info[ndevs].dev_offset = dev_offset;
> | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
> fs/btrfs/volumes.c: In function ‘btrfs_create_chunk’:
> fs/btrfs/volumes.c:5196:13: note: ‘dev_offset’ was declared here
> 5196 | u64 dev_offset;
>
> This occurs because find_free_dev_extent is responsible for setting
> dev_offset, however if we get an -ENOMEM at the top of the function
> we'll return without setting the value.
>
> This isn't actually a problem because we will see the -ENOMEM in
> gather_device_info() and return and not use the uninitialized value,
> however we also just don't want the compiler warning so rework the code
> slightly in find_free_dev_extent() to make sure it's always setting
> *start and *len to avoid the compiler error.
>
> Reported-by: Jens Axboe <axboe@kernel.dk>
> Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Just one nitpick below.
> ---
> fs/btrfs/volumes.c | 14 ++++++--------
> 1 file changed, 6 insertions(+), 8 deletions(-)
>
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 4b0e441227b2..08dba911212c 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -1594,25 +1594,23 @@ static int find_free_dev_extent(struct btrfs_device *device, u64 num_bytes,
> u64 search_start;
> u64 hole_size;
> u64 max_hole_start;
> - u64 max_hole_size;
> + u64 max_hole_size = 0;
> u64 extent_end;
> u64 search_end = device->total_bytes;
> int ret;
> int slot;
> struct extent_buffer *l;
>
> - search_start = dev_extent_search_start(device);
> + max_hole_start = search_start = dev_extent_search_start(device);
IIRC we don't recommend such assignment, it would be better to go two
lines to do the assignment.
Thanks,
Qu
>
> WARN_ON(device->zone_info &&
> !IS_ALIGNED(num_bytes, device->zone_info->zone_size));
>
> path = btrfs_alloc_path();
> - if (!path)
> - return -ENOMEM;
> -
> - max_hole_start = search_start;
> - max_hole_size = 0;
> -
> + if (!path) {
> + ret = -ENOMEM;
> + goto out;
> + }
> again:
> if (search_start >= search_end ||
> test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) {
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] btrfs: initialize start_slot in btrfs_log_prealloc_extents
2023-09-05 16:15 ` [PATCH 2/2] btrfs: initialize start_slot in btrfs_log_prealloc_extents Josef Bacik
2023-09-05 17:31 ` Jens Axboe
@ 2023-09-05 22:51 ` Qu Wenruo
2023-09-06 16:17 ` David Sterba
1 sibling, 1 reply; 10+ messages in thread
From: Qu Wenruo @ 2023-09-05 22:51 UTC (permalink / raw)
To: Josef Bacik, linux-btrfs, kernel-team; +Cc: Jens Axboe
On 2023/9/6 00:15, Josef Bacik wrote:
> Jens reported a compiler warning when using
> CONFIG_CC_OPTIMIZE_FOR_SIZE=y that looks like this
>
> fs/btrfs/tree-log.c: In function ‘btrfs_log_prealloc_extents’:
> fs/btrfs/tree-log.c:4828:23: warning: ‘start_slot’ may be used
> uninitialized [-Wmaybe-uninitialized]
> 4828 | ret = copy_items(trans, inode, dst_path, path,
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 4829 | start_slot, ins_nr, 1, 0);
> | ~~~~~~~~~~~~~~~~~~~~~~~~~
> fs/btrfs/tree-log.c:4725:13: note: ‘start_slot’ was declared here
> 4725 | int start_slot;
> | ^~~~~~~~~~
>
> The compiler is incorrect, as we only use this code when ins_len > 0,
> and when ins_len > 0 we have start_slot properly initialized. However
> we generally find the -Wmaybe-uninitialized warnings valuable, so
> initialize start_slot to get rid of the warning.
>
> Reported-by: Jens Axboe <axboe@kernel.dk>
> Signed-off-by: Josef Bacik <josef@toxicpanda.com>
I think we're in a dilemma, if we don't do the initialization, bad
compiler may warn.
But if we do the initialization, some static checker may also warn...
Thanks,
Qu
> ---
> fs/btrfs/tree-log.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
> index d1e46b839519..cbb17b542131 100644
> --- a/fs/btrfs/tree-log.c
> +++ b/fs/btrfs/tree-log.c
> @@ -4722,7 +4722,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans,
> struct extent_buffer *leaf;
> int slot;
> int ins_nr = 0;
> - int start_slot;
> + int start_slot = 0;
> int ret;
>
> if (!(inode->flags & BTRFS_INODE_PREALLOC))
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] btrfs: make sure to initialize start and len in find_free_dev_extent
2023-09-05 22:48 ` Qu Wenruo
@ 2023-09-06 16:13 ` David Sterba
0 siblings, 0 replies; 10+ messages in thread
From: David Sterba @ 2023-09-06 16:13 UTC (permalink / raw)
To: Qu Wenruo; +Cc: Josef Bacik, linux-btrfs, kernel-team, Jens Axboe
On Wed, Sep 06, 2023 at 06:48:41AM +0800, Qu Wenruo wrote:
> > - search_start = dev_extent_search_start(device);
> > + max_hole_start = search_start = dev_extent_search_start(device);
>
> IIRC we don't recommend such assignment, it would be better to go two
> lines to do the assignment.
Right, fixed in the commit, thanks.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] btrfs: initialize start_slot in btrfs_log_prealloc_extents
2023-09-05 22:51 ` Qu Wenruo
@ 2023-09-06 16:17 ` David Sterba
0 siblings, 0 replies; 10+ messages in thread
From: David Sterba @ 2023-09-06 16:17 UTC (permalink / raw)
To: Qu Wenruo; +Cc: Josef Bacik, linux-btrfs, kernel-team, Jens Axboe
On Wed, Sep 06, 2023 at 06:51:26AM +0800, Qu Wenruo wrote:
>
>
> On 2023/9/6 00:15, Josef Bacik wrote:
> > Jens reported a compiler warning when using
> > CONFIG_CC_OPTIMIZE_FOR_SIZE=y that looks like this
> >
> > fs/btrfs/tree-log.c: In function ‘btrfs_log_prealloc_extents’:
> > fs/btrfs/tree-log.c:4828:23: warning: ‘start_slot’ may be used
> > uninitialized [-Wmaybe-uninitialized]
> > 4828 | ret = copy_items(trans, inode, dst_path, path,
> > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > 4829 | start_slot, ins_nr, 1, 0);
> > | ~~~~~~~~~~~~~~~~~~~~~~~~~
> > fs/btrfs/tree-log.c:4725:13: note: ‘start_slot’ was declared here
> > 4725 | int start_slot;
> > | ^~~~~~~~~~
> >
> > The compiler is incorrect, as we only use this code when ins_len > 0,
> > and when ins_len > 0 we have start_slot properly initialized. However
> > we generally find the -Wmaybe-uninitialized warnings valuable, so
> > initialize start_slot to get rid of the warning.
> >
> > Reported-by: Jens Axboe <axboe@kernel.dk>
> > Signed-off-by: Josef Bacik <josef@toxicpanda.com>
>
> I think we're in a dilemma, if we don't do the initialization, bad
> compiler may warn.
>
> But if we do the initialization, some static checker may also warn...
I've seen static checkers to accept variables initialized to 0 and
unused, there's a lot of code that does that as a matter of coding style
so there would be too many warnings for a generally good practice.
If we see a warning from something else than compiler then we can
reconsider the way it's fixed but I think we'd see more compiler reports
than static checker reports.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/2] Fix some -Wmaybe-uninitialized errors
2023-09-05 16:15 [PATCH 0/2] Fix some -Wmaybe-uninitialized errors Josef Bacik
2023-09-05 16:15 ` [PATCH 1/2] btrfs: make sure to initialize start and len in find_free_dev_extent Josef Bacik
2023-09-05 16:15 ` [PATCH 2/2] btrfs: initialize start_slot in btrfs_log_prealloc_extents Josef Bacik
@ 2023-09-06 16:18 ` David Sterba
2 siblings, 0 replies; 10+ messages in thread
From: David Sterba @ 2023-09-06 16:18 UTC (permalink / raw)
To: Josef Bacik; +Cc: linux-btrfs, kernel-team
On Tue, Sep 05, 2023 at 12:15:22PM -0400, Josef Bacik wrote:
> Hello,
>
> Jens reported to me two warnings he was seeing with
> CONFIG_CC_OPTIMIZE_FOR_SIZE=y set in his .config. We don't see these errors
> without this option, and they're not correct warnings. However we've had issues
> where -Wmaybe-uninitialized would have caught a real bug, so this warning is
> generally valuable. Fix these warnings so we have a clean build. Thanks,
>
> Josef
>
> Josef Bacik (2):
> btrfs: make sure to initialize start and len in find_free_dev_extent
> btrfs: initialize start_slot in btrfs_log_prealloc_extents
Added to misc-next, thanks.
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-09-06 16:25 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-05 16:15 [PATCH 0/2] Fix some -Wmaybe-uninitialized errors Josef Bacik
2023-09-05 16:15 ` [PATCH 1/2] btrfs: make sure to initialize start and len in find_free_dev_extent Josef Bacik
2023-09-05 17:30 ` Jens Axboe
2023-09-05 22:48 ` Qu Wenruo
2023-09-06 16:13 ` David Sterba
2023-09-05 16:15 ` [PATCH 2/2] btrfs: initialize start_slot in btrfs_log_prealloc_extents Josef Bacik
2023-09-05 17:31 ` Jens Axboe
2023-09-05 22:51 ` Qu Wenruo
2023-09-06 16:17 ` David Sterba
2023-09-06 16:18 ` [PATCH 0/2] Fix some -Wmaybe-uninitialized errors David Sterba
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox