Plain text patch.
# 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.744   -> 1.745
#       fs/reiserfs/resize.c    1.6     -> 1.7
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/08/13      [email protected]       1.745
# Fix a problem that when doing online resizing, resizer code forgot to update bitmap usage counters.
# --------------------------------------------
#
diff -Nru a/fs/reiserfs/resize.c b/fs/reiserfs/resize.c
--- a/fs/reiserfs/resize.c      Tue Aug 13 19:38:26 2002
+++ b/fs/reiserfs/resize.c      Tue Aug 13 19:38:26 2002
@@ -110,9 +110,9 @@
               return -ENOMEM;
           }
           for (i = 0; i < bmap_nr; i++)
-               bitmap[i].bh = SB_AP_BITMAP(s)[i].bh;
+               bitmap[i] = SB_AP_BITMAP(s)[i];
           for (i = bmap_nr; i < bmap_nr_new; i++) {
-               bitmap[i].bh = getblk(s->s_dev, i * s->s_blocksize * 8, s->s_blocksize);
+               bitmap[i].bh = sb_getblk(s, i * s->s_blocksize * 8);
               memset(bitmap[i].bh->b_data, 0, sb->s_blocksize);
               reiserfs_test_and_set_le_bit(0, bitmap[i].bh->b_data);

@@ -120,6 +120,8 @@
               mark_buffer_uptodate(bitmap[i].bh, 1);
               ll_rw_block(WRITE, 1, &bitmap[i].bh);
               wait_on_buffer(bitmap[i].bh);
+               bitmap[i].first_zero_hint=1;
+               bitmap[i].free_count = s->s_blocksize * 8 - 1;
           }
           /* free old bitmap blocks array */
           vfree(SB_AP_BITMAP(s));
@@ -135,6 +137,9 @@
       for (i = block_r; i < s->s_blocksize * 8; i++)
           reiserfs_test_and_clear_le_bit(i,
                                          SB_AP_BITMAP(s)[bmap_nr - 1].bh->b_data);
+       SB_AP_BITMAP(s)[bmap_nr - 1].free_count += s->s_blocksize * 8 - block_r;
+       if ( !SB_AP_BITMAP(s)[bmap_nr - 1].first_zero_hint)
+           SB_AP_BITMAP(s)[bmap_nr - 1].first_zero_hint = block_r;
       journal_mark_dirty(&th, s, SB_AP_BITMAP(s)[bmap_nr - 1].bh);

       reiserfs_prepare_for_journal(s, SB_AP_BITMAP(s)[bmap_nr_new - 1].bh, 1);
@@ -142,7 +147,11 @@
           reiserfs_test_and_set_le_bit(i,
                                        SB_AP_BITMAP(s)[bmap_nr_new - 1].bh->b_data);
       journal_mark_dirty(&th, s, SB_AP_BITMAP(s)[bmap_nr_new - 1].bh);
-
+
+       SB_AP_BITMAP(s)[bmap_nr_new - 1].free_count -= s->s_blocksize * 8 - block_r_new;
+       /* Extreme case where last bitmap is the only valid block in itself. */
+       if ( !SB_AP_BITMAP(s)[bmap_nr_new - 1].free_count )
+           SB_AP_BITMAP(s)[bmap_nr_new - 1].first_zero_hint = 0;
       /* update super */
       reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1) ;
       free_blocks = SB_FREE_BLOCKS(s);