Add bcachefs creation (!123)

Set the minimum file system size to 16 MiB as creating a bcachefs that
size succeeds:
    $ truncate -s $((16*1024*1024)) /tmp/disk.img
    $ bcachefs format /tmp/disk.img
    ...
    initializing new filesystem
    going read-write
    initializing freespace
    $ echo $?
    0

Where as creating a smaller file system fails for most sizes below that:
    $ rm /tmp/disk.img
    $ truncate -s $((15*1024*1024)) /tmp/disk.img
    $ bcachefs format /tmp/disk.img
    ...
    mounting version 1.6: btree_subvolume_children
    initializing new filesystem
    going read-write
    bch2_trans_mark_dev_sb(): error ENOSPC_disk_reservation
    bch2_fs_initialize(): error marking superblocks ENOSPC_disk_reservation
    bch2_fs_initialize(): error ENOSPC_disk_reservation
    bch2_fs_start(): error starting filesystem ENOSPC_disk_reservation
    error opening /tmp/disk.img: ENOSPC_disk_reservation
    $ echo $?
    1

Closes !123 - Add support for bcachefs, single device file systems only
This commit is contained in:
Mike Fleetwood 2024-02-28 16:35:22 +00:00
parent c9b991cc95
commit ae5a6aeea8
10 changed files with 115 additions and 3 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 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

View File

@ -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>

View File

@ -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 \

41
include/bcachefs.h Normal file
View File

@ -0,0 +1,41 @@
/* 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();
bool create(const Partition& new_partition, OperationDetail& operationdetail);
};
} //GParted
#endif /* GPARTED_BCACHEFS_H */

View File

@ -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

View File

@ -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 \

View File

@ -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);

View File

@ -260,6 +260,7 @@ int Utils::get_filesystem_label_maxlength(FSType fstype)
// afterwards, need a maximum length defining. // afterwards, need a maximum length defining.
switch (fstype) switch (fstype)
{ {
case FS_BCACHEFS: return 32;
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;
@ -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";

61
src/bcachefs.cc Normal file
View File

@ -0,0 +1,61 @@
/* 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 "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.create = FS::EXTERNAL;
fs.create_with_label = FS::EXTERNAL;
}
fs_limits.min_size = 16 * MEBIBYTE;
return fs;
}
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);
}
} //GParted

View File

@ -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) \