mirror of
https://gitlab.gnome.org/GNOME/gparted
synced 2024-10-01 05:33:51 +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:
commit
c13bba84b6
1
README
1
README
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -53,6 +53,7 @@ noinst_HEADERS = \
|
|||
TreeView_Detail.h \
|
||||
Utils.h \
|
||||
Win_GParted.h \
|
||||
bcachefs.h \
|
||||
btrfs.h \
|
||||
exfat.h \
|
||||
ext2.h \
|
||||
|
|
|
@ -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
46
include/bcachefs.h
Normal 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 */
|
|
@ -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
|
||||
|
|
|
@ -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 ),
|
||||
|
|
|
@ -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() );
|
||||
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -63,6 +63,7 @@ gpartedbin_SOURCES = \
|
|||
TreeView_Detail.cc \
|
||||
Utils.cc \
|
||||
Win_GParted.cc \
|
||||
bcachefs.cc \
|
||||
btrfs.cc \
|
||||
exfat.cc \
|
||||
ext2.cc \
|
||||
|
|
|
@ -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);
|
||||
|
|
98
src/Utils.cc
98
src/Utils.cc
|
@ -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() ) ;
|
||||
|
|
|
@ -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
184
src/bcachefs.cc
Normal 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
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ";
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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 +
|
||||
|
|
|
@ -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) \
|
||||
|
|
Loading…
Reference in a new issue