vserver 2.0 rc7
[linux-2.6.git] / fs / ext2 / inode.c
index 069e9aa..0290ba2 100644 (file)
@@ -53,6 +53,19 @@ static inline int ext2_inode_is_fast_symlink(struct inode *inode)
                inode->i_blocks - ea_blocks == 0);
 }
 
+/*
+ * Called at each iput().
+ *
+ * The inode may be "bad" if ext2_read_inode() saw an error from
+ * ext2_get_inode(), so we need to check that to avoid freeing random disk
+ * blocks.
+ */
+void ext2_put_inode(struct inode *inode)
+{
+       if (!is_bad_inode(inode))
+               ext2_discard_prealloc(inode);
+}
+
 static void ext2_truncate_nocheck (struct inode * inode);
 
 /*
@@ -629,6 +642,12 @@ ext2_nobh_prepare_write(struct file *file, struct page *page,
        return nobh_prepare_write(page,from,to,ext2_get_block);
 }
 
+static int ext2_nobh_writepage(struct page *page,
+                       struct writeback_control *wbc)
+{
+       return nobh_writepage(page, ext2_get_block, wbc);
+}
+
 static sector_t ext2_bmap(struct address_space *mapping, sector_t block)
 {
        return generic_block_bmap(mapping,block,ext2_get_block);
@@ -678,7 +697,7 @@ struct address_space_operations ext2_aops = {
 struct address_space_operations ext2_nobh_aops = {
        .readpage               = ext2_readpage,
        .readpages              = ext2_readpages,
-       .writepage              = ext2_writepage,
+       .writepage              = ext2_nobh_writepage,
        .sync_page              = block_sync_page,
        .prepare_write          = ext2_nobh_prepare_write,
        .commit_write           = nobh_commit_write,