Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

btrfs: abort transaction on generation mismatch when marking eb as dirty

When marking an extent buffer as dirty, at btrfs_mark_buffer_dirty(),
we check if its generation matches the running transaction and if not we
just print a warning. Such mismatch is an indicator that something really
went wrong and only printing a warning message (and stack trace) is not
enough to prevent a corruption. Allowing a transaction to commit with such
an extent buffer will trigger an error if we ever try to read it from disk
due to a generation mismatch with its parent generation.

So abort the current transaction with -EUCLEAN if we notice a generation
mismatch. For this we need to pass a transaction handle to
btrfs_mark_buffer_dirty() which is always available except in test code,
in which case we can pass NULL since it operates on dummy extent buffers
and all test roots have a single node/leaf (root node at level 0).

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>

authored by

Filipe Manana and committed by
David Sterba
50564b65 bc27d6f0

+205 -169
+2 -2
fs/btrfs/block-group.c
··· 2601 2601 btrfs_set_dev_extent_chunk_offset(leaf, extent, chunk_offset); 2602 2602 2603 2603 btrfs_set_dev_extent_length(leaf, extent, num_bytes); 2604 - btrfs_mark_buffer_dirty(leaf); 2604 + btrfs_mark_buffer_dirty(trans, leaf); 2605 2605 out: 2606 2606 btrfs_free_path(path); 2607 2607 return ret; ··· 3025 3025 cache->global_root_id); 3026 3026 btrfs_set_stack_block_group_flags(&bgi, cache->flags); 3027 3027 write_extent_buffer(leaf, &bgi, bi, sizeof(bgi)); 3028 - btrfs_mark_buffer_dirty(leaf); 3028 + btrfs_mark_buffer_dirty(trans, leaf); 3029 3029 fail: 3030 3030 btrfs_release_path(path); 3031 3031 /*
+59 -50
fs/btrfs/ctree.c
··· 359 359 return ret; 360 360 } 361 361 362 - btrfs_mark_buffer_dirty(cow); 362 + btrfs_mark_buffer_dirty(trans, cow); 363 363 *cow_ret = cow; 364 364 return 0; 365 365 } ··· 616 616 cow->start); 617 617 btrfs_set_node_ptr_generation(parent, parent_slot, 618 618 trans->transid); 619 - btrfs_mark_buffer_dirty(parent); 619 + btrfs_mark_buffer_dirty(trans, parent); 620 620 if (last_ref) { 621 621 ret = btrfs_tree_mod_log_free_eb(buf); 622 622 if (ret) { ··· 632 632 if (unlock_orig) 633 633 btrfs_tree_unlock(buf); 634 634 free_extent_buffer_stale(buf); 635 - btrfs_mark_buffer_dirty(cow); 635 + btrfs_mark_buffer_dirty(trans, cow); 636 636 *cow_ret = cow; 637 637 return 0; 638 638 } ··· 1186 1186 goto out; 1187 1187 } 1188 1188 btrfs_set_node_key(parent, &right_key, pslot + 1); 1189 - btrfs_mark_buffer_dirty(parent); 1189 + btrfs_mark_buffer_dirty(trans, parent); 1190 1190 } 1191 1191 } 1192 1192 if (btrfs_header_nritems(mid) == 1) { ··· 1244 1244 goto out; 1245 1245 } 1246 1246 btrfs_set_node_key(parent, &mid_key, pslot); 1247 - btrfs_mark_buffer_dirty(parent); 1247 + btrfs_mark_buffer_dirty(trans, parent); 1248 1248 } 1249 1249 1250 1250 /* update the path */ ··· 1351 1351 return ret; 1352 1352 } 1353 1353 btrfs_set_node_key(parent, &disk_key, pslot); 1354 - btrfs_mark_buffer_dirty(parent); 1354 + btrfs_mark_buffer_dirty(trans, parent); 1355 1355 if (btrfs_header_nritems(left) > orig_slot) { 1356 1356 path->nodes[level] = left; 1357 1357 path->slots[level + 1] -= 1; ··· 1411 1411 return ret; 1412 1412 } 1413 1413 btrfs_set_node_key(parent, &disk_key, pslot + 1); 1414 - btrfs_mark_buffer_dirty(parent); 1414 + btrfs_mark_buffer_dirty(trans, parent); 1415 1415 1416 1416 if (btrfs_header_nritems(mid) <= orig_slot) { 1417 1417 path->nodes[level] = right; ··· 2667 2667 * higher levels 2668 2668 * 2669 2669 */ 2670 - static void fixup_low_keys(struct btrfs_path *path, 2670 + static void fixup_low_keys(struct btrfs_trans_handle *trans, 2671 + struct btrfs_path *path, 2671 2672 struct btrfs_disk_key *key, int level) 2672 2673 { 2673 2674 int i; ··· 2685 2684 BTRFS_MOD_LOG_KEY_REPLACE); 2686 2685 BUG_ON(ret < 0); 2687 2686 btrfs_set_node_key(t, key, tslot); 2688 - btrfs_mark_buffer_dirty(path->nodes[i]); 2687 + btrfs_mark_buffer_dirty(trans, path->nodes[i]); 2689 2688 if (tslot != 0) 2690 2689 break; 2691 2690 } ··· 2697 2696 * This function isn't completely safe. It's the caller's responsibility 2698 2697 * that the new key won't break the order 2699 2698 */ 2700 - void btrfs_set_item_key_safe(struct btrfs_fs_info *fs_info, 2699 + void btrfs_set_item_key_safe(struct btrfs_trans_handle *trans, 2701 2700 struct btrfs_path *path, 2702 2701 const struct btrfs_key *new_key) 2703 2702 { 2703 + struct btrfs_fs_info *fs_info = trans->fs_info; 2704 2704 struct btrfs_disk_key disk_key; 2705 2705 struct extent_buffer *eb; 2706 2706 int slot; ··· 2739 2737 2740 2738 btrfs_cpu_key_to_disk(&disk_key, new_key); 2741 2739 btrfs_set_item_key(eb, &disk_key, slot); 2742 - btrfs_mark_buffer_dirty(eb); 2740 + btrfs_mark_buffer_dirty(trans, eb); 2743 2741 if (slot == 0) 2744 - fixup_low_keys(path, &disk_key, 1); 2742 + fixup_low_keys(trans, path, &disk_key, 1); 2745 2743 } 2746 2744 2747 2745 /* ··· 2872 2870 } 2873 2871 btrfs_set_header_nritems(src, src_nritems - push_items); 2874 2872 btrfs_set_header_nritems(dst, dst_nritems + push_items); 2875 - btrfs_mark_buffer_dirty(src); 2876 - btrfs_mark_buffer_dirty(dst); 2873 + btrfs_mark_buffer_dirty(trans, src); 2874 + btrfs_mark_buffer_dirty(trans, dst); 2877 2875 2878 2876 return ret; 2879 2877 } ··· 2948 2946 btrfs_set_header_nritems(src, src_nritems - push_items); 2949 2947 btrfs_set_header_nritems(dst, dst_nritems + push_items); 2950 2948 2951 - btrfs_mark_buffer_dirty(src); 2952 - btrfs_mark_buffer_dirty(dst); 2949 + btrfs_mark_buffer_dirty(trans, src); 2950 + btrfs_mark_buffer_dirty(trans, dst); 2953 2951 2954 2952 return ret; 2955 2953 } ··· 2997 2995 2998 2996 btrfs_set_node_ptr_generation(c, 0, lower_gen); 2999 2997 3000 - btrfs_mark_buffer_dirty(c); 2998 + btrfs_mark_buffer_dirty(trans, c); 3001 2999 3002 3000 old = root->node; 3003 3001 ret = btrfs_tree_mod_log_insert_root(root->node, c, false); ··· 3069 3067 WARN_ON(trans->transid == 0); 3070 3068 btrfs_set_node_ptr_generation(lower, slot, trans->transid); 3071 3069 btrfs_set_header_nritems(lower, nritems + 1); 3072 - btrfs_mark_buffer_dirty(lower); 3070 + btrfs_mark_buffer_dirty(trans, lower); 3073 3071 3074 3072 return 0; 3075 3073 } ··· 3148 3146 btrfs_set_header_nritems(split, c_nritems - mid); 3149 3147 btrfs_set_header_nritems(c, mid); 3150 3148 3151 - btrfs_mark_buffer_dirty(c); 3152 - btrfs_mark_buffer_dirty(split); 3149 + btrfs_mark_buffer_dirty(trans, c); 3150 + btrfs_mark_buffer_dirty(trans, split); 3153 3151 3154 3152 ret = insert_ptr(trans, path, &disk_key, split->start, 3155 3153 path->slots[level + 1] + 1, level + 1); ··· 3315 3313 btrfs_set_header_nritems(left, left_nritems); 3316 3314 3317 3315 if (left_nritems) 3318 - btrfs_mark_buffer_dirty(left); 3316 + btrfs_mark_buffer_dirty(trans, left); 3319 3317 else 3320 3318 btrfs_clear_buffer_dirty(trans, left); 3321 3319 3322 - btrfs_mark_buffer_dirty(right); 3320 + btrfs_mark_buffer_dirty(trans, right); 3323 3321 3324 3322 btrfs_item_key(right, &disk_key, 0); 3325 3323 btrfs_set_node_key(upper, &disk_key, slot + 1); 3326 - btrfs_mark_buffer_dirty(upper); 3324 + btrfs_mark_buffer_dirty(trans, upper); 3327 3325 3328 3326 /* then fixup the leaf pointer in the path */ 3329 3327 if (path->slots[0] >= left_nritems) { ··· 3535 3533 btrfs_set_token_item_offset(&token, i, push_space); 3536 3534 } 3537 3535 3538 - btrfs_mark_buffer_dirty(left); 3536 + btrfs_mark_buffer_dirty(trans, left); 3539 3537 if (right_nritems) 3540 - btrfs_mark_buffer_dirty(right); 3538 + btrfs_mark_buffer_dirty(trans, right); 3541 3539 else 3542 3540 btrfs_clear_buffer_dirty(trans, right); 3543 3541 3544 3542 btrfs_item_key(right, &disk_key, 0); 3545 - fixup_low_keys(path, &disk_key, 1); 3543 + fixup_low_keys(trans, path, &disk_key, 1); 3546 3544 3547 3545 /* then fixup the leaf pointer in the path */ 3548 3546 if (path->slots[0] < push_items) { ··· 3673 3671 if (ret < 0) 3674 3672 return ret; 3675 3673 3676 - btrfs_mark_buffer_dirty(right); 3677 - btrfs_mark_buffer_dirty(l); 3674 + btrfs_mark_buffer_dirty(trans, right); 3675 + btrfs_mark_buffer_dirty(trans, l); 3678 3676 BUG_ON(path->slots[0] != slot); 3679 3677 3680 3678 if (mid <= slot) { ··· 3915 3913 path->nodes[0] = right; 3916 3914 path->slots[0] = 0; 3917 3915 if (path->slots[1] == 0) 3918 - fixup_low_keys(path, &disk_key, 1); 3916 + fixup_low_keys(trans, path, &disk_key, 1); 3919 3917 } 3920 3918 /* 3921 3919 * We create a new leaf 'right' for the required ins_len and ··· 4014 4012 return ret; 4015 4013 } 4016 4014 4017 - static noinline int split_item(struct btrfs_path *path, 4015 + static noinline int split_item(struct btrfs_trans_handle *trans, 4016 + struct btrfs_path *path, 4018 4017 const struct btrfs_key *new_key, 4019 4018 unsigned long split_offset) 4020 4019 { ··· 4074 4071 write_extent_buffer(leaf, buf + split_offset, 4075 4072 btrfs_item_ptr_offset(leaf, slot), 4076 4073 item_size - split_offset); 4077 - btrfs_mark_buffer_dirty(leaf); 4074 + btrfs_mark_buffer_dirty(trans, leaf); 4078 4075 4079 4076 BUG_ON(btrfs_leaf_free_space(leaf) < 0); 4080 4077 kfree(buf); ··· 4108 4105 if (ret) 4109 4106 return ret; 4110 4107 4111 - ret = split_item(path, new_key, split_offset); 4108 + ret = split_item(trans, path, new_key, split_offset); 4112 4109 return ret; 4113 4110 } 4114 4111 ··· 4118 4115 * off the end of the item or if we shift the item to chop bytes off 4119 4116 * the front. 4120 4117 */ 4121 - void btrfs_truncate_item(struct btrfs_path *path, u32 new_size, int from_end) 4118 + void btrfs_truncate_item(struct btrfs_trans_handle *trans, 4119 + struct btrfs_path *path, u32 new_size, int from_end) 4122 4120 { 4123 4121 int slot; 4124 4122 struct extent_buffer *leaf; ··· 4195 4191 btrfs_set_disk_key_offset(&disk_key, offset + size_diff); 4196 4192 btrfs_set_item_key(leaf, &disk_key, slot); 4197 4193 if (slot == 0) 4198 - fixup_low_keys(path, &disk_key, 1); 4194 + fixup_low_keys(trans, path, &disk_key, 1); 4199 4195 } 4200 4196 4201 4197 btrfs_set_item_size(leaf, slot, new_size); 4202 - btrfs_mark_buffer_dirty(leaf); 4198 + btrfs_mark_buffer_dirty(trans, leaf); 4203 4199 4204 4200 if (btrfs_leaf_free_space(leaf) < 0) { 4205 4201 btrfs_print_leaf(leaf); ··· 4210 4206 /* 4211 4207 * make the item pointed to by the path bigger, data_size is the added size. 4212 4208 */ 4213 - void btrfs_extend_item(struct btrfs_path *path, u32 data_size) 4209 + void btrfs_extend_item(struct btrfs_trans_handle *trans, 4210 + struct btrfs_path *path, u32 data_size) 4214 4211 { 4215 4212 int slot; 4216 4213 struct extent_buffer *leaf; ··· 4261 4256 data_end = old_data; 4262 4257 old_size = btrfs_item_size(leaf, slot); 4263 4258 btrfs_set_item_size(leaf, slot, old_size + data_size); 4264 - btrfs_mark_buffer_dirty(leaf); 4259 + btrfs_mark_buffer_dirty(trans, leaf); 4265 4260 4266 4261 if (btrfs_leaf_free_space(leaf) < 0) { 4267 4262 btrfs_print_leaf(leaf); ··· 4272 4267 /* 4273 4268 * Make space in the node before inserting one or more items. 4274 4269 * 4270 + * @trans: transaction handle 4275 4271 * @root: root we are inserting items to 4276 4272 * @path: points to the leaf/slot where we are going to insert new items 4277 4273 * @batch: information about the batch of items to insert ··· 4280 4274 * Main purpose is to save stack depth by doing the bulk of the work in a 4281 4275 * function that doesn't call btrfs_search_slot 4282 4276 */ 4283 - static void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path, 4277 + static void setup_items_for_insert(struct btrfs_trans_handle *trans, 4278 + struct btrfs_root *root, struct btrfs_path *path, 4284 4279 const struct btrfs_item_batch *batch) 4285 4280 { 4286 4281 struct btrfs_fs_info *fs_info = root->fs_info; ··· 4301 4294 */ 4302 4295 if (path->slots[0] == 0) { 4303 4296 btrfs_cpu_key_to_disk(&disk_key, &batch->keys[0]); 4304 - fixup_low_keys(path, &disk_key, 1); 4297 + fixup_low_keys(trans, path, &disk_key, 1); 4305 4298 } 4306 4299 btrfs_unlock_up_safe(path, 1); 4307 4300 ··· 4360 4353 } 4361 4354 4362 4355 btrfs_set_header_nritems(leaf, nritems + batch->nr); 4363 - btrfs_mark_buffer_dirty(leaf); 4356 + btrfs_mark_buffer_dirty(trans, leaf); 4364 4357 4365 4358 if (btrfs_leaf_free_space(leaf) < 0) { 4366 4359 btrfs_print_leaf(leaf); ··· 4371 4364 /* 4372 4365 * Insert a new item into a leaf. 4373 4366 * 4367 + * @trans: Transaction handle. 4374 4368 * @root: The root of the btree. 4375 4369 * @path: A path pointing to the target leaf and slot. 4376 4370 * @key: The key of the new item. 4377 4371 * @data_size: The size of the data associated with the new key. 4378 4372 */ 4379 - void btrfs_setup_item_for_insert(struct btrfs_root *root, 4373 + void btrfs_setup_item_for_insert(struct btrfs_trans_handle *trans, 4374 + struct btrfs_root *root, 4380 4375 struct btrfs_path *path, 4381 4376 const struct btrfs_key *key, 4382 4377 u32 data_size) ··· 4390 4381 batch.total_data_size = data_size; 4391 4382 batch.nr = 1; 4392 4383 4393 - setup_items_for_insert(root, path, &batch); 4384 + setup_items_for_insert(trans, root, path, &batch); 4394 4385 } 4395 4386 4396 4387 /* ··· 4416 4407 slot = path->slots[0]; 4417 4408 BUG_ON(slot < 0); 4418 4409 4419 - setup_items_for_insert(root, path, batch); 4410 + setup_items_for_insert(trans, root, path, batch); 4420 4411 return 0; 4421 4412 } 4422 4413 ··· 4441 4432 leaf = path->nodes[0]; 4442 4433 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]); 4443 4434 write_extent_buffer(leaf, data, ptr, data_size); 4444 - btrfs_mark_buffer_dirty(leaf); 4435 + btrfs_mark_buffer_dirty(trans, leaf); 4445 4436 } 4446 4437 btrfs_free_path(path); 4447 4438 return ret; ··· 4472 4463 return ret; 4473 4464 4474 4465 path->slots[0]++; 4475 - btrfs_setup_item_for_insert(root, path, new_key, item_size); 4466 + btrfs_setup_item_for_insert(trans, root, path, new_key, item_size); 4476 4467 leaf = path->nodes[0]; 4477 4468 memcpy_extent_buffer(leaf, 4478 4469 btrfs_item_ptr_offset(leaf, path->slots[0]), ··· 4530 4521 struct btrfs_disk_key disk_key; 4531 4522 4532 4523 btrfs_node_key(parent, &disk_key, 0); 4533 - fixup_low_keys(path, &disk_key, level + 1); 4524 + fixup_low_keys(trans, path, &disk_key, level + 1); 4534 4525 } 4535 - btrfs_mark_buffer_dirty(parent); 4526 + btrfs_mark_buffer_dirty(trans, parent); 4536 4527 return 0; 4537 4528 } 4538 4529 ··· 4629 4620 struct btrfs_disk_key disk_key; 4630 4621 4631 4622 btrfs_item_key(leaf, &disk_key, 0); 4632 - fixup_low_keys(path, &disk_key, 1); 4623 + fixup_low_keys(trans, path, &disk_key, 1); 4633 4624 } 4634 4625 4635 4626 /* ··· 4694 4685 * dirtied this buffer 4695 4686 */ 4696 4687 if (path->nodes[0] == leaf) 4697 - btrfs_mark_buffer_dirty(leaf); 4688 + btrfs_mark_buffer_dirty(trans, leaf); 4698 4689 free_extent_buffer(leaf); 4699 4690 } 4700 4691 } else { 4701 - btrfs_mark_buffer_dirty(leaf); 4692 + btrfs_mark_buffer_dirty(trans, leaf); 4702 4693 } 4703 4694 } 4704 4695 return ret;
+7 -4
fs/btrfs/ctree.h
··· 466 466 int type); 467 467 int btrfs_previous_extent_item(struct btrfs_root *root, 468 468 struct btrfs_path *path, u64 min_objectid); 469 - void btrfs_set_item_key_safe(struct btrfs_fs_info *fs_info, 469 + void btrfs_set_item_key_safe(struct btrfs_trans_handle *trans, 470 470 struct btrfs_path *path, 471 471 const struct btrfs_key *new_key); 472 472 struct extent_buffer *btrfs_root_node(struct btrfs_root *root); ··· 492 492 struct extent_buffer *buf); 493 493 int btrfs_del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, 494 494 struct btrfs_path *path, int level, int slot); 495 - void btrfs_extend_item(struct btrfs_path *path, u32 data_size); 496 - void btrfs_truncate_item(struct btrfs_path *path, u32 new_size, int from_end); 495 + void btrfs_extend_item(struct btrfs_trans_handle *trans, 496 + struct btrfs_path *path, u32 data_size); 497 + void btrfs_truncate_item(struct btrfs_trans_handle *trans, 498 + struct btrfs_path *path, u32 new_size, int from_end); 497 499 int btrfs_split_item(struct btrfs_trans_handle *trans, 498 500 struct btrfs_root *root, 499 501 struct btrfs_path *path, ··· 559 557 int nr; 560 558 }; 561 559 562 - void btrfs_setup_item_for_insert(struct btrfs_root *root, 560 + void btrfs_setup_item_for_insert(struct btrfs_trans_handle *trans, 561 + struct btrfs_root *root, 563 562 struct btrfs_path *path, 564 563 const struct btrfs_key *key, 565 564 u32 data_size);
+1 -1
fs/btrfs/delayed-inode.c
··· 1031 1031 struct btrfs_inode_item); 1032 1032 write_extent_buffer(leaf, &node->inode_item, (unsigned long)inode_item, 1033 1033 sizeof(struct btrfs_inode_item)); 1034 - btrfs_mark_buffer_dirty(leaf); 1034 + btrfs_mark_buffer_dirty(trans, leaf); 1035 1035 1036 1036 if (!test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &node->flags)) 1037 1037 goto out;
+1 -1
fs/btrfs/dev-replace.c
··· 441 441 dev_replace->item_needs_writeback = 0; 442 442 up_write(&dev_replace->rwsem); 443 443 444 - btrfs_mark_buffer_dirty(eb); 444 + btrfs_mark_buffer_dirty(trans, eb); 445 445 446 446 out: 447 447 btrfs_free_path(path);
+4 -4
fs/btrfs/dir-item.c
··· 38 38 di = btrfs_match_dir_item_name(fs_info, path, name, name_len); 39 39 if (di) 40 40 return ERR_PTR(-EEXIST); 41 - btrfs_extend_item(path, data_size); 41 + btrfs_extend_item(trans, path, data_size); 42 42 } else if (ret < 0) 43 43 return ERR_PTR(ret); 44 44 WARN_ON(ret > 0); ··· 93 93 94 94 write_extent_buffer(leaf, name, name_ptr, name_len); 95 95 write_extent_buffer(leaf, data, data_ptr, data_len); 96 - btrfs_mark_buffer_dirty(path->nodes[0]); 96 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 97 97 98 98 return ret; 99 99 } ··· 153 153 name_ptr = (unsigned long)(dir_item + 1); 154 154 155 155 write_extent_buffer(leaf, name->name, name_ptr, name->len); 156 - btrfs_mark_buffer_dirty(leaf); 156 + btrfs_mark_buffer_dirty(trans, leaf); 157 157 158 158 second_insert: 159 159 /* FIXME, use some real flag for selecting the extra index */ ··· 439 439 start = btrfs_item_ptr_offset(leaf, path->slots[0]); 440 440 memmove_extent_buffer(leaf, ptr, ptr + sub_item_len, 441 441 item_len - (ptr + sub_item_len - start)); 442 - btrfs_truncate_item(path, item_len - sub_item_len, 1); 442 + btrfs_truncate_item(trans, path, item_len - sub_item_len, 1); 443 443 } 444 444 return ret; 445 445 }
+9 -4
fs/btrfs/disk-io.c
··· 867 867 } 868 868 869 869 root->node = leaf; 870 - btrfs_mark_buffer_dirty(leaf); 870 + btrfs_mark_buffer_dirty(trans, leaf); 871 871 872 872 root->commit_root = btrfs_root_node(root); 873 873 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); ··· 942 942 943 943 root->node = leaf; 944 944 945 - btrfs_mark_buffer_dirty(root->node); 945 + btrfs_mark_buffer_dirty(trans, root->node); 946 946 btrfs_tree_unlock(root->node); 947 947 948 948 return 0; ··· 4385 4385 btrfs_close_devices(fs_info->fs_devices); 4386 4386 } 4387 4387 4388 - void btrfs_mark_buffer_dirty(struct extent_buffer *buf) 4388 + void btrfs_mark_buffer_dirty(struct btrfs_trans_handle *trans, 4389 + struct extent_buffer *buf) 4389 4390 { 4390 4391 struct btrfs_fs_info *fs_info = buf->fs_info; 4391 4392 u64 transid = btrfs_header_generation(buf); ··· 4400 4399 if (unlikely(test_bit(EXTENT_BUFFER_UNMAPPED, &buf->bflags))) 4401 4400 return; 4402 4401 #endif 4402 + /* This is an active transaction (its state < TRANS_STATE_UNBLOCKED). */ 4403 + ASSERT(trans->transid == fs_info->generation); 4403 4404 btrfs_assert_tree_write_locked(buf); 4404 - if (transid != fs_info->generation) 4405 + if (transid != fs_info->generation) { 4405 4406 WARN(1, KERN_CRIT "btrfs transid mismatch buffer %llu, found %llu running %llu\n", 4406 4407 buf->start, transid, fs_info->generation); 4408 + btrfs_abort_transaction(trans, -EUCLEAN); 4409 + } 4407 4410 set_extent_buffer_dirty(buf); 4408 4411 } 4409 4412
+2 -1
fs/btrfs/disk-io.h
··· 104 104 } 105 105 106 106 void btrfs_put_root(struct btrfs_root *root); 107 - void btrfs_mark_buffer_dirty(struct extent_buffer *buf); 107 + void btrfs_mark_buffer_dirty(struct btrfs_trans_handle *trans, 108 + struct extent_buffer *buf); 108 109 int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid, 109 110 int atomic); 110 111 int btrfs_read_extent_buffer(struct extent_buffer *buf,
+20 -16
fs/btrfs/extent-tree.c
··· 575 575 btrfs_set_extent_data_ref_count(leaf, ref, num_refs); 576 576 } 577 577 } 578 - btrfs_mark_buffer_dirty(leaf); 578 + btrfs_mark_buffer_dirty(trans, leaf); 579 579 ret = 0; 580 580 fail: 581 581 btrfs_release_path(path); ··· 623 623 btrfs_set_extent_data_ref_count(leaf, ref1, num_refs); 624 624 else if (key.type == BTRFS_SHARED_DATA_REF_KEY) 625 625 btrfs_set_shared_data_ref_count(leaf, ref2, num_refs); 626 - btrfs_mark_buffer_dirty(leaf); 626 + btrfs_mark_buffer_dirty(trans, leaf); 627 627 } 628 628 return ret; 629 629 } ··· 973 973 * helper to add new inline back ref 974 974 */ 975 975 static noinline_for_stack 976 - void setup_inline_extent_backref(struct btrfs_fs_info *fs_info, 976 + void setup_inline_extent_backref(struct btrfs_trans_handle *trans, 977 977 struct btrfs_path *path, 978 978 struct btrfs_extent_inline_ref *iref, 979 979 u64 parent, u64 root_objectid, ··· 996 996 type = extent_ref_type(parent, owner); 997 997 size = btrfs_extent_inline_ref_size(type); 998 998 999 - btrfs_extend_item(path, size); 999 + btrfs_extend_item(trans, path, size); 1000 1000 1001 1001 ei = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_extent_item); 1002 1002 refs = btrfs_extent_refs(leaf, ei); ··· 1030 1030 } else { 1031 1031 btrfs_set_extent_inline_ref_offset(leaf, iref, root_objectid); 1032 1032 } 1033 - btrfs_mark_buffer_dirty(leaf); 1033 + btrfs_mark_buffer_dirty(trans, leaf); 1034 1034 } 1035 1035 1036 1036 static int lookup_extent_backref(struct btrfs_trans_handle *trans, ··· 1063 1063 /* 1064 1064 * helper to update/remove inline back ref 1065 1065 */ 1066 - static noinline_for_stack int update_inline_extent_backref(struct btrfs_path *path, 1066 + static noinline_for_stack int update_inline_extent_backref( 1067 + struct btrfs_trans_handle *trans, 1068 + struct btrfs_path *path, 1067 1069 struct btrfs_extent_inline_ref *iref, 1068 1070 int refs_to_mod, 1069 1071 struct btrfs_delayed_extent_op *extent_op) ··· 1173 1171 memmove_extent_buffer(leaf, ptr, ptr + size, 1174 1172 end - ptr - size); 1175 1173 item_size -= size; 1176 - btrfs_truncate_item(path, item_size, 1); 1174 + btrfs_truncate_item(trans, path, item_size, 1); 1177 1175 } 1178 - btrfs_mark_buffer_dirty(leaf); 1176 + btrfs_mark_buffer_dirty(trans, leaf); 1179 1177 return 0; 1180 1178 } 1181 1179 ··· 1205 1203 bytenr, num_bytes, root_objectid, path->slots[0]); 1206 1204 return -EUCLEAN; 1207 1205 } 1208 - ret = update_inline_extent_backref(path, iref, refs_to_add, extent_op); 1206 + ret = update_inline_extent_backref(trans, path, iref, 1207 + refs_to_add, extent_op); 1209 1208 } else if (ret == -ENOENT) { 1210 - setup_inline_extent_backref(trans->fs_info, path, iref, parent, 1209 + setup_inline_extent_backref(trans, path, iref, parent, 1211 1210 root_objectid, owner, offset, 1212 1211 refs_to_add, extent_op); 1213 1212 ret = 0; ··· 1226 1223 1227 1224 BUG_ON(!is_data && refs_to_drop != 1); 1228 1225 if (iref) 1229 - ret = update_inline_extent_backref(path, iref, -refs_to_drop, NULL); 1226 + ret = update_inline_extent_backref(trans, path, iref, 1227 + -refs_to_drop, NULL); 1230 1228 else if (is_data) 1231 1229 ret = remove_extent_data_ref(trans, root, path, refs_to_drop); 1232 1230 else ··· 1510 1506 if (extent_op) 1511 1507 __run_delayed_extent_op(extent_op, leaf, item); 1512 1508 1513 - btrfs_mark_buffer_dirty(leaf); 1509 + btrfs_mark_buffer_dirty(trans, leaf); 1514 1510 btrfs_release_path(path); 1515 1511 1516 1512 /* now insert the actual backref */ ··· 1674 1670 ei = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_extent_item); 1675 1671 __run_delayed_extent_op(extent_op, leaf, ei); 1676 1672 1677 - btrfs_mark_buffer_dirty(leaf); 1673 + btrfs_mark_buffer_dirty(trans, leaf); 1678 1674 out: 1679 1675 btrfs_free_path(path); 1680 1676 return ret; ··· 3153 3149 } 3154 3150 } else { 3155 3151 btrfs_set_extent_refs(leaf, ei, refs); 3156 - btrfs_mark_buffer_dirty(leaf); 3152 + btrfs_mark_buffer_dirty(trans, leaf); 3157 3153 } 3158 3154 if (found_extent) { 3159 3155 ret = remove_extent_backref(trans, extent_root, path, ··· 4661 4657 btrfs_set_extent_data_ref_count(leaf, ref, ref_mod); 4662 4658 } 4663 4659 4664 - btrfs_mark_buffer_dirty(path->nodes[0]); 4660 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 4665 4661 btrfs_free_path(path); 4666 4662 4667 4663 return alloc_reserved_extent(trans, ins->objectid, ins->offset); ··· 4736 4732 btrfs_set_extent_inline_ref_offset(leaf, iref, ref->root); 4737 4733 } 4738 4734 4739 - btrfs_mark_buffer_dirty(leaf); 4735 + btrfs_mark_buffer_dirty(trans, leaf); 4740 4736 btrfs_free_path(path); 4741 4737 4742 4738 return alloc_reserved_extent(trans, node->bytenr, fs_info->nodesize);
+9 -8
fs/btrfs/file-item.c
··· 194 194 btrfs_set_file_extent_encryption(leaf, item, 0); 195 195 btrfs_set_file_extent_other_encoding(leaf, item, 0); 196 196 197 - btrfs_mark_buffer_dirty(leaf); 197 + btrfs_mark_buffer_dirty(trans, leaf); 198 198 out: 199 199 btrfs_free_path(path); 200 200 return ret; ··· 811 811 * This calls btrfs_truncate_item with the correct args based on the overlap, 812 812 * and fixes up the key as required. 813 813 */ 814 - static noinline void truncate_one_csum(struct btrfs_fs_info *fs_info, 814 + static noinline void truncate_one_csum(struct btrfs_trans_handle *trans, 815 815 struct btrfs_path *path, 816 816 struct btrfs_key *key, 817 817 u64 bytenr, u64 len) 818 818 { 819 + struct btrfs_fs_info *fs_info = trans->fs_info; 819 820 struct extent_buffer *leaf; 820 821 const u32 csum_size = fs_info->csum_size; 821 822 u64 csum_end; ··· 837 836 */ 838 837 u32 new_size = (bytenr - key->offset) >> blocksize_bits; 839 838 new_size *= csum_size; 840 - btrfs_truncate_item(path, new_size, 1); 839 + btrfs_truncate_item(trans, path, new_size, 1); 841 840 } else if (key->offset >= bytenr && csum_end > end_byte && 842 841 end_byte > key->offset) { 843 842 /* ··· 849 848 u32 new_size = (csum_end - end_byte) >> blocksize_bits; 850 849 new_size *= csum_size; 851 850 852 - btrfs_truncate_item(path, new_size, 0); 851 + btrfs_truncate_item(trans, path, new_size, 0); 853 852 854 853 key->offset = end_byte; 855 - btrfs_set_item_key_safe(fs_info, path, key); 854 + btrfs_set_item_key_safe(trans, path, key); 856 855 } else { 857 856 BUG(); 858 857 } ··· 995 994 996 995 key.offset = end_byte - 1; 997 996 } else { 998 - truncate_one_csum(fs_info, path, &key, bytenr, len); 997 + truncate_one_csum(trans, path, &key, bytenr, len); 999 998 if (key.offset < bytenr) 1000 999 break; 1001 1000 } ··· 1203 1202 diff /= csum_size; 1204 1203 diff *= csum_size; 1205 1204 1206 - btrfs_extend_item(path, diff); 1205 + btrfs_extend_item(trans, path, diff); 1207 1206 ret = 0; 1208 1207 goto csum; 1209 1208 } ··· 1250 1249 ins_size /= csum_size; 1251 1250 total_bytes += ins_size * fs_info->sectorsize; 1252 1251 1253 - btrfs_mark_buffer_dirty(path->nodes[0]); 1252 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 1254 1253 if (total_bytes < sums->len) { 1255 1254 btrfs_release_path(path); 1256 1255 cond_resched();
+17 -17
fs/btrfs/file.c
··· 369 369 btrfs_set_file_extent_offset(leaf, fi, extent_offset); 370 370 btrfs_set_file_extent_num_bytes(leaf, fi, 371 371 extent_end - args->start); 372 - btrfs_mark_buffer_dirty(leaf); 372 + btrfs_mark_buffer_dirty(trans, leaf); 373 373 374 374 if (update_refs && disk_bytenr > 0) { 375 375 btrfs_init_generic_ref(&ref, ··· 406 406 407 407 memcpy(&new_key, &key, sizeof(new_key)); 408 408 new_key.offset = args->end; 409 - btrfs_set_item_key_safe(fs_info, path, &new_key); 409 + btrfs_set_item_key_safe(trans, path, &new_key); 410 410 411 411 extent_offset += args->end - key.offset; 412 412 btrfs_set_file_extent_offset(leaf, fi, extent_offset); 413 413 btrfs_set_file_extent_num_bytes(leaf, fi, 414 414 extent_end - args->end); 415 - btrfs_mark_buffer_dirty(leaf); 415 + btrfs_mark_buffer_dirty(trans, leaf); 416 416 if (update_refs && disk_bytenr > 0) 417 417 args->bytes_found += args->end - key.offset; 418 418 break; ··· 432 432 433 433 btrfs_set_file_extent_num_bytes(leaf, fi, 434 434 args->start - key.offset); 435 - btrfs_mark_buffer_dirty(leaf); 435 + btrfs_mark_buffer_dirty(trans, leaf); 436 436 if (update_refs && disk_bytenr > 0) 437 437 args->bytes_found += extent_end - args->start; 438 438 if (args->end == extent_end) ··· 537 537 if (btrfs_comp_cpu_keys(&key, &slot_key) > 0) 538 538 path->slots[0]++; 539 539 } 540 - btrfs_setup_item_for_insert(root, path, &key, args->extent_item_size); 540 + btrfs_setup_item_for_insert(trans, root, path, &key, 541 + args->extent_item_size); 541 542 args->extent_inserted = true; 542 543 } 543 544 ··· 595 594 int btrfs_mark_extent_written(struct btrfs_trans_handle *trans, 596 595 struct btrfs_inode *inode, u64 start, u64 end) 597 596 { 598 - struct btrfs_fs_info *fs_info = trans->fs_info; 599 597 struct btrfs_root *root = inode->root; 600 598 struct extent_buffer *leaf; 601 599 struct btrfs_path *path; ··· 665 665 ino, bytenr, orig_offset, 666 666 &other_start, &other_end)) { 667 667 new_key.offset = end; 668 - btrfs_set_item_key_safe(fs_info, path, &new_key); 668 + btrfs_set_item_key_safe(trans, path, &new_key); 669 669 fi = btrfs_item_ptr(leaf, path->slots[0], 670 670 struct btrfs_file_extent_item); 671 671 btrfs_set_file_extent_generation(leaf, fi, ··· 680 680 trans->transid); 681 681 btrfs_set_file_extent_num_bytes(leaf, fi, 682 682 end - other_start); 683 - btrfs_mark_buffer_dirty(leaf); 683 + btrfs_mark_buffer_dirty(trans, leaf); 684 684 goto out; 685 685 } 686 686 } ··· 699 699 trans->transid); 700 700 path->slots[0]++; 701 701 new_key.offset = start; 702 - btrfs_set_item_key_safe(fs_info, path, &new_key); 702 + btrfs_set_item_key_safe(trans, path, &new_key); 703 703 704 704 fi = btrfs_item_ptr(leaf, path->slots[0], 705 705 struct btrfs_file_extent_item); ··· 709 709 other_end - start); 710 710 btrfs_set_file_extent_offset(leaf, fi, 711 711 start - orig_offset); 712 - btrfs_mark_buffer_dirty(leaf); 712 + btrfs_mark_buffer_dirty(trans, leaf); 713 713 goto out; 714 714 } 715 715 } ··· 743 743 btrfs_set_file_extent_offset(leaf, fi, split - orig_offset); 744 744 btrfs_set_file_extent_num_bytes(leaf, fi, 745 745 extent_end - split); 746 - btrfs_mark_buffer_dirty(leaf); 746 + btrfs_mark_buffer_dirty(trans, leaf); 747 747 748 748 btrfs_init_generic_ref(&ref, BTRFS_ADD_DELAYED_REF, bytenr, 749 749 num_bytes, 0); ··· 815 815 btrfs_set_file_extent_type(leaf, fi, 816 816 BTRFS_FILE_EXTENT_REG); 817 817 btrfs_set_file_extent_generation(leaf, fi, trans->transid); 818 - btrfs_mark_buffer_dirty(leaf); 818 + btrfs_mark_buffer_dirty(trans, leaf); 819 819 } else { 820 820 fi = btrfs_item_ptr(leaf, del_slot - 1, 821 821 struct btrfs_file_extent_item); ··· 824 824 btrfs_set_file_extent_generation(leaf, fi, trans->transid); 825 825 btrfs_set_file_extent_num_bytes(leaf, fi, 826 826 extent_end - key.offset); 827 - btrfs_mark_buffer_dirty(leaf); 827 + btrfs_mark_buffer_dirty(trans, leaf); 828 828 829 829 ret = btrfs_del_items(trans, root, path, del_slot, del_nr); 830 830 if (ret < 0) { ··· 2105 2105 btrfs_set_file_extent_ram_bytes(leaf, fi, num_bytes); 2106 2106 btrfs_set_file_extent_offset(leaf, fi, 0); 2107 2107 btrfs_set_file_extent_generation(leaf, fi, trans->transid); 2108 - btrfs_mark_buffer_dirty(leaf); 2108 + btrfs_mark_buffer_dirty(trans, leaf); 2109 2109 goto out; 2110 2110 } 2111 2111 ··· 2113 2113 u64 num_bytes; 2114 2114 2115 2115 key.offset = offset; 2116 - btrfs_set_item_key_safe(fs_info, path, &key); 2116 + btrfs_set_item_key_safe(trans, path, &key); 2117 2117 fi = btrfs_item_ptr(leaf, path->slots[0], 2118 2118 struct btrfs_file_extent_item); 2119 2119 num_bytes = btrfs_file_extent_num_bytes(leaf, fi) + end - ··· 2122 2122 btrfs_set_file_extent_ram_bytes(leaf, fi, num_bytes); 2123 2123 btrfs_set_file_extent_offset(leaf, fi, 0); 2124 2124 btrfs_set_file_extent_generation(leaf, fi, trans->transid); 2125 - btrfs_mark_buffer_dirty(leaf); 2125 + btrfs_mark_buffer_dirty(trans, leaf); 2126 2126 goto out; 2127 2127 } 2128 2128 btrfs_release_path(path); ··· 2274 2274 btrfs_set_file_extent_num_bytes(leaf, extent, replace_len); 2275 2275 if (extent_info->is_new_extent) 2276 2276 btrfs_set_file_extent_generation(leaf, extent, trans->transid); 2277 - btrfs_mark_buffer_dirty(leaf); 2277 + btrfs_mark_buffer_dirty(trans, leaf); 2278 2278 btrfs_release_path(path); 2279 2279 2280 2280 ret = btrfs_inode_set_file_extent_range(inode, extent_info->file_offset,
+3 -3
fs/btrfs/free-space-cache.c
··· 200 200 btrfs_set_inode_nlink(leaf, inode_item, 1); 201 201 btrfs_set_inode_transid(leaf, inode_item, trans->transid); 202 202 btrfs_set_inode_block_group(leaf, inode_item, offset); 203 - btrfs_mark_buffer_dirty(leaf); 203 + btrfs_mark_buffer_dirty(trans, leaf); 204 204 btrfs_release_path(path); 205 205 206 206 key.objectid = BTRFS_FREE_SPACE_OBJECTID; ··· 218 218 struct btrfs_free_space_header); 219 219 memzero_extent_buffer(leaf, (unsigned long)header, sizeof(*header)); 220 220 btrfs_set_free_space_key(leaf, header, &disk_key); 221 - btrfs_mark_buffer_dirty(leaf); 221 + btrfs_mark_buffer_dirty(trans, leaf); 222 222 btrfs_release_path(path); 223 223 224 224 return 0; ··· 1190 1190 btrfs_set_free_space_entries(leaf, header, entries); 1191 1191 btrfs_set_free_space_bitmaps(leaf, header, bitmaps); 1192 1192 btrfs_set_free_space_generation(leaf, header, trans->transid); 1193 - btrfs_mark_buffer_dirty(leaf); 1193 + btrfs_mark_buffer_dirty(trans, leaf); 1194 1194 btrfs_release_path(path); 1195 1195 1196 1196 return 0;
+9 -8
fs/btrfs/free-space-tree.c
··· 89 89 struct btrfs_free_space_info); 90 90 btrfs_set_free_space_extent_count(leaf, info, 0); 91 91 btrfs_set_free_space_flags(leaf, info, 0); 92 - btrfs_mark_buffer_dirty(leaf); 92 + btrfs_mark_buffer_dirty(trans, leaf); 93 93 94 94 ret = 0; 95 95 out: ··· 287 287 flags |= BTRFS_FREE_SPACE_USING_BITMAPS; 288 288 btrfs_set_free_space_flags(leaf, info, flags); 289 289 expected_extent_count = btrfs_free_space_extent_count(leaf, info); 290 - btrfs_mark_buffer_dirty(leaf); 290 + btrfs_mark_buffer_dirty(trans, leaf); 291 291 btrfs_release_path(path); 292 292 293 293 if (extent_count != expected_extent_count) { ··· 324 324 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]); 325 325 write_extent_buffer(leaf, bitmap_cursor, ptr, 326 326 data_size); 327 - btrfs_mark_buffer_dirty(leaf); 327 + btrfs_mark_buffer_dirty(trans, leaf); 328 328 btrfs_release_path(path); 329 329 330 330 i += extent_size; ··· 430 430 flags &= ~BTRFS_FREE_SPACE_USING_BITMAPS; 431 431 btrfs_set_free_space_flags(leaf, info, flags); 432 432 expected_extent_count = btrfs_free_space_extent_count(leaf, info); 433 - btrfs_mark_buffer_dirty(leaf); 433 + btrfs_mark_buffer_dirty(trans, leaf); 434 434 btrfs_release_path(path); 435 435 436 436 nrbits = block_group->length >> block_group->fs_info->sectorsize_bits; ··· 495 495 496 496 extent_count += new_extents; 497 497 btrfs_set_free_space_extent_count(path->nodes[0], info, extent_count); 498 - btrfs_mark_buffer_dirty(path->nodes[0]); 498 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 499 499 btrfs_release_path(path); 500 500 501 501 if (!(flags & BTRFS_FREE_SPACE_USING_BITMAPS) && ··· 533 533 return !!extent_buffer_test_bit(leaf, ptr, i); 534 534 } 535 535 536 - static void free_space_set_bits(struct btrfs_block_group *block_group, 536 + static void free_space_set_bits(struct btrfs_trans_handle *trans, 537 + struct btrfs_block_group *block_group, 537 538 struct btrfs_path *path, u64 *start, u64 *size, 538 539 int bit) 539 540 { ··· 564 563 extent_buffer_bitmap_set(leaf, ptr, first, last - first); 565 564 else 566 565 extent_buffer_bitmap_clear(leaf, ptr, first, last - first); 567 - btrfs_mark_buffer_dirty(leaf); 566 + btrfs_mark_buffer_dirty(trans, leaf); 568 567 569 568 *size -= end - *start; 570 569 *start = end; ··· 657 656 cur_start = start; 658 657 cur_size = size; 659 658 while (1) { 660 - free_space_set_bits(block_group, path, &cur_start, &cur_size, 659 + free_space_set_bits(trans, block_group, path, &cur_start, &cur_size, 661 660 !remove); 662 661 if (cur_size == 0) 663 662 break;
+8 -8
fs/btrfs/inode-item.c
··· 167 167 memmove_extent_buffer(leaf, ptr, ptr + del_len, 168 168 item_size - (ptr + del_len - item_start)); 169 169 170 - btrfs_truncate_item(path, item_size - del_len, 1); 170 + btrfs_truncate_item(trans, path, item_size - del_len, 1); 171 171 172 172 out: 173 173 btrfs_free_path(path); ··· 229 229 item_start = btrfs_item_ptr_offset(leaf, path->slots[0]); 230 230 memmove_extent_buffer(leaf, ptr, ptr + sub_item_len, 231 231 item_size - (ptr + sub_item_len - item_start)); 232 - btrfs_truncate_item(path, item_size - sub_item_len, 1); 232 + btrfs_truncate_item(trans, path, item_size - sub_item_len, 1); 233 233 out: 234 234 btrfs_free_path(path); 235 235 ··· 282 282 name)) 283 283 goto out; 284 284 285 - btrfs_extend_item(path, ins_len); 285 + btrfs_extend_item(trans, path, ins_len); 286 286 ret = 0; 287 287 } 288 288 if (ret < 0) ··· 299 299 300 300 ptr = (unsigned long)&extref->name; 301 301 write_extent_buffer(path->nodes[0], name->name, ptr, name->len); 302 - btrfs_mark_buffer_dirty(path->nodes[0]); 302 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 303 303 304 304 out: 305 305 btrfs_free_path(path); ··· 338 338 goto out; 339 339 340 340 old_size = btrfs_item_size(path->nodes[0], path->slots[0]); 341 - btrfs_extend_item(path, ins_len); 341 + btrfs_extend_item(trans, path, ins_len); 342 342 ref = btrfs_item_ptr(path->nodes[0], path->slots[0], 343 343 struct btrfs_inode_ref); 344 344 ref = (struct btrfs_inode_ref *)((unsigned long)ref + old_size); ··· 364 364 ptr = (unsigned long)(ref + 1); 365 365 } 366 366 write_extent_buffer(path->nodes[0], name->name, ptr, name->len); 367 - btrfs_mark_buffer_dirty(path->nodes[0]); 367 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 368 368 369 369 out: 370 370 btrfs_free_path(path); ··· 591 591 num_dec = (orig_num_bytes - extent_num_bytes); 592 592 if (extent_start != 0) 593 593 control->sub_bytes += num_dec; 594 - btrfs_mark_buffer_dirty(leaf); 594 + btrfs_mark_buffer_dirty(trans, leaf); 595 595 } else { 596 596 extent_num_bytes = 597 597 btrfs_file_extent_disk_num_bytes(leaf, fi); ··· 617 617 618 618 btrfs_set_file_extent_ram_bytes(leaf, fi, size); 619 619 size = btrfs_file_extent_calc_inline_size(size); 620 - btrfs_truncate_item(path, size, 1); 620 + btrfs_truncate_item(trans, path, size, 1); 621 621 } else if (!del_item) { 622 622 /* 623 623 * We have to bail so the last_size is set to
+5 -5
fs/btrfs/inode.c
··· 573 573 kunmap_local(kaddr); 574 574 put_page(page); 575 575 } 576 - btrfs_mark_buffer_dirty(leaf); 576 + btrfs_mark_buffer_dirty(trans, leaf); 577 577 btrfs_release_path(path); 578 578 579 579 /* ··· 2912 2912 btrfs_item_ptr_offset(leaf, path->slots[0]), 2913 2913 sizeof(struct btrfs_file_extent_item)); 2914 2914 2915 - btrfs_mark_buffer_dirty(leaf); 2915 + btrfs_mark_buffer_dirty(trans, leaf); 2916 2916 btrfs_release_path(path); 2917 2917 2918 2918 /* ··· 3981 3981 struct btrfs_inode_item); 3982 3982 3983 3983 fill_inode_item(trans, leaf, inode_item, &inode->vfs_inode); 3984 - btrfs_mark_buffer_dirty(leaf); 3984 + btrfs_mark_buffer_dirty(trans, leaf); 3985 3985 btrfs_set_inode_last_trans(trans, inode); 3986 3986 ret = 0; 3987 3987 failed: ··· 6311 6311 } 6312 6312 } 6313 6313 6314 - btrfs_mark_buffer_dirty(path->nodes[0]); 6314 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 6315 6315 /* 6316 6316 * We don't need the path anymore, plus inheriting properties, adding 6317 6317 * ACLs, security xattrs, orphan item or adding the link, will result in ··· 9447 9447 9448 9448 ptr = btrfs_file_extent_inline_start(ei); 9449 9449 write_extent_buffer(leaf, symname, ptr, name_len); 9450 - btrfs_mark_buffer_dirty(leaf); 9450 + btrfs_mark_buffer_dirty(trans, leaf); 9451 9451 btrfs_free_path(path); 9452 9452 9453 9453 d_instantiate_new(dentry, inode);
+2 -2
fs/btrfs/ioctl.c
··· 663 663 goto out; 664 664 } 665 665 666 - btrfs_mark_buffer_dirty(leaf); 666 + btrfs_mark_buffer_dirty(trans, leaf); 667 667 668 668 inode_item = &root_item->inode; 669 669 btrfs_set_stack_inode_generation(inode_item, 1); ··· 2947 2947 2948 2948 btrfs_cpu_key_to_disk(&disk_key, &new_root->root_key); 2949 2949 btrfs_set_dir_item_key(path->nodes[0], di, &disk_key); 2950 - btrfs_mark_buffer_dirty(path->nodes[0]); 2950 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 2951 2951 btrfs_release_path(path); 2952 2952 2953 2953 btrfs_set_fs_incompat(fs_info, DEFAULT_SUBVOL);
+7 -7
fs/btrfs/qgroup.c
··· 636 636 637 637 ret = btrfs_insert_empty_item(trans, quota_root, path, &key, 0); 638 638 639 - btrfs_mark_buffer_dirty(path->nodes[0]); 639 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 640 640 641 641 btrfs_free_path(path); 642 642 return ret; ··· 714 714 btrfs_set_qgroup_info_excl(leaf, qgroup_info, 0); 715 715 btrfs_set_qgroup_info_excl_cmpr(leaf, qgroup_info, 0); 716 716 717 - btrfs_mark_buffer_dirty(leaf); 717 + btrfs_mark_buffer_dirty(trans, leaf); 718 718 719 719 btrfs_release_path(path); 720 720 ··· 733 733 btrfs_set_qgroup_limit_rsv_rfer(leaf, qgroup_limit, 0); 734 734 btrfs_set_qgroup_limit_rsv_excl(leaf, qgroup_limit, 0); 735 735 736 - btrfs_mark_buffer_dirty(leaf); 736 + btrfs_mark_buffer_dirty(trans, leaf); 737 737 738 738 ret = 0; 739 739 out: ··· 822 822 btrfs_set_qgroup_limit_rsv_rfer(l, qgroup_limit, qgroup->rsv_rfer); 823 823 btrfs_set_qgroup_limit_rsv_excl(l, qgroup_limit, qgroup->rsv_excl); 824 824 825 - btrfs_mark_buffer_dirty(l); 825 + btrfs_mark_buffer_dirty(trans, l); 826 826 827 827 out: 828 828 btrfs_free_path(path); ··· 868 868 btrfs_set_qgroup_info_excl(l, qgroup_info, qgroup->excl); 869 869 btrfs_set_qgroup_info_excl_cmpr(l, qgroup_info, qgroup->excl_cmpr); 870 870 871 - btrfs_mark_buffer_dirty(l); 871 + btrfs_mark_buffer_dirty(trans, l); 872 872 873 873 out: 874 874 btrfs_free_path(path); ··· 910 910 btrfs_set_qgroup_status_rescan(l, ptr, 911 911 fs_info->qgroup_rescan_progress.objectid); 912 912 913 - btrfs_mark_buffer_dirty(l); 913 + btrfs_mark_buffer_dirty(trans, l); 914 914 915 915 out: 916 916 btrfs_free_path(path); ··· 1084 1084 BTRFS_QGROUP_STATUS_FLAGS_MASK); 1085 1085 btrfs_set_qgroup_status_rescan(leaf, ptr, 0); 1086 1086 1087 - btrfs_mark_buffer_dirty(leaf); 1087 + btrfs_mark_buffer_dirty(trans, leaf); 1088 1088 1089 1089 key.objectid = 0; 1090 1090 key.type = BTRFS_ROOT_REF_KEY;
+5 -5
fs/btrfs/relocation.c
··· 1180 1180 } 1181 1181 } 1182 1182 if (dirty) 1183 - btrfs_mark_buffer_dirty(leaf); 1183 + btrfs_mark_buffer_dirty(trans, leaf); 1184 1184 if (inode) 1185 1185 btrfs_add_delayed_iput(BTRFS_I(inode)); 1186 1186 return ret; ··· 1373 1373 */ 1374 1374 btrfs_set_node_blockptr(parent, slot, new_bytenr); 1375 1375 btrfs_set_node_ptr_generation(parent, slot, new_ptr_gen); 1376 - btrfs_mark_buffer_dirty(parent); 1376 + btrfs_mark_buffer_dirty(trans, parent); 1377 1377 1378 1378 btrfs_set_node_blockptr(path->nodes[level], 1379 1379 path->slots[level], old_bytenr); 1380 1380 btrfs_set_node_ptr_generation(path->nodes[level], 1381 1381 path->slots[level], old_ptr_gen); 1382 - btrfs_mark_buffer_dirty(path->nodes[level]); 1382 + btrfs_mark_buffer_dirty(trans, path->nodes[level]); 1383 1383 1384 1384 btrfs_init_generic_ref(&ref, BTRFS_ADD_DELAYED_REF, old_bytenr, 1385 1385 blocksize, path->nodes[level]->start); ··· 2516 2516 node->eb->start); 2517 2517 btrfs_set_node_ptr_generation(upper->eb, slot, 2518 2518 trans->transid); 2519 - btrfs_mark_buffer_dirty(upper->eb); 2519 + btrfs_mark_buffer_dirty(trans, upper->eb); 2520 2520 2521 2521 btrfs_init_generic_ref(&ref, BTRFS_ADD_DELAYED_REF, 2522 2522 node->eb->start, blocksize, ··· 3834 3834 btrfs_set_inode_mode(leaf, item, S_IFREG | 0600); 3835 3835 btrfs_set_inode_flags(leaf, item, BTRFS_INODE_NOCOMPRESS | 3836 3836 BTRFS_INODE_PREALLOC); 3837 - btrfs_mark_buffer_dirty(leaf); 3837 + btrfs_mark_buffer_dirty(trans, leaf); 3838 3838 out: 3839 3839 btrfs_free_path(path); 3840 3840 return ret;
+2 -2
fs/btrfs/root-tree.c
··· 192 192 btrfs_set_root_generation_v2(item, btrfs_root_generation(item)); 193 193 194 194 write_extent_buffer(l, item, ptr, sizeof(*item)); 195 - btrfs_mark_buffer_dirty(path->nodes[0]); 195 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 196 196 out: 197 197 btrfs_free_path(path); 198 198 return ret; ··· 439 439 btrfs_set_root_ref_name_len(leaf, ref, name->len); 440 440 ptr = (unsigned long)(ref + 1); 441 441 write_extent_buffer(leaf, name->name, ptr, name->len); 442 - btrfs_mark_buffer_dirty(leaf); 442 + btrfs_mark_buffer_dirty(trans, leaf); 443 443 444 444 if (key.type == BTRFS_ROOT_BACKREF_KEY) { 445 445 btrfs_release_path(path);
+5 -1
fs/btrfs/tests/extent-buffer-tests.c
··· 61 61 key.type = BTRFS_EXTENT_CSUM_KEY; 62 62 key.offset = 0; 63 63 64 - btrfs_setup_item_for_insert(root, path, &key, value_len); 64 + /* 65 + * Passing a NULL trans handle is fine here, we have a dummy root eb 66 + * and the tree is a single node (level 0). 67 + */ 68 + btrfs_setup_item_for_insert(NULL, root, path, &key, value_len); 65 69 write_extent_buffer(eb, value, btrfs_item_ptr_offset(eb, 0), 66 70 value_len); 67 71
+10 -2
fs/btrfs/tests/inode-tests.c
··· 34 34 key.type = BTRFS_EXTENT_DATA_KEY; 35 35 key.offset = start; 36 36 37 - btrfs_setup_item_for_insert(root, &path, &key, value_len); 37 + /* 38 + * Passing a NULL trans handle is fine here, we have a dummy root eb 39 + * and the tree is a single node (level 0). 40 + */ 41 + btrfs_setup_item_for_insert(NULL, root, &path, &key, value_len); 38 42 fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item); 39 43 btrfs_set_file_extent_generation(leaf, fi, 1); 40 44 btrfs_set_file_extent_type(leaf, fi, type); ··· 68 64 key.type = BTRFS_INODE_ITEM_KEY; 69 65 key.offset = 0; 70 66 71 - btrfs_setup_item_for_insert(root, &path, &key, value_len); 67 + /* 68 + * Passing a NULL trans handle is fine here, we have a dummy root eb 69 + * and the tree is a single node (level 0). 70 + */ 71 + btrfs_setup_item_for_insert(NULL, root, &path, &key, value_len); 72 72 } 73 73 74 74 /*
+6 -6
fs/btrfs/tree-log.c
··· 503 503 found_size = btrfs_item_size(path->nodes[0], 504 504 path->slots[0]); 505 505 if (found_size > item_size) 506 - btrfs_truncate_item(path, item_size, 1); 506 + btrfs_truncate_item(trans, path, item_size, 1); 507 507 else if (found_size < item_size) 508 - btrfs_extend_item(path, item_size - found_size); 508 + btrfs_extend_item(trans, path, item_size - found_size); 509 509 } else if (ret) { 510 510 return ret; 511 511 } ··· 573 573 } 574 574 } 575 575 no_copy: 576 - btrfs_mark_buffer_dirty(path->nodes[0]); 576 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 577 577 btrfs_release_path(path); 578 578 return 0; 579 579 } ··· 3528 3528 last_offset = max(last_offset, curr_end); 3529 3529 } 3530 3530 btrfs_set_dir_log_end(path->nodes[0], item, last_offset); 3531 - btrfs_mark_buffer_dirty(path->nodes[0]); 3531 + btrfs_mark_buffer_dirty(trans, path->nodes[0]); 3532 3532 btrfs_release_path(path); 3533 3533 return 0; 3534 3534 } ··· 4486 4486 dst_index++; 4487 4487 } 4488 4488 4489 - btrfs_mark_buffer_dirty(dst_path->nodes[0]); 4489 + btrfs_mark_buffer_dirty(trans, dst_path->nodes[0]); 4490 4490 btrfs_release_path(dst_path); 4491 4491 out: 4492 4492 kfree(ins_data); ··· 4691 4691 write_extent_buffer(leaf, &fi, 4692 4692 btrfs_item_ptr_offset(leaf, path->slots[0]), 4693 4693 sizeof(fi)); 4694 - btrfs_mark_buffer_dirty(leaf); 4694 + btrfs_mark_buffer_dirty(trans, leaf); 4695 4695 4696 4696 btrfs_release_path(path); 4697 4697
+3 -3
fs/btrfs/uuid-tree.c
··· 124 124 * An item with that type already exists. 125 125 * Extend the item and store the new subid at the end. 126 126 */ 127 - btrfs_extend_item(path, sizeof(subid_le)); 127 + btrfs_extend_item(trans, path, sizeof(subid_le)); 128 128 eb = path->nodes[0]; 129 129 slot = path->slots[0]; 130 130 offset = btrfs_item_ptr_offset(eb, slot); ··· 139 139 ret = 0; 140 140 subid_le = cpu_to_le64(subid_cpu); 141 141 write_extent_buffer(eb, &subid_le, offset, sizeof(subid_le)); 142 - btrfs_mark_buffer_dirty(eb); 142 + btrfs_mark_buffer_dirty(trans, eb); 143 143 144 144 out: 145 145 btrfs_free_path(path); ··· 221 221 move_src = offset + sizeof(subid); 222 222 move_len = item_size - (move_src - btrfs_item_ptr_offset(eb, slot)); 223 223 memmove_extent_buffer(eb, move_dst, move_src, move_len); 224 - btrfs_truncate_item(path, item_size - sizeof(subid), 1); 224 + btrfs_truncate_item(trans, path, item_size - sizeof(subid), 1); 225 225 226 226 out: 227 227 btrfs_free_path(path);
+5 -5
fs/btrfs/volumes.c
··· 1919 1919 ptr = btrfs_device_fsid(dev_item); 1920 1920 write_extent_buffer(leaf, trans->fs_info->fs_devices->metadata_uuid, 1921 1921 ptr, BTRFS_FSID_SIZE); 1922 - btrfs_mark_buffer_dirty(leaf); 1922 + btrfs_mark_buffer_dirty(trans, leaf); 1923 1923 1924 1924 ret = 0; 1925 1925 out: ··· 2622 2622 if (device->fs_devices->seeding) { 2623 2623 btrfs_set_device_generation(leaf, dev_item, 2624 2624 device->generation); 2625 - btrfs_mark_buffer_dirty(leaf); 2625 + btrfs_mark_buffer_dirty(trans, leaf); 2626 2626 } 2627 2627 2628 2628 path->slots[0]++; ··· 2920 2920 btrfs_device_get_disk_total_bytes(device)); 2921 2921 btrfs_set_device_bytes_used(leaf, dev_item, 2922 2922 btrfs_device_get_bytes_used(device)); 2923 - btrfs_mark_buffer_dirty(leaf); 2923 + btrfs_mark_buffer_dirty(trans, leaf); 2924 2924 2925 2925 out: 2926 2926 btrfs_free_path(path); ··· 3509 3509 3510 3510 btrfs_set_balance_flags(leaf, item, bctl->flags); 3511 3511 3512 - btrfs_mark_buffer_dirty(leaf); 3512 + btrfs_mark_buffer_dirty(trans, leaf); 3513 3513 out: 3514 3514 btrfs_free_path(path); 3515 3515 err = btrfs_commit_transaction(trans); ··· 7552 7552 for (i = 0; i < BTRFS_DEV_STAT_VALUES_MAX; i++) 7553 7553 btrfs_set_dev_stats_value(eb, ptr, i, 7554 7554 btrfs_dev_stat_read(device, i)); 7555 - btrfs_mark_buffer_dirty(eb); 7555 + btrfs_mark_buffer_dirty(trans, eb); 7556 7556 7557 7557 out: 7558 7558 btrfs_free_path(path);
+4 -4
fs/btrfs/xattr.c
··· 188 188 if (old_data_len + name_len + sizeof(*di) == item_size) { 189 189 /* No other xattrs packed in the same leaf item. */ 190 190 if (size > old_data_len) 191 - btrfs_extend_item(path, size - old_data_len); 191 + btrfs_extend_item(trans, path, size - old_data_len); 192 192 else if (size < old_data_len) 193 - btrfs_truncate_item(path, data_size, 1); 193 + btrfs_truncate_item(trans, path, data_size, 1); 194 194 } else { 195 195 /* There are other xattrs packed in the same item. */ 196 196 ret = btrfs_delete_one_dir_name(trans, root, path, di); 197 197 if (ret) 198 198 goto out; 199 - btrfs_extend_item(path, data_size); 199 + btrfs_extend_item(trans, path, data_size); 200 200 } 201 201 202 202 ptr = btrfs_item_ptr(leaf, slot, char); ··· 205 205 btrfs_set_dir_data_len(leaf, di, size); 206 206 data_ptr = ((unsigned long)(di + 1)) + name_len; 207 207 write_extent_buffer(leaf, value, data_ptr, size); 208 - btrfs_mark_buffer_dirty(leaf); 208 + btrfs_mark_buffer_dirty(trans, leaf); 209 209 } else { 210 210 /* 211 211 * Insert, and we had space for the xattr, so path->slots[0] is