@@ -5714,6 +5714,44 @@ void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes)
5714
5714
to_free );
5715
5715
}
5716
5716
5717
+ /**
5718
+ * __btrfs_delalloc_reserve_space - reserve data and metadata space for
5719
+ * delalloc
5720
+ * @inode: inode we're writing to
5721
+ * @start: start range we are writing to
5722
+ * @len: how long the range we are writing to
5723
+ *
5724
+ * TODO: This function will finally replace old btrfs_delalloc_reserve_space()
5725
+ *
5726
+ * This will do the following things
5727
+ *
5728
+ * o reserve space in data space info for num bytes
5729
+ * and reserve precious corresponding qgroup space
5730
+ * (Done in check_data_free_space)
5731
+ *
5732
+ * o reserve space for metadata space, based on the number of outstanding
5733
+ * extents and how much csums will be needed
5734
+ * also reserve metadata space in a per root over-reserve method.
5735
+ * o add to the inodes->delalloc_bytes
5736
+ * o add it to the fs_info's delalloc inodes list.
5737
+ * (Above 3 all done in delalloc_reserve_metadata)
5738
+ *
5739
+ * Return 0 for success
5740
+ * Return <0 for error(-ENOSPC or -EQUOT)
5741
+ */
5742
+ int __btrfs_delalloc_reserve_space (struct inode * inode , u64 start , u64 len )
5743
+ {
5744
+ int ret ;
5745
+
5746
+ ret = __btrfs_check_data_free_space (inode , start , len );
5747
+ if (ret < 0 )
5748
+ return ret ;
5749
+ ret = btrfs_delalloc_reserve_metadata (inode , len );
5750
+ if (ret < 0 )
5751
+ __btrfs_free_reserved_data_space (inode , start , len );
5752
+ return ret ;
5753
+ }
5754
+
5717
5755
/**
5718
5756
* btrfs_delalloc_reserve_space - reserve data and metadata space for delalloc
5719
5757
* @inode: inode we're writing to
@@ -5746,6 +5784,27 @@ int btrfs_delalloc_reserve_space(struct inode *inode, u64 num_bytes)
5746
5784
return 0 ;
5747
5785
}
5748
5786
5787
+ /**
5788
+ * __btrfs_delalloc_release_space - release data and metadata space for delalloc
5789
+ * @inode: inode we're releasing space for
5790
+ * @start: start position of the space already reserved
5791
+ * @len: the len of the space already reserved
5792
+ *
5793
+ * This must be matched with a call to btrfs_delalloc_reserve_space. This is
5794
+ * called in the case that we don't need the metadata AND data reservations
5795
+ * anymore. So if there is an error or we insert an inline extent.
5796
+ *
5797
+ * This function will release the metadata space that was not used and will
5798
+ * decrement ->delalloc_bytes and remove it from the fs_info delalloc_inodes
5799
+ * list if there are no delalloc bytes left.
5800
+ * Also it will handle the qgroup reserved space.
5801
+ */
5802
+ void __btrfs_delalloc_release_space (struct inode * inode , u64 start , u64 len )
5803
+ {
5804
+ btrfs_delalloc_release_metadata (inode , len );
5805
+ __btrfs_free_reserved_data_space (inode , start , len );
5806
+ }
5807
+
5749
5808
/**
5750
5809
* btrfs_delalloc_release_space - release data and metadata space for delalloc
5751
5810
* @inode: inode we're releasing space for
0 commit comments