On Wed, May 20, 2015 at 06:51:28AM -0400, Chen Hanxiao wrote:
For MBR, logical partitions laid inside extended partition.
Add 3 variables to describe this:
- partitions
flat list of primary partitions (as now, the global 'partitions').
extended partitions is essentially primary partition
- logical_partitions
flat list of logical partitions
- extended_partition
one MBR extended partition
Signed-off-by: Chen Hanxiao <chenhanxiao(a)cn.fujitsu.com>
---
resize/resize.ml | 37 +++++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 14 deletions(-)
diff --git a/resize/resize.ml b/resize/resize.ml
index 4c97405..d7a8ce1 100644
--- a/resize/resize.ml
+++ b/resize/resize.ml
@@ -26,19 +26,16 @@ module G = Guestfs
(* Minimum surplus before we create an extra partition. *)
let min_extra_partition = 10L *^ 1024L *^ 1024L
+(* mbr extended partition *)
+let extended_partition_list = []
This assignment doesn't really do anything. 'let' bindings in OCaml
don't create global variables. This just makes
'extended_partition_list' be a name for the empty list, ...
[...]
+ let extended_partition_list = List.append
+ extended_partition_list
... up to here, where you create a second name, also
'extended_partition_list', completely independent from the one above,
which for no reason appends to the empty list.
What *doesn't* happen is 'extended_partition_list' that you created at
the top is modified.
+ let extended_partition = if (List.length extended_partition_list)
> 0 then
+ List.hd extended_partition_list else List.hd partitions in
You could write this more naturally as:
let extended_partition =
match extended_partition_list with
| h :: _ -> h
| [] -> List.hd partitions in
Rewriting it like this also makes the bug in this code clearer: why is
extended_partition initialized to the first partition, if there are no
extended partitions?
I think you probably meant to write:
let extended_partition =
match extended_partition_list with
| h :: _ -> Some h
| [] -> None in
+ let logical_partitions =
+ List.filter (fun p -> parttype = MBR && p.p_mbr_p_type =
LogicalPartition) partitions in
+ (* Filter out logical partitions. See note above. *)
+ let partitions =
+ (* for GPT, all partitions are regarded as Primary Partition,
+ * e.g. there is no Extended Partition or Logical Partition. *)
+ List.filter (fun p -> parttype <> MBR || p.p_mbr_p_type <>
LogicalPartition) partitions in
Although this is code is correct, it is clearer and shorter to write
the test using a separate function, so it would become:
let is_logical_partition p =
parttype = MBR && p.p_mbr_p_type = LogicalPartition
in
let logical_partitions = List.filter is_logical_partition partitions in
let partitions =
List.filter (fun p -> not (is_logical_partition p)) partitions in
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines. Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v