[gparted] Add f2fs file system support (#695396)



commit 9b649ed445652dea9738d15cd5ad71864c14761b
Author: Patrick Verner <exodusrobot yahoo com>
Date:   Sat Mar 16 15:56:02 2013 -0500

    Add f2fs file system support (#695396)
    
    Only supports detection and creation of f2fs file systems.  Requires
    f2fs-tools and a blkid with f2fs support, util-linux > 2.22.2.
    
    f2fs-tools v1.1.0 only supports file system creation.
    Currently requires util-linux directly from the git repository as f2fs
    support was only committed on 5 Feb 2013 and it has not yet been
    released.
    
    Closes Bug #695396 - Please apply f2fs patch

 README              |    1 +
 include/Makefile.am |    1 +
 include/Utils.h     |   37 +++++++++++++++++++------------------
 include/f2fs.h      |   36 ++++++++++++++++++++++++++++++++++++
 po/POTFILES.in      |    1 +
 src/GParted_Core.cc |    4 ++++
 src/Makefile.am     |    1 +
 src/Utils.cc        |    8 ++++++++
 src/f2fs.cc         |   45 +++++++++++++++++++++++++++++++++++++++++++++
 9 files changed, 116 insertions(+), 18 deletions(-)
---
diff --git a/README b/README
index 4563400..c5edfbb 100644
--- a/README
+++ b/README
@@ -133,6 +133,7 @@ Optional packages include:
 
    btrfs-tools
    e2fsprogs
+   f2fs-tools
    dosfstools
    mtools          - required to read and write FAT16/32 volume labels and UUIDs
    hfsutils
diff --git a/include/Makefile.am b/include/Makefile.am
index 98a227c..d711674 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -40,6 +40,7 @@ EXTRA_DIST = \
        btrfs.h                         \
        exfat.h                         \
        ext2.h                          \
+       f2fs.h                          \
        fat16.h                         \
        fat32.h                         \
        hfs.h                           \
diff --git a/include/Utils.h b/include/Utils.h
index 5094890..57a7014 100644
--- a/include/Utils.h
+++ b/include/Utils.h
@@ -66,24 +66,25 @@ enum FILESYSTEM
        FS_EXT2         = 6,
        FS_EXT3         = 7,
        FS_EXT4         = 8,
-       FS_FAT16        = 9,
-       FS_FAT32        = 10,
-       FS_HFS          = 11,
-       FS_HFSPLUS      = 12,
-       FS_JFS          = 13,
-       FS_LINUX_SWAP   = 14,
-       FS_LVM2_PV      = 15,
-       FS_NILFS2       = 16,
-       FS_NTFS         = 17,
-       FS_REISER4      = 18,
-       FS_REISERFS     = 19,
-       FS_UFS          = 20,
-       FS_XFS          = 21,
-
-       FS_USED         = 22,
-       FS_UNUSED       = 23,
-
-       FS_LUKS         = 24
+       FS_F2FS         = 9,
+       FS_FAT16        = 10,
+       FS_FAT32        = 11,
+       FS_HFS          = 12,
+       FS_HFSPLUS      = 13,
+       FS_JFS          = 14,
+       FS_LINUX_SWAP   = 15,
+       FS_LVM2_PV      = 16,
+       FS_NILFS2       = 17,
+       FS_NTFS         = 18,
+       FS_REISER4      = 19,
+       FS_REISERFS     = 20,
+       FS_UFS          = 21,
+       FS_XFS          = 22,
+
+       FS_USED         = 23,
+       FS_UNUSED       = 24,
+
+       FS_LUKS         = 25
 } ;
 
 enum SIZE_UNIT
diff --git a/include/f2fs.h b/include/f2fs.h
new file mode 100644
index 0000000..251f71d
--- /dev/null
+++ b/include/f2fs.h
@@ -0,0 +1,36 @@
+/* Copyright (C) 2013 Patrick Verner <exodusrobot yahoo com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef F2FS_H_
+#define F2FS_H_
+
+#include "../include/FileSystem.h"
+
+namespace GParted
+{
+
+class f2fs : public FileSystem
+{
+public:
+       FS get_filesystem_support() ;
+       bool create( const Partition & new_partition, OperationDetail & operationdetail ) ;
+};
+
+} //GParted
+
+#endif /* F2FS_H_ */
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 3c25035..8273142 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -34,6 +34,7 @@ src/Win_GParted.cc
 src/btrfs.cc
 src/exfat.cc
 src/ext2.cc
+src/f2fs.cc
 src/fat16.cc
 src/fat32.cc
 src/hfs.cc
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index d42f30e..7ac3368 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -33,6 +33,7 @@
 #include "../include/btrfs.h"
 #include "../include/exfat.h"
 #include "../include/ext2.h"
+#include "../include/f2fs.h"
 #include "../include/fat16.h"
 #include "../include/fat32.h"
 #include "../include/linux_swap.h"
@@ -101,6 +102,7 @@ void GParted_Core::find_supported_filesystems()
        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() ;
        FILESYSTEM_MAP[ FS_FAT32 ]      = new fat32() ;
        FILESYSTEM_MAP[ FS_HFS ]        = new hfs() ;
@@ -1237,6 +1239,8 @@ GParted::FILESYSTEM GParted_Core::get_filesystem( PedDevice* lp_device, PedParti
                        return GParted::FS_LINUX_SWAP ;
                else if ( fs_type == "LVM2_member" )
                        return GParted::FS_LVM2_PV ;
+               else if ( fs_type == "f2fs" )
+                       return GParted::FS_F2FS ;
                else if ( fs_type == "fat16" )
                        return GParted::FS_FAT16 ;
                else if ( fs_type == "fat32" )
diff --git a/src/Makefile.am b/src/Makefile.am
index 28feb63..34c6de4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -50,6 +50,7 @@ gpartedbin_SOURCES = \
        btrfs.cc                        \
        exfat.cc                        \
        ext2.cc                         \
+       f2fs.cc                         \
        fat16.cc                        \
        fat32.cc                        \
        hfs.cc                          \
diff --git a/src/Utils.cc b/src/Utils.cc
index 694cf0e..4bf4de4 100644
--- a/src/Utils.cc
+++ b/src/Utils.cc
@@ -84,6 +84,7 @@ Glib::ustring Utils::get_color( FILESYSTEM filesystem )
                case FS_EXT3            : return "#7590AE" ;    //blue medium
                case FS_EXT4            : return "#4B6983" ;    //blue dark
                case FS_LINUX_SWAP      : return "#C1665A" ;    //red medium
+               case FS_F2FS            : return "#DF421E" ;    //accent red
                case FS_FAT16           : return "#00FF00" ;    //green
                case FS_FAT32           : return "#18D918" ;    // ~ medium green
                case FS_EXFAT           : return "#2E8B57" ;    // ~ sea green
@@ -132,6 +133,11 @@ int Utils::get_filesystem_label_maxlength( FILESYSTEM filesystem )
                case FS_EXT2            : return 16 ;
                case FS_EXT3            : return 16 ;
                case FS_EXT4            : return 16 ;
+               //mkfs.f2fs says that it can create file systems with labels up to 512
+               //  characters, but it core dumps with labels of 29 characters or larger!
+               //  Also blkid only correctly displays labels up to 19 characters.
+               //  (Suspect it is all part of a memory corruption bug in mkfs.f2fs).
+               case FS_F2FS            : return 19 ;
                case FS_FAT16           : return 11 ;
                case FS_FAT32           : return 11 ;
                //mkfs.hfsplus can create hfs and hfs+ file systems with labels up to 255
@@ -199,6 +205,7 @@ Glib::ustring Utils::get_filesystem_string( FILESYSTEM filesystem )
                case FS_EXT3            : return "ext3" ;
                case FS_EXT4            : return "ext4" ;
                case FS_LINUX_SWAP      : return "linux-swap" ;
+               case FS_F2FS            : return "f2fs" ;
                case FS_FAT16           : return "fat16" ;
                case FS_FAT32           : return "fat32" ;
                case FS_EXFAT           : return "exfat" ;
@@ -228,6 +235,7 @@ Glib::ustring Utils::get_filesystem_software( FILESYSTEM filesystem )
                case FS_EXT2        : return "e2fsprogs" ;
                case FS_EXT3        : return "e2fsprogs" ;
                case FS_EXT4        : return "e2fsprogs v1.41+" ;
+               case FS_F2FS        : return "f2fs-tools" ;
                case FS_FAT16       : return "dosfstools, mtools" ;
                case FS_FAT32       : return "dosfstools, mtools" ;
                case FS_HFS         : return "hfsutils" ;
diff --git a/src/f2fs.cc b/src/f2fs.cc
new file mode 100644
index 0000000..a3b62e1
--- /dev/null
+++ b/src/f2fs.cc
@@ -0,0 +1,45 @@
+/* Copyright (C) 2013 Patrick Verner <exodusrobot yahoo com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+#include "../include/f2fs.h"
+
+namespace GParted
+{
+
+FS f2fs::get_filesystem_support()
+{
+       FS fs ;
+
+       fs .filesystem = FS_F2FS ;
+
+       if ( ! Glib::find_program_in_path( "mkfs.f2fs" ) .empty() )
+               fs .create = GParted::FS::EXTERNAL ;
+
+       fs .copy = FS::GPARTED ;
+       fs .move = FS::GPARTED ;
+       fs .online_read = FS::GPARTED ;
+
+       return fs ;
+}
+
+bool f2fs::create( const Partition & new_partition, OperationDetail & operationdetail )
+{
+       return (! execute_command( "mkfs.f2fs -l \"" + new_partition .get_label() + "\" " + new_partition 
.get_path(), operationdetail ) );
+}
+
+} //GParted


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