[gparted] Enhance F2FS support (!29)



commit e550509781c32ed5bb0c5839c3f39fed8fa69d6b
Author: Antoine Viallon <antoine viallon gmail com>
Date:   Fri Mar 15 19:22:00 2019 +0100

    Enhance F2FS support (!29)
    
    - Adds reading of file system usage
    - Adds resize (grow) support
    - Adds verify support
    
    Closes !29 - Enhance F2FS support

 include/f2fs.h |  3 +++
 src/f2fs.cc    | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+)
---
diff --git a/include/f2fs.h b/include/f2fs.h
index a7b6cb0c..f0fc380c 100644
--- a/include/f2fs.h
+++ b/include/f2fs.h
@@ -28,7 +28,10 @@ class f2fs : public FileSystem
 {
 public:
        FS get_filesystem_support() ;
+       void set_used_sectors(Partition & partition);
        bool create( const Partition & new_partition, OperationDetail & operationdetail ) ;
+       bool resize(const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition);
+       bool check_repair(const Partition & partition, OperationDetail & operationdetail);
 };
 
 } //GParted
diff --git a/src/f2fs.cc b/src/f2fs.cc
index 9bb945c3..ec357f4f 100644
--- a/src/f2fs.cc
+++ b/src/f2fs.cc
@@ -31,12 +31,21 @@ FS f2fs::get_filesystem_support()
 
        fs .busy = FS::GPARTED ;
 
+       if (! Glib::find_program_in_path("dump.f2fs").empty())
+               fs.read = FS::EXTERNAL;
+
        if ( ! Glib::find_program_in_path( "mkfs.f2fs" ) .empty() )
        {
                fs.create = FS::EXTERNAL;
                fs.create_with_label = FS::EXTERNAL;
        }
 
+       if (! Glib::find_program_in_path("fsck.f2fs").empty())
+               fs.check = FS::EXTERNAL;
+
+       if (! Glib::find_program_in_path("resize.f2fs").empty())
+               fs.grow = FS::EXTERNAL;
+
        fs .copy = FS::GPARTED ;
        fs .move = FS::GPARTED ;
        fs .online_read = FS::GPARTED ;
@@ -44,6 +53,54 @@ FS f2fs::get_filesystem_support()
        return fs ;
 }
 
+
+void f2fs::set_used_sectors(Partition & partition)
+{
+       if (! Utils::execute_command("dump.f2fs -d 1 " + Glib::shell_quote(partition.get_path()), output, 
error, true))
+       {
+               long long int user_block_count;
+               long long int valid_block_count;
+               long long int log_blocksize;
+               long long int blocksize;
+               long long int total_fs_sectors;
+
+               Glib::ustring temp;
+               temp = Utils::regexp_label(output, "user_block_count\\s+\\[0x\\s+[0-9a-f]+ : ([0-9]+)\\]");
+               sscanf(temp.c_str(), "%lld", &user_block_count);
+
+               temp = Utils::regexp_label(output, "valid_block_count\\s+\\[0x\\s+[0-9a-f]+ : ([0-9]+)\\]");
+               sscanf(temp.c_str(), "%lld", &valid_block_count);
+
+               temp = Utils::regexp_label(output, "log_blocksize\\s+\\[0x\\s+[0-9a-f]+ : ([0-9]+)\\]");
+               sscanf(temp.c_str(), "%lld", &log_blocksize);
+
+               temp = Utils::regexp_label(output, "sector size = ([0-9]+)");
+               sscanf(temp.c_str(), "%lld", &S);
+
+               temp = Utils::regexp_label(output, "total FS sectors = ([0-9]+)");
+               sscanf(temp.c_str(), "%lld", &total_fs_sectors);
+
+               blocksize = (1 << log_blocksize);
+               N = (user_block_count - valid_block_count)*blocksize;
+               T = total_fs_sectors * S;
+
+               T = Utils::round(T / double(partition.sector_size));
+               N = Utils::round(N / double(partition.sector_size));
+
+               partition.set_sector_usage(T, N);
+               partition.fs_block_size = S;
+       }
+       else
+       {
+               if (! output.empty())
+                       partition.push_back_message(output);
+
+               if (! error.empty())
+                       partition.push_back_message(error);
+       }
+}
+
+
 bool f2fs::create( const Partition & new_partition, OperationDetail & operationdetail )
 {
        return ! execute_command( "mkfs.f2fs -l " + Glib::shell_quote( new_partition.get_filesystem_label() ) 
+
@@ -51,4 +108,25 @@ bool f2fs::create( const Partition & new_partition, OperationDetail & operationd
                                  operationdetail, EXEC_CHECK_STATUS );
 }
 
+
+bool f2fs::resize(const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition)
+{
+       Glib::ustring size = "";
+       if (! fill_partition)
+               // resize.f2fs works in sector size units of whatever device the file
+               // system is currently stored on.
+               size = "-t " + Utils::num_to_str(partition_new.get_sector_length()) + " ";
+
+       return ! execute_command("resize.f2fs " + size + Glib::shell_quote(partition_new.get_path()),
+                                operationdetail, EXEC_CHECK_STATUS);
+}
+
+
+bool f2fs::check_repair(const Partition & partition, OperationDetail & operationdetail)
+{
+       return ! execute_command("fsck.f2fs -f -y -a " + Glib::shell_quote(partition.get_path()),
+                                operationdetail, EXEC_CHECK_STATUS|EXEC_CANCEL_SAFE);
+}
+
+
 } //GParted


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