ext4: do not destroy ext4_groupinfo_caches if ext4_mb_init() fails
authorAndrey Tsyvarev <tsyvarev@ispras.ru>
Mon, 12 May 2014 16:34:21 +0000 (12:34 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 12 May 2014 16:34:21 +0000 (12:34 -0400)
Caches from 'ext4_groupinfo_caches' may be in use by other mounts,
which have already existed.  So, it is incorrect to destroy them when
newly requested mount fails.

Found by Linux File System Verification project (linuxtesting.org).

Signed-off-by: Andrey Tsyvarev <tsyvarev@ispras.ru>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Reviewed-by: Lukas Czerner <lczerner@redhat.com>
fs/ext4/mballoc.c

index c8238a26818cd9ef7567d0552a60a461bfd1f76e..3235a2fd7e7e785850ae75c2d80a82e4834ecc54 100644 (file)
@@ -2617,7 +2617,7 @@ int ext4_mb_init(struct super_block *sb)
        sbi->s_locality_groups = alloc_percpu(struct ext4_locality_group);
        if (sbi->s_locality_groups == NULL) {
                ret = -ENOMEM;
-               goto out_free_groupinfo_slab;
+               goto out;
        }
        for_each_possible_cpu(i) {
                struct ext4_locality_group *lg;
@@ -2642,8 +2642,6 @@ int ext4_mb_init(struct super_block *sb)
 out_free_locality_groups:
        free_percpu(sbi->s_locality_groups);
        sbi->s_locality_groups = NULL;
-out_free_groupinfo_slab:
-       ext4_groupinfo_destroy_slabs();
 out:
        kfree(sbi->s_mb_offsets);
        sbi->s_mb_offsets = NULL;