aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext2
diff options
context:
space:
mode:
authorWang Shilong <wangsl-fnst@cn.fujitsu.com>2013-01-12 04:19:32 -0500
committerJan Kara <jack@suse.cz>2013-01-21 05:19:56 -0500
commit8d8759eb488f9e88fa5f976c4fd7ed205661c872 (patch)
tree3c33cd06749c2c1caba82b3fcab64789c9f3aab0 /fs/ext2
parentf56426ae4d4414c9c996567710dceecbdfc39acc (diff)
Ext2: free memory allocated and forget buffer head when io error happens
Add a necessary check when an io error happens. If io error happens,free the memory allocated and forget buffer head. Signed-off-by: Wang Shilong <wangsl-fnst@cn.fujitsu.com> Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext2')
-rw-r--r--fs/ext2/inode.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c
index 6363ac66fafa..c3881e56662e 100644
--- a/fs/ext2/inode.c
+++ b/fs/ext2/inode.c
@@ -495,6 +495,10 @@ static int ext2_alloc_branch(struct inode *inode,
495 * parent to disk. 495 * parent to disk.
496 */ 496 */
497 bh = sb_getblk(inode->i_sb, new_blocks[n-1]); 497 bh = sb_getblk(inode->i_sb, new_blocks[n-1]);
498 if (unlikely(!bh)) {
499 err = -ENOMEM;
500 goto failed;
501 }
498 branch[n].bh = bh; 502 branch[n].bh = bh;
499 lock_buffer(bh); 503 lock_buffer(bh);
500 memset(bh->b_data, 0, blocksize); 504 memset(bh->b_data, 0, blocksize);
@@ -523,6 +527,14 @@ static int ext2_alloc_branch(struct inode *inode,
523 } 527 }
524 *blks = num; 528 *blks = num;
525 return err; 529 return err;
530
531failed:
532 for (i = 1; i < n; i++)
533 bforget(branch[i].bh);
534 for (i = 0; i < indirect_blks; i++)
535 ext2_free_blocks(inode, new_blocks[i], 1);
536 ext2_free_blocks(inode, new_blocks[i], num);
537 return err;
526} 538}
527 539
528/** 540/**