The helper is to calculate the defrag length in one run according to a 
threshold,
it will proceed doing defragmentation until the threshold was meet, and skip a
LARGE extent if any.

Signed-off-by: Tristan Ye <[email protected]>
---
 fs/ocfs2/move_extents.c |   30 ++++++++++++++++++++++++++++++
 1 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/fs/ocfs2/move_extents.c b/fs/ocfs2/move_extents.c
index 5b00b8c..2d31bad 100644
--- a/fs/ocfs2/move_extents.c
+++ b/fs/ocfs2/move_extents.c
@@ -801,3 +801,33 @@ out:
 
        return ret;
 }
+
+/*
+ * Helper to calculate the defraging length in one run according to threshold.
+ */
+static void ocfs2_calc_extent_defrag_len(u32 *alloc_size, u32 *len_defraged,
+                                        u32 threshold, int *skip)
+{
+       if ((*alloc_size + *len_defraged) < threshold) {
+               /*
+                * proceed defragmentation until we meet the thresh
+                */
+               *len_defraged += *alloc_size;
+       } else if (*len_defraged == 0) {
+               /*
+                * XXX: skip a large extent.
+                */
+               *skip = 1;
+       } else {
+               /*
+                * split this extent to coalesce with former pieces as
+                * to reach the threshold.
+                *
+                * we're done here with one cycle of defragmentation
+                * in a size of 'thresh', resetting 'len_defraged'
+                * forces a new defragmentation.
+                */
+               *alloc_size = threshold - *len_defraged;
+               *len_defraged = 0;
+       }
+}
-- 
1.5.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to