X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=resize%2Fresize.ml;h=3c7a6335b4025988daaf9b91ccf548a243815e7c;hb=c55bad93fbde03a3daa6058913f02098c45e55f5;hp=9976ff4476a2c4269380cdff5a16238988020151;hpb=119e67a92e74c3e657133c751a4f92d40924d787;p=libguestfs.git diff --git a/resize/resize.ml b/resize/resize.ml index 9976ff4..3c7a633 100644 --- a/resize/resize.ml +++ b/resize/resize.ml @@ -866,20 +866,41 @@ let () = (* Are we going to align the first partition and fix the bootloader? *) let align_first_partition_and_fix_bootloader = - (* Bootloaders that we know how to fix. *) - let can_fix_boot_loader = + (* Bootloaders that we know how to fix: + * - first partition is NTFS, and + * - first partition is bootable, and + * - only one partition (ie. not Win Vista and later), and + * - it's not already aligned to some small value (no point + * moving it around unnecessarily) + *) + let rec can_fix_boot_loader () = match partitions with - | { p_type = ContentFS ("ntfs", _); p_bootable = true; - p_operation = OpCopy | OpIgnore | OpResize _ } :: _ -> true + | [ { p_part = { G.part_start = start }; + p_type = ContentFS ("ntfs", _); + p_bootable = true; + p_operation = OpCopy | OpIgnore | OpResize _ } ] + when not_aligned_enough start -> true | _ -> false + and not_aligned_enough start = + let alignment = alignment_of start in + alignment < 12 (* < 4K alignment *) + and alignment_of = function + | 0L -> 64 + | n when n &^ 1L = 1L -> 0 + | n -> 1 + alignment_of (n /^ 2L) in - match align_first, can_fix_boot_loader with + match align_first, can_fix_boot_loader () with | `Never, _ | `Auto, false -> false | `Always, _ | `Auto, true -> true +let () = + if debug then + eprintf "align_first_partition_and_fix_bootloader = %b\n%!" + align_first_partition_and_fix_bootloader + (* Repartition the target disk. *) (* Calculate the location of the partitions on the target disk. This