summaryrefslogtreecommitdiffstats
path: root/e2fsprogs-1.41.4-update-sb-journal-backup.patch
diff options
context:
space:
mode:
Diffstat (limited to 'e2fsprogs-1.41.4-update-sb-journal-backup.patch')
-rw-r--r--e2fsprogs-1.41.4-update-sb-journal-backup.patch89
1 files changed, 89 insertions, 0 deletions
diff --git a/e2fsprogs-1.41.4-update-sb-journal-backup.patch b/e2fsprogs-1.41.4-update-sb-journal-backup.patch
new file mode 100644
index 0000000..1f26210
--- /dev/null
+++ b/e2fsprogs-1.41.4-update-sb-journal-backup.patch
@@ -0,0 +1,89 @@
+This was reported in Fedora, since the livecd creator does
+a lot of resizing.
+
+If we've moved the journal blocks during resize (more likely now,
+due to the journal being in the middle) the backup blocks in the
+superblock don't get updated, and a subsequent e2fsck will find
+issues:
+
+e2fsck 1.41.6 (30-May-2009)
+Backing up journal inode block information.
+
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+
+/mnt/test/img: ***** FILE SYSTEM WAS MODIFIED *****
+/mnt/test/img: 11/16000 files (0.0% non-contiguous), 17789/38400 blocks
+
+This can be shown in a simple test:
+
+# dd if=/dev/zero of=img bs=1 count=0 seek=3000M
+# mke2fs -t ext4 -F img
+# resize2fs img 150M
+# e2fsck -f img
+
+(thanks to the Fedora reporter Mads Kiilerich for the testcase!
+https://bugzilla.redhat.com/show_bug.cgi?id=506105#c2)
+
+So, update the backup journal in the superblock before resize2fs exits.
+
+Signed-off-by: Eric Sandeen <sandeen@redhat.com>
+Resolves-RH-Bugzilla: 505339
+---
+
+diff --git a/resize/resize2fs.c b/resize/resize2fs.c
+index 0d5dc81..63c469f 100644
+--- a/resize/resize2fs.c
++++ b/resize/resize2fs.c
+@@ -49,6 +49,7 @@ static errcode_t inode_ref_fix(ext2_resize_t rfs);
+ static errcode_t move_itables(ext2_resize_t rfs);
+ static errcode_t fix_resize_inode(ext2_filsys fs);
+ static errcode_t ext2fs_calculate_summary_stats(ext2_filsys fs);
++static errcode_t fix_sb_journal_backup(ext2_filsys fs);
+
+ /*
+ * Some helper CPP macros
+@@ -148,6 +149,10 @@ errcode_t resize_fs(ext2_filsys fs, blk_t *new_size, int flags,
+ if (retval)
+ goto errout;
+
++ retval = fix_sb_journal_backup(rfs->new_fs);
++ if (retval)
++ goto errout;
++
+ rfs->new_fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
+ retval = ext2fs_close(rfs->new_fs);
+ if (retval)
+@@ -1857,6 +1862,28 @@ static errcode_t ext2fs_calculate_summary_stats(ext2_filsys fs)
+ }
+
+ /*
++ * Journal may have been relocated; update the backup journal blocks
++ * in the superblock.
++ */
++static errcode_t fix_sb_journal_backup(ext2_filsys fs)
++{
++ errcode_t retval;
++ struct ext2_inode inode;
++
++ if (!(fs->super->s_feature_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL))
++ return 0;
++
++ retval = ext2fs_read_inode(fs, fs->super->s_journal_inum, &inode);
++ if (retval)
++ return retval;
++ memcpy(fs->super->s_jnl_blocks, inode.i_block, EXT2_N_BLOCKS*4);
++ fs->super->s_jnl_blocks[16] = inode.i_size;
++ fs->super->s_jnl_backup_type = EXT3_JNL_BACKUP_BLOCKS;
++ ext2fs_mark_super_dirty(fs);
++ return 0;
++}
++
++/*
+ * calcluate the minimum number of blocks the given fs can be resized to
+ */
+ blk_t calculate_minimum_resize_size(ext2_filsys fs)
+