Whole-disk formats are recognized but cannot be edited in any way. --- booty/bootloaderInfo.py | 6 ++- iw/bootloader_main_gui.py | 10 ++- iw/partition_dialog_gui.py | 6 +- iw/partition_gui.py | 119 ++++++++++++++++++++------------------- iw/partition_ui_helpers_gui.py | 2 +- iw/raid_dialog_gui.py | 4 +- storage/__init__.py | 26 ++++++++- storage/devices.py | 105 ++++++++++++++++------------------- storage/devicetree.py | 49 +++++++++------- storage/partitioning.py | 10 ++-- textw/partition_text.py | 2 +- 11 files changed, 184 insertions(+), 155 deletions(-) diff --git a/booty/bootloaderInfo.py b/booty/bootloaderInfo.py index deddb4d..1878393 100644 --- a/booty/bootloaderInfo.py +++ b/booty/bootloaderInfo.py @@ -475,7 +475,11 @@ class bootloaderInfo(object): f.write("\n") def updateDriveList(self, sortedList=[]): - self._drivelist = map(lambda x: x.name, self.storage.disks) + # bootloader is unusual in that we only want to look at disks that + # have disklabels -- no partitioned md or unpartitioned disks + disks = self.storage.disks + partitioned = self.storage.partitioned + self._drivelist = [d.name for d in disks if d in partitioned] self._drivelist.sort(isys.compareDrives) # If we're given a sort order, make sure the drives listed in it diff --git a/iw/bootloader_main_gui.py b/iw/bootloader_main_gui.py index 213083a..5f2fec5 100644 --- a/iw/bootloader_main_gui.py +++ b/iw/bootloader_main_gui.py @@ -136,7 +136,10 @@ class MainBootloaderWindow(InstallWindow): lbl = dxml.get_widget("bd%dLabel" %(i,)) combo.show() lbl.show() - m = __genStore(combo, anaconda.id.storage.disks, self.driveorder[i - 1]) + partitioned = anaconda.id.storage.partitioned + disks = anaconda.id.storage.disks + bl_disks = [d.name for d in disks if d in partitioned] + m = __genStore(combo, bl_disks, self.driveorder[i - 1]) dxml.get_widget("bd1Combo").connect("changed", __driveChange, dxml, choices) __driveChange(dxml.get_widget("bd1Combo"), dxml, choices) @@ -190,10 +193,11 @@ class MainBootloaderWindow(InstallWindow): self.bl = anaconda.id.bootloader self.intf = anaconda.intf - disks = anaconda.id.storage.disks self.driveorder = self.bl.drivelist if len(self.driveorder) == 0: - self.driveorder = [d.name for d in disks] + partitioned = anaconda.id.storage.partitioned + disks = anaconda.id.storage.disks + self.driveorder = [d.name for d in disks if d in partitioned] if self.bl.getPassword(): self.usePass = 1 diff --git a/iw/partition_dialog_gui.py b/iw/partition_dialog_gui.py index c9781e0..7f76c86 100644 --- a/iw/partition_dialog_gui.py +++ b/iw/partition_dialog_gui.py @@ -164,14 +164,14 @@ class PartitionEditor: iter = model.iter_next(iter) - if len(allowdrives) == len(self.storage.disks): + if len(allowdrives) == len(self.storage.partitioned): allowdrives = None size = self.sizespin.get_value_as_int() disks = [] if allowdrives: for drive in allowdrives: - for disk in self.storage.disks: + for disk in self.storage.partitioned: if disk.name == drive: disks.append(disk) @@ -403,7 +403,7 @@ class PartitionEditor: maintable.attach(lbl, 0, 1, row, row + 1) req_disk_names = [d.name for d in self.origrequest.req_disks] - self.driveview = createAllowedDrivesList(self.storage.disks, + self.driveview = createAllowedDrivesList(self.storage.partitioned, req_disk_names, disallowDrives=[self.anaconda.updateSrc]) lbl.set_mnemonic_widget(self.driveview) diff --git a/iw/partition_gui.py b/iw/partition_gui.py index 04c9988..a17fd70 100644 --- a/iw/partition_gui.py +++ b/iw/partition_gui.py @@ -1017,62 +1017,66 @@ class PartitionWindow(InstallWindow): parent = self.tree.append(drvparent) self.tree[parent]['PyObject'] = disk - part = disk.format.firstPartition - extendedParent = None - while part: - if part.type & parted.PARTITION_METADATA: - part = part.nextPartition() - continue - - partName = devicePathToName(part.getDeviceNodeName()) - device = self.storage.devicetree.getDeviceByName(partName) - if not device and not part.type & parted.PARTITION_FREESPACE: - 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: + if disk.partitioned: + part = disk.format.firstPartition + extendedParent = None + while part: + if part.type & parted.PARTITION_METADATA: part = part.nextPartition() continue - if device and device.isExtended: - if extendedParent: - raise RuntimeError, ("can't handle more than " - "one extended partition per disk") - extendedParent = self.tree.append(parent) - iter = extendedParent - elif device and device.isLogical: - if not extendedParent: - raise RuntimeError, ("crossed logical partition " - "before extended") - iter = self.tree.append(extendedParent) - else: - iter = self.tree.append(parent) - - if device and not device.isExtended: - self.addDevice(device, iter) - else: - # either extended or freespace - if part.type & parted.PARTITION_FREESPACE: - devstring = _("Free") - ptype = "" + partName = devicePathToName(part.getDeviceNodeName()) + device = self.storage.devicetree.getDeviceByName(partName) + if not device and not part.type & parted.PARTITION_FREESPACE: + 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: + part = part.nextPartition() + continue + + if device and device.isExtended: + if extendedParent: + raise RuntimeError, ("can't handle more than " + "one extended partition per disk") + extendedParent = self.tree.append(parent) + iter = extendedParent + elif device and device.isLogical: + if not extendedParent: + raise RuntimeError, ("crossed logical partition " + "before extended") + iter = self.tree.append(extendedParent) else: - devstring = device.name - ptype = _("Extended") - - self.tree[iter]['Device'] = devstring - self.tree[iter]['Type'] = ptype - size = part.getSize(unit="MB") - if size < 1.0: - sizestr = "< 1" + iter = self.tree.append(parent) + + if device and not device.isExtended: + self.addDevice(device, iter) else: - sizestr = "%Ld" % (size) - self.tree[iter]['Size (MB)'] = sizestr - self.tree[iter]['PyObject'] = device + # either extended or freespace + if part.type & parted.PARTITION_FREESPACE: + devstring = _("Free") + ptype = "" + else: + devstring = device.name + ptype = _("Extended") + + self.tree[iter]['Device'] = devstring + self.tree[iter]['Type'] = ptype + size = part.getSize(unit="MB") + if size < 1.0: + sizestr = "< 1" + else: + sizestr = "%Ld" % (size) + self.tree[iter]['Size (MB)'] = sizestr + self.tree[iter]['PyObject'] = device - part = part.nextPartition() + part = part.nextPartition() + else: + # whole-disk formatting + self.addDevice(disk, parent) # Insert a '\n' when device string is too long. Usually when it # contains '/dev/mapper'. First column should be around 20 chars. @@ -1116,7 +1120,7 @@ class PartitionWindow(InstallWindow): # Display a create dialog. stripe_dev = disp_stripe.obj - if isinstance(stripe_dev, storage.DiskDevice): + if stripe_dev.partitioned: tempformat = self.storage.defaultFSType device = self.storage.newPartition(fmt_type=tempformat, size=200) self.editPartition(device, isNew = True) @@ -1145,7 +1149,7 @@ class PartitionWindow(InstallWindow): # FIXME: This code might repeat itself. might be a good idea to # put it in a function. curr_parent = self.tree[iparent]["PyObject"] - if isinstance(curr_parent, storage.DiskDevice): + if curr_parent.partitioned: tempformat = self.storage.defaultFSType device = self.storage.newPartition(fmt_type=tempformat, size=200) self.editPartition(device, isNew = True) @@ -1187,7 +1191,7 @@ class PartitionWindow(InstallWindow): if not device: # This is free space. parent = self.tree[iparent]["PyObject"] - if isinstance(parent, storage.DiskDevice): + if parent.partitioned: if not isinstance(self.stripeGraph, DiskStripeGraph): self.stripeGraph.shutDown() self.stripeGraph = DiskStripeGraph(self.storage, @@ -1203,7 +1207,7 @@ class PartitionWindow(InstallWindow): dcCB = self.barviewActivateCB) self.stripeGraph.setDisplayed(parent) - elif isinstance(device, storage.DiskDevice): + elif device.partitioned: if not isinstance(self.stripeGraph, DiskStripeGraph): self.stripeGraph.shutDown() self.stripeGraph = DiskStripeGraph(self.storage, @@ -1273,7 +1277,7 @@ class PartitionWindow(InstallWindow): devices. This will need some work when that time comes. """ device = self.tree.getCurrentDevice() - if device.format.type == "disklabel": + if device.partitioned: if doClearPartitionedDevice(self.intf, self.storage, device): @@ -1281,8 +1285,7 @@ class PartitionWindow(InstallWindow): elif doDeleteDevice(self.intf, self.storage, device): - if isinstance(device, storage.devices.DiskDevice) or \ - isinstance(device, storage.devices.PartitionDevice): + if isinstance(device, storage.devices.PartitionDevice): justRedraw = False else: justRedraw = True @@ -1327,7 +1330,7 @@ class PartitionWindow(InstallWindow): # FIXME: Why do I need availraidparts to clone? activate_create_raid_clone = False - if (len(self.storage.disks) > 1 + if (len(self.storage.partitioned) > 1 and availraidparts > 0): activate_create_raid_clone = True diff --git a/iw/partition_ui_helpers_gui.py b/iw/partition_ui_helpers_gui.py index 39b2561..ee6d0ac 100644 --- a/iw/partition_ui_helpers_gui.py +++ b/iw/partition_ui_helpers_gui.py @@ -420,7 +420,7 @@ def createPreExistFSOptionSection(origrequest, maintable, row, mountCombo, # do tests we just want in UI for now, not kickstart def doUIRAIDLVMChecks(request, storage): fstype = request.format.name - numdrives = len(storage.disks) + numdrives = len(storage.partitioned) ## if fstype and fstype.getName() == "physical volume (LVM)": ## if request.grow: diff --git a/iw/raid_dialog_gui.py b/iw/raid_dialog_gui.py index 8431e71..086c562 100644 --- a/iw/raid_dialog_gui.py +++ b/iw/raid_dialog_gui.py @@ -812,7 +812,7 @@ class RaidCloneDialog: lbl = gtk.Label(_("Source Drive:")) lbl.set_alignment(0.0, 0.0) box.pack_start(lbl, padding=5) - (sw, self.sourceView) = self.createDriveList(storage.disks) + (sw, self.sourceView) = self.createDriveList(storage.partitioned) selection = self.sourceView.get_selection() selection.set_mode(gtk.SELECTION_SINGLE) box.pack_start(sw, padding=5) @@ -820,7 +820,7 @@ class RaidCloneDialog: lbl = gtk.Label(_("Target Drive(s):")) lbl.set_alignment(0.0, 0.0) box.pack_start(lbl, padding=5) - (sw, self.targetView) = self.createDriveList(storage.disks) + (sw, self.targetView) = self.createDriveList(storage.partitioned) selection = self.targetView.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) box.pack_start(sw, padding=5) diff --git a/storage/__init__.py b/storage/__init__.py index ea89633..05478f5 100644 --- a/storage/__init__.py +++ b/storage/__init__.py @@ -386,7 +386,7 @@ class Storage(object): """ disks = [] for device in self.devicetree.devices: - if isinstance(device, DiskDevice): + if device.isDisk: if not device.mediaPresent: log.info("Skipping disk: %s: No media present" % device.name) continue @@ -395,6 +395,30 @@ class Storage(object): return disks @property + def partitioned(self): + """ A list of the partitioned devices in the device tree. + + Ignored devices are not included, nor disks with no media present. + + This is based on the current state of the device tree and + does not necessarily reflect the actual on-disk state of the + system's disks. + """ + partitioned = [] + for device in self.devicetree.devices: + if not device.partitioned: + continue + + if not device.mediaPresent: + log.info("Skipping device: %s: No media present" % device.name) + continue + + partitioned.append(device) + + partitioned.sort(key=lambda d: d.name) + return partitioned + + @property def partitions(self): """ A list of the partitions in the device tree. diff --git a/storage/devices.py b/storage/devices.py index b4a518e..9440534 100644 --- a/storage/devices.py +++ b/storage/devices.py @@ -418,6 +418,8 @@ class StorageDevice(Device): _devDir = "/dev" sysfsBlockDir = "class/block" _resizable = False + partitionable = False + isDisk = False def __init__(self, device, format=None, size=None, major=None, minor=None, @@ -710,9 +712,15 @@ class StorageDevice(Device): os.access(remfile, os.R_OK) and open(remfile).readline().strip() == "1") + @property + def partitioned(self): + return self.format.type == "disklabel" + class DiskDevice(StorageDevice): """ A disk """ _type = "disk" + partitionable = True + isDisk = True def __init__(self, device, format=None, size=None, major=None, minor=None, sysfsPath='', \ @@ -2195,12 +2203,9 @@ class LVMLogicalVolumeDevice(DMDevice): class MDRaidArrayDevice(StorageDevice): - """ An mdraid (Linux RAID) device. - - Since this is derived from StorageDevice, not DiskDevice, it - can NOT be used to represent a partitionable device. - """ + """ An mdraid (Linux RAID) device. """ _type = "mdarray" + partitionable = True def __init__(self, name, level=None, major=None, minor=None, size=None, memberDevices=None, totalDevices=None, bitmap=False, @@ -2643,29 +2648,28 @@ class MDRaidArrayDevice(StorageDevice): # real work, but it isn't our place to do it from here. self.exists = False - -class PartitionableMDRaidArrayDevice(MDRaidArrayDevice, DiskDevice): - """ A partitionable mdraid (Linux RAID) device. - - Since this is derived from DiskDevice, not StorageDevice, it - can be used to represent a partitionable device. - """ - _type = "partitionable mdarray" - @property def mediaPresent(self): - # Even if stopped/deactivated we still want to show up in storage.disks - return True + present = None + if self.partitioned: + # Even if stopped/deactivated we still want to show up in + # storage.disks + present = True + else: + present = self.partedDevice is not None + + return present @property def model(self): return "RAID%d Array" % self.level -class DMRaidArrayDevice(DiskDevice): +class DMRaidArrayDevice(DMDevice): """ A dmraid (device-mapper RAID) device """ _type = "dm-raid array" _packages = ["dmraid"] - _devDir = "/dev/mapper" + partitionable = True + isDisk = True def __init__(self, name, raidSet=None, format=None, size=None, major=None, minor=None, parents=None, @@ -2688,15 +2692,14 @@ class DMRaidArrayDevice(DiskDevice): for parent in parents: if not parent.format or parent.format.type != "dmraidmember": raise ValueError("parent devices must contain dmraidmember format") - DiskDevice.__init__(self, name, format=format, size=size, - major=major, minor=minor, parents=parents, - sysfsPath=sysfsPath) + DMDevice.__init__(self, name, format=format, size=size, + major=major, minor=minor, parents=parents, + sysfsPath=sysfsPath) self.formatClass = get_device_format_class("dmraidmember") if not self.formatClass: raise StorageError("cannot find class for 'dmraidmember'") - self._raidSet = raidSet @property @@ -2733,19 +2736,6 @@ class DMRaidArrayDevice(DiskDevice): """ Return a list of this array's member device instances. """ return self.parents - def updateSysfsPath(self): - """ Update this device's sysfs path. """ - log_method_call(self, self.name, status=self.status) - if not self.exists: - raise DeviceError("device has not been created", self.name) - - if self.status: - dm_node = dm.dm_node_from_name(self.name) - path = os.path.join("/sys", self.sysfsBlockDir, dm_node) - self.sysfsPath = os.path.realpath(path)[4:] - else: - self.sysfsPath = '' - def deactivate(self): """ Deactivate the raid set. """ log_method_call(self, self.name, status=self.status) @@ -2759,6 +2749,20 @@ class DMRaidArrayDevice(DiskDevice): self._raidSet.activate(mknod=True) udev_settle() + def setup(self, intf=None): + """ Open, or set up, a device. """ + log_method_call(self, self.name, status=self.status) + StorageDevice.setup(self, intf=intf) + self.activate() + + def teardown(self, recursive=None): + """ Close, or tear down, a device. """ + log_method_call(self, self.name, status=self.status) + if not self.exists and not recursive: + raise DeviceError("device has not been created", self.name) + + log.debug("not tearing down dmraid device %s" % self.name) + @property def mediaPresent(self): # Even if teared down we still want to show up in storage.disks @@ -2777,11 +2781,12 @@ def generateMultipathDeviceName(): number = _multipathDeviceNameGenerator.get() return "mpath%s" % (number, ) -class MultipathDevice(DiskDevice): +class MultipathDevice(DMDevice): """ A multipath device """ _type = "dm-multipath" _packages = ["device-mapper-multipath"] - _devDir = "/dev/mapper" + partitionable = True + isDisk = True def __init__(self, name, info, format=None, size=None, parents=None, sysfsPath=''): @@ -2804,7 +2809,7 @@ class MultipathDevice(DiskDevice): self._isUp = False self._pyBlockMultiPath = None self.setupIdentity() - DiskDevice.__init__(self, name, format=format, size=size, + DMDevice.__init__(self, name, format=format, size=size, parents=parents, sysfsPath=sysfsPath) # PJTODO: these need better setup @@ -2881,26 +2886,6 @@ class MultipathDevice(DiskDevice): self._isUp = False self._pyBlockMultiPath = None - def updateSysfsPath(self): - """ Update this device's sysfs path. """ - log_method_call(self, self.name, status=self.status) - if not self.exists: - raise DeviceError("device has not been created", self.name) - - if self.status: - dm_node = self.getDMNode() - path = os.path.join("/sys", self.sysfsBlockDir, dm_node) - self.sysfsPath = os.path.realpath(path)[4:] - else: - self.sysfsPath = '' - - def getDMNode(self): - """ Return the dm-X (eg: dm-0) device node for this device. """ - log_method_call(self, self.name, status=self.status) - if not self.exists: - raise DeviceError("device has not been created", self.name) - - return dm.dm_node_from_name(self.name) class NoDevice(StorageDevice): """ A nodev device for nodev filesystems like tmpfs. """ @@ -3089,6 +3074,8 @@ class iScsiDiskDevice(DiskDevice, NetworkStorageDevice): """ An iSCSI disk. """ _type = "iscsi" _packages = ["iscsi-initiator-utils", "dracut-network"] + partitionable = True + isDisk = True def __init__(self, device, **kwargs): self.node = kwargs.pop("node") @@ -3121,6 +3108,8 @@ class FcoeDiskDevice(DiskDevice, NetworkStorageDevice): """ An FCoE disk. """ _type = "fcoe" _packages = ["fcoe-utils", "dracut-network"] + partitionable = True + isDisk = True def __init__(self, device, **kwargs): self.nic = kwargs.pop("nic") diff --git a/storage/devicetree.py b/storage/devicetree.py index b528ab2..23a8e57 100644 --- a/storage/devicetree.py +++ b/storage/devicetree.py @@ -567,10 +567,10 @@ class DeviceTree(object): else: ret = cmp(a2.device.name, a1.device.name) elif isinstance(a1.device, PartitionDevice) and \ - not isinstance(a2.device, DiskDevice): + a2.device.partitioned: ret = 1 elif isinstance(a2.device, PartitionDevice) and \ - not isinstance(a1.device, DiskDevice): + a1.device.partitioned: ret = -1 else: ret = 0 @@ -610,13 +610,13 @@ class DeviceTree(object): isinstance(a2.device, PartitionDevice): ret = cmp(a1.device.name, a2.device.name) elif isinstance(a1.device, PartitionDevice) and \ - not isinstance(a2.device, DiskDevice): + a2.device.partitioned: if a1.isGrow(): ret = -1 else: ret = 1 elif isinstance(a2.device, PartitionDevice) and \ - not isinstance(a1.device, DiskDevice): + a1.device.partitioned: if a2.isGrow(): ret = 1 else: @@ -650,10 +650,10 @@ class DeviceTree(object): else: ret = cmp(a1.device.name, a2.device.name) elif isinstance(a1.device, PartitionDevice) and \ - not isinstance(a2.device, DiskDevice): + a2.device.partitioned: ret = -1 elif isinstance(a2.device, PartitionDevice) and \ - not isinstance(a1.device, DiskDevice): + a1.device.partitioned: ret = 1 else: ret = 0 @@ -681,7 +681,7 @@ class DeviceTree(object): log.debug("resetting parted disks...") for device in self.devices: - if device.format.type == "disklabel": + if device.partitioned: device.format.resetPartedDisk() # reget parted.Partition for remaining preexisting devices @@ -1184,7 +1184,7 @@ class DeviceTree(object): kwargs["identifier"] = udev_device_get_fcoe_identifier(info) log.debug("%s is an fcoe disk" % name) elif udev_device_get_md_container(info): - diskType = PartitionableMDRaidArrayDevice + diskType = MDRaidArrayDevice parentName = devicePathToName(udev_device_get_md_container(info)) kwargs["parents"] = [ self.getDeviceByName(parentName) ] kwargs["level"] = udev_device_get_md_level(info) @@ -1250,7 +1250,7 @@ class DeviceTree(object): # The first step is to either look up or create the device # if udev_device_is_multipath_member(info): - device = StorageDevice(name, + device = DiskDevice(name, major=udev_device_get_major(info), minor=udev_device_get_minor(info), sysfsPath=sysfs_path, exists=True, @@ -1282,14 +1282,9 @@ class DeviceTree(object): if device is None: device = self.addUdevOpticalDevice(info) elif udev_device_is_biosraid(info) and udev_device_is_disk(info): - # This is special handling to avoid the "unrecognized disklabel" - # code since biosraid member disks won't have a disklabel. We - # use a StorageDevice because DiskDevices need disklabels. - # Quite lame, but it doesn't matter much since we won't use - # the StorageDevice instances for anything. log.debug("%s is part of a biosraid" % name) if device is None: - device = StorageDevice(name, + device = DiskDevice(name, major=udev_device_get_major(info), minor=udev_device_get_minor(info), sysfsPath=sysfs_path, exists=True) @@ -1311,23 +1306,28 @@ class DeviceTree(object): if device and device.name in self.protectedDevNames: device.protected = True - # Don't try to do format handling on drives without media - if device and not device.mediaPresent: + # Don't try to do format handling on drives without media or + # if we didn't end up with a device somehow. + if not device or not device.mediaPresent: return # Now, if the device is a disk, see if there is a usable disklabel. # If not, see if the user would like to create one. - # XXX this is the bit that forces disklabels on disks. Lame. - if isinstance(device, DiskDevice): + if device.partitionable: self.handleUdevDiskLabelFormat(info, device) - return + if device.partitioned or self.isIgnored(info): + # If the device has a disklabel, or the user chose not to + # create one, we are finished with this device. Otherwise + # it must have some non-disklabel formatting, in which case + # we fall through to handle that. + return # now handle the device's formatting self.handleUdevDeviceFormat(info, device) def handleUdevDiskLabelFormat(self, info, device): log_method_call(self, device=device.name) - if device.format.type == "disklabel": + if device.partitioned: # this device is already set up log.debug("disklabel format on %s already set up" % device.name) return @@ -1371,6 +1371,11 @@ class DeviceTree(object): device=device.path, exists=not initlabel) except InvalidDiskLabelError: + # if there is preexisting formatting on the device we will + # use it instead of ignoring the device + if not self.zeroMbr and \ + getFormat(udev_device_get_format(info)).type is not None: + return # if we have a cb function use it. else we ignore the device. if initcb is not None and initcb(): format = getFormat("disklabel", @@ -1767,7 +1772,7 @@ class DeviceTree(object): if shouldClear(device, self.clearPartType, clearPartDisks=self.clearPartDisks): - # if this is a partition that will be cleared by clearpart, + # if this is a device that will be cleared by clearpart, # don't bother with format-specific processing return diff --git a/storage/partitioning.py b/storage/partitioning.py index a23efb3..1bb1567 100644 --- a/storage/partitioning.py +++ b/storage/partitioning.py @@ -43,7 +43,7 @@ def _createFreeSpacePartitions(anaconda): # get a list of disks that have at least one free space region of at # least 100MB disks = [] - for disk in anaconda.id.storage.disks: + for disk in anaconda.id.storage.partitioned: if anaconda.id.storage.clearPartDisks and \ (disk.name not in anaconda.id.storage.clearPartDisks): continue @@ -169,7 +169,8 @@ def doAutoPartition(anaconda): log.debug("clearPartType: %s" % anaconda.id.storage.clearPartType) log.debug("clearPartDisks: %s" % anaconda.id.storage.clearPartDisks) log.debug("autoPartitionRequests: %s" % anaconda.id.storage.autoPartitionRequests) - log.debug("storage.disks: %s" % anaconda.id.storage.disks) + log.debug("storage.disks: %s" % [d.name for d in anaconda.id.storage.disks]) + log.debug("storage.partitioned: %s" % [d.name for d in anaconda.id.storage.partitioned]) log.debug("all names: %s" % [d.name for d in anaconda.id.storage.devices]) if anaconda.dir == DISPATCH_BACK: anaconda.id.storage.reset() @@ -363,9 +364,8 @@ def clearPartitions(storage): # now remove any empty extended partitions removeEmptyExtendedPartitions(storage) - def removeEmptyExtendedPartitions(storage): - for disk in storage.disks: + for disk in storage.partitioned: log.debug("checking whether disk %s has an empty extended" % disk.name) extended = disk.format.extendedPartition logical_parts = disk.format.logicalPartitions @@ -733,7 +733,7 @@ def doPartitioning(storage, exclusiveDisks=None): """ anaconda = storage.anaconda - disks = storage.disks + disks = storage.partitioned if exclusiveDisks: disks = [d for d in disks if d.name in exclusiveDisks] diff --git a/textw/partition_text.py b/textw/partition_text.py index 81c1f05..a299b94 100644 --- a/textw/partition_text.py +++ b/textw/partition_text.py @@ -95,7 +95,7 @@ class PartitionTypeWindow: screen.pushHelpLine (_("<Space>,<+>,<-> selection | <F2> Add drive | <F12> next screen")) # restore the drive list each time - disks = anaconda.id.storage.disks + disks = anaconda.id.storage.partitioned cleardrives = anaconda.id.storage.clearPartDisks for disk in disks: -- 1.6.5.2 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list