summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnna Leuschner <anna.m.leuschner@gmail.com>2012-10-22 21:53:36 +0200
committerJens Axboe <axboe@kernel.dk>2012-10-22 22:00:26 +0200
commit386bc35a2d548c28a5083b2e162a20251b37cab5 (patch)
tree14d3f0ac36cd9b56b535c3e5aa3c6ed152d6cf6b
parentblkcg: stop iteration early if root_rl is the only request list (diff)
downloadlinux-386bc35a2d548c28a5083b2e162a20251b37cab5.tar.xz
linux-386bc35a2d548c28a5083b2e162a20251b37cab5.zip
vfs: fix: don't increase bio_slab_max if krealloc() fails
Without the patch, bio_slab_max, representing bio_slabs capacity, is increased before krealloc() of bio_slabs. If krealloc() fails, bio_slab_max is too high. Fix that by only updating bio_slab_max if krealloc() is successful. Signed-off-by: Anna Leuschner <anna.m.leuschner@gmail.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--fs/bio.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/bio.c b/fs/bio.c
index 9298c65ad9c7..b96fc6ce4855 100644
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -75,6 +75,7 @@ static struct kmem_cache *bio_find_or_create_slab(unsigned int extra_size)
unsigned int sz = sizeof(struct bio) + extra_size;
struct kmem_cache *slab = NULL;
struct bio_slab *bslab, *new_bio_slabs;
+ unsigned int new_bio_slab_max;
unsigned int i, entry = -1;
mutex_lock(&bio_slab_lock);
@@ -97,12 +98,13 @@ static struct kmem_cache *bio_find_or_create_slab(unsigned int extra_size)
goto out_unlock;
if (bio_slab_nr == bio_slab_max && entry == -1) {
- bio_slab_max <<= 1;
+ new_bio_slab_max = bio_slab_max << 1;
new_bio_slabs = krealloc(bio_slabs,
- bio_slab_max * sizeof(struct bio_slab),
+ new_bio_slab_max * sizeof(struct bio_slab),
GFP_KERNEL);
if (!new_bio_slabs)
goto out_unlock;
+ bio_slab_max = new_bio_slab_max;
bio_slabs = new_bio_slabs;
}
if (entry == -1)