When compiling the bcachefs-tools, the following compilation warning
is reported:
libbcachefs/six.c: In function ‘__do_six_trylock’:
libbcachefs/six.c:90:12: warning: ‘old’ may be used uninitialized in this
function [-Wmaybe-uninitialized]
90 | if (!(old & SIX_LOCK_HELD_intent)) {
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
This is also a false altert. Only when @type=SIX_LOCK_write and @try=false
are passed in __do_six_trylock, the second condition branch would enter
which does not initialize the @old variable. But six_set_owner will not
use @old if @type is not SIX_LOCK_intent. There should be nothing wrong
in logical too.
Although the report itself is a false alert, we can elimate the unitialize
compilation warning by assigning @old in front.
Fixes: 84a37cbf62e0 ("six locks: Wakeup now takes lock on behalf of waiter")
Signed-off-by: Hongbo Li <[email protected]>
---
v3:
- Keep the lock state reading in original branch as Kent's suggestion.
v2:
https://lore.kernel.org/linux-bcachefs/[email protected]/T/#u
- Fix the error about reading lock->state introduced in v1.
v1:
https://lore.kernel.org/all/[email protected]/T/#u
fs/bcachefs/six.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/bcachefs/six.c b/fs/bcachefs/six.c
index 3a494c5d1247..086f045dbaa9 100644
--- a/fs/bcachefs/six.c
+++ b/fs/bcachefs/six.c
@@ -118,11 +118,11 @@ static int __do_six_trylock(struct six_lock *lock, enum
six_lock_type type,
struct task_struct *task, bool try)
{
int ret;
- u32 old;
+ u32 old = atomic_read(&lock->state);
EBUG_ON(type == SIX_LOCK_write && lock->owner != task);
EBUG_ON(type == SIX_LOCK_write &&
- (try != !(atomic_read(&lock->state) & SIX_LOCK_HELD_write)));
+ (try != !(old & SIX_LOCK_HELD_write)));
/*
* Percpu reader mode:
--
2.34.1