Index: linux-stage/include/linux/ext3_fs.h =================================================================== --- linux-stage.orig/include/linux/ext3_fs.h +++ linux-stage/include/linux/ext3_fs.h @@ -921,6 +921,7 @@ extern unsigned ext3_list_backups(struct unsigned *five, unsigned *seven); /* super.c */ +extern void ext3_commit_super (struct super_block *, struct ext3_super_block *, int); extern void ext3_error (struct super_block *, const char *, const char *, ...) __attribute__ ((format (printf, 3, 4))); extern void __ext3_std_error (struct super_block *, const char *, int); Index: linux-stage/fs/ext3/super.c =================================================================== --- linux-stage.orig/fs/ext3/super.c +++ linux-stage/fs/ext3/super.c @@ -47,9 +47,6 @@ static int ext3_load_journal(struct supe unsigned long journal_devnum); static int ext3_create_journal(struct super_block *, struct ext3_super_block *, int); -static void ext3_commit_super (struct super_block * sb, - struct ext3_super_block * es, - int sync); static void ext3_mark_recovery_complete(struct super_block * sb, struct ext3_super_block * es); static void ext3_clear_journal_err(struct super_block * sb, @@ -2175,7 +2172,7 @@ static int ext3_create_journal(struct su return 0; } -static void ext3_commit_super (struct super_block * sb, +void ext3_commit_super (struct super_block * sb, struct ext3_super_block * es, int sync) { Index: linux-stage/fs/ext3/namei.c =================================================================== --- linux-stage.orig/fs/ext3/namei.c +++ linux-stage/fs/ext3/namei.c @@ -1591,7 +1591,7 @@ static int ext3_delete_entry (handle_t * struct buffer_head * bh) { struct ext3_dir_entry_2 * de, * pde; - int i; + int i, err; i = 0; pde = NULL; @@ -1601,7 +1601,9 @@ static int ext3_delete_entry (handle_t * return -EIO; if (de == de_del) { BUFFER_TRACE(bh, "get_write_access"); - ext3_journal_get_write_access(handle, bh); + err = ext3_journal_get_write_access(handle, bh); + if (err) + return err; if (pde) pde->rec_len = cpu_to_le16(le16_to_cpu(pde->rec_len) + Index: linux-stage/fs/ext3/inode.c =================================================================== --- linux-stage.orig/fs/ext3/inode.c +++ linux-stage/fs/ext3/inode.c @@ -1838,8 +1838,18 @@ ext3_clear_blocks(handle_t *handle, stru ext3_mark_inode_dirty(handle, inode); ext3_journal_test_restart(handle, inode); if (bh) { + int err; BUFFER_TRACE(bh, "retaking write access"); - ext3_journal_get_write_access(handle, bh); + err = ext3_journal_get_write_access(handle, bh); + if (err) { + struct super_block *sb = inode->i_sb; + struct ext3_super_block *es = EXT3_SB(sb)->s_es; + printk (KERN_CRIT"EXT3-fs: can't continue truncate\n"); + EXT3_SB(sb)->s_mount_state |= EXT3_ERROR_FS; + es->s_state |= cpu_to_le16(EXT3_ERROR_FS); + ext3_commit_super(sb, es, 1); + return; + } } }