1
0
mirror of https://gitlab.gnome.org/GNOME/gparted synced 2024-07-02 15:58:47 +00:00

Merge branch 'bcachefs-single' into 'master'

Add support for bcachefs, single device file systems only

See merge request GNOME/gparted!123
This commit is contained in:
Mike Fleetwood 2024-04-12 21:03:43 +00:00
commit f45f560368
23 changed files with 375 additions and 114 deletions

1
README
View File

@ -265,6 +265,7 @@ devices and partitions. When available, it uses each file system's
specific commands. The following optional file system specific packages
provide this support:
bcachefs-tools
btrfs-progs / btrfs-tools
e2fsprogs
exfatprogs

View File

@ -18,9 +18,9 @@
data rescue from lost partitions.
</p>
<p>
GParted works with many file systems including: btrfs, exfat, ext2,
ext3, ext4, fat16, fat32, hfs, hfs+, linux-swap, lvm2 pv, minix,
nilfs2, ntfs, reiserfs, reiser4, udf, ufs, and xfs.
GParted works with many file systems including: bcachefs, btrfs,
exfat, ext2, ext3, ext4, fat16, fat32, hfs, hfs+, linux-swap,
lvm2 pv, minix, nilfs2, ntfs, reiserfs, reiser4, udf, ufs, and xfs.
</p>
</description>
<launchable type="desktop-id">gparted.desktop</launchable>

View File

@ -53,6 +53,7 @@ noinst_HEADERS = \
TreeView_Detail.h \
Utils.h \
Win_GParted.h \
bcachefs.h \
btrfs.h \
exfat.h \
ext2.h \

View File

@ -71,45 +71,46 @@ enum FSType
FS_EXTENDED = 6,
// Fully supported file system types
FS_BTRFS = 7,
FS_EXFAT = 8, /* Also known as fat64 */
FS_EXT2 = 9,
FS_EXT3 = 10,
FS_EXT4 = 11,
FS_F2FS = 12,
FS_FAT16 = 13,
FS_FAT32 = 14,
FS_HFS = 15,
FS_HFSPLUS = 16,
FS_JFS = 17,
FS_LINUX_SWAP = 18,
FS_LUKS = 19,
FS_LVM2_PV = 20,
FS_MINIX = 21,
FS_NILFS2 = 22,
FS_NTFS = 23,
FS_REISER4 = 24,
FS_REISERFS = 25,
FS_UDF = 26,
FS_XFS = 27,
FS_BCACHEFS = 7,
FS_BTRFS = 8,
FS_EXFAT = 9, /* Also known as fat64 */
FS_EXT2 = 10,
FS_EXT3 = 11,
FS_EXT4 = 12,
FS_F2FS = 13,
FS_FAT16 = 14,
FS_FAT32 = 15,
FS_HFS = 16,
FS_HFSPLUS = 17,
FS_JFS = 18,
FS_LINUX_SWAP = 19,
FS_LUKS = 20,
FS_LVM2_PV = 21,
FS_MINIX = 22,
FS_NILFS2 = 23,
FS_NTFS = 24,
FS_REISER4 = 25,
FS_REISERFS = 26,
FS_UDF = 27,
FS_XFS = 28,
// Other recognised file system types
FS_APFS = 28,
FS_ATARAID = 29,
FS_BCACHE = 30,
FS_BITLOCKER = 31,
FS_GRUB2_CORE_IMG = 32,
FS_ISO9660 = 33,
FS_JBD = 34,
FS_LINUX_SWRAID = 35,
FS_LINUX_SWSUSPEND = 36,
FS_REFS = 37,
FS_UFS = 38,
FS_ZFS = 39,
FS_APFS = 29,
FS_ATARAID = 30,
FS_BCACHE = 31,
FS_BITLOCKER = 32,
FS_GRUB2_CORE_IMG = 33,
FS_ISO9660 = 34,
FS_JBD = 35,
FS_LINUX_SWRAID = 36,
FS_LINUX_SWSUSPEND = 37,
FS_REFS = 38,
FS_UFS = 39,
FS_ZFS = 40,
// Partition space usage colours
FS_USED = 40,
FS_UNUSED = 41
FS_USED = 41,
FS_UNUSED = 42
} ;
enum SIZE_UNIT

46
include/bcachefs.h Normal file
View File

@ -0,0 +1,46 @@
/* Copyright (C) 2024 Mike Fleetwood
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GPARTED_BCACHEFS_H
#define GPARTED_BCACHEFS_H
#include "FileSystem.h"
#include "OperationDetail.h"
#include "Partition.h"
namespace GParted
{
class bcachefs : public FileSystem
{
public:
FS get_filesystem_support();
void set_used_sectors(Partition& partition);
bool create(const Partition& new_partition, OperationDetail& operationdetail);
void read_label(Partition& partition);
void read_uuid(Partition& partition);
bool resize(const Partition& partition_new, OperationDetail& operationdetail, bool fill_partition);
bool check_repair(const Partition& partition, OperationDetail& operationdetail);
};
} //GParted
#endif /* GPARTED_BCACHEFS_H */

View File

@ -48,6 +48,7 @@ src/SWRaid_Info.cc
src/TreeView_Detail.cc
src/Utils.cc
src/Win_GParted.cc
src/bcachefs.cc
src/btrfs.cc
src/exfat.cc
src/ext2.cc

View File

@ -210,12 +210,11 @@ void DMRaid::get_devices( std::vector<Glib::ustring> & device_list )
Glib::ustring DMRaid::get_dmraid_name( const Glib::ustring & dev_path )
{
//Retrieve name of dmraid device
Glib::ustring dmraid_name = "" ;
Glib::ustring regexp = "" ;
Glib::ustring dmraid_name;
for ( unsigned int k=0; k < dmraid_devices .size(); k++ )
{
regexp = ".*(" + dmraid_devices[k] + ").*" ;
Glib::ustring regexp = ".*(" + dmraid_devices[k] + ").*";
if ( Utils::regexp_label( dev_path, regexp ) == dmraid_devices[k] )
dmraid_name = dmraid_devices[k] ;
}
@ -256,7 +255,7 @@ void DMRaid::get_dmraid_dir_entries( const Glib::ustring & dev_path, std::vector
Glib::ustring dmraid_name = get_dmraid_name( dev_path ) ;
//Loop through the entries in the directory
Glib::ustring filename = "" ;
Glib::ustring filename;
Glib::Dir dir( DEV_MAPPER_PATH );
while ( ( filename = dir .read_name() ) != "" )
{
@ -277,9 +276,9 @@ int DMRaid::get_partition_number( const Glib::ustring & partition_name )
Glib::ustring DMRaid::get_udev_dm_name( const Glib::ustring & dev_path )
{
//Retrieve DM_NAME of device using udev information
Glib::ustring output = "" ;
Glib::ustring error = "" ;
Glib::ustring dm_name = "" ;
Glib::ustring output;
Glib::ustring error;
Glib::ustring dm_name;
if (udevadm_found)
Utils::execute_command( "udevadm info --query=all --name=" + Glib::shell_quote( dev_path ),

View File

@ -228,7 +228,7 @@ void Dialog_Partition_Info::Display_Info()
Sector ptn_sectors = partition .get_sector_length() ;
Glib::ustring vgname = "" ; //Also used in partition status message
Glib::ustring vgname;
if (filesystem_ptn.fstype == FS_LVM2_PV)
vgname = LVM2_PV_Info::get_vg_name( filesystem_ptn.get_path() );

View File

@ -1235,7 +1235,6 @@ FSType GParted_Core::detect_filesystem(const PedDevice *lp_device, const PedPart
{
g_assert(lp_device != nullptr); // Bug: Not initialised by call to ped_device_get() or ped_device_get_next()
Glib::ustring fsname = "";
Glib::ustring path;
DMRaid dmraid;
@ -1257,7 +1256,7 @@ FSType GParted_Core::detect_filesystem(const PedDevice *lp_device, const PedPart
// (Q2) FS_Info (blkid) file system detection
// Blkid detects more signatures and generally has less limitations so use before
// libparted detection, but it doesn't report anything for extended partitions.
fsname = FS_Info::get_fs_type( path );
Glib::ustring fsname = FS_Info::get_fs_type(path);
// (Q3) Libparted file system detection
// Only used when blkid didn't report anything and only on partitions, not whole
@ -1270,6 +1269,8 @@ FSType GParted_Core::detect_filesystem(const PedDevice *lp_device, const PedPart
{
if ( fsname == "extended" )
return FS_EXTENDED;
else if (fsname == "bcachefs")
return FS_BCACHEFS;
else if ( fsname == "btrfs" )
return FS_BTRFS;
else if ( fsname == "exfat" )
@ -3787,6 +3788,7 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
// Not covered by the above are:
// * Btrfs super block mirror copies
// * One possible location of Promise FastTrack RAID super block
// * Bcachefs super block backup
//
// Btrfs super blocks are located at: 64 KiB, 64 MiB, 256 GiB and 1 PiB. The
// super block at 64 KiB will be erased by the zeroing from offset 0. The super
@ -3801,6 +3803,16 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
// location -3087 must be explicitly cleared.
// util-linux v2.38.1: libblkid/src/subperblocks/promise_raid.c:probe_pdcraid()
// https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/tree/libblkid/src/superblocks/promise_raid.c?h=v2.38.1#n27
//
// Bcachefs super block backup is located at -1 MiB before the end of the device,
// rounded down to the file system's bucket size, where the bucket size is one of:
// 128 KiB, 256 KiB, 512 KiB or 1024 KiB.
// * bcachefs-tools v1.6.4: c_src/libbcachefs.c:bch2_format()
// https://evilpiepirate.org/git/bcachefs-tools.git/tree/c_src/libbcachefs.c?h=v1.6.4#n313
// * bcachefs-tools v1.6.4: c_src/libbcachefs.c:bch2_pick_bucket_size()
// https://evilpiepirate.org/git/bcachefs-tools.git/tree/c_src/libbcachefs.c?h=v1.6.4#n85
// * bcachefs-tools v1.6.4: libcachefs/bcachefs_format.h:struct bch_sb
// https://evilpiepirate.org/git/bcachefs-tools.git/tree/libbcachefs/bcachefs_format.h?h=v1.6.4#n907
struct {
Byte_Value offset; // Negative offsets work backwards from the end of the partition
Byte_Value rounding; // Minimum desired rounding for offset
@ -3812,8 +3824,14 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
{ 256LL * GIBIBYTE, 1LL , 4LL * KIBIBYTE }, // Btrfs super block mirror copy
{ 1LL * PEBIBYTE, 1LL , 4LL * KIBIBYTE }, // Btrfs super block mirror copy
{ -3087LL * 512LL , 1LL , 512LL }, // Promise FastTrack RAID super block
{ -1LL * MEBIBYTE, 128LL * KIBIBYTE, 4LL * KIBIBYTE }, // Bcachefs backup super block
{ -1LL * MEBIBYTE, 256LL * KIBIBYTE, 4LL * KIBIBYTE }, // Bcachefs backup super block
{ -1LL * MEBIBYTE, 512LL * KIBIBYTE, 4LL * KIBIBYTE }, // Bcachefs backup super block
{ -1LL * MEBIBYTE, 1LL * MEBIBYTE, 4LL * KIBIBYTE }, // Bcachefs backup super block
{ -512LL * KIBIBYTE, 256LL * KIBIBYTE, 768LL * KIBIBYTE } // Super blocks at end
} ;
Byte_Value prev_byte_offset = -1;
Byte_Value prev_byte_len = -1;
for ( unsigned int i = 0 ; overall_success && i < sizeof( ranges ) / sizeof( ranges[0] ) ; i ++ )
{
//Rounding is performed in multiples of the sector size because writes are in whole sectors.
@ -3862,6 +3880,10 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
byte_len = partition .get_byte_length() - byte_offset ;
}
if (byte_offset == prev_byte_offset && byte_len == prev_byte_len)
// Byte range identical to previous. Skip.
continue;
OperationDetail & od = operationdetail .get_last_child() ;
Byte_Value written = 0LL ;
bool zero_success = false ;
@ -3887,6 +3909,10 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
written += amount ;
}
// Save byte range for detection of following identical range.
prev_byte_offset = byte_offset;
prev_byte_len = byte_len;
od.get_last_child().set_success_and_capture_errors( zero_success );
}
overall_success &= zero_success ;

View File

@ -63,6 +63,7 @@ gpartedbin_SOURCES = \
TreeView_Detail.cc \
Utils.cc \
Win_GParted.cc \
bcachefs.cc \
btrfs.cc \
exfat.cc \
ext2.cc \

View File

@ -18,6 +18,7 @@
#include "SupportedFileSystems.h"
#include "FileSystem.h"
#include "Utils.h"
#include "bcachefs.h"
#include "btrfs.h"
#include "exfat.h"
#include "ext2.h"
@ -59,6 +60,7 @@ SupportedFileSystems::SupportedFileSystems()
// supported_filesystem() -> false
m_fs_objects[FS_UNKNOWN] = nullptr;
m_fs_objects[FS_OTHER] = nullptr;
m_fs_objects[FS_BCACHEFS] = new bcachefs();
m_fs_objects[FS_BTRFS] = new btrfs();
m_fs_objects[FS_EXFAT] = new exfat();
m_fs_objects[FS_EXT2] = new ext2(FS_EXT2);

View File

@ -153,6 +153,7 @@ Glib::ustring Utils::get_color(FSType fstype)
case FS_CLEARED: return "#000000"; // Black
case FS_OTHER: return "#000000"; // Black (never displayed)
case FS_EXTENDED: return "#95E3E5"; // Cyan Hilight [*]
case FS_BCACHEFS: return "#C26825"; // Orange Dark [*]
case FS_BTRFS: return "#E58749"; // Orange Medium [*]
case FS_EXFAT: return "#267726"; // Accent Green Dark
case FS_EXT2: return "#7590AE"; // Blue Medium
@ -185,7 +186,7 @@ Glib::ustring Utils::get_color(FSType fstype)
case FS_LINUX_SWSUSPEND: return "#884631"; // Red Dark
case FS_REFS: return "#3EA281"; // Aquamarine Dark [*]
case FS_UFS: return "#AA8F2C"; // Accent Yellow Shadow [+]
case FS_ZFS: return "#C26825"; // Orange Dark [*]
case FS_ZFS: return "#984F18"; // Orange Shadow [*]
case FS_USED: return "#F8F8BA"; // Light Tan Yellow [*]
case FS_UNUSED: return "#FFFFFF"; // White
default: return "#000000"; // Black
@ -255,53 +256,54 @@ int Utils::get_max_partition_name_length( Glib::ustring & tabletype )
int Utils::get_filesystem_label_maxlength(FSType fstype)
{
// Only file systems which can have labels, either set when created or changed
// afterwards, need a maximum length defining.
switch (fstype)
{
//All file systems commented out are not supported for labelling
// by either the new partition or label partition operations.
case FS_BTRFS : return 255 ;
case FS_EXFAT : return 11;
case FS_EXT2 : return 16 ;
case FS_EXT3 : return 16 ;
case FS_EXT4 : return 16 ;
case FS_BCACHEFS: return 32;
case FS_BTRFS: return 255;
case FS_EXFAT: return 11;
case FS_EXT2: return 16;
case FS_EXT3: return 16;
case FS_EXT4: return 16;
// mkfs.f2fs supports labels up to 512 characters, however only blkid is
// used to read the label and that only displays the first 127 characters.
case FS_F2FS : return 127;
case FS_FAT16 : return 11 ;
case FS_FAT32 : return 11 ;
//mkfs.hfsplus can create hfs and hfs+ file systems with labels up to 255
// characters. However there is no specific tool to read the labels and
// blkid, the only tool currently available, only display the first 27
// and 63 character respectively.
// Reference:
// util-linux-2.20.1/libblkid/src/superblocks/hfs.c:struct hfs_mdb
case FS_HFS : return 27 ;
case FS_HFSPLUS : return 63 ;
//mkfs.jfs and jfs_tune can create and update labels to 16 characters but
// only displays the first 11 characters. This is because version 1 jfs
// file systems only have an 11 character field for the label but version
// 2 jfs has extra fields containing a 16 character label. mkfs.jfs
// writes the extra fields containing the 16 character label, but then
// sets it to version 1 jfs. It does this to be backwardly compatible
// with jfs before 1.0.18, released May 2002. Blkid does display the
// full 16 character label by just ignoring the file system version.
// As using jfs_tune to get the label stick with an 11 character limit.
// References:
// jfsutils-1.1.15/tune/tune.c:main()
// jfsutils-1.1.15/mkfs/mkfs.c:create_aggregate()
// http://jfs.cvs.sourceforge.net/viewvc/jfs/jfsutils/NEWS?revision=HEAD
case FS_JFS : return 11 ;
case FS_LINUX_SWAP : return 15 ;
//case FS_LVM2_PV : return ;
case FS_MINIX : return 0; // MINIX doesn't support labelling.
case FS_NILFS2 : return 80 ;
case FS_NTFS : return 128 ;
case FS_REISER4 : return 16 ;
case FS_REISERFS : return 16 ;
case FS_UDF : return 126; // and only 63 if label contains character above U+FF
case FS_XFS : return 12 ;
case FS_F2FS: return 127;
case FS_FAT16: return 11;
case FS_FAT32: return 11;
default : return 30 ;
// mkfs.hfsplus can create hfs and hfs+ file systems with labels up to 255
// characters. However there is no specific tool to read the labels and
// blkid, the only tool currently available, only display the first 27 and
// 63 character respectively.
// Reference:
// util-linux-2.20.1/libblkid/src/superblocks/hfs.c:struct hfs_mdb
case FS_HFS: return 27;
case FS_HFSPLUS: return 63;
// mkfs.jfs and jfs_tune can create and update labels to 16 characters but
// only displays the first 11 characters. This is because version 1 jfs
// file systems only have an 11 character field for the label but version
// 2 jfs has extra fields containing a 16 character label. mkfs.jfs
// writes the extra fields containing the 16 character label, but then
// sets it to version 1 jfs. It does this to be backwardly compatible
// with jfs before 1.0.18, released May 2002. Blkid does display the full
// 16 character label by just ignoring the file system version. As using
// jfs_tune to read the label stick with an 11 character limit.
// References:
// jfsutils-1.1.15/tune/tune.c:main()
// jfsutils-1.1.15/mkfs/mkfs.c:create_aggregate()
// http://jfs.cvs.sourceforge.net/viewvc/jfs/jfsutils/NEWS?revision=HEAD
case FS_JFS: return 11;
case FS_LINUX_SWAP: return 15;
case FS_NILFS2: return 80;
case FS_NTFS: return 128;
case FS_REISER4: return 16;
case FS_REISERFS: return 16;
case FS_UDF: return 126; // and only 63 if label contains character above U+FF
case FS_XFS: return 12;
default: return 30;
}
}
@ -347,6 +349,7 @@ const Glib::ustring Utils::get_filesystem_string(FSType fstype)
*/
return _("cleared");
case FS_EXTENDED: return "extended";
case FS_BCACHEFS: return "bcachefs";
case FS_BTRFS: return "btrfs";
case FS_EXFAT: return "exfat";
case FS_EXT2: return "ext2";
@ -406,6 +409,7 @@ const Glib::ustring Utils::get_filesystem_kernel_name( FSType fstype )
{
switch ( fstype )
{
case FS_BCACHEFS : return "bcachefs";
case FS_BTRFS : return "btrfs";
case FS_EXFAT : return "exfat";
case FS_EXT2 : return "ext2";
@ -433,6 +437,7 @@ const Glib::ustring Utils::get_filesystem_software(FSType fstype)
{
switch (fstype)
{
case FS_BCACHEFS: return "bcachefs-tools";
case FS_BTRFS: return "btrfs-progs / btrfs-tools";
case FS_EXFAT: return "exfatprogs";
case FS_EXT2: return "e2fsprogs";
@ -532,14 +537,17 @@ bool Utils::kernel_version_at_least( int major_ver, int minor_ver, int patch_ver
Glib::ustring Utils::format_size( Sector sectors, Byte_Value sector_size )
{
std::stringstream ss ;
ss << std::setiosflags( std::ios::fixed ) << std::setprecision( 2 ) ;
ss << std::setiosflags(std::ios::fixed);
if ( (sectors * sector_size) < KIBIBYTE )
{
ss << std::setprecision(0);
ss << sector_to_unit( sectors, sector_size, UNIT_BYTE ) ;
return Glib::ustring::compose( _("%1 B"), ss .str() ) ;
}
else if ( (sectors * sector_size) < MEBIBYTE )
ss << std::setprecision(2);
if (sectors * sector_size < MEBIBYTE)
{
ss << sector_to_unit( sectors, sector_size, UNIT_KIB ) ;
return Glib::ustring::compose( _("%1 KiB"), ss .str() ) ;

View File

@ -3322,7 +3322,7 @@ void Win_GParted::activate_change_uuid()
Gtk::MESSAGE_WARNING,
Gtk::BUTTONS_OK,
true );
Glib::ustring tmp_msg = "" ;
Glib::ustring tmp_msg;
for ( i = 1 ; filesystem_object->get_custom_text( CTEXT_CHANGE_UUID_WARNING, i ) != "" ; i++ )
{
if ( i > 1 )
@ -3563,18 +3563,8 @@ bool Win_GParted::remove_non_empty_lvm2_pv_dialog( const OperationType optype )
Gtk::Label *label_members = Utils::mk_label("<b>" + Glib::ustring(members_label) + "</b>",
true, false, false, Gtk::ALIGN_START);
grid->attach(*label_members, 0, 1, 1, 1);
Glib::ustring members_str = "" ;
if ( ! members .empty() )
{
for ( unsigned int i = 0 ; i < members .size() ; i ++ )
{
if ( i > 0 )
members_str += "\n" ;
members_str += members[i] ;
}
}
Gtk::Label *value_members = Utils::mk_label(members_str, true, false, true, Gtk::ALIGN_START);
Gtk::Label *value_members = Utils::mk_label(Glib::build_path("\n", members),
true, false, true, Gtk::ALIGN_START);
grid->attach(*value_members, 1, 1, 1, 1);
value_members->get_accessible()->add_relationship(Atk::RELATION_LABELLED_BY,
label_members->get_accessible());

184
src/bcachefs.cc Normal file
View File

@ -0,0 +1,184 @@
/* Copyright (C) 2024 Mike Fleetwood
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include "bcachefs.h"
#include "BlockSpecial.h"
#include "FileSystem.h"
#include "OperationDetail.h"
#include "Partition.h"
#include "Utils.h"
# include <glibmm/miscutils.h>
# include <glibmm/shell.h>
namespace GParted
{
FS bcachefs::get_filesystem_support()
{
FS fs(FS_BCACHEFS);
fs.busy = FS::GPARTED;
fs.move = FS::GPARTED;
fs.copy = FS::GPARTED;
fs.online_read = FS::GPARTED;
if (! Glib::find_program_in_path("bcachefs").empty())
{
fs.online_read = FS::EXTERNAL;
fs.create = FS::EXTERNAL;
fs.create_with_label = FS::EXTERNAL;
fs.read_label = FS::EXTERNAL;
fs.read_uuid = FS::EXTERNAL;
fs.grow = FS::EXTERNAL;
#ifdef ENABLE_ONLINE_RESIZE
if (Utils::kernel_version_at_least(3, 6, 0))
fs.online_grow = FS::EXTERNAL;
#endif
fs.check = FS::EXTERNAL;
}
fs_limits.min_size = 32 * MEBIBYTE;
return fs;
}
void bcachefs::set_used_sectors(Partition& partition)
{
// 'bcachefs fs usage' only reports usage for mounted file systems.
exit_status = Utils::execute_command("bcachefs fs usage " + Glib::shell_quote(partition.get_mountpoint()),
output, error, true);
if (exit_status != 0)
{
if (! output.empty())
partition.push_back_message(output);
if (! error.empty())
partition.push_back_message(error);
return;
}
// Example output:
// # bcachefs fs usage /mnt/1 | egrep ' \(device |free:|capacity:'
// (no label) (device 0): sdb1 rw
// free: 522190848 3984
// capacity: 1073741824 8192
// (no label) (device 1): sdb2 rw
// free: 1061945344 8102
// capacity: 1073741824 8192
//
// Substring the output down to just the device section for this partition.
BlockSpecial wanted = BlockSpecial(partition.get_path());
bool found = false;
Glib::ustring::size_type start_offset = output.find(" (device ");
while (start_offset != Glib::ustring::npos)
{
Glib::ustring device_name = Utils::regexp_label(output.substr(start_offset),
" \\(device [[:digit:]]+\\):[[:blank:]]+([[:graph:]]+)");
Glib::ustring::size_type end_offset = output.find(" (device ", start_offset + 9);
if (wanted == BlockSpecial("/dev/" + device_name))
{
output = output.substr(start_offset, end_offset - start_offset);
found = true;
break;
}
start_offset = end_offset;
}
if (! found)
return;
// Device specific free space in bytes
long long dev_free_bytes = -1;
Glib::ustring::size_type index = output.find("free:");
if (index < output.length())
sscanf(output.substr(index).c_str(), "free: %lld", &dev_free_bytes);
// Device specific size in bytes
long long dev_capacity_bytes = -1;
index = output.find("capacity:");
if (index < output.length())
sscanf(output.substr(index).c_str(), "capacity: %lld", &dev_capacity_bytes);
if (dev_free_bytes > -1 && dev_capacity_bytes > -1)
{
Sector fs_size = dev_capacity_bytes / partition.sector_size;
Sector fs_free = dev_free_bytes / partition.sector_size;
partition.set_sector_usage(fs_size, fs_free);
// Block size is not available in 'bcachefs fs usage' output.
}
}
bool bcachefs::create(const Partition& new_partition, OperationDetail& operationdetail)
{
return ! execute_command("bcachefs format -L " + Glib::shell_quote(new_partition.get_filesystem_label()) +
" " + Glib::shell_quote(new_partition.get_path()),
operationdetail, EXEC_CHECK_STATUS);
}
void bcachefs::read_label(Partition& partition)
{
exit_status = Utils::execute_command("bcachefs show-super " + Glib::shell_quote(partition.get_path()),
output, error, true);
if (exit_status != 0)
{
if (! output.empty())
partition.push_back_message(output);
if (! error.empty())
partition.push_back_message(error);
return;
}
partition.set_filesystem_label(Utils::regexp_label(output, "^Label:[[:blank:]]*(.*)$"));
}
void bcachefs::read_uuid(Partition& partition)
{
exit_status = Utils::execute_command("bcachefs show-super " + Glib::shell_quote(partition.get_path()),
output, error, true);
if (exit_status != 0)
{
if (! output.empty())
partition.push_back_message(output);
if (! error.empty())
partition.push_back_message(error);
return;
}
partition.uuid = Utils::regexp_label(output, "^External UUID: *(" RFC4122_NONE_NIL_UUID_REGEXP ")");
}
bool bcachefs::resize(const Partition& partition_new, OperationDetail& operationdetail, bool fill_partition)
{
return ! execute_command("bcachefs device resize " + Glib::shell_quote(partition_new.get_path()),
operationdetail, EXEC_CHECK_STATUS);
}
bool bcachefs::check_repair(const Partition& partition, OperationDetail& operationdetail)
{
return ! execute_command("bcachefs fsck -f -y -v " + Glib::shell_quote(partition.get_path()),
operationdetail, EXEC_CHECK_STATUS);
}
} //GParted

View File

@ -128,7 +128,7 @@ bool f2fs::create( const Partition & new_partition, OperationDetail & operationd
bool f2fs::resize(const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition)
{
Glib::ustring size = "";
Glib::ustring size;
if (! fill_partition)
// resize.f2fs works in sector size units of whatever device the file
// system is currently stored on.

View File

@ -209,7 +209,7 @@ void fat16::read_label(Partition& partition)
bool fat16::write_label( const Partition & partition, OperationDetail & operationdetail )
{
Glib::ustring cmd = "" ;
Glib::ustring cmd;
if ( partition.get_filesystem_label().empty() )
cmd = "mlabel -c -i " + Glib::shell_quote(partition.get_path()) + " ::";
else

View File

@ -57,7 +57,7 @@ FS hfs::get_filesystem_support()
bool hfs::create( const Partition & new_partition, OperationDetail & operationdetail )
{
Glib::ustring cmd = "";
Glib::ustring cmd;
if( new_partition.get_filesystem_label().empty() )
cmd = "hformat " + Glib::shell_quote( new_partition.get_path() );
else

View File

@ -55,7 +55,7 @@ FS hfsplus::get_filesystem_support()
bool hfsplus::create( const Partition & new_partition, OperationDetail & operationdetail )
{
Glib::ustring cmd = "";
Glib::ustring cmd;
if( new_partition.get_filesystem_label().empty() )
cmd = "mkfs.hfsplus " + Glib::shell_quote( new_partition.get_path() );
else

View File

@ -151,7 +151,7 @@ bool luks::resize( const Partition & partition_new, OperationDetail & operationd
}
}
Glib::ustring size = "";
Glib::ustring size;
if ( ! fill_partition )
// Cryptsetup resize takes the size of the encryption mapping, not the
// size of the underlying block device. Both device-mapper and cryptsetup

View File

@ -105,7 +105,7 @@ bool lvm2_pv::create( const Partition & new_partition, OperationDetail & operati
bool lvm2_pv::resize( const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition )
{
Glib::ustring size = "" ;
Glib::ustring size;
if ( ! fill_partition )
size = " --yes --setphysicalvolumesize " +
Utils::num_to_str(partition_new.get_byte_length() / KIBIBYTE) + "K ";

View File

@ -190,7 +190,7 @@ bool ntfs::create( const Partition & new_partition, OperationDetail & operationd
bool ntfs::resize( const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition )
{
bool success;
Glib::ustring size = "" ;
Glib::ustring size;
if ( ! fill_partition )
size = " -s " + Utils::num_to_str(partition_new.get_byte_length());
Glib::ustring cmd = "ntfsresize --force --force" + size ;

View File

@ -176,7 +176,7 @@ bool reiserfs::create( const Partition & new_partition, OperationDetail & operat
bool reiserfs::resize( const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition )
{
Glib::ustring size = "" ;
Glib::ustring size;
if ( ! fill_partition )
size = " -s " + Utils::num_to_str(partition_new.get_byte_length());
const Glib::ustring resize_cmd = "echo y | resize_reiserfs" + size +

View File

@ -50,6 +50,7 @@ gparted_core_OBJECTS = \
$(top_builddir)/src/SupportedFileSystems.$(OBJEXT) \
$(top_builddir)/src/SWRaid_Info.$(OBJEXT) \
$(top_builddir)/src/Utils.$(OBJEXT) \
$(top_builddir)/src/bcachefs.$(OBJEXT) \
$(top_builddir)/src/btrfs.$(OBJEXT) \
$(top_builddir)/src/exfat.$(OBJEXT) \
$(top_builddir)/src/ext2.$(OBJEXT) \