[gparted] Enable online resizing of extended partitions (!23)



commit 24d9599f66fb53439c0aec5d24d3aa0379758f30
Author: Mike Fleetwood <mike fleetwood googlemail com>
Date:   Sat Feb 9 10:18:01 2019 +0000

    Enable online resizing of extended partitions (!23)
    
    A forum user had a case where they wanted to grow their in use root,
    ext4 file system.  GParted supports this, but the partition was a
    logical partition inside an extended partition and GParted doesn't
    support resizing an extended partition while any contained logical
    partitions are busy.
    
    Example layout:
    
        Partition              File System   Mount Point
        /dev/sdb1              ntfs
        /dev/sdb2     [busy]
            /dev/sdb5 [busy]   ext4          /
        unallocated            unallocated
    
    So just allow extended partitions to be resized online when online
    partition resizing is available via libparted.
    
    NOTE:
    The block device that the Linux kernel provides for an extended
    partition just maps to the first 1 KiB of the extended partition where
    the Extended Boot Record is stored, and does not include any of the
    contained logical partitions.  Therefore no application can care that
    the extended partition is resized while a logical partition is in use
    because it can't use the extended partition block device to access any
    data.
    
    The on disk layout looks like this:
    
        # fdisk -l /dev/sdb
    
        Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
        Units = sectors of 1 * 512 = 512 bytes
        Sector size (logical/physical): 512 bytes / 512 bytes
        I/O size (minimum/optimal): 512 bytes / 512 bytes
        Disk label type: dos
        Disk identifier: 0x0007650e
    
           Device Boot      Start         End      Blocks   Id  System
        /dev/sdb1            2048     1050623      524288    7  HPFS/NTFS/exFAT
        /dev/sdb2         1050624     2101247      525312    5  Extended
        /dev/sdb5         1052672     2101247      524288   83  Linux
    
        # parted /dev/sdb unit s print free
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sdb: 16777216s
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos
        Disk Flags:
    
        Number  Start     End        Size       Type      File system  Flags
                63s       2047s      1985s                Free Space
         1      2048s     1050623s   1048576s   primary   ntfs
         2      1050624s  2101247s   1050624s   extended
         5      1052672s  2101247s   1048576s   logical   ext4
                2101248s  16777215s  14675968s            Free Space
    
    The kernel's partition sizes from /sys/block/sdb/sdb${N}/{start,size}
    shows extended partition 2 has a size of only 2 sectors:
    
        # for N in 1 2 5
        > do
        > echo -e "/dev/sdb${N}\tstart=`cat /sys/block/sdb/sdb${N}/start`\tsize=`cat 
/sys/block/sdb/sdb${N}/size`"
        > done
        /dev/sdb1       start=2048      size=1048576
        /dev/sdb2       start=1050624   size=2
        /dev/sdb5       start=1052672   size=1048576
    
    The EBR read from the whole of extended partition 2 block device:
    
        # hexdump -C /dev/sdb2
        00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
        *
        000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 86  |................|
        000001c0  06 41 83 cb 09 82 00 08  00 00 00 00 10 00 00 00  |.A..............|
        000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
        *
        000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
        00000200  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
        *
        00000400
    
    Closes !23 - Enable online resizing of extended partitions

 src/Win_GParted.cc | 3 +++
 1 file changed, 3 insertions(+)
---
diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc
index 08924567..77fc85af 100644
--- a/src/Win_GParted.cc
+++ b/src/Win_GParted.cc
@@ -1279,6 +1279,9 @@ void Win_GParted::set_valid_operations()
                     ( ( enc_cap.online_grow && fs_cap.online_grow )     ||
                       ( enc_cap.online_shrink && fs_cap.online_shrink )    )    )
                        allow_resize( true );
+               // Always allow an extended partition to be resized online.
+               if (selected_partition_ptr->type == TYPE_EXTENDED)
+                       allow_resize(true);
        }
 #endif
 


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