File block allocation if sb_getblk() returns NULL. unlikely() is added because it is called in a loop and we've been OK without the check until now. Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxx> --- fs/ext2/inode.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 940c961..4acdc17 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -497,6 +497,11 @@ 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 = -EIO; + goto failed; + } + branch[n].bh = bh; lock_buffer(bh); memset(bh->b_data, 0, blocksize); @@ -525,6 +530,14 @@ static int ext2_alloc_branch(struct inode *inode, } *blks = num; return err; +failed: + /* Allocation failed, free what we already allocated */ + 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; } /** -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html