On Fri, 2009-03-20 at 17:50 -1000, David Cantrell wrote: > On 03/20/2009 05:36 PM, David Lehman wrote: > > On Fri, 2009-03-20 at 17:05 -1000, David Cantrell wrote: > >> Resizing existing filesystems on PartitionDevice objects now works > >> properly. I have resized ext3 and ntfs on existing partitions and > >> autopart takes over after that. > > > > I have some concern about the self._resizePartition business, but if it > > works I say we can hammer out the details later. Ack. > > New patch attached. Looks great! > > > > >> LVM resizing is not done yet, but this patch takes care of the major > >> case: resizing existing Windows installations. > >> --- > >> storage/devices.py | 69 ++++++++++++++++++++++++++++++++++----------------- > >> 1 files changed, 46 insertions(+), 23 deletions(-) > >> > >> diff --git a/storage/devices.py b/storage/devices.py > >> index e1f08d3..1b33145 100644 > >> --- a/storage/devices.py > >> +++ b/storage/devices.py > >> @@ -939,28 +939,25 @@ class PartitionDevice(StorageDevice): > >> return s > >> > >> def _setTargetSize(self, newsize): > >> - # a change in the target size means we need to resize the disk > >> - # if targetSize is 0, it means we are initializing, so don't jump > >> - # the gun and assume we're resizing > >> - if newsize != self.targetSize and self.targetSize != 0: > >> - self._resize = True > >> - > >> - self._targetSize = newsize > >> - > >> - if self._resize: > >> - currentGeom = self.partedPartition.geometry > >> - currentDev = currentGeom.device > >> - newLen = long(self.targetSize * 1024 * 1024) / currentDev.sectorSize > >> - geom = parted.Geometry(device=currentDev, > >> - start=currentGeom.start, > >> - length=newLen) > >> - constraint = parted.Constraint(exactGeom=geom) > >> - > >> - partedDisk = self.disk.partedDisk > >> - partedDisk.setPartitionGeometry(partition=self.partedPartition, > >> - constraint=constraint, > >> - start=geom.start, end=geom.end) > >> - self.partedPartition = None > >> + if newsize != self.currentSize: > >> + # change this partition's geometry in-memory so that other > >> + # partitioning operations can complete (e.g., autopart) > >> + self._targetSize = newsize > >> + disk = self.disk.partedDisk > >> + > >> + # keep a pointer to this partition in _origPartedDisk > >> + i = 0 > >> + for partition in disk.partitions: > >> + if partition == self.partedPartition: > >> + break > >> + i += 1 > >> + self._resizePartition = self.disk._origPartedDisk.partitions[i] > >> + > >> + # resize the partition's geometry in memory > >> + (constraint, geometry) = self._computeResize(self.partedPartition) > >> + disk.setPartitionGeometry(partition=self.partedPartition, > >> + constraint=constraint, > >> + start=geometry.start, end=geometry.end) > >> > >> @property > >> def path(self): > >> @@ -1146,6 +1143,20 @@ class PartitionDevice(StorageDevice): > >> self.exists = True > >> self.setup() > >> > >> + def _computeResize(self, partition): > >> + log_method_call(self, self.name, status=self.status) > >> + > >> + # compute new size for partition > >> + currentGeom = partition.geometry > >> + currentDev = currentGeom.device > >> + newLen = long(self.targetSize * 1024 * 1024) / currentDev.sectorSize > >> + newGeometry = parted.Geometry(device=currentDev, > >> + start=currentGeom.start, > >> + length=newLen) > >> + constraint = parted.Constraint(exactGeom=newGeometry) > >> + > >> + return (constraint, newGeometry) > >> + > >> def resize(self, intf=None): > >> """ Resize the device. > >> > >> @@ -1153,8 +1164,20 @@ class PartitionDevice(StorageDevice): > >> """ > >> log_method_call(self, self.name, status=self.status) > >> > >> - if self._resize: > >> + if self.targetSize != self.currentSize: > >> + # partedDisk has been restored to _origPartedDisk, so > >> + # recalculate resize geometry because we may have new > >> + # partitions on the disk, which could change constraints > >> + partition = self._resizePartition > >> + (constraint, geometry) = self._computeResize(partition) > >> + > >> + self.disk.partedDisk.setPartitionGeometry(partition=partition, > >> + constraint=constraint, > >> + start=geometry.start, > >> + end=geometry.end) > >> + > >> self.disk.commit() > >> + self.notifyKernel() > >> > >> def destroy(self): > >> """ Destroy the device. """ > > > > _______________________________________________ > > Anaconda-devel-list mailing list > > Anaconda-devel-list@xxxxxxxxxx > > https://www.redhat.com/mailman/listinfo/anaconda-devel-list > > > _______________________________________________ > Anaconda-devel-list mailing list > Anaconda-devel-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/anaconda-devel-list _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list