>From 8d7984f20bd26cbbbef6e6aeae5e66e515670422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Mon, 7 Mar 2011 08:34:35 +0000 Subject: [PATCH] copy: merge similar extents before processing * src/extent-scan.c (extent_scan_read): Merge extents that vary only in size, so that we may process them more efficiently. This will be especially useful when we introduce fallocate() to allocate extents in the destination. --- src/extent-scan.c | 26 ++++++++++++++++++++------ 1 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/extent-scan.c b/src/extent-scan.c index 1ba59db..c416586 100644 --- a/src/extent-scan.c +++ b/src/extent-scan.c @@ -85,23 +85,37 @@ extent_scan_read (struct extent_scan *scan) scan->ei_count = fiemap->fm_mapped_extents; scan->ext_info = xnmalloc (scan->ei_count, sizeof (struct extent_info)); - unsigned int i; + unsigned int i, si = 0; for (i = 0; i < scan->ei_count; i++) { assert (fm_extents[i].fe_logical <= OFF_T_MAX); - scan->ext_info[i].ext_logical = fm_extents[i].fe_logical; - scan->ext_info[i].ext_length = fm_extents[i].fe_length; - scan->ext_info[i].ext_flags = fm_extents[i].fe_flags; + if (si && scan->ext_info[si-1].ext_flags == fm_extents[i].fe_flags + && (scan->ext_info[si-1].ext_logical + scan->ext_info[si-1].ext_length + == fm_extents[i].fe_logical)) + { + /* Merge previous with last. */ + scan->ext_info[si-1].ext_length += fm_extents[i].fe_length; + } + else + { + scan->ext_info[si].ext_logical = fm_extents[i].fe_logical; + scan->ext_info[si].ext_length = fm_extents[i].fe_length; + scan->ext_info[si].ext_flags = fm_extents[i].fe_flags; + si++; + } } - i--; - if (scan->ext_info[i].ext_flags & FIEMAP_EXTENT_LAST) + scan->ei_count = si; + + si--; + if (scan->ext_info[si].ext_flags & FIEMAP_EXTENT_LAST) { scan->hit_final_extent = true; return true; } + i--; scan->scan_start = fm_extents[i].fe_logical + fm_extents[i].fe_length; return true; -- 1.7.4