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 <[email protected]> --- 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 = [] + (* Command line argument parsing. *) type align_first_t = [ `Never | `Always | `Auto ] (* Source partition type. *) type parttype = MBR | GPT -(* Data structure describing the source disk's partition layout. - * - * NOTE: For MBR, only primary/extended partitions are tracked here. - * Logical partitions are contained within an extended partition, and - * we don't track them (they are just copied within the extended - * partition). For the same reason we cannot resize logical partitions. - *) +(* Data structure describing the source disk's partition layout. *) type partition = { p_name : string; (* Device name, like /dev/sda1. *) p_part : G.partition; (* SOURCE partition data from libguestfs. *) @@ -496,12 +493,6 @@ read the man page virt-resize(1). p_target_start = 0L; p_target_end = 0L } ) parts 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 - (* Check content isn't larger than partitions. If it is then * something has gone wrong and we shouldn't continue. Old * virt-resize didn't do these checks. @@ -533,11 +524,29 @@ read the man page virt-resize(1). error (f_"%s: this partition overlaps the previous one") name | { p_part = { G.part_end = part_end } } :: parts -> loop part_end parts in + + let extended_partition_list = List.append + extended_partition_list + (List.filter (fun p -> parttype = MBR && p.p_mbr_p_type = ExtendedPartition) partitions) in + let extended_partition = if (List.length extended_partition_list) > 0 then + List.hd extended_partition_list else List.hd partitions 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 + loop 0L partitions; + loop 0L logical_partitions; if verbose () then ( printf "%d partitions found\n" (List.length partitions); - List.iter (debug_partition ~sectsize) partitions + List.iter (debug_partition ~sectsize) partitions; + List.iter (debug_partition ~sectsize) logical_partitions; + if (List.length extended_partition_list) > 0 then + printf "%s is extended partition\n" extended_partition.p_name ); (* Build a data structure describing LVs on the source disk. *) -- 2.1.0 _______________________________________________ Libguestfs mailing list [email protected] https://www.redhat.com/mailman/listinfo/libguestfs
