btrfs: fix dip leak
authorDaniel J Blueman <daniel.blueman@gmail.com>
Wed, 9 Mar 2011 16:46:42 +0000 (16:46 +0000)
committerChris Mason <chris.mason@oracle.com>
Thu, 10 Mar 2011 16:21:49 +0000 (11:21 -0500)
The btrfs DIO code leaks dip structs when dip->csums allocation
fails; bio->bi_end_io isn't set at the point where the free_ordered
branch is consequently taken, thus bio_endio doesn't call the function
which would free it in the normal case. Fix.

Signed-off-by: Daniel J Blueman <daniel.blueman@gmail.com>
Acked-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/inode.c

index 44b926646e33912e2a4df629aa76b4fd8ae92c72..e7a8303328b2eeb5a7397a94e5f279ebadebf0bf 100644 (file)
@@ -6058,6 +6058,7 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode,
        if (!skip_sum) {
                dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS);
                if (!dip->csums) {
+                       kfree(dip);
                        ret = -ENOMEM;
                        goto free_ordered;
                }