summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2024-01-04 19:45:54 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2024-01-04 19:56:14 -0500
commita751fe3a3cec77704d6e5ddd56c92a64f910951a (patch)
tree2f049e839c9d7dfa36c356f86572352c34d6b966
parente51f25af3cdd7eadc49a91ea4f5e48fb2759fc18 (diff)
cmd_reset_counters
Add a subcommand for resetting superblock counters - for automated tests Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--bcachefs.c3
-rw-r--r--cmd_counters.c51
-rw-r--r--cmds.h1
3 files changed, 55 insertions, 0 deletions
diff --git a/bcachefs.c b/bcachefs.c
index 4efe29ed..e132d916 100644
--- a/bcachefs.c
+++ b/bcachefs.c
@@ -34,6 +34,7 @@ static void usage(void)
" format Format a new filesystem\n"
" show-super Dump superblock information to stdout\n"
" set-option Set a filesystem option\n"
+ " reset-counters Reset all counters on an unmounted device\n"
"\n"
#ifndef BCACHEFS_NO_RUST
"Mount:\n"
@@ -236,6 +237,8 @@ int main(int argc, char *argv[])
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"))
diff --git a/cmd_counters.c b/cmd_counters.c
new file mode 100644
index 00000000..7605e2d7
--- /dev/null
+++ b/cmd_counters.c
@@ -0,0 +1,51 @@
+#include <getopt.h>
+
+#include "cmds.h"
+#include "libbcachefs.h"
+#include "libbcachefs/super-io.h"
+
+static void reset_counters_usage(void)
+{
+ puts("bcachefs reset-counters \n"
+ "Usage: bcachefs reset-counters device\n"
+ "\n"
+ "Options:\n"
+ " -h, --help display this help and exit\n"
+ "Report bugs to <linux-bcachefs@vger.kernel.org>");
+ exit(EXIT_SUCCESS);
+}
+
+int cmd_reset_counters(int argc, char *argv[])
+{
+ static const struct option longopts[] = {
+ { "help", 0, NULL, 'h' },
+ { NULL }
+ };
+ int opt;
+
+ while ((opt = getopt_long(argc, argv, "h", longopts, NULL)) != -1)
+ switch (opt) {
+ case 'h':
+ reset_counters_usage();
+ break;
+ }
+ args_shift(optind);
+
+ char *dev = arg_pop();
+ if (!dev)
+ die("please supply a device");
+ if (argc)
+ die("too many arguments");
+
+ struct bch_opts opts = bch2_opts_empty();
+ struct bch_sb_handle sb;
+ int ret = bch2_read_super(dev, &opts, &sb);
+ if (ret)
+ die("Error opening %s: %s", dev, bch2_err_str(ret));
+
+ bch2_sb_field_resize(&sb, counters, 0);
+
+ bch2_super_write(sb.bdev->bd_buffered_fd, sb.sb);
+ bch2_free_super(&sb);
+ return 0;
+}
diff --git a/cmds.h b/cmds.h
index 5b3f5f55..76a76135 100644
--- a/cmds.h
+++ b/cmds.h
@@ -11,6 +11,7 @@
int cmd_format(int argc, char *argv[]);
int cmd_show_super(int argc, char *argv[]);
+int cmd_reset_counters(int argc, char *argv[]);
int cmd_set_option(int argc, char *argv[]);
int cmd_fs_usage(int argc, char *argv[]);