[gparted] Recognise Linux Swap Suspend and Software RAID partitions (#709640)



commit fac3f5b86556391a880271371642ac7df68718f6
Author: Mike Fleetwood <mike fleetwood googlemail com>
Date:   Sat Oct 5 16:28:24 2013 +0100

    Recognise Linux Swap Suspend and Software RAID partitions (#709640)
    
    Recognise in kernel, Linux Swap Suspend partitions.  (When hibernated
    the kernel write the RAM out to swap space and changes the magic string
    from swap space to suspend).  Recognition required either
    libparted >= 1.8.8.1 or blkid from util-linux >= 2.15 or before that
    blkid from e2fsprogs >= 1.39.
    
    Recognise Linux Software RAID partitions.  Recognition requires blkid
    from util-linux >= 2.15.
    
    Example:
    
        # blkid /dev/sda10 /dev/sda11
        /dev/sda10: ... TYPE="swsuspend"
        /dev/sda11: ... TYPE="linux_raid_member"
    
        # parted /dev/sda print
        Model: ATA SAMSUNG HM500JI (scsi)
        Disk /dev/sda: 500GB
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos
    
        Number  Start   End     Size    Type      File system     Flags
        ...
        10      361GB   362GB   1074MB  logical   swsusp
        11      362GB   363GB   1074MB  logical                   raid
    
    Bug #709640 - Linux Swap Suspend and Software RAID partitions not
                  recognised

 include/Utils.h             |   56 +++++++++++++++++----------------
 src/DialogFeatures.cc       |    4 ++-
 src/Dialog_Partition_New.cc |    4 ++-
 src/GParted_Core.cc         |   71 +++++++++++++++++++++++++------------------
 src/Utils.cc                |    4 ++
 src/Win_GParted.cc          |    4 ++-
 6 files changed, 83 insertions(+), 60 deletions(-)
---
diff --git a/include/Utils.h b/include/Utils.h
index 55fa4db..a768283 100644
--- a/include/Utils.h
+++ b/include/Utils.h
@@ -58,36 +58,38 @@ const Glib::ustring UUID_RANDOM_NTFS_HALF = _("(Half new UUID - will be randomly
 
 enum FILESYSTEM
 {
-       FS_UNALLOCATED  = 0,
-       FS_UNKNOWN      = 1,
-       FS_UNFORMATTED  = 2,
-       FS_CLEARED      = 3,  //Clear existing file system signatures
-       FS_EXTENDED     = 4,
-
-       FS_BTRFS        = 5,
-       FS_EXFAT        = 6, /* Also known as fat64 */
-       FS_EXT2         = 7,
-       FS_EXT3         = 8,
-       FS_EXT4         = 9,
-       FS_F2FS         = 10,
-       FS_FAT16        = 11,
-       FS_FAT32        = 12,
-       FS_HFS          = 13,
-       FS_HFSPLUS      = 14,
-       FS_JFS          = 15,
-       FS_LINUX_SWAP   = 16,
-       FS_LVM2_PV      = 17,
-       FS_NILFS2       = 18,
-       FS_NTFS         = 19,
-       FS_REISER4      = 20,
-       FS_REISERFS     = 21,
-       FS_UFS          = 22,
-       FS_XFS          = 23,
-
-       FS_USED         = 24,
-       FS_UNUSED       = 25,
-
-       FS_LUKS         = 26
+       FS_UNALLOCATED     = 0,
+       FS_UNKNOWN         = 1,
+       FS_UNFORMATTED     = 2,
+       FS_CLEARED         = 3,  //Clear existing file system signatures
+       FS_EXTENDED        = 4,
+
+       FS_BTRFS           = 5,
+       FS_EXFAT           = 6, /* Also known as fat64 */
+       FS_EXT2            = 7,
+       FS_EXT3            = 8,
+       FS_EXT4            = 9,
+       FS_F2FS            = 10,
+       FS_FAT16           = 11,
+       FS_FAT32           = 12,
+       FS_HFS             = 13,
+       FS_HFSPLUS         = 14,
+       FS_JFS             = 15,
+       FS_LINUX_SWAP      = 16,
+       FS_LVM2_PV         = 17,
+       FS_NILFS2          = 18,
+       FS_NTFS            = 19,
+       FS_REISER4         = 20,
+       FS_REISERFS        = 21,
+       FS_UFS             = 22,
+       FS_XFS             = 23,
+
+       FS_USED            = 24,
+       FS_UNUSED          = 25,
+
+       FS_LUKS            = 26,
+       FS_LINUX_SWRAID    = 27,
+       FS_LINUX_SWSUSPEND = 28
 } ;
 
 enum SIZE_UNIT
diff --git a/src/DialogFeatures.cc b/src/DialogFeatures.cc
index 03dba42..8b13cf3 100644
--- a/src/DialogFeatures.cc
+++ b/src/DialogFeatures.cc
@@ -123,10 +123,12 @@ void DialogFeatures::load_filesystems( const std::vector<FS> & FILESYSTEMS )
        //fill the features chart with valid file systems 
        for ( unsigned short t = 0; t < FILESYSTEMS .size() ; t++ )
        {
-               //Skip unknown, cleared and luks because these are not file systems
+               //Skip non-file systems or file systems only recognised but not otherwise supported
                if (    FILESYSTEMS[ t ] .filesystem == FS_UNKNOWN
                     || FILESYSTEMS[ t ] .filesystem == FS_CLEARED
                     || FILESYSTEMS[ t ] .filesystem == FS_LUKS
+                    || FILESYSTEMS[ t ] .filesystem == FS_LINUX_SWRAID
+                    || FILESYSTEMS[ t ] .filesystem == FS_LINUX_SWSUSPEND
                   )
                        continue ;
                show_filesystem( FILESYSTEMS[ t ] ) ;
diff --git a/src/Dialog_Partition_New.cc b/src/Dialog_Partition_New.cc
index 69dbfb0..acf732b 100644
--- a/src/Dialog_Partition_New.cc
+++ b/src/Dialog_Partition_New.cc
@@ -47,13 +47,15 @@ void Dialog_Partition_New::Set_Data( const Partition & partition,
        //  the order of items in the file system menu, built by Build_Filesystems_Menu().
        this ->FILESYSTEMS = FILESYSTEMS ;
 
-       //... remove all non-valid file systems
+       //... remove all non-file systems or file systems only recognised but not otherwise supported
        std::vector< FS >::iterator f ;
        for ( f = this->FILESYSTEMS .begin(); f != this->FILESYSTEMS .end(); f++ )
        {
                if (   f ->filesystem == FS_UNKNOWN
                    || f ->filesystem == FS_CLEARED
                    || f ->filesystem == FS_LUKS
+                   || f ->filesystem == FS_LINUX_SWRAID
+                   || f ->filesystem == FS_LINUX_SWSUSPEND
                   )
                        //Compensate for subsequent 'f++' ...
                        f = this ->FILESYSTEMS .erase( f ) - 1 ;
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index 6c1c8a5..1959efa 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -96,34 +96,36 @@ void GParted_Core::find_supported_filesystems()
 
        FILESYSTEM_MAP .clear() ;
 
-       FILESYSTEM_MAP[ FS_UNKNOWN ]    = NULL ;
-       FILESYSTEM_MAP[ FS_CLEARED ]    = NULL ;
-       FILESYSTEM_MAP[ FS_BTRFS ]      = new btrfs() ;
-       FILESYSTEM_MAP[ FS_EXFAT ]      = new exfat() ;
-       FILESYSTEM_MAP[ FS_EXT2 ]       = new ext2( FS_EXT2 ) ;
-       FILESYSTEM_MAP[ FS_EXT3 ]       = new ext2( FS_EXT3 ) ;
-       FILESYSTEM_MAP[ FS_EXT4 ]       = new ext2( FS_EXT4 ) ;
-       FILESYSTEM_MAP[ FS_F2FS ]       = new f2fs() ;
-       FILESYSTEM_MAP[ FS_FAT16 ]      = new fat16( FS_FAT16 ) ;
-       FILESYSTEM_MAP[ FS_FAT32 ]      = new fat16( FS_FAT32 ) ;
-       FILESYSTEM_MAP[ FS_HFS ]        = new hfs() ;
-       FILESYSTEM_MAP[ FS_HFSPLUS ]    = new hfsplus() ;
-       FILESYSTEM_MAP[ FS_JFS ]        = new jfs() ;
-       FILESYSTEM_MAP[ FS_LINUX_SWAP ] = new linux_swap() ;
-       FILESYSTEM_MAP[ FS_LVM2_PV ]    = new lvm2_pv() ;
-       FILESYSTEM_MAP[ FS_NILFS2 ]     = new nilfs2() ;
-       FILESYSTEM_MAP[ FS_NTFS ]       = new ntfs() ;
-       FILESYSTEM_MAP[ FS_REISER4 ]    = new reiser4() ;
-       FILESYSTEM_MAP[ FS_REISERFS ]   = new reiserfs() ;
-       FILESYSTEM_MAP[ FS_UFS ]        = new ufs() ;
-       FILESYSTEM_MAP[ FS_XFS ]        = new xfs() ;
-       FILESYSTEM_MAP[ FS_LUKS ]       = NULL ;
+       FILESYSTEM_MAP[ FS_UNKNOWN ]         = NULL ;
+       FILESYSTEM_MAP[ FS_CLEARED ]         = NULL ;
+       FILESYSTEM_MAP[ FS_BTRFS ]           = new btrfs() ;
+       FILESYSTEM_MAP[ FS_EXFAT ]           = new exfat() ;
+       FILESYSTEM_MAP[ FS_EXT2 ]            = new ext2( FS_EXT2 ) ;
+       FILESYSTEM_MAP[ FS_EXT3 ]            = new ext2( FS_EXT3 ) ;
+       FILESYSTEM_MAP[ FS_EXT4 ]            = new ext2( FS_EXT4 ) ;
+       FILESYSTEM_MAP[ FS_F2FS ]            = new f2fs() ;
+       FILESYSTEM_MAP[ FS_FAT16 ]           = new fat16( FS_FAT16 ) ;
+       FILESYSTEM_MAP[ FS_FAT32 ]           = new fat16( FS_FAT32 ) ;
+       FILESYSTEM_MAP[ FS_HFS ]             = new hfs() ;
+       FILESYSTEM_MAP[ FS_HFSPLUS ]         = new hfsplus() ;
+       FILESYSTEM_MAP[ FS_JFS ]             = new jfs() ;
+       FILESYSTEM_MAP[ FS_LINUX_SWAP ]      = new linux_swap() ;
+       FILESYSTEM_MAP[ FS_LVM2_PV ]         = new lvm2_pv() ;
+       FILESYSTEM_MAP[ FS_NILFS2 ]          = new nilfs2() ;
+       FILESYSTEM_MAP[ FS_NTFS ]            = new ntfs() ;
+       FILESYSTEM_MAP[ FS_REISER4 ]         = new reiser4() ;
+       FILESYSTEM_MAP[ FS_REISERFS ]        = new reiserfs() ;
+       FILESYSTEM_MAP[ FS_UFS ]             = new ufs() ;
+       FILESYSTEM_MAP[ FS_XFS ]             = new xfs() ;
+       FILESYSTEM_MAP[ FS_LUKS ]            = NULL ;
+       FILESYSTEM_MAP[ FS_LINUX_SWRAID ]    = NULL ;
+       FILESYSTEM_MAP[ FS_LINUX_SWSUSPEND ] = NULL ;
 
        //Iteration of std::map is ordered according to operator< of the key.
        //  Hence the FILESYSTEMS vector is constructed in FILESYSTEM enum
-       //  order: FS_UNKNOWN, FS_CLEARED, FS_BTRFS, ..., FS_XFS, FS_LUKS
-       //  which ultimately controls the default order of file systems in menus
-       //  and dialogs.
+       //  order: FS_UNKNOWN, FS_CLEARED, FS_BTRFS, ..., FS_LINUX_SWRAID,
+       //  LINUX_SWSUSPEND which ultimately controls the default order of file
+       //  systems in menus and dialogs.
        FILESYSTEMS .clear() ;
 
        FS fs_notsupp;
@@ -1268,6 +1270,11 @@ GParted::FILESYSTEM GParted_Core::get_filesystem( PedDevice* lp_device, PedParti
                        return GParted::FS_HFSPLUS ;
                else if ( fs_type == "ufs" )
                        return GParted::FS_UFS ;
+               else if ( fs_type == "linux_raid_member" )
+                       return FS_LINUX_SWRAID ;
+               else if ( fs_type == "swsusp" ||
+                         fs_type == "swsuspend" )
+                       return FS_LINUX_SWSUSPEND ;
        }
 
 
@@ -1468,9 +1475,11 @@ void GParted_Core::set_mountpoints( std::vector<Partition> & partitions )
                if ( ( partitions[ t ] .type == GParted::TYPE_PRIMARY ||
                       partitions[ t ] .type == GParted::TYPE_LOGICAL
                     ) &&
-                    partitions[ t ] .filesystem != GParted::FS_LINUX_SWAP &&
-                    partitions[ t ] .filesystem != GParted::FS_LVM2_PV    &&
-                    partitions[ t ] .filesystem != GParted::FS_LUKS
+                    partitions[ t ] .filesystem != FS_LINUX_SWAP      &&
+                    partitions[ t ] .filesystem != FS_LVM2_PV         &&
+                    partitions[ t ] .filesystem != FS_LUKS            &&
+                    partitions[ t ] .filesystem != FS_LINUX_SWRAID    &&
+                    partitions[ t ] .filesystem != FS_LINUX_SWSUSPEND
                   )
                {
                        if ( partitions[ t ] .busy )
@@ -1539,8 +1548,10 @@ void GParted_Core::set_used_sectors( std::vector<Partition> & partitions, PedDis
 {
        for ( unsigned int t = 0 ; t < partitions .size() ; t++ )
        {
-               if ( partitions[ t ] .filesystem != GParted::FS_LUKS       &&
-                    partitions[ t ] .filesystem != GParted::FS_UNKNOWN
+               if ( partitions[ t ] .filesystem != FS_UNKNOWN         &&
+                    partitions[ t ] .filesystem != FS_LUKS            &&
+                    partitions[ t ] .filesystem != FS_LINUX_SWRAID    &&
+                    partitions[ t ] .filesystem != FS_LINUX_SWSUSPEND
                   )
                {
                        if ( partitions[ t ] .type == GParted::TYPE_PRIMARY ||
diff --git a/src/Utils.cc b/src/Utils.cc
index 371189b..2b30515 100644
--- a/src/Utils.cc
+++ b/src/Utils.cc
@@ -106,6 +106,8 @@ Glib::ustring Utils::get_color( FILESYSTEM filesystem )
                case FS_UNUSED          : return "#FFFFFF" ;    //white
                case FS_LVM2_PV         : return "#CC9966" ;    // ~ medium brown
                case FS_LUKS            : return "#625B81" ;    //purple dark
+               case FS_LINUX_SWRAID    : return "#5A4733" ;    // ~ dark brown
+               case FS_LINUX_SWSUSPEND : return "#884631" ;    //red dark
 
                default                         : return "#000000" ;
        }
@@ -233,6 +235,8 @@ Glib::ustring Utils::get_filesystem_string( FILESYSTEM filesystem )
                case FS_UNUSED          : return _("unused") ;
                case FS_LVM2_PV         : return "lvm2 pv" ;
                case FS_LUKS            : return "crypt-luks" ;
+               case FS_LINUX_SWRAID    : return "linux-raid" ;
+               case FS_LINUX_SWSUSPEND : return "linux-suspend" ;
 
                default                 : return "" ;
        }
diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc
index bfb51b1..f34fe4f 100644
--- a/src/Win_GParted.cc
+++ b/src/Win_GParted.cc
@@ -416,10 +416,12 @@ Gtk::Menu * Win_GParted::create_format_menu()
 
        for ( unsigned int t = 0 ; t < fss .size() ; t++ )
        {
-               //Skip unknown, cleared and luks because these are not file systems
+               //Skip non-file systems or file systems only recognised but not otherwise supported
                if (    fss[ t ] .filesystem == FS_UNKNOWN
                     || fss[ t ] .filesystem == FS_CLEARED
                     || fss[ t ] .filesystem == FS_LUKS
+                    || fss[ t ] .filesystem == FS_LINUX_SWRAID
+                    || fss[ t ] .filesystem == FS_LINUX_SWSUSPEND
                   )
                        continue ;
 


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