]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
closefs.c (write_bgdesc, ext2fs_flush): Fix bug in meta_bg
authorTheodore Ts'o <tytso@mit.edu>
Fri, 8 Nov 2002 14:21:46 +0000 (09:21 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 8 Nov 2002 14:21:46 +0000 (09:21 -0500)
support when the MASTER_SB_ONLY flag is set.  Some of
the descriptor blocks that should have been written out
were getting skipped.

lib/ext2fs/ChangeLog
lib/ext2fs/closefs.c

index acd209c59f13e5bbbd99bacc5711314d213a5d0b..c062080a3ad9efefae41298b02d699b8b1bedff6 100644 (file)
@@ -1,3 +1,10 @@
+2002-11-07    <tytso@snap.thunk.org>
+
+       * closefs.c (write_bgdesc, ext2fs_flush): Fix bug in meta_bg
+               support when the MASTER_SB_ONLY flag is set.  Some of
+               the descriptor blocks that should have been written out
+               were getting skipped.
+
 2002-10-31  Theodore Ts'o  <tytso@mit.edu>
 
        * Release of E2fsprogs 1.30
index c96b7abae9ff6568def807355d6002c14b5c6823..02e04a14833f774a7cb75d8ee32c97a0905ddef7 100644 (file)
@@ -122,7 +122,7 @@ static errcode_t write_bgdesc(ext2_filsys fs, dgrp_t group, blk_t group_block,
 {
        errcode_t       retval;
        char            *group_ptr = (char *) group_shadow;
-       int             j, old_desc_blocks;
+       int             j, old_desc_blocks, mod;
        int             has_super = ext2fs_bg_has_super(fs, group);
        dgrp_t          meta_bg_size, meta_bg;
 
@@ -134,7 +134,8 @@ static errcode_t write_bgdesc(ext2_filsys fs, dgrp_t group, blk_t group_block,
                old_desc_blocks = fs->desc_blocks;
        if (!(fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) ||
            (meta_bg < fs->super->s_first_meta_bg)) {
-               if (!has_super)
+               if (!has_super ||
+                   ((fs->flags & EXT2_FLAG_MASTER_SB_ONLY) && (group != 0)))
                        return 0;
                for (j=0; j < old_desc_blocks; j++) {
                        retval = io_channel_write_blk(fs->io,
@@ -147,9 +148,10 @@ static errcode_t write_bgdesc(ext2_filsys fs, dgrp_t group, blk_t group_block,
        } else {
                if (has_super)
                        group_block++;
-               if (((group % meta_bg_size) == 0) ||
-                   ((group % meta_bg_size) == 1) ||
-                   ((group % meta_bg_size) == (meta_bg_size-1))) {
+               mod = group % meta_bg_size;
+               if ((mod == 0) || (mod == 1) || (mod == (meta_bg_size-1))) {
+                       if (mod && (fs->flags & EXT2_FLAG_MASTER_SB_ONLY))
+                               return 0;
                        return io_channel_write_blk(fs->io, group_block,
                                1, group_ptr + (meta_bg*fs->blocksize));
                }
@@ -180,7 +182,7 @@ static errcode_t write_backup_super(ext2_filsys fs, dgrp_t group,
 
 errcode_t ext2fs_flush(ext2_filsys fs)
 {
-       dgrp_t          i,j,maxgroup;
+       dgrp_t          i,j;
        blk_t           group_block;
        errcode_t       retval;
        unsigned long   fs_state;
@@ -265,10 +267,9 @@ errcode_t ext2fs_flush(ext2_filsys fs)
         * superblocks and group descriptors.
         */
        group_block = fs->super->s_first_data_block;
-       maxgroup = (fs->flags & EXT2_FLAG_MASTER_SB_ONLY) ? 1 :
-               fs->group_desc_count;
-       for (i = 0; i < maxgroup; i++) {
-               if (i && ext2fs_bg_has_super(fs, i)) {
+       for (i = 0; i < fs->group_desc_count; i++) {
+               if (!(fs->flags & EXT2_FLAG_MASTER_SB_ONLY) &&
+                   i && ext2fs_bg_has_super(fs, i)) {
                        retval = write_backup_super(fs, i, group_block,
                                                    super_shadow);
                        if (retval)