Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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 <jack@suse.cz>
Link: https://lore.kernel.org/r/20231004093757.11560-1-jack@suse.cz
Asked-by: Coly Li <colyli@suse.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Jan Kara and committed by
Christian Brauner
b3856da7 e340dd63

+10 -13
+10 -13
drivers/md/bcache/super.c
··· 2354 2354 2355 2355 ret = cache_alloc(ca); 2356 2356 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); 2357 2364 /* 2358 2365 * If we failed here, it means ca->kobj is not initialized yet, 2359 2366 * kobject_put() won't be called and there is no chance to ··· 2368 2361 * we explicitly call bdev_release() here. 2369 2362 */ 2370 2363 bdev_release(bdev_handle); 2371 - if (ret == -ENOMEM) 2372 - err = "cache_alloc(): -ENOMEM"; 2373 - else if (ret == -EPERM) 2374 - err = "cache_alloc(): cache device is too small"; 2375 - else 2376 - err = "cache_alloc(): unknown error"; 2377 - goto err; 2364 + return ret; 2378 2365 } 2379 2366 2380 2367 if (kobject_add(&ca->kobj, bdev_kobj(bdev_handle->bdev), "bcache")) { 2381 - err = "error calling kobject_add"; 2368 + pr_notice("error %pg: error calling kobject_add\n", 2369 + bdev_handle->bdev); 2382 2370 ret = -ENOMEM; 2383 2371 goto out; 2384 2372 } ··· 2391 2389 2392 2390 out: 2393 2391 kobject_put(&ca->kobj); 2394 - 2395 - err: 2396 - if (err) 2397 - pr_notice("error %pg: %s\n", ca->bdev_handle->bdev, err); 2398 - 2399 2392 return ret; 2400 2393 } 2401 2394