Re: [anaconda-storage-branch PATCH 1/2] Make PartitionDevice resize work.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

> 
> 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

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux