From c45c58ab99df0caacaa032470c68626aad562ed9 Mon Sep 17 00:00:00 2001 From: Wang Shilong Date: Sat, 12 Jan 2013 01:19:32 -0800 Subject: [PATCH] --- yaml --- r: 359013 b: refs/heads/master c: 8d8759eb488f9e88fa5f976c4fd7ed205661c872 h: refs/heads/master i: 359011: 6eaf2e9b4d912bd84736a61b8b3c6a38a3e364f2 v: v3 --- [refs] | 2 +- trunk/fs/ext2/inode.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 24762b37b4ec..bfb35ebd8df5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f56426ae4d4414c9c996567710dceecbdfc39acc +refs/heads/master: 8d8759eb488f9e88fa5f976c4fd7ed205661c872 diff --git a/trunk/fs/ext2/inode.c b/trunk/fs/ext2/inode.c index 6363ac66fafa..c3881e56662e 100644 --- a/trunk/fs/ext2/inode.c +++ b/trunk/fs/ext2/inode.c @@ -495,6 +495,10 @@ static int ext2_alloc_branch(struct inode *inode, * parent to disk. */ bh = sb_getblk(inode->i_sb, new_blocks[n-1]); + if (unlikely(!bh)) { + err = -ENOMEM; + goto failed; + } branch[n].bh = bh; lock_buffer(bh); memset(bh->b_data, 0, blocksize); @@ -523,6 +527,14 @@ static int ext2_alloc_branch(struct inode *inode, } *blks = num; return err; + +failed: + for (i = 1; i < n; i++) + bforget(branch[i].bh); + for (i = 0; i < indirect_blks; i++) + ext2_free_blocks(inode, new_blocks[i], 1); + ext2_free_blocks(inode, new_blocks[i], num); + return err; } /**