]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/ext2/inode.c
Merge tag 'writeback-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/wfg...
[karo-tx-linux.git] / fs / ext2 / inode.c
index 264d315f6c4753d6bee17f28ea86c6497b560449..c3881e56662efac8c80ec409c5808771303ed24f 100644 (file)
@@ -79,6 +79,7 @@ void ext2_evict_inode(struct inode * inode)
        truncate_inode_pages(&inode->i_data, 0);
 
        if (want_delete) {
+               sb_start_intwrite(inode->i_sb);
                /* set dtime */
                EXT2_I(inode)->i_dtime  = get_seconds();
                mark_inode_dirty(inode);
@@ -98,8 +99,10 @@ void ext2_evict_inode(struct inode * inode)
        if (unlikely(rsv))
                kfree(rsv);
 
-       if (want_delete)
+       if (want_delete) {
                ext2_free_inode(inode);
+               sb_end_intwrite(inode->i_sb);
+       }
 }
 
 typedef struct {
@@ -492,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);
@@ -520,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;
 }
 
 /**