@@ -4604,6 +4604,28 @@ int btrfs_pin_reserved_extent(struct btrfs_trans_handle *trans, u64 start,
46044604 return ret ;
46054605}
46064606
4607+ static int alloc_reserved_extent (struct btrfs_trans_handle * trans , u64 bytenr ,
4608+ u64 num_bytes )
4609+ {
4610+ struct btrfs_fs_info * fs_info = trans -> fs_info ;
4611+ int ret ;
4612+
4613+ ret = remove_from_free_space_tree (trans , bytenr , num_bytes );
4614+ if (ret )
4615+ return ret ;
4616+
4617+ ret = btrfs_update_block_group (trans , bytenr , num_bytes , true);
4618+ if (ret ) {
4619+ ASSERT (!ret );
4620+ btrfs_err (fs_info , "update block group failed for %llu %llu" ,
4621+ bytenr , num_bytes );
4622+ return ret ;
4623+ }
4624+
4625+ trace_btrfs_reserved_extent_alloc (fs_info , bytenr , num_bytes );
4626+ return 0 ;
4627+ }
4628+
46074629static int alloc_reserved_file_extent (struct btrfs_trans_handle * trans ,
46084630 u64 parent , u64 root_objectid ,
46094631 u64 flags , u64 owner , u64 offset ,
@@ -4664,18 +4686,7 @@ static int alloc_reserved_file_extent(struct btrfs_trans_handle *trans,
46644686 btrfs_mark_buffer_dirty (path -> nodes [0 ]);
46654687 btrfs_free_path (path );
46664688
4667- ret = remove_from_free_space_tree (trans , ins -> objectid , ins -> offset );
4668- if (ret )
4669- return ret ;
4670-
4671- ret = btrfs_update_block_group (trans , ins -> objectid , ins -> offset , true);
4672- if (ret ) { /* -ENOENT, logic error */
4673- btrfs_err (fs_info , "update block group failed for %llu %llu" ,
4674- ins -> objectid , ins -> offset );
4675- BUG ();
4676- }
4677- trace_btrfs_reserved_extent_alloc (fs_info , ins -> objectid , ins -> offset );
4678- return ret ;
4689+ return alloc_reserved_extent (trans , ins -> objectid , ins -> offset );
46794690}
46804691
46814692static int alloc_reserved_tree_block (struct btrfs_trans_handle * trans ,
@@ -4693,7 +4704,6 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans,
46934704 struct extent_buffer * leaf ;
46944705 struct btrfs_delayed_tree_ref * ref ;
46954706 u32 size = sizeof (* extent_item ) + sizeof (* iref );
4696- u64 num_bytes ;
46974707 u64 flags = extent_op -> flags_to_set ;
46984708 bool skinny_metadata = btrfs_fs_incompat (fs_info , SKINNY_METADATA );
46994709
@@ -4703,12 +4713,10 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans,
47034713 if (skinny_metadata ) {
47044714 extent_key .offset = ref -> level ;
47054715 extent_key .type = BTRFS_METADATA_ITEM_KEY ;
4706- num_bytes = fs_info -> nodesize ;
47074716 } else {
47084717 extent_key .offset = node -> num_bytes ;
47094718 extent_key .type = BTRFS_EXTENT_ITEM_KEY ;
47104719 size += sizeof (* block_info );
4711- num_bytes = node -> num_bytes ;
47124720 }
47134721
47144722 path = btrfs_alloc_path ();
@@ -4753,23 +4761,7 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans,
47534761 btrfs_mark_buffer_dirty (leaf );
47544762 btrfs_free_path (path );
47554763
4756- ret = remove_from_free_space_tree (trans , extent_key .objectid ,
4757- num_bytes );
4758- if (ret )
4759- return ret ;
4760-
4761- ret = btrfs_update_block_group (trans , extent_key .objectid ,
4762- fs_info -> nodesize , true);
4763- if (ret ) { /* -ENOENT, logic error */
4764- ASSERT (!ret );
4765- btrfs_err (fs_info , "update block group failed for %llu %llu" ,
4766- extent_key .objectid , extent_key .offset );
4767- return ret ;
4768- }
4769-
4770- trace_btrfs_reserved_extent_alloc (fs_info , extent_key .objectid ,
4771- fs_info -> nodesize );
4772- return ret ;
4764+ return alloc_reserved_extent (trans , node -> bytenr , fs_info -> nodesize );
47734765}
47744766
47754767int btrfs_alloc_reserved_file_extent (struct btrfs_trans_handle * trans ,
0 commit comments