Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit b3856da

Browse files
jankarabrauner
authored andcommitted
bcache: Fixup error handling in register_cache()
Coverity has noticed that the printing of error message in register_cache() uses already freed bdev_handle to get to bdev. In fact the problem has been there even before commit "bcache: Convert to bdev_open_by_path()" just a bit more subtle one - cache object itself could have been freed by the time we looked at ca->bdev and we don't hold any reference to bdev either so even that could in principle go away (due to device unplug or similar). Fix all these problems by printing the error message before closing the bdev. Fixes: dc893f51d24a ("bcache: Convert to bdev_open_by_path()") Signed-off-by: Jan Kara <[email protected]> Link: https://lore.kernel.org/r/[email protected] Asked-by: Coly Li <[email protected]> Signed-off-by: Christian Brauner <[email protected]>
1 parent e340dd6 commit b3856da

File tree

1 file changed

+10
-13
lines changed

1 file changed

+10
-13
lines changed

drivers/md/bcache/super.c

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2354,24 +2354,26 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk,
23542354

23552355
ret = cache_alloc(ca);
23562356
if (ret != 0) {
2357+
if (ret == -ENOMEM)
2358+
err = "cache_alloc(): -ENOMEM";
2359+
else if (ret == -EPERM)
2360+
err = "cache_alloc(): cache device is too small";
2361+
else
2362+
err = "cache_alloc(): unknown error";
2363+
pr_notice("error %pg: %s\n", bdev_handle->bdev, err);
23572364
/*
23582365
* If we failed here, it means ca->kobj is not initialized yet,
23592366
* kobject_put() won't be called and there is no chance to
23602367
* call bdev_release() to bdev in bch_cache_release(). So
23612368
* we explicitly call bdev_release() here.
23622369
*/
23632370
bdev_release(bdev_handle);
2364-
if (ret == -ENOMEM)
2365-
err = "cache_alloc(): -ENOMEM";
2366-
else if (ret == -EPERM)
2367-
err = "cache_alloc(): cache device is too small";
2368-
else
2369-
err = "cache_alloc(): unknown error";
2370-
goto err;
2371+
return ret;
23712372
}
23722373

23732374
if (kobject_add(&ca->kobj, bdev_kobj(bdev_handle->bdev), "bcache")) {
2374-
err = "error calling kobject_add";
2375+
pr_notice("error %pg: error calling kobject_add\n",
2376+
bdev_handle->bdev);
23752377
ret = -ENOMEM;
23762378
goto out;
23772379
}
@@ -2389,11 +2391,6 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk,
23892391

23902392
out:
23912393
kobject_put(&ca->kobj);
2392-
2393-
err:
2394-
if (err)
2395-
pr_notice("error %pg: %s\n", ca->bdev_handle->bdev, err);
2396-
23972394
return ret;
23982395
}
23992396

0 commit comments

Comments
 (0)