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

staging: android: ashmem.c: destroy slabs when init fails

when ashmem init fails, destroy the slabs, leave
no garbage.

Signed-off-by: Wenwei Tao <ww.tao0320@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Wenwei Tao and committed by
Greg Kroah-Hartman
a2df4e33 59dfafd0

+11 -4
+11 -4
drivers/staging/android/ashmem.c
··· 831 831 832 832 static int __init ashmem_init(void) 833 833 { 834 - int ret; 834 + int ret = -ENOMEM; 835 835 836 836 ashmem_area_cachep = kmem_cache_create("ashmem_area_cache", 837 837 sizeof(struct ashmem_area), 838 838 0, 0, NULL); 839 839 if (unlikely(!ashmem_area_cachep)) { 840 840 pr_err("failed to create slab cache\n"); 841 - return -ENOMEM; 841 + goto out; 842 842 } 843 843 844 844 ashmem_range_cachep = kmem_cache_create("ashmem_range_cache", ··· 846 846 0, 0, NULL); 847 847 if (unlikely(!ashmem_range_cachep)) { 848 848 pr_err("failed to create slab cache\n"); 849 - return -ENOMEM; 849 + goto out_free1; 850 850 } 851 851 852 852 ret = misc_register(&ashmem_misc); 853 853 if (unlikely(ret)) { 854 854 pr_err("failed to register misc device!\n"); 855 - return ret; 855 + goto out_free2; 856 856 } 857 857 858 858 register_shrinker(&ashmem_shrinker); ··· 860 860 pr_info("initialized\n"); 861 861 862 862 return 0; 863 + 864 + out_free2: 865 + kmem_cache_destroy(ashmem_range_cachep); 866 + out_free1: 867 + kmem_cache_destroy(ashmem_area_cachep); 868 + out: 869 + return ret; 863 870 } 864 871 device_initcall(ashmem_init);