# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.1009 -> 1.1010
# fs/reiserfs/stree.c 1.20 -> 1.21
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/03/04
[email protected] 1.1010
# reiserfs: Fix possible transaction overflow when deleting highly fragmented large files.
#
# --------------------------------------------
#
diff -Nru a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c
--- a/fs/reiserfs/stree.c Thu Mar 13 11:44:43 2003
+++ b/fs/reiserfs/stree.c Thu Mar 13 11:44:43 2003
@@ -1125,6 +1125,21 @@
journal_mark_dirty (th, p_s_sb, p_s_bh);
inode->i_blocks -= p_s_sb->s_blocksize / 512;
reiserfs_free_block(th, tmp);
+ /* In case of big fragmentation it is possible that each block
+ freed will cause dirtying of one more bitmap and then we will
+ quickly overflow our transaction space. This is a
+ counter-measure against that scenario */
+ if (journal_transaction_should_end(th, th->t_blocks_allocated)) {
+ int orig_len_alloc = th->t_blocks_allocated ;
+ pathrelse(p_s_path) ;
+
+ journal_end(th, p_s_sb, orig_len_alloc) ;
+ journal_begin(th, p_s_sb, orig_len_alloc) ;
+ reiserfs_update_inode_transaction(inode) ;
+ need_research = 1;
+ break;
+ }
+
if ( item_moved (&s_ih, p_s_path) ) {
need_research = 1;
break ;