[Libguestfs] [PATCH v3 04/11] resize: add support for logical partitions for calculate_surplus

Chen Hanxiao chenhanxiao at cn.fujitsu.com
Wed Jun 3 09:32:38 UTC 2015


Add support for logical partitions.
 - add max_logi_align for calculate_surplus
   If we resize logical partition, we will lose size becasue of alignment.
   max_logi_align shows the max loss for alignment,
   which can ensure a successfully resize

 - don't count size of extended partition
   For it'll duplicate with logical partition, we'll count it later

 - we need at leat 1 gap between logical partitions.
   so --aligment=1 will be increased by 1

Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
---
v3: introduce max_logi_align for calculate_surplus

 resize/resize.ml | 27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/resize/resize.ml b/resize/resize.ml
index 1cefcef..d2c1724 100644
--- a/resize/resize.ml
+++ b/resize/resize.ml
@@ -740,10 +740,12 @@ read the man page virt-resize(1).
    * the size of the target disk.  If the return value >= 0 then it's
    * a surplus, if it is < 0 then it's a deficit.
    *)
-  let calculate_surplus () =
+  let calculate_surplus max_logi_align =
     (* We need some overhead for partitioning. *)
     let overhead =
       let maxl64 = List.fold_left max 0L in
+      (* We need at least 1 sector gap between logical partitions *)
+      let alignment = if alignment = 1L then 2L else alignment in
 
       let nr_partitions = List.length partitions in
 
@@ -773,12 +775,29 @@ read the man page virt-resize(1).
     let required = List.fold_left (
       fun total p ->
         let newsize =
+          (* size of extended partition is calculated seperately *)
+          if p.p_type = ContentExtendedPartition then 0L else
+            match p.p_operation with
+            | OpCopy | OpIgnore -> p.p_part.G.part_size
+            | OpDelete -> 0L
+            | OpResize newsize -> newsize in
+        total +^ newsize
+    ) 0L partitions in
+
+    let required_logical = List.fold_left (
+      fun total p ->
+        let newsize =
           match p.p_operation with
           | OpCopy | OpIgnore -> p.p_part.G.part_size
           | OpDelete -> 0L
           | OpResize newsize -> newsize in
         total +^ newsize
-    ) 0L partitions in
+    ) 0L logical_partitions in
+
+    let required_logical =
+      (* an extra alignment for the gap between extended and 1st logical *)
+      required_logical +^ (max_logi_align +^ alignment) *^sectsize in
+    let required = required +^ required_logical in
 
     let surplus = outsize -^ (required +^ overhead) in
 
@@ -794,7 +813,7 @@ read the man page virt-resize(1).
     error (f_"you cannot use options --expand and --shrink together");
 
   if expand <> None || shrink <> None then (
-    let surplus = calculate_surplus () in
+    let surplus = calculate_surplus 0L in
 
     if verbose () then
       printf "surplus before --expand or --shrink: %Ld\n" surplus;
@@ -845,7 +864,7 @@ read the man page virt-resize(1).
    * At this point, this number must be >= 0.
    *)
   let surplus =
-    let surplus = calculate_surplus () in
+    let surplus = calculate_surplus logical_align in
 
     if surplus < 0L then (
       let deficit = Int64.neg surplus in
-- 
2.1.0




More information about the Libguestfs mailing list