Btrfs: Fix super block updates during transaction commit
[linux-2.6-block.git] / fs / btrfs / transaction.c
index a5a63d471e432fd4c2f6667fe6190492188c2883..3b2face593e98cf2bb2bb98fc94ed0cddd982cf3 100644 (file)
@@ -380,6 +380,12 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
                else
                        prev_trans->use_count++;
        }
+       btrfs_set_super_generation(&root->fs_info->super_copy,
+                                  cur_trans->transid);
+       btrfs_set_super_root(&root->fs_info->super_copy,
+                            bh_blocknr(root->fs_info->tree_root->node));
+       memcpy(root->fs_info->disk_super, &root->fs_info->super_copy,
+              sizeof(root->fs_info->super_copy));
        mutex_unlock(&root->fs_info->trans_mutex);
        mutex_unlock(&root->fs_info->fs_mutex);
        ret = btrfs_write_and_wait_transaction(trans, root);
@@ -389,8 +395,6 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
                put_transaction(prev_trans);
                mutex_unlock(&root->fs_info->trans_mutex);
        }
-       btrfs_set_super_generation(root->fs_info->disk_super,
-                                  cur_trans->transid);
        BUG_ON(ret);
        write_ctree_super(trans, root);