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 <chenhanx...@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 _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs