Enhance F2FS support (!29)
- Adds reading of file system usage - Adds resize (grow) support - Adds verify support Closes !29 - Enhance F2FS support
This commit is contained in:
parent
45fd146fd0
commit
e550509781
|
@ -28,7 +28,10 @@ class f2fs : public FileSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FS get_filesystem_support() ;
|
FS get_filesystem_support() ;
|
||||||
|
void set_used_sectors(Partition & partition);
|
||||||
bool create( const Partition & new_partition, OperationDetail & operationdetail ) ;
|
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
|
} //GParted
|
||||||
|
|
78
src/f2fs.cc
78
src/f2fs.cc
|
@ -31,12 +31,21 @@ FS f2fs::get_filesystem_support()
|
||||||
|
|
||||||
fs .busy = FS::GPARTED ;
|
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() )
|
if ( ! Glib::find_program_in_path( "mkfs.f2fs" ) .empty() )
|
||||||
{
|
{
|
||||||
fs.create = FS::EXTERNAL;
|
fs.create = FS::EXTERNAL;
|
||||||
fs.create_with_label = 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 .copy = FS::GPARTED ;
|
||||||
fs .move = FS::GPARTED ;
|
fs .move = FS::GPARTED ;
|
||||||
fs .online_read = FS::GPARTED ;
|
fs .online_read = FS::GPARTED ;
|
||||||
|
@ -44,6 +53,54 @@ FS f2fs::get_filesystem_support()
|
||||||
return fs ;
|
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 )
|
bool f2fs::create( const Partition & new_partition, OperationDetail & operationdetail )
|
||||||
{
|
{
|
||||||
return ! execute_command( "mkfs.f2fs -l " + Glib::shell_quote( new_partition.get_filesystem_label() ) +
|
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 );
|
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
|
} //GParted
|
||||||
|
|
Loading…
Reference in New Issue