mirror of
https://gitlab.gnome.org/GNOME/gparted
synced 2024-07-05 01:08:39 +00:00
Compare commits
15 Commits
ac4f391080
...
f45f560368
Author | SHA1 | Date | |
---|---|---|---|
|
f45f560368 | ||
|
3d36d7ed2b | ||
|
3ebeadf050 | ||
|
61ac1a416f | ||
|
cc65eef59a | ||
|
a621623326 | ||
|
3b5da02943 | ||
|
31df2f2b75 | ||
|
f027809e73 | ||
|
76b27b9f7a | ||
|
b8304a141a | ||
|
aabba99594 | ||
|
ccdf14ddb4 | ||
|
7ca99a1577 | ||
|
81c2271311 |
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
|
specific commands. The following optional file system specific packages
|
||||||
provide this support:
|
provide this support:
|
||||||
|
|
||||||
|
bcachefs-tools
|
||||||
btrfs-progs / btrfs-tools
|
btrfs-progs / btrfs-tools
|
||||||
e2fsprogs
|
e2fsprogs
|
||||||
exfatprogs
|
exfatprogs
|
||||||
|
|
|
@ -18,9 +18,9 @@
|
||||||
data rescue from lost partitions.
|
data rescue from lost partitions.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
GParted works with many file systems including: btrfs, exfat, ext2,
|
GParted works with many file systems including: bcachefs, btrfs,
|
||||||
ext3, ext4, fat16, fat32, hfs, hfs+, linux-swap, lvm2 pv, minix,
|
exfat, ext2, ext3, ext4, fat16, fat32, hfs, hfs+, linux-swap,
|
||||||
nilfs2, ntfs, reiserfs, reiser4, udf, ufs, and xfs.
|
lvm2 pv, minix, nilfs2, ntfs, reiserfs, reiser4, udf, ufs, and xfs.
|
||||||
</p>
|
</p>
|
||||||
</description>
|
</description>
|
||||||
<launchable type="desktop-id">gparted.desktop</launchable>
|
<launchable type="desktop-id">gparted.desktop</launchable>
|
||||||
|
|
|
@ -53,6 +53,7 @@ noinst_HEADERS = \
|
||||||
TreeView_Detail.h \
|
TreeView_Detail.h \
|
||||||
Utils.h \
|
Utils.h \
|
||||||
Win_GParted.h \
|
Win_GParted.h \
|
||||||
|
bcachefs.h \
|
||||||
btrfs.h \
|
btrfs.h \
|
||||||
exfat.h \
|
exfat.h \
|
||||||
ext2.h \
|
ext2.h \
|
||||||
|
|
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/TreeView_Detail.cc
|
||||||
src/Utils.cc
|
src/Utils.cc
|
||||||
src/Win_GParted.cc
|
src/Win_GParted.cc
|
||||||
|
src/bcachefs.cc
|
||||||
src/btrfs.cc
|
src/btrfs.cc
|
||||||
src/exfat.cc
|
src/exfat.cc
|
||||||
src/ext2.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 )
|
Glib::ustring DMRaid::get_dmraid_name( const Glib::ustring & dev_path )
|
||||||
{
|
{
|
||||||
//Retrieve name of dmraid device
|
//Retrieve name of dmraid device
|
||||||
Glib::ustring dmraid_name = "" ;
|
Glib::ustring dmraid_name;
|
||||||
Glib::ustring regexp = "" ;
|
|
||||||
|
|
||||||
for ( unsigned int k=0; k < dmraid_devices .size(); k++ )
|
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] )
|
if ( Utils::regexp_label( dev_path, regexp ) == dmraid_devices[k] )
|
||||||
dmraid_name = 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 ) ;
|
Glib::ustring dmraid_name = get_dmraid_name( dev_path ) ;
|
||||||
|
|
||||||
//Loop through the entries in the directory
|
//Loop through the entries in the directory
|
||||||
Glib::ustring filename = "" ;
|
Glib::ustring filename;
|
||||||
Glib::Dir dir( DEV_MAPPER_PATH );
|
Glib::Dir dir( DEV_MAPPER_PATH );
|
||||||
while ( ( filename = dir .read_name() ) != "" )
|
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 )
|
Glib::ustring DMRaid::get_udev_dm_name( const Glib::ustring & dev_path )
|
||||||
{
|
{
|
||||||
//Retrieve DM_NAME of device using udev information
|
//Retrieve DM_NAME of device using udev information
|
||||||
Glib::ustring output = "" ;
|
Glib::ustring output;
|
||||||
Glib::ustring error = "" ;
|
Glib::ustring error;
|
||||||
Glib::ustring dm_name = "" ;
|
Glib::ustring dm_name;
|
||||||
|
|
||||||
if (udevadm_found)
|
if (udevadm_found)
|
||||||
Utils::execute_command( "udevadm info --query=all --name=" + Glib::shell_quote( dev_path ),
|
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() ;
|
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)
|
if (filesystem_ptn.fstype == FS_LVM2_PV)
|
||||||
vgname = LVM2_PV_Info::get_vg_name( filesystem_ptn.get_path() );
|
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()
|
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;
|
Glib::ustring path;
|
||||||
DMRaid dmraid;
|
DMRaid dmraid;
|
||||||
|
|
||||||
|
@ -1257,7 +1256,7 @@ FSType GParted_Core::detect_filesystem(const PedDevice *lp_device, const PedPart
|
||||||
// (Q2) FS_Info (blkid) file system detection
|
// (Q2) FS_Info (blkid) file system detection
|
||||||
// Blkid detects more signatures and generally has less limitations so use before
|
// Blkid detects more signatures and generally has less limitations so use before
|
||||||
// libparted detection, but it doesn't report anything for extended partitions.
|
// 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
|
// (Q3) Libparted file system detection
|
||||||
// Only used when blkid didn't report anything and only on partitions, not whole
|
// Only used when blkid didn't report anything and only on partitions, not whole
|
||||||
|
@ -3789,6 +3788,7 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
|
||||||
// Not covered by the above are:
|
// Not covered by the above are:
|
||||||
// * Btrfs super block mirror copies
|
// * Btrfs super block mirror copies
|
||||||
// * One possible location of Promise FastTrack RAID super block
|
// * 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
|
// 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
|
// super block at 64 KiB will be erased by the zeroing from offset 0. The super
|
||||||
|
@ -3803,6 +3803,16 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
|
||||||
// location -3087 must be explicitly cleared.
|
// location -3087 must be explicitly cleared.
|
||||||
// util-linux v2.38.1: libblkid/src/subperblocks/promise_raid.c:probe_pdcraid()
|
// 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
|
// 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 {
|
struct {
|
||||||
Byte_Value offset; // Negative offsets work backwards from the end of the partition
|
Byte_Value offset; // Negative offsets work backwards from the end of the partition
|
||||||
Byte_Value rounding; // Minimum desired rounding for offset
|
Byte_Value rounding; // Minimum desired rounding for offset
|
||||||
|
@ -3814,8 +3824,14 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
|
||||||
{ 256LL * GIBIBYTE, 1LL , 4LL * KIBIBYTE }, // Btrfs super block mirror copy
|
{ 256LL * GIBIBYTE, 1LL , 4LL * KIBIBYTE }, // Btrfs super block mirror copy
|
||||||
{ 1LL * PEBIBYTE, 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
|
{ -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
|
{ -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 ++ )
|
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.
|
//Rounding is performed in multiples of the sector size because writes are in whole sectors.
|
||||||
|
@ -3864,6 +3880,10 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
|
||||||
byte_len = partition .get_byte_length() - byte_offset ;
|
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() ;
|
OperationDetail & od = operationdetail .get_last_child() ;
|
||||||
Byte_Value written = 0LL ;
|
Byte_Value written = 0LL ;
|
||||||
bool zero_success = false ;
|
bool zero_success = false ;
|
||||||
|
@ -3889,6 +3909,10 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
|
||||||
written += amount ;
|
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 );
|
od.get_last_child().set_success_and_capture_errors( zero_success );
|
||||||
}
|
}
|
||||||
overall_success &= zero_success ;
|
overall_success &= zero_success ;
|
||||||
|
|
|
@ -63,6 +63,7 @@ gpartedbin_SOURCES = \
|
||||||
TreeView_Detail.cc \
|
TreeView_Detail.cc \
|
||||||
Utils.cc \
|
Utils.cc \
|
||||||
Win_GParted.cc \
|
Win_GParted.cc \
|
||||||
|
bcachefs.cc \
|
||||||
btrfs.cc \
|
btrfs.cc \
|
||||||
exfat.cc \
|
exfat.cc \
|
||||||
ext2.cc \
|
ext2.cc \
|
||||||
|
|
|
@ -160,6 +160,11 @@ bool Proc_Partitions_Info::is_whole_disk_device_name(const Glib::ustring& name)
|
||||||
if (Utils::regexp_label(name, "^(bcache[0-9]+)$") != "")
|
if (Utils::regexp_label(name, "^(bcache[0-9]+)$") != "")
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// Match Network Block Device names.
|
||||||
|
// E.g.: device = nbd0 (partition = nbd0p1)
|
||||||
|
if (Utils::regexp_label(name, "^(nbd[0-9]+)$") != "")
|
||||||
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "SupportedFileSystems.h"
|
#include "SupportedFileSystems.h"
|
||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
#include "bcachefs.h"
|
||||||
#include "btrfs.h"
|
#include "btrfs.h"
|
||||||
#include "exfat.h"
|
#include "exfat.h"
|
||||||
#include "ext2.h"
|
#include "ext2.h"
|
||||||
|
@ -59,6 +60,7 @@ SupportedFileSystems::SupportedFileSystems()
|
||||||
// supported_filesystem() -> false
|
// supported_filesystem() -> false
|
||||||
m_fs_objects[FS_UNKNOWN] = nullptr;
|
m_fs_objects[FS_UNKNOWN] = nullptr;
|
||||||
m_fs_objects[FS_OTHER] = 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_BTRFS] = new btrfs();
|
||||||
m_fs_objects[FS_EXFAT] = new exfat();
|
m_fs_objects[FS_EXFAT] = new exfat();
|
||||||
m_fs_objects[FS_EXT2] = new ext2(FS_EXT2);
|
m_fs_objects[FS_EXT2] = new ext2(FS_EXT2);
|
||||||
|
|
94
src/Utils.cc
94
src/Utils.cc
|
@ -256,53 +256,54 @@ int Utils::get_max_partition_name_length( Glib::ustring & tabletype )
|
||||||
|
|
||||||
int Utils::get_filesystem_label_maxlength(FSType fstype)
|
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)
|
switch (fstype)
|
||||||
{
|
{
|
||||||
//All file systems commented out are not supported for labelling
|
case FS_BCACHEFS: return 32;
|
||||||
// by either the new partition or label partition operations.
|
case FS_BTRFS: return 255;
|
||||||
case FS_BTRFS : return 255 ;
|
case FS_EXFAT: return 11;
|
||||||
case FS_EXFAT : return 11;
|
case FS_EXT2: return 16;
|
||||||
case FS_EXT2 : return 16 ;
|
case FS_EXT3: return 16;
|
||||||
case FS_EXT3 : return 16 ;
|
case FS_EXT4: return 16;
|
||||||
case FS_EXT4 : return 16 ;
|
|
||||||
// mkfs.f2fs supports labels up to 512 characters, however only blkid is
|
// 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.
|
// used to read the label and that only displays the first 127 characters.
|
||||||
case FS_F2FS : return 127;
|
case FS_F2FS: return 127;
|
||||||
case FS_FAT16 : return 11 ;
|
case FS_FAT16: return 11;
|
||||||
case FS_FAT32 : 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 ;
|
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,6 +409,7 @@ const Glib::ustring Utils::get_filesystem_kernel_name( FSType fstype )
|
||||||
{
|
{
|
||||||
switch ( fstype )
|
switch ( fstype )
|
||||||
{
|
{
|
||||||
|
case FS_BCACHEFS : return "bcachefs";
|
||||||
case FS_BTRFS : return "btrfs";
|
case FS_BTRFS : return "btrfs";
|
||||||
case FS_EXFAT : return "exfat";
|
case FS_EXFAT : return "exfat";
|
||||||
case FS_EXT2 : return "ext2";
|
case FS_EXT2 : return "ext2";
|
||||||
|
@ -435,6 +437,7 @@ const Glib::ustring Utils::get_filesystem_software(FSType fstype)
|
||||||
{
|
{
|
||||||
switch (fstype)
|
switch (fstype)
|
||||||
{
|
{
|
||||||
|
case FS_BCACHEFS: return "bcachefs-tools";
|
||||||
case FS_BTRFS: return "btrfs-progs / btrfs-tools";
|
case FS_BTRFS: return "btrfs-progs / btrfs-tools";
|
||||||
case FS_EXFAT: return "exfatprogs";
|
case FS_EXFAT: return "exfatprogs";
|
||||||
case FS_EXT2: return "e2fsprogs";
|
case FS_EXT2: return "e2fsprogs";
|
||||||
|
@ -534,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 )
|
Glib::ustring Utils::format_size( Sector sectors, Byte_Value sector_size )
|
||||||
{
|
{
|
||||||
std::stringstream ss ;
|
std::stringstream ss ;
|
||||||
ss << std::setiosflags( std::ios::fixed ) << std::setprecision( 2 ) ;
|
ss << std::setiosflags(std::ios::fixed);
|
||||||
|
|
||||||
if ( (sectors * sector_size) < KIBIBYTE )
|
if ( (sectors * sector_size) < KIBIBYTE )
|
||||||
{
|
{
|
||||||
|
ss << std::setprecision(0);
|
||||||
ss << sector_to_unit( sectors, sector_size, UNIT_BYTE ) ;
|
ss << sector_to_unit( sectors, sector_size, UNIT_BYTE ) ;
|
||||||
return Glib::ustring::compose( _("%1 B"), ss .str() ) ;
|
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 ) ;
|
ss << sector_to_unit( sectors, sector_size, UNIT_KIB ) ;
|
||||||
return Glib::ustring::compose( _("%1 KiB"), ss .str() ) ;
|
return Glib::ustring::compose( _("%1 KiB"), ss .str() ) ;
|
||||||
|
|
|
@ -3322,7 +3322,7 @@ void Win_GParted::activate_change_uuid()
|
||||||
Gtk::MESSAGE_WARNING,
|
Gtk::MESSAGE_WARNING,
|
||||||
Gtk::BUTTONS_OK,
|
Gtk::BUTTONS_OK,
|
||||||
true );
|
true );
|
||||||
Glib::ustring tmp_msg = "" ;
|
Glib::ustring tmp_msg;
|
||||||
for ( i = 1 ; filesystem_object->get_custom_text( CTEXT_CHANGE_UUID_WARNING, i ) != "" ; i++ )
|
for ( i = 1 ; filesystem_object->get_custom_text( CTEXT_CHANGE_UUID_WARNING, i ) != "" ; i++ )
|
||||||
{
|
{
|
||||||
if ( i > 1 )
|
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>",
|
Gtk::Label *label_members = Utils::mk_label("<b>" + Glib::ustring(members_label) + "</b>",
|
||||||
true, false, false, Gtk::ALIGN_START);
|
true, false, false, Gtk::ALIGN_START);
|
||||||
grid->attach(*label_members, 0, 1, 1, 1);
|
grid->attach(*label_members, 0, 1, 1, 1);
|
||||||
|
Gtk::Label *value_members = Utils::mk_label(Glib::build_path("\n", members),
|
||||||
Glib::ustring members_str = "" ;
|
true, false, true, Gtk::ALIGN_START);
|
||||||
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);
|
|
||||||
grid->attach(*value_members, 1, 1, 1, 1);
|
grid->attach(*value_members, 1, 1, 1, 1);
|
||||||
value_members->get_accessible()->add_relationship(Atk::RELATION_LABELLED_BY,
|
value_members->get_accessible()->add_relationship(Atk::RELATION_LABELLED_BY,
|
||||||
label_members->get_accessible());
|
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)
|
bool f2fs::resize(const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition)
|
||||||
{
|
{
|
||||||
Glib::ustring size = "";
|
Glib::ustring size;
|
||||||
if (! fill_partition)
|
if (! fill_partition)
|
||||||
// resize.f2fs works in sector size units of whatever device the file
|
// resize.f2fs works in sector size units of whatever device the file
|
||||||
// system is currently stored on.
|
// system is currently stored on.
|
||||||
|
|
|
@ -209,7 +209,7 @@ void fat16::read_label(Partition& partition)
|
||||||
|
|
||||||
bool fat16::write_label( const Partition & partition, OperationDetail & operationdetail )
|
bool fat16::write_label( const Partition & partition, OperationDetail & operationdetail )
|
||||||
{
|
{
|
||||||
Glib::ustring cmd = "" ;
|
Glib::ustring cmd;
|
||||||
if ( partition.get_filesystem_label().empty() )
|
if ( partition.get_filesystem_label().empty() )
|
||||||
cmd = "mlabel -c -i " + Glib::shell_quote(partition.get_path()) + " ::";
|
cmd = "mlabel -c -i " + Glib::shell_quote(partition.get_path()) + " ::";
|
||||||
else
|
else
|
||||||
|
|
|
@ -57,7 +57,7 @@ FS hfs::get_filesystem_support()
|
||||||
|
|
||||||
bool hfs::create( const Partition & new_partition, OperationDetail & operationdetail )
|
bool hfs::create( const Partition & new_partition, OperationDetail & operationdetail )
|
||||||
{
|
{
|
||||||
Glib::ustring cmd = "";
|
Glib::ustring cmd;
|
||||||
if( new_partition.get_filesystem_label().empty() )
|
if( new_partition.get_filesystem_label().empty() )
|
||||||
cmd = "hformat " + Glib::shell_quote( new_partition.get_path() );
|
cmd = "hformat " + Glib::shell_quote( new_partition.get_path() );
|
||||||
else
|
else
|
||||||
|
|
|
@ -55,7 +55,7 @@ FS hfsplus::get_filesystem_support()
|
||||||
|
|
||||||
bool hfsplus::create( const Partition & new_partition, OperationDetail & operationdetail )
|
bool hfsplus::create( const Partition & new_partition, OperationDetail & operationdetail )
|
||||||
{
|
{
|
||||||
Glib::ustring cmd = "";
|
Glib::ustring cmd;
|
||||||
if( new_partition.get_filesystem_label().empty() )
|
if( new_partition.get_filesystem_label().empty() )
|
||||||
cmd = "mkfs.hfsplus " + Glib::shell_quote( new_partition.get_path() );
|
cmd = "mkfs.hfsplus " + Glib::shell_quote( new_partition.get_path() );
|
||||||
else
|
else
|
||||||
|
|
|
@ -151,7 +151,7 @@ bool luks::resize( const Partition & partition_new, OperationDetail & operationd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Glib::ustring size = "";
|
Glib::ustring size;
|
||||||
if ( ! fill_partition )
|
if ( ! fill_partition )
|
||||||
// Cryptsetup resize takes the size of the encryption mapping, not the
|
// Cryptsetup resize takes the size of the encryption mapping, not the
|
||||||
// size of the underlying block device. Both device-mapper and cryptsetup
|
// 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 )
|
bool lvm2_pv::resize( const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition )
|
||||||
{
|
{
|
||||||
Glib::ustring size = "" ;
|
Glib::ustring size;
|
||||||
if ( ! fill_partition )
|
if ( ! fill_partition )
|
||||||
size = " --yes --setphysicalvolumesize " +
|
size = " --yes --setphysicalvolumesize " +
|
||||||
Utils::num_to_str(partition_new.get_byte_length() / KIBIBYTE) + "K ";
|
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 ntfs::resize( const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition )
|
||||||
{
|
{
|
||||||
bool success;
|
bool success;
|
||||||
Glib::ustring size = "" ;
|
Glib::ustring size;
|
||||||
if ( ! fill_partition )
|
if ( ! fill_partition )
|
||||||
size = " -s " + Utils::num_to_str(partition_new.get_byte_length());
|
size = " -s " + Utils::num_to_str(partition_new.get_byte_length());
|
||||||
Glib::ustring cmd = "ntfsresize --force --force" + size ;
|
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 )
|
bool reiserfs::resize( const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition )
|
||||||
{
|
{
|
||||||
Glib::ustring size = "" ;
|
Glib::ustring size;
|
||||||
if ( ! fill_partition )
|
if ( ! fill_partition )
|
||||||
size = " -s " + Utils::num_to_str(partition_new.get_byte_length());
|
size = " -s " + Utils::num_to_str(partition_new.get_byte_length());
|
||||||
const Glib::ustring resize_cmd = "echo y | resize_reiserfs" + size +
|
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/SupportedFileSystems.$(OBJEXT) \
|
||||||
$(top_builddir)/src/SWRaid_Info.$(OBJEXT) \
|
$(top_builddir)/src/SWRaid_Info.$(OBJEXT) \
|
||||||
$(top_builddir)/src/Utils.$(OBJEXT) \
|
$(top_builddir)/src/Utils.$(OBJEXT) \
|
||||||
|
$(top_builddir)/src/bcachefs.$(OBJEXT) \
|
||||||
$(top_builddir)/src/btrfs.$(OBJEXT) \
|
$(top_builddir)/src/btrfs.$(OBJEXT) \
|
||||||
$(top_builddir)/src/exfat.$(OBJEXT) \
|
$(top_builddir)/src/exfat.$(OBJEXT) \
|
||||||
$(top_builddir)/src/ext2.$(OBJEXT) \
|
$(top_builddir)/src/ext2.$(OBJEXT) \
|
||||||
|
|
Loading…
Reference in New Issue
Block a user