Btrfs: avoid potential super block corruption
authorYan Zheng <zheng.yan@oracle.com>
Mon, 5 Jan 2009 20:43:42 +0000 (15:43 -0500)
committerChris Mason <chris.mason@oracle.com>
Mon, 5 Jan 2009 20:43:42 +0000 (15:43 -0500)
The data in fs_info->super_for_commit are zeros before the
first transaction commit. If tree log sync and system crash
both occur before the first transaction commit, super block
will get corrupted.

This fixes it by properly filling in the super_for_commit field at
open time.

Signed-off-by: Yan Zheng <zheng.yan@oracle.com>
fs/btrfs/disk-io.c

index 40a540f311619f28b8cdd448ab5ed78dec8a3b44..dae25e78a6b7d33abf19572e792f996ea3ecc330 100644 (file)
@@ -1609,6 +1609,8 @@ struct btrfs_root *open_ctree(struct super_block *sb,
                goto fail_iput;
 
        memcpy(&fs_info->super_copy, bh->b_data, sizeof(fs_info->super_copy));
+       memcpy(&fs_info->super_for_commit, &fs_info->super_copy,
+              sizeof(fs_info->super_for_commit));
        brelse(bh);
 
        memcpy(fs_info->fsid, fs_info->super_copy.fsid, BTRFS_FSID_SIZE);
@@ -1790,7 +1792,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
 
        btrfs_read_block_groups(extent_root);
 
-       fs_info->generation = generation + 1;
+       fs_info->generation = generation;
        fs_info->last_trans_committed = generation;
        fs_info->data_alloc_profile = (u64)-1;
        fs_info->metadata_alloc_profile = (u64)-1;