Fix writing external journals on big-endian machines

Fix a bug when writing an external journal device on an big
endian machine (such as a S/390), where when the number of
block groups is zero, we never end up writing out the
primary superblock at all.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
bitmap-optimize
Theodore Ts'o 2005-11-12 23:30:39 -05:00
parent dd947da232
commit 0d961040fe
2 changed files with 25 additions and 16 deletions

View File

@ -1,3 +1,10 @@
2005-11-09 Theodore Ts'o <tytso@mit.edu>
* Fix a bug when writing an external journal device on an big
endian machine (such as a S/390), where when the number of
block groups is zero, we never end up writing out the
primary superblock at all.
2005-09-24 Theodore Ts'o <tytso@mit.edu>
* ext2fs.h, bb_inode.c, closefs.c, initialize.c, mkdir.c,

View File

@ -250,14 +250,6 @@ errcode_t ext2fs_flush(ext2_filsys fs)
group_shadow = fs->group_desc;
#endif
/*
* If this is an external journal device, don't write out the
* block group descriptors or any of the backup superblocks
*/
if (fs->super->s_feature_incompat &
EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)
goto write_primary_superblock_only;
/*
* Set the state of the FS to be non-valid. (The state has
* already been backed up earlier, and will be restored after
@ -271,6 +263,14 @@ errcode_t ext2fs_flush(ext2_filsys fs)
}
#endif
/*
* If this is an external journal device, don't write out the
* block group descriptors or any of the backup superblocks
*/
if (fs->super->s_feature_incompat &
EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)
goto write_primary_superblock_only;
/*
* Write out the master group descriptors, and the backup
* superblocks and group descriptors.
@ -311,14 +311,6 @@ errcode_t ext2fs_flush(ext2_filsys fs)
goto errout;
}
}
fs->super->s_block_group_nr = 0;
fs->super->s_state = fs_state;
#ifdef EXT2FS_ENABLE_SWAPFS
if (fs->flags & EXT2_FLAG_SWAP_BYTES) {
*super_shadow = *fs->super;
ext2fs_swap_super(super_shadow);
}
#endif
/*
* If the write_bitmaps() function is present, call it to
@ -340,6 +332,16 @@ write_primary_superblock_only:
* out to disk first, just to avoid a race condition with an
* insy-tinsy window....
*/
fs->super->s_block_group_nr = 0;
fs->super->s_state = fs_state;
#ifdef EXT2FS_ENABLE_SWAPFS
if (fs->flags & EXT2_FLAG_SWAP_BYTES) {
*super_shadow = *fs->super;
ext2fs_swap_super(super_shadow);
}
#endif
retval = io_channel_flush(fs->io);
retval = write_primary_superblock(fs, super_shadow);
if (retval)