From: Serge E. Hallyn Date: Fri, 29 Sep 2006 09:01:18 +0000 (-0700) Subject: [PATCH] loop: forward-port resource leak checks from Solar X-Git-Tag: v2.6.19-rc1~690 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7422bf8a6feee6ec0c130fab7080df0cea86ebc;p=linux-2.6 [PATCH] loop: forward-port resource leak checks from Solar Forward port of the patch by Solar and ported by Julio. Compiles, boots, and passes my looptorturetest.sh. Signed-off-by: Serge E. Hallyn Cc: Julio Auto Cc: Solar Designer Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/drivers/block/loop.c b/drivers/block/loop.c index e87b88731a..68b0471ad5 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -820,13 +820,22 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file, lo->lo_number); if (IS_ERR(lo->lo_thread)) { error = PTR_ERR(lo->lo_thread); - lo->lo_thread = NULL; - goto out_putf; + goto out_clr; } lo->lo_state = Lo_bound; wake_up_process(lo->lo_thread); return 0; +out_clr: + lo->lo_thread = NULL; + lo->lo_device = NULL; + lo->lo_backing_file = NULL; + lo->lo_flags = 0; + set_capacity(disks[lo->lo_number], 0); + invalidate_bdev(bdev, 0); + bd_set_size(bdev, 0); + mapping_set_gfp_mask(mapping, lo->old_gfp_mask); + lo->lo_state = Lo_unbound; out_putf: fput(file); out: