aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ocfs2/move_extents.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/fs/ocfs2/move_extents.c b/fs/ocfs2/move_extents.c
index ae15c998a82a..1c822e08fea0 100644
--- a/fs/ocfs2/move_extents.c
+++ b/fs/ocfs2/move_extents.c
@@ -797,3 +797,33 @@ out:
797 797
798 return ret; 798 return ret;
799} 799}
800
801/*
802 * Helper to calculate the defraging length in one run according to threshold.
803 */
804static void ocfs2_calc_extent_defrag_len(u32 *alloc_size, u32 *len_defraged,
805 u32 threshold, int *skip)
806{
807 if ((*alloc_size + *len_defraged) < threshold) {
808 /*
809 * proceed defragmentation until we meet the thresh
810 */
811 *len_defraged += *alloc_size;
812 } else if (*len_defraged == 0) {
813 /*
814 * XXX: skip a large extent.
815 */
816 *skip = 1;
817 } else {
818 /*
819 * split this extent to coalesce with former pieces as
820 * to reach the threshold.
821 *
822 * we're done here with one cycle of defragmentation
823 * in a size of 'thresh', resetting 'len_defraged'
824 * forces a new defragmentation.
825 */
826 *alloc_size = threshold - *len_defraged;
827 *len_defraged = 0;
828 }
829}