Re: [PATCH resent] bcache: Fix exception handling in mca_alloc()

From: Coly Li
Date: Sat Mar 25 2023 - 06:16:43 EST


On 3/25/23 5:31 PM, Markus Elfring wrote:
Date: Mon, 20 Mar 2023 13:13:37 +0100

The label “err” was used to jump to another pointer check despite of
the detail in the implementation of the function “mca_alloc”
that it was determined already that a corresponding variable contained
a null pointer because of a failed function call “mca_bucket_alloc”.


Hmm, I don't get the exact point from the above long sentence. Could you please describe a bit more specific where the problem is at exact line number of the code?

* Thus use a more appropriate label instead.

So far I am not convinced the modified label is more appropriate.


* Delete a redundant check.

Where is the location of the redundant check?




This issue was detected by using the Coccinelle software.

Just curious, what is the warning reported by the mentioned software ?



Fixes: cafe563591446cf80bfbc2fe3bc72a2e36cf1060 ("bcache: A block layer cache")
Signed-off-by: Markus Elfring <elfring@xxxxxxxxxxxxxxxxxxxxx>
---
drivers/md/bcache/btree.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index 147c493a989a..166afd7ec499 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -921,18 +921,18 @@ static struct btree *mca_alloc(struct cache_set *c, struct btree_op *op,
if (!mca_reap(b, 0, false)) {
mca_data_alloc(b, k, __GFP_NOWARN|GFP_NOIO);
if (!b->keys.set[0].data)
- goto err;
+ goto unlock;
else
goto out;
}

b = mca_bucket_alloc(c, k, __GFP_NOWARN|GFP_NOIO);
if (!b)
- goto err;
+ goto unlock;

BUG_ON(!down_write_trylock(&b->lock));
if (!b->keys.set->data)
- goto err;
+ goto unlock;
out:
BUG_ON(b->io_mutex.count != 1);

@@ -955,9 +955,8 @@ static struct btree *mca_alloc(struct cache_set *c, struct btree_op *op,
&b->c->expensive_debug_checks);

return b;
-err:
- if (b)
- rw_unlock(true, b);
+unlock:
+ rw_unlock(true, b);

If b is NULL, is it a bit fishing to send the NULL pointer into rw_unlock() ?


Thanks in advance for more information.


Coly Li