summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--autopart.py35
-rw-r--r--bootloader.py9
-rw-r--r--fsset.py12
-rw-r--r--iscsi.py7
-rw-r--r--packages.py2
-rw-r--r--partIntfHelpers.py128
-rw-r--r--partRequests.py17
7 files changed, 127 insertions, 83 deletions
diff --git a/autopart.py b/autopart.py
index a7855db4d..460ae656d 100644
--- a/autopart.py
+++ b/autopart.py
@@ -70,7 +70,12 @@ else:
def bootRequestCheck(req, diskset):
if not req.device or req.ignoreBootConstraints:
return PARTITION_SUCCESS
- part = parted.getPartitionByName(req.device)
+
+ for drive in req.drive:
+ part = diskset.disks[drive].getPartitionByPath(req.device)
+ if part:
+ break
+
if not part:
return PARTITION_SUCCESS
@@ -85,10 +90,11 @@ def bootRequestCheck(req, diskset):
return bootAlphaCheckRequirements(part)
elif (iutil.getPPCMachine() == "pSeries" or
iutil.getPPCMachine() == "iSeries"):
- part = parted.getPartitionByName(req.device)
- if part and ((part.geometry.end * part.geometry.device.sectorSize /
- (1024.0 * 1024)) > 4096):
- return BOOTIPSERIES_TOO_HIGH
+ for drive in req.drive:
+ part = diskset.disks[drive].getPartitionByPath(req.device)
+ if part and ((part.geometry.end * part.geometry.device.sectorSize /
+ (1024.0 * 1024)) > 4096):
+ return BOOTIPSERIES_TOO_HIGH
return PARTITION_SUCCESS
@@ -124,15 +130,15 @@ def bootAlphaCheckRequirements(part):
return PARTITION_SUCCESS
-
def printNewRequestsCyl(diskset, newRequest):
for req in newRequest.requests:
if req.type != REQUEST_NEW:
continue
- part = parted.getPartitionByName(req.device)
-## print(req)
-## print("Start Cyl:%s End Cyl: %s" % (part.geometry.device.startSectorToCylinder(part.geometry.start),
+ for drive in req.drive:
+ part = diskset.disks[drive].getPartitionByPath(req.device)
+## print(req)
+## print("Start Cyl:%s End Cyl: %s" % (part.geometry.device.startSectorToCylinder(part.geometry.start),
## part.geometry.device.endSectorToCylinder(part.geometry.end),))
def printFreespaceitem(part):
@@ -749,7 +755,11 @@ def growParts(diskset, requests, newParts):
donegrowing = 0
# get amount of space actually used by current allocation
- part = parted.getPartitionByName(request.device)
+ for drive in request.drive:
+ part = diskset.disks[drive].getPartitionByPath(request.device)
+ if part:
+ break
+
startSize = part.geometry.length
# compute fraction of freespace which to give to this
@@ -1033,7 +1043,10 @@ def processPartitioning(diskset, requests, newParts):
elif request.preexist:
# we need to keep track of the max size of preexisting partitions
# FIXME: we should also get the max size for LVs at some point
- part = parted.getPartitionByName(request.device)
+ for drive in request.drive:
+ part = diskset.disks[drive].getPartitionByPath(request.device)
+ if part:
+ break
request.maxResizeSize = part.getMaxAvailableSize(unit="MB")
## print("disk layout after everything is done")
diff --git a/bootloader.py b/bootloader.py
index 58d20b39d..b78cfd701 100644
--- a/bootloader.py
+++ b/bootloader.py
@@ -121,15 +121,6 @@ def bootloaderSetupChoices(anaconda):
elif choices and choices.has_key("boot"):
anaconda.id.bootloader.setDevice(choices["boot"][0])
-
- bootDev = anaconda.id.fsset.getEntryByMountPoint("/")
- if not bootDev:
- bootDev = anaconda.id.fsset.getEntryByMountPoint("/boot")
- part = parted.getPartitionByName(bootDev.device.getDevice())
- if part and part.geometry.device.endSectorToCylinder(part.geometry.end) >= 1024:
- anaconda.id.bootloader.above1024 = 1
-
-
def writeBootloader(anaconda):
def dosync():
isys.sync()
diff --git a/fsset.py b/fsset.py
index c04988a39..085dba3e3 100644
--- a/fsset.py
+++ b/fsset.py
@@ -1637,7 +1637,7 @@ MAILADDR root
# set active partition on disks
# if an active partition is set, leave it alone; if none set
# set either our boot partition or the first partition on the drive active
- def setActive(self, diskset):
+ def setActive(self, diskset, requests):
dev = self.getBootDev()
if dev is None:
@@ -1646,8 +1646,14 @@ MAILADDR root
bootDev = dev.device
if dev.getName() != "RAIDDevice":
- part = parted.getPartitionByName(bootDev)
- drive = partedUtils.get_partition_drive(part)
+ for request in requests:
+ if request.mountpoint = bootDev.mountpoint:
+ break
+
+ for drive in request.drive:
+ part = diskset.disks[drive].getPartitionByPath(bootDev)
+ if part:
+ break
# on EFI systems, *only* /boot/efi should be marked bootable
# similarly, on pseries, we really only want the PReP partition
diff --git a/iscsi.py b/iscsi.py
index a1612da49..bbbf89d05 100644
--- a/iscsi.py
+++ b/iscsi.py
@@ -300,11 +300,12 @@ class iscsi(object):
req = anaconda.id.partitions.getRequestByMountPoint("/")
root_requests = anaconda.id.partitions.getUnderlyingRequests(req)
for req in root_requests:
- # req.drive is unreliable <sigh> so figure it out ourselves
- part = parted.getPartitionByName(req.device)
+ for drive in req.drive:
+ part = anaconda.id.diskset.disks[drive].getPartitionByPath(req.device)
+ if part:
+ break
if not part:
continue
- drive = partedUtils.get_partition_drive(part)
if drive not in root_drives:
root_drives.append(drive)
diff --git a/packages.py b/packages.py
index 7478c10c0..f871c49f8 100644
--- a/packages.py
+++ b/packages.py
@@ -134,7 +134,7 @@ def turnOnFilesystems(anaconda):
stdout = "/dev/tty5", stderr="/dev/tty5",
searchPath = 1)
anaconda.id.partitions.doMetaDeletes(anaconda.id.diskset)
- anaconda.id.fsset.setActive(anaconda.id.diskset)
+ anaconda.id.fsset.setActive(anaconda.id.diskset, anaconda.id.partitions.requests)
try:
anaconda.id.fsset.shrinkFilesystems(anaconda.id.diskset, anaconda.rootPath)
except fsset.ResizeError, (e, dev):
diff --git a/partIntfHelpers.py b/partIntfHelpers.py
index 2bc6620d6..a47222fb6 100644
--- a/partIntfHelpers.py
+++ b/partIntfHelpers.py
@@ -253,43 +253,65 @@ def doDeletePartitionsByDevice(intf, requestlist, diskset, device,
return
# get list of unique IDs of these requests
- reqIDs = []
+ reqIDs = set()
+ reqparts = {}
+
for req in requests:
- part = parted.getPartitionByName(req.device)
- if part.type & parted.PARTITION_FREESPACE or part.type & parted.PARTITION_METADATA or part.type & parted.PARTITION_PROTECTED:
- continue
- reqIDs.append(req.uniqueID)
+ for drive in req.drive:
+ part = diskset.disks[drive].getPartitionByPath(req.device)
+
+ if part.type & parted.PARTITION_FREESPACE or \
+ part.type & parted.PARTITION_METADATA or \
+ part.type & parted.PARTITION_PROTECTED:
+ continue
+
+ reqIDs.add(req.uniqueID)
+
+ if reqparts.has_key(req.uniqueID):
+ reqparts[req.uniqueID].append(part)
+ else:
+ reqparts[req.uniqueID] = [ part ]
+
+ reqIDs = list(reqIDs)
# now go thru and try to delete the unique IDs
for id in reqIDs:
try:
- req = requestlist.getRequestByID(id)
- if req is None:
- continue
- part = parted.getPartitionByName(req.device)
- rc = doDeletePartitionByRequest(intf, requestlist, part,
- confirm=0, quiet=1)
- if not rc:
- pass
+ req = requestlist.getRequestByID(id)
+ if req is None:
+ continue
+ for partlist in reqparts[id]:
+ for part in partlist:
+ rc = doDeletePartitionByRequest(intf, requestlist, part,
+ confirm=0, quiet=1)
+ if not rc:
+ pass
except:
- pass
+ pass
# see which partitions are left
notdeleted = []
left_requests = requestlist.getRequestsByDevice(diskset, device)
if left_requests:
- # get list of unique IDs of these requests
- leftIDs = []
- for req in left_requests:
- part = parted.getPartitionByName(req.device)
- if part.type & parted.PARTITION_FREESPACE or part.type & parted.PARTITION_METADATA or part.type & parted.PARTITION_PROTECTED:
- continue
- leftIDs.append(req.uniqueID)
-
- for id in leftIDs:
- req = requestlist.getRequestByID(id)
- notdeleted.append(req)
-
+ # get list of unique IDs of these requests
+ leftIDs = set()
+
+ for req in left_requests:
+ for drive in req.drive:
+ part = diskset.disks[drive].getPartitionByPath(req.device)
+
+ if part.type & parted.PARTITION_FREESPACE or \
+ part.type & parted.PARTITION_METADATA or \
+ part.type & parted.PARTITION_PROTECTED:
+ continue
+
+ leftIDs.add(req.uniqueID)
+
+ leftIDs = list(leftIDs)
+
+ for id in leftIDs:
+ req = requestlist.getRequestByID(id)
+ notdeleted.append(req)
# see if we need to report any failures - some were because we removed
# an extended partition which contained other members of our delete list
@@ -377,34 +399,38 @@ def doEditPartitionByRequest(intf, requestlist, part):
def checkForSwapNoMatch(anaconda):
"""Check for any partitions of type 0x82 which don't have a swap fs."""
+ diskset = anaconda.id.diskset
+
for request in anaconda.id.partitions.requests:
if not request.device or not request.fstype:
continue
-
- part = parted.getPartitionByName(request.device)
- if (part and (not part.type & parted.PARTITION_FREESPACE)
- and (part.getFlag(parted.PARTITION_SWAP))
- and (request.fstype and request.fstype.getName() != "swap")
- and (not request.format)):
- rc = anaconda.intf.messageWindow(_("Format as Swap?"),
- _("/dev/%s has a partition type of 0x82 "
- "(Linux swap) but does not appear to "
- "be formatted as a Linux swap "
- "partition.\n\n"
- "Would you like to format this "
- "partition as a swap partition?")
- % (request.device), type = "yesno",
- custom_icon="question")
- if rc == 1:
- request.format = 1
- request.fstype = fsset.fileSystemTypeGet("swap")
- if request.fstype.getName() == "software RAID":
- part.setFlag(parted.PARTITION_RAID)
- else:
- part.unsetFlag(parted.PARTITION_RAID)
-
- partedUtils.set_partition_file_system_type(part,
- request.fstype)
+
+ for drive in request.drive:
+ part = diskset.disks[drive].getPartitionByPath(request.device)
+
+ if (part and (not part.type & parted.PARTITION_FREESPACE)
+ and (part.getFlag(parted.PARTITION_SWAP))
+ and (request.fstype and request.fstype.getName() != "swap")
+ and (not request.format)):
+ rc = anaconda.intf.messageWindow(_("Format as Swap?"),
+ _("/dev/%s has a partition type of 0x82 "
+ "(Linux swap) but does not appear to "
+ "be formatted as a Linux swap "
+ "partition.\n\n"
+ "Would you like to format this "
+ "partition as a swap partition?")
+ % (request.device), type = "yesno",
+ custom_icon="question")
+ if rc == 1:
+ request.format = 1
+ request.fstype = fsset.fileSystemTypeGet("swap")
+ if request.fstype.getName() == "software RAID":
+ part.setFlag(parted.PARTITION_RAID)
+ else:
+ part.unsetFlag(parted.PARTITION_RAID)
+
+ partedUtils.set_partition_file_system_type(part,
+ request.fstype)
def mustHaveSelectedDrive(intf):
txt =_("You need to select at least one hard drive to install %s.") % (productName,)
diff --git a/partRequests.py b/partRequests.py
index d768bd388..d8de5e679 100644
--- a/partRequests.py
+++ b/partRequests.py
@@ -517,11 +517,18 @@ class PartitionSpec(RequestSpec):
def getActualSize(self, partitions, diskset):
"""Return the actual size allocated for the request in megabytes."""
- part = parted.getPartitionByName(self.device)
- if not part:
- # XXX kickstart might still call this before allocating the partitions
- raise RuntimeError, "Checking the size of a partition which hasn't been allocated yet"
- return part.getSize(unit="MB")
+ size = 0
+
+ for drive in self.drive:
+ part = diskset.disks[drive].getPartitionByPath(self.device)
+
+ if not part:
+ # XXX kickstart might still call this before allocating the partitions
+ raise RuntimeError, "Checking the size of a partition which hasn't been allocated yet"
+
+ size += part.getSize(unit="MB")
+
+ return size
def doSizeSanityCheck(self):
"""Sanity check that the size of the partition is sane."""