diff options
author | Jens Axboe <axboe@kernel.dk> | 2022-05-29 07:13:09 -0600 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2022-05-29 07:36:31 -0600 |
commit | 605f7415ecfb426610195dd6c7577b30592b3369 (patch) | |
tree | fa9c0bb18d2267c20a6a6f69d719ea427989efe9 /block | |
parent | ebd076bf7d5deef488ec7ebc3fdbf781eafae269 (diff) | |
download | linux-stable-605f7415ecfb426610195dd6c7577b30592b3369.tar.gz linux-stable-605f7415ecfb426610195dd6c7577b30592b3369.tar.bz2 linux-stable-605f7415ecfb426610195dd6c7577b30592b3369.zip |
block: make bioset_exit() fully resilient against being called twice
Most of bioset_exit() is fine being called twice, as it clears the
various allocations etc when they are freed. The exception is
bio_alloc_cache_destroy(), which does not clear ->cache when it has
freed it.
This isn't necessarily a bug, but can be if buggy users does call the
exit path more then once, or with just a memset() bioset which has
never been initialized. dm appears to be one such user.
Fixes: be4d234d7aeb ("bio: add allocation cache abstraction")
Link: https://lore.kernel.org/linux-block/YpK7m+14A+pZKs5k@casper.infradead.org/
Reported-by: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
-rw-r--r-- | block/bio.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/block/bio.c b/block/bio.c index 8a1b3d650a7f..f92d0223247b 100644 --- a/block/bio.c +++ b/block/bio.c @@ -722,6 +722,7 @@ static void bio_alloc_cache_destroy(struct bio_set *bs) bio_alloc_cache_prune(cache, -1U); } free_percpu(bs->cache); + bs->cache = NULL; } /** |