diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2024-01-04 19:45:54 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2024-01-04 19:56:14 -0500 |
commit | a751fe3a3cec77704d6e5ddd56c92a64f910951a (patch) | |
tree | 2f049e839c9d7dfa36c356f86572352c34d6b966 | |
parent | e51f25af3cdd7eadc49a91ea4f5e48fb2759fc18 (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.c | 3 | ||||
-rw-r--r-- | cmd_counters.c | 51 | ||||
-rw-r--r-- | cmds.h | 1 |
3 files changed, 55 insertions, 0 deletions
@@ -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; +} @@ -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[]); |