btrfs: abort transaction on generation mismatch when marking eb as dirty
[linux-2.6-block.git] / fs / btrfs / free-space-tree.c
index c0e734082dcc4270147ed74b2840934a2b466279..7b598b070700e74583f4fe325b52346ed50f43c0 100644 (file)
@@ -89,7 +89,7 @@ static int add_new_free_space_info(struct btrfs_trans_handle *trans,
                              struct btrfs_free_space_info);
        btrfs_set_free_space_extent_count(leaf, info, 0);
        btrfs_set_free_space_flags(leaf, info, 0);
-       btrfs_mark_buffer_dirty(leaf);
+       btrfs_mark_buffer_dirty(trans, leaf);
 
        ret = 0;
 out:
@@ -287,7 +287,7 @@ int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,
        flags |= BTRFS_FREE_SPACE_USING_BITMAPS;
        btrfs_set_free_space_flags(leaf, info, flags);
        expected_extent_count = btrfs_free_space_extent_count(leaf, info);
-       btrfs_mark_buffer_dirty(leaf);
+       btrfs_mark_buffer_dirty(trans, leaf);
        btrfs_release_path(path);
 
        if (extent_count != expected_extent_count) {
@@ -324,7 +324,7 @@ int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,
                ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
                write_extent_buffer(leaf, bitmap_cursor, ptr,
                                    data_size);
-               btrfs_mark_buffer_dirty(leaf);
+               btrfs_mark_buffer_dirty(trans, leaf);
                btrfs_release_path(path);
 
                i += extent_size;
@@ -430,7 +430,7 @@ int convert_free_space_to_extents(struct btrfs_trans_handle *trans,
        flags &= ~BTRFS_FREE_SPACE_USING_BITMAPS;
        btrfs_set_free_space_flags(leaf, info, flags);
        expected_extent_count = btrfs_free_space_extent_count(leaf, info);
-       btrfs_mark_buffer_dirty(leaf);
+       btrfs_mark_buffer_dirty(trans, leaf);
        btrfs_release_path(path);
 
        nrbits = block_group->length >> block_group->fs_info->sectorsize_bits;
@@ -495,7 +495,7 @@ static int update_free_space_extent_count(struct btrfs_trans_handle *trans,
 
        extent_count += new_extents;
        btrfs_set_free_space_extent_count(path->nodes[0], info, extent_count);
-       btrfs_mark_buffer_dirty(path->nodes[0]);
+       btrfs_mark_buffer_dirty(trans, path->nodes[0]);
        btrfs_release_path(path);
 
        if (!(flags & BTRFS_FREE_SPACE_USING_BITMAPS) &&
@@ -533,7 +533,8 @@ int free_space_test_bit(struct btrfs_block_group *block_group,
        return !!extent_buffer_test_bit(leaf, ptr, i);
 }
 
-static void free_space_set_bits(struct btrfs_block_group *block_group,
+static void free_space_set_bits(struct btrfs_trans_handle *trans,
+                               struct btrfs_block_group *block_group,
                                struct btrfs_path *path, u64 *start, u64 *size,
                                int bit)
 {
@@ -563,7 +564,7 @@ static void free_space_set_bits(struct btrfs_block_group *block_group,
                extent_buffer_bitmap_set(leaf, ptr, first, last - first);
        else
                extent_buffer_bitmap_clear(leaf, ptr, first, last - first);
-       btrfs_mark_buffer_dirty(leaf);
+       btrfs_mark_buffer_dirty(trans, leaf);
 
        *size -= end - *start;
        *start = end;
@@ -656,7 +657,7 @@ static int modify_free_space_bitmap(struct btrfs_trans_handle *trans,
        cur_start = start;
        cur_size = size;
        while (1) {
-               free_space_set_bits(block_group, path, &cur_start, &cur_size,
+               free_space_set_bits(trans, block_group, path, &cur_start, &cur_size,
                                    !remove);
                if (cur_size == 0)
                        break;