Ack. David Lehman <dlehman@xxxxxxxxxx> wrote: > Show free regions within extended partitions as such in the graphic > as well as in the tree view. > > Take advantage of the fact that free space "partitions" within an > extended have the PARTITION_LOGICAL flag set. > > Lastly, use the grain size of the kernel-supplied alignment as the > minimum size of free regions that get displayed. Within the extended > we double this because the way logical partitions' metadata areas > are allocated leads to more conservative partition alignment. > > Resolves: rhbz#626025 > --- > pyanaconda/iw/partition_gui.py | 80 ++++++++++++++-------------------------- > 1 files changed, 28 insertions(+), 52 deletions(-) > > diff --git a/pyanaconda/iw/partition_gui.py b/pyanaconda/iw/partition_gui.py > index 4c9bba2..bb2c9fc 100644 > --- a/pyanaconda/iw/partition_gui.py > +++ b/pyanaconda/iw/partition_gui.py > @@ -363,19 +363,13 @@ class DiskStripeGraph(StripeGraph): > 'model': drive.model} > stripe = Stripe(self.getCanvas(), drivetext, self.dcCB, obj = drive) > > - # Free Extended Calculation > - # Free slice/partition in the extended partition "free space". If there > - # is space between the last logical partition and the ending of the > - # extended partition we create a "free space" in the extended part. > # Create the slices. > > # These offsets are where the partition/slices end. 0<offset<1 > - last_logical_offset = None > - last_extended_offset = None > - > for part in drive.format.partedDisk.getFreeSpacePartitions() \ > + [d for d in drive.format.partitions]: > - if part.getSize(unit="MB") <= 1.0: > + if part.getSize(unit="MB") <= 1.0 or \ > + part.type & parted.PARTITION_METADATA: > continue > > # Create the start and length for the slice. > @@ -384,43 +378,37 @@ class DiskStripeGraph(StripeGraph): > xlength = (Decimal(str(part.geometry.length)) > / Decimal(str(drive.partedDevice.length))) > > - if part.type == parted.PARTITION_LOGICAL: > - partstr = "%s\n%.0f MB" % (part.path, float(part.getSize())) > - stype = Slice.SUBSLICE > - unsel_col = self.part_type_colors["unsel_logical"] > - sel_col = self.part_type_colors["sel_logical"] > + if part.type & parted.PARTITION_LOGICAL: > + if part.type & parted.PARTITION_FREESPACE: > + name = _("Free") > + unsel_col = self.part_type_colors["unsel_freespace"] > + sel_col = self.part_type_colors["sel_freespace"] > + else: > + name = part.path > + unsel_col = self.part_type_colors["unsel_logical"] > + sel_col = self.part_type_colors["sel_logical"] > > - # Free Extended Calculation > - if last_logical_offset == None: > - last_logical_offset = xoffset + xlength > - elif last_logical_offset < xoffset + xlength: > - last_logical_offset = xoffset + xlength > + partstr = "%s\n%.0f MB" % (name, float(part.getSize())) > + stype = Slice.SUBSLICE > > - elif part.type == parted.PARTITION_FREESPACE: > + elif part.type & parted.PARTITION_FREESPACE: > partstr = "%s\n%.0f MB" % (_("Free"), float(part.getSize())) > stype = Slice.SLICE > unsel_col = self.part_type_colors["unsel_freespace"] > sel_col = self.part_type_colors["sel_freespace"] > > - elif part.type == parted.PARTITION_EXTENDED: > + elif part.type & parted.PARTITION_EXTENDED: > partstr = "" > stype = Slice.CONTAINERSLICE > unsel_col = self.part_type_colors["unsel_extended"] > sel_col = self.part_type_colors["sel_extended"] > > - # Free Extended Calculation > - last_extended_offset = xoffset + xlength > - > - elif part.type == parted.PARTITION_NORMAL: > + else: > partstr = "%s\n%.0f MB" % (part.path, float(part.getSize())) > stype = Slice.SLICE > unsel_col = self.part_type_colors["unsel_normal"] > sel_col = self.part_type_colors["sel_normal"] > > - else: > - # We don't really want to draw anything in this case. > - continue > - > # We need to use the self.storage objects not the partedDisk ones. > # The free space has not storage object. > if part.type != parted.PARTITION_FREESPACE: > @@ -434,25 +422,6 @@ class DiskStripeGraph(StripeGraph): > unsel_col = unsel_col, obj = o_part) > stripe.addSlice(slice) > > - # Free Extended Calculation > - if (last_logical_offset != None and last_extended_offset != None) \ > - and last_logical_offset < last_extended_offset: > - # We must create a "free extended" slice > - stype = Slice.SUBSLICE > - unsel_col = self.part_type_colors["unsel_freespace"] > - sel_col = self.part_type_colors["sel_freespace"] > - xoffset = last_logical_offset > - xlength = last_extended_offset - last_logical_offset > - # don't add a slice for free regions of <= 1MB > - size = Decimal(str(drive.size)) * xlength > - if size > 1: > - slcstr = "%s\n%.0f MB" % (_("Free"), size) > - > - slice = Slice(stripe, slcstr, stype, xoffset, xlength, > - dcCB = self.dcCB, cCB = self.cCB, sel_col=sel_col, > - unsel_col=unsel_col) > - stripe.addSlice(slice) > - > return stripe > > class LVMStripeGraph(StripeGraph): > @@ -1045,10 +1014,17 @@ class PartitionWindow(InstallWindow): > log.debug("can't find partition %s in device" > " tree" % partName) > > - # ignore the tiny < 1 MB free space partitions (#119479) > - if part.getSize(unit="MB") <= 1.0 and \ > - part.type & parted.PARTITION_FREESPACE: > - if not part.active or not device.bootable: > + # ignore any free space region that is less than the > + # grain size of the disklabel alignment we are using > + if part.type & parted.PARTITION_FREESPACE: > + min_length = disk.format.alignment.grainSize > + if part.type & parted.PARTITION_LOGICAL: > + # ignored free regions in the extended can be up > + # to twice the alignment grain size, to account > + # for logical partition metadata > + min_length *= 2 > + > + if part.geometry.length < min_length: > part = part.nextPartition() > continue > > @@ -1058,7 +1034,7 @@ class PartitionWindow(InstallWindow): > "one extended partition per disk") > extendedParent = self.tree.append(parent) > iter = extendedParent > - elif device and device.isLogical: > + elif part.type & parted.PARTITION_LOGICAL: > if not extendedParent: > raise RuntimeError, ("crossed logical partition " > "before extended") > -- > 1.7.3.5 > > _______________________________________________ > Anaconda-devel-list mailing list > Anaconda-devel-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/anaconda-devel-list -- David Cantrell <dcantrell@xxxxxxxxxx> Supervisor, Installer Engineering Team Red Hat, Inc. | Honolulu, HI | UTC-10 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list