Skip to content

Commit

Permalink
convert main() from C to Rust
Browse files Browse the repository at this point in the history
This moves the main() function from C to Rust. It also updates the name
of the Rust package from "bcachefs-rust" to "bcachefs-tools".

Signed-off-by: Thomas Bertschinger <tahbertschinger@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
  • Loading branch information
bertschingert authored and Kent Overstreet committed Jan 16, 2024
1 parent 249bf7b commit 0a284fc
Show file tree
Hide file tree
Showing 16 changed files with 173 additions and 195 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ jobs:
- name: Extract MSRV
run: |
MSRV=$(cargo metadata --format-version 1 --no-deps --manifest-path rust-src/Cargo.toml |
jq -r '.packages[] | select(.name == "bcachefs-rust") | .rust_version')
jq -r '.packages[] | select(.name == "bcachefs-tools") | .rust_version')
echo "MSRV=$MSRV" >> $GITHUB_ENV
- name: Install Rust ${{ env.MSRV }} toolchain
run: |
Expand Down
21 changes: 6 additions & 15 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ PKGCONFIG_LIBS="blkid uuid liburcu libsodium zlib liblz4 libzstd libudev libkeyu
ifdef BCACHEFS_FUSE
PKGCONFIG_LIBS+="fuse3 >= 3.7"
CFLAGS+=-DBCACHEFS_FUSE
export RUSTFLAGS=--cfg fuse
endif

PKGCONFIG_CFLAGS:=$(shell $(PKG_CONFIG) --cflags $(PKGCONFIG_LIBS))
Expand Down Expand Up @@ -172,25 +173,15 @@ OBJS:=$(SRCS:.c=.o)
$(Q)$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

BCACHEFS_DEPS=libbcachefs.a
RUST_SRCS:=$(shell find rust-src/src rust-src/bch_bindgen/src -type f -iname '*.rs')

ifndef NO_RUST
BCACHEFS_DEPS+=rust-src/target/release/libbcachefs_rust.a
else
CFLAGS+=-DBCACHEFS_NO_RUST
endif

bcachefs: $(BCACHEFS_DEPS)
@echo " [LD] $@"
$(Q)$(CC) $(LDFLAGS) -Wl,--whole-archive $+ $(LOADLIBES) -Wl,--no-whole-archive $(LDLIBS) -o $@
bcachefs: $(BCACHEFS_DEPS) $(RUST_SRCS)
$(CARGO_BUILD)

libbcachefs.a: $(filter-out ./tests/%.o, $(OBJS))
@echo " [AR] $@"
$(Q)ar -rc $@ $+

RUST_SRCS:=$(shell find rust-src/src rust-src/bch_bindgen/src -type f -iname '*.rs')
rust-src/target/release/libbcachefs_rust.a: $(RUST_SRCS)
$(CARGO_BUILD)

tests/test_helper: $(filter ./tests/%.o, $(OBJS))
@echo " [LD] $@"
$(Q)$(CC) $(LDFLAGS) $+ $(LOADLIBES) $(LDLIBS) -o $@
Expand All @@ -210,7 +201,7 @@ cmd_version.o : .version
install: INITRAMFS_HOOK=$(INITRAMFS_DIR)/hooks/bcachefs
install: INITRAMFS_SCRIPT=$(INITRAMFS_DIR)/scripts/local-premount/bcachefs
install: bcachefs $(optional_install)
$(INSTALL) -m0755 -D bcachefs -t $(DESTDIR)$(ROOT_SBINDIR)
$(INSTALL) -m0755 -D rust-src/target/release/bcachefs -t $(DESTDIR)$(ROOT_SBINDIR)
$(INSTALL) -m0644 -D bcachefs.8 -t $(DESTDIR)$(PREFIX)/share/man/man8/
$(INSTALL) -m0755 -D initramfs/script $(DESTDIR)$(INITRAMFS_SCRIPT)
$(INSTALL) -m0755 -D initramfs/hook $(DESTDIR)$(INITRAMFS_HOOK)
Expand All @@ -233,7 +224,7 @@ install_systemd: $(systemd_services) $(systemd_libexecfiles)
.PHONY: clean
clean:
@echo "Cleaning all"
$(Q)$(RM) bcachefs libbcachefs.a tests/test_helper .version *.tar.xz $(OBJS) $(DEPS) $(DOCGENERATED)
$(Q)$(RM) libbcachefs.a tests/test_helper .version *.tar.xz $(OBJS) $(DEPS) $(DOCGENERATED)
$(Q)$(CARGO_CLEAN)
$(Q)$(RM) -f $(built_scripts)

Expand Down
127 changes: 6 additions & 121 deletions bcachefs.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

#include "cmds.h"

static void usage(void)
void bcachefs_usage(void)
{
puts("bcachefs - tool for managing bcachefs filesystems\n"
"usage: bcachefs <command> [<args>]\n"
Expand All @@ -36,11 +36,9 @@ static void usage(void)
" set-option Set a filesystem option\n"
" reset-counters Reset all counters on an unmounted device\n"
"\n"
#ifndef BCACHEFS_NO_RUST
"Mount:\n"
" mount Mount a filesystem\n"
"\n"
#endif
"Repair:\n"
" fsck Check an existing filesystem for errors\n"
"\n"
Expand Down Expand Up @@ -89,18 +87,14 @@ static void usage(void)
"Debug:\n"
"These commands work on offline, unmounted filesystems\n"
" dump Dump filesystem metadata to a qcow2 image\n"
#ifndef BCACHEFS_NO_RUST
" list List filesystem metadata in textual form\n"
#endif
" list_journal List contents of journal\n"
"\n"
"FUSE:\n"
" fusemount Mount a filesystem via FUSE\n"
"\n"
"Miscellaneous:\n"
#ifndef BCACHEFS_NO_RUST
" completions Generate shell completions\n"
#endif
" version Display the version of the invoked bcachefs tool\n");
}

Expand All @@ -115,12 +109,12 @@ static char *pop_cmd(int *argc, char *argv[])
return cmd;
}

static int fs_cmds(int argc, char *argv[])
int fs_cmds(int argc, char *argv[])
{
char *cmd = pop_cmd(&argc, argv);

if (argc < 1) {
usage();
bcachefs_usage();
exit(EXIT_FAILURE);
}
if (!strcmp(cmd, "usage"))
Expand All @@ -129,7 +123,7 @@ static int fs_cmds(int argc, char *argv[])
return 0;
}

static int device_cmds(int argc, char *argv[])
int device_cmds(int argc, char *argv[])
{
char *cmd = pop_cmd(&argc, argv);

Expand All @@ -155,7 +149,7 @@ static int device_cmds(int argc, char *argv[])
return 0;
}

static int data_cmds(int argc, char *argv[])
int data_cmds(int argc, char *argv[])
{
char *cmd = pop_cmd(&argc, argv);

Expand All @@ -169,7 +163,7 @@ static int data_cmds(int argc, char *argv[])
return 0;
}

static int subvolume_cmds(int argc, char *argv[])
int subvolume_cmds(int argc, char *argv[])
{
char *cmd = pop_cmd(&argc, argv);
if (argc < 1)
Expand All @@ -183,112 +177,3 @@ static int subvolume_cmds(int argc, char *argv[])

return 0;
}

int main(int argc, char *argv[])
{
raid_init();

char *full_cmd = argv[0];

/* Are we being called via a symlink? */

if (strstr(full_cmd, "mkfs"))
return cmd_format(argc, argv);

if (strstr(full_cmd, "fsck"))
return cmd_fsck(argc, argv);

#ifdef BCACHEFS_FUSE
if (strstr(full_cmd, "mount.fuse"))
return cmd_fusemount(argc, argv);
#endif

#ifndef BCACHEFS_NO_RUST
if (strstr(full_cmd, "mount"))
return rust_main(argc, argv, "mount");
#endif

setvbuf(stdout, NULL, _IOLBF, 0);

char *cmd = pop_cmd(&argc, argv);
if (!cmd) {
puts("missing command\n");
goto usage;
}

/* these subcommands display usage when argc < 2 */
if (!strcmp(cmd, "device"))
return device_cmds(argc, argv);
if (!strcmp(cmd, "fs"))
return fs_cmds(argc, argv);
if (!strcmp(cmd, "data"))
return data_cmds(argc, argv);
if (!strcmp(cmd, "subvolume"))
return subvolume_cmds(argc, argv);
if (!strcmp(cmd, "format"))
return cmd_format(argc, argv);
if (!strcmp(cmd, "fsck"))
return cmd_fsck(argc, argv);
if (!strcmp(cmd, "version"))
return cmd_version(argc, argv);
if (!strcmp(cmd, "show-super"))
return cmd_show_super(argc, argv);
if (!strcmp(cmd, "set-option"))
return cmd_set_option(argc, argv);
if (!strcmp(cmd, "reset-counters"))
return cmd_reset_counters(argc, argv);

#if 0
if (!strcmp(cmd, "assemble"))
return cmd_assemble(argc, argv);
if (!strcmp(cmd, "incremental"))
return cmd_incremental(argc, argv);
if (!strcmp(cmd, "run"))
return cmd_run(argc, argv);
if (!strcmp(cmd, "stop"))
return cmd_stop(argc, argv);
#endif

if (!strcmp(cmd, "unlock"))
return cmd_unlock(argc, argv);
if (!strcmp(cmd, "set-passphrase"))
return cmd_set_passphrase(argc, argv);
if (!strcmp(cmd, "remove-passphrase"))
return cmd_remove_passphrase(argc, argv);

if (!strcmp(cmd, "migrate"))
return cmd_migrate(argc, argv);
if (!strcmp(cmd, "migrate-superblock"))
return cmd_migrate_superblock(argc, argv);

if (!strcmp(cmd, "dump"))
return cmd_dump(argc, argv);
if (!strcmp(cmd, "list_journal"))
return cmd_list_journal(argc, argv);
if (!strcmp(cmd, "kill_btree_node"))
return cmd_kill_btree_node(argc, argv);

if (!strcmp(cmd, "setattr"))
return cmd_setattr(argc, argv);
#ifndef BCACHEFS_NO_RUST
if (!strcmp(cmd, "list") ||
!strcmp(cmd, "mount") ||
!strcmp(cmd, "completions"))
return rust_main(argc, argv, cmd);
#endif

#ifdef BCACHEFS_FUSE
if (!strcmp(cmd, "fusemount"))
return cmd_fusemount(argc, argv);
#endif

if (!strcmp(cmd, "--help")) {
usage();
return 0;
}

printf("Unknown command %s\n", cmd);
usage:
usage();
exit(EXIT_FAILURE);
}
6 changes: 5 additions & 1 deletion cmds.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ int cmd_subvolume_snapshot(int argc, char *argv[]);

int cmd_fusemount(int argc, char *argv[]);

int rust_main(int argc, char *argv[], char *cmd);
void bcachefs_usage(void);
int device_cmds(int argc, char *argv[]);
int fs_cmds(int argc, char *argv[]);
int data_cmds(int argc, char *argv[]);
int subvolume_cmds(int argc, char *argv[]);

#endif /* _CMDS_H */
2 changes: 1 addition & 1 deletion rust-src/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 6 additions & 2 deletions rust-src/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
[package]
name = "bcachefs-rust"
name = "bcachefs-tools"
version = "0.3.1"
authors = ["Yuxuan Shui <yshuiv7@gmail.com>", "Kayla Firestack <dev@kaylafire.me>", "Kent Overstreet <kent.overstreet@linux.dev>" ]
edition = "2021"
rust-version = "1.65"

[[bin]]
name = "bcachefs"
path = "src/bcachefs.rs"

[lib]
crate-type = ["staticlib"]
name = "bcachefs"

[dependencies]
atty = "0.2.14"
Expand Down
6 changes: 6 additions & 0 deletions rust-src/bch_bindgen/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ impl bindgen::callbacks::ParseCallbacks for Fix753 {
fn main() {
use std::path::PathBuf;

println!("cargo:rerun-if-changed=src/libbcachefs_wrapper.h");

let out_dir: PathBuf = std::env::var_os("OUT_DIR")
.expect("ENV Var 'OUT_DIR' Expected")
.into();
Expand Down Expand Up @@ -44,6 +46,10 @@ fn main() {
.default_enum_style(bindgen::EnumVariation::Rust {
non_exhaustive: true,
})
.allowlist_function("bcachefs_usage")
.allowlist_function("raid_init")
.allowlist_function("cmd_.*")
.allowlist_function(".*_cmds")
.allowlist_function(".*bch2_.*")
.allowlist_function("bio_.*")
.allowlist_function("derive_passphrase")
Expand Down
2 changes: 2 additions & 0 deletions rust-src/bch_bindgen/src/libbcachefs_wrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#include "../crypto.h"
#include "../include/linux/bio.h"
#include "../include/linux/blkdev.h"
#include "../cmds.h"
#include "../raid/raid.h"


#define MARK_FIX_753(req_name) const blk_mode_t Fix753_##req_name = req_name;
Expand Down
21 changes: 21 additions & 0 deletions rust-src/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
fn main() {
println!("cargo:rustc-link-search=..");
println!("cargo:rerun-if-changed=../libbcachefs.a");
println!("cargo:rustc-link-lib=static:+whole-archive=bcachefs");

println!("cargo:rustc-link-lib=urcu");
println!("cargo:rustc-link-lib=zstd");
println!("cargo:rustc-link-lib=blkid");
println!("cargo:rustc-link-lib=uuid");
println!("cargo:rustc-link-lib=sodium");
println!("cargo:rustc-link-lib=z");
println!("cargo:rustc-link-lib=lz4");
println!("cargo:rustc-link-lib=zstd");
println!("cargo:rustc-link-lib=udev");
println!("cargo:rustc-link-lib=keyutils");
println!("cargo:rustc-link-lib=aio");

if std::env::var("BCACHEFS_FUSE").is_ok() {
println!("cargo:rustc-link-lib=fuse3");
}
}
Loading

0 comments on commit 0a284fc

Please sign in to comment.