summaryrefslogtreecommitdiff
path: root/c_src
diff options
context:
space:
mode:
Diffstat (limited to 'c_src')
-rw-r--r--c_src/cmd_format.c3
-rw-r--r--c_src/cmd_fsck.c1
-rw-r--r--c_src/cmd_fusemount.c4
-rw-r--r--c_src/cmd_image.c14
-rw-r--r--c_src/cmd_super.c93
-rw-r--r--c_src/cmd_super.h8
-rw-r--r--c_src/libbcachefs.c25
-rw-r--r--c_src/tools-util.c5
8 files changed, 113 insertions, 40 deletions
diff --git a/c_src/cmd_format.c b/c_src/cmd_format.c
index 740b0e81..841a7913 100644
--- a/c_src/cmd_format.c
+++ b/c_src/cmd_format.c
@@ -21,6 +21,7 @@
#include <uuid/uuid.h>
#include "cmds.h"
+#include "cmd_super.h"
#include "tools-util.h"
#include "posix_to_bcachefs.h"
#include "libbcachefs.h"
@@ -293,7 +294,7 @@ int cmd_format(int argc, char *argv[])
struct printbuf buf = PRINTBUF;
buf.human_readable_units = true;
- bch2_sb_to_text(&buf, sb, false, 1 << BCH_SB_FIELD_members_v2);
+ bch2_sb_to_text_with_names(&buf, sb, false, 1 << BCH_SB_FIELD_members_v2, -1);
printf("%s", buf.buf);
printbuf_exit(&buf);
}
diff --git a/c_src/cmd_fsck.c b/c_src/cmd_fsck.c
index 8c37b1ba..17e3af4d 100644
--- a/c_src/cmd_fsck.c
+++ b/c_src/cmd_fsck.c
@@ -208,6 +208,7 @@ static void fsck_usage(void)
" -f Force checking even if filesystem is marked clean\n"
" -r, --ratelimit_errors Don't display more than 10 errors of a given type\n"
" -k, --kernel Use the in-kernel fsck implementation\n"
+ " -K, --no-kernel\n"
" -v Be verbose\n"
" -h, --help Display this help and exit\n"
"Report bugs to <linux-bcachefs@vger.kernel.org>");
diff --git a/c_src/cmd_fusemount.c b/c_src/cmd_fusemount.c
index e5740050..056e9a08 100644
--- a/c_src/cmd_fusemount.c
+++ b/c_src/cmd_fusemount.c
@@ -214,7 +214,7 @@ retry:
bch2_trans_commit(trans, NULL, NULL,
BCH_TRANS_COMMIT_no_enospc);
err:
- bch2_trans_iter_exit(trans, &iter);
+ bch2_trans_iter_exit(&iter);
if (ret == -EINTR)
goto retry;
@@ -554,7 +554,7 @@ retry:
ret = bch2_trans_commit(trans, NULL, NULL,
BCH_TRANS_COMMIT_no_enospc);
err:
- bch2_trans_iter_exit(trans, &iter);
+ bch2_trans_iter_exit(&iter);
if (ret == -EINTR)
goto retry;
diff --git a/c_src/cmd_image.c b/c_src/cmd_image.c
index 467378b0..01179254 100644
--- a/c_src/cmd_image.c
+++ b/c_src/cmd_image.c
@@ -165,23 +165,19 @@ static void check_gaps(struct bch_fs *c)
static int get_nbuckets_used(struct bch_fs *c, u64 *nbuckets)
{
- struct btree_trans *trans = bch2_trans_get(c);
- struct btree_iter iter;
- bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc, POS(0, U64_MAX), 0);
+ CLASS(btree_trans, trans)(c);
+ CLASS(btree_iter, iter)(trans, BTREE_ID_alloc, POS(0, U64_MAX), 0);
struct bkey_s_c k;
- int ret = lockrestart_do(trans, bkey_err(k = bch2_btree_iter_peek_prev(trans, &iter)));
+ int ret = lockrestart_do(trans, bkey_err(k = bch2_btree_iter_peek_prev(&iter)));
if (!ret && k.k->type != KEY_TYPE_alloc_v4)
ret = -ENOENT;
if (ret) {
fprintf(stderr, "error looking up last alloc key: %s\n", bch2_err_str(ret));
- goto err;
+ return ret;
}
*nbuckets = (k.k->p.offset + 1);
-err:
- bch2_trans_iter_exit(trans, &iter);
- bch2_trans_put(trans);
- return ret;
+ return 0;
}
diff --git a/c_src/cmd_super.c b/c_src/cmd_super.c
index 3161205f..00776b1b 100644
--- a/c_src/cmd_super.c
+++ b/c_src/cmd_super.c
@@ -21,6 +21,7 @@
#include <uuid/uuid.h>
#include "cmds.h"
+#include "cmd_super.h"
#include "libbcachefs.h"
#include "libbcachefs/opts.h"
#include "libbcachefs/super-io.h"
@@ -28,6 +29,8 @@
#include "libbcachefs/darray.h"
+#include "src/rust_to_c.h"
+
static void show_super_usage(void)
{
puts("bcachefs show-super \n"
@@ -42,6 +45,72 @@ static void show_super_usage(void)
exit(EXIT_SUCCESS);
}
+static struct sb_name *sb_dev_to_name(sb_names sb_names, unsigned idx)
+{
+ darray_for_each(sb_names, i)
+ if (i->sb.sb->dev_idx == idx)
+ return i;
+ return NULL;
+}
+
+static void print_one_member(struct printbuf *out, sb_names sb_names,
+ struct bch_sb *sb,
+ struct bch_sb_field_disk_groups *gi,
+ struct bch_member m, unsigned idx)
+{
+ struct sb_name *name = sb_dev_to_name(sb_names, idx);
+ prt_printf(out, "Device %u:\t%s\t", idx, name ? name->name : "(not found)");
+
+ if (name) {
+ char *model = fd_to_dev_model(name->sb.bdev->bd_fd);
+ prt_str(out, model);
+ free(model);
+ }
+ prt_newline(out);
+
+ printbuf_indent_add(out, 2);
+ bch2_member_to_text(out, &m, gi, sb, idx);
+ printbuf_indent_sub(out, 2);
+}
+
+void bch2_sb_to_text_with_names(struct printbuf *out, struct bch_sb *sb,
+ bool print_layout, unsigned fields, int field_only)
+{
+ CLASS(printbuf, uuid_buf)();
+ prt_str(&uuid_buf, "UUID=");
+ pr_uuid(&uuid_buf, sb->user_uuid.b);
+
+ sb_names sb_names = {};
+ bch2_scan_device_sbs(uuid_buf.buf, &sb_names);
+
+ if (field_only >= 0) {
+ struct bch_sb_field *f = bch2_sb_field_get_id(sb, field_only);
+
+ if (f)
+ __bch2_sb_field_to_text(out, sb, f);
+ } else {
+ printbuf_tabstop_push(out, 44);
+
+ bch2_sb_to_text(out, sb, print_layout,
+ fields & ~(BIT(BCH_SB_FIELD_members_v1)|
+ BIT(BCH_SB_FIELD_members_v2)));
+
+ struct bch_sb_field_disk_groups *gi = bch2_sb_field_get(sb, disk_groups);
+
+ struct bch_sb_field_members_v1 *mi1;
+ if ((fields & BIT(BCH_SB_FIELD_members_v1)) &&
+ (mi1 = bch2_sb_field_get(sb, members_v1)))
+ for (unsigned i = 0; i < sb->nr_devices; i++)
+ print_one_member(out, sb_names, sb, gi, bch2_members_v1_get(mi1, i), i);
+
+ struct bch_sb_field_members_v2 *mi2;
+ if ((fields & BIT(BCH_SB_FIELD_members_v2)) &&
+ (mi2 = bch2_sb_field_get(sb, members_v2)))
+ for (unsigned i = 0; i < sb->nr_devices; i++)
+ print_one_member(out, sb_names, sb, gi, bch2_members_v2_get(mi2, i), i);
+ }
+}
+
int cmd_show_super(int argc, char *argv[])
{
static const struct option longopts[] = {
@@ -98,32 +167,16 @@ int cmd_show_super(int argc, char *argv[])
if (print_default_fields) {
fields |= bch2_sb_field_get(sb.sb, members_v2)
- ? 1 << BCH_SB_FIELD_members_v2
- : 1 << BCH_SB_FIELD_members_v1;
- fields |= 1 << BCH_SB_FIELD_errors;
+ ? BIT(BCH_SB_FIELD_members_v2)
+ : BIT(BCH_SB_FIELD_members_v1);
+ fields |= BIT(BCH_SB_FIELD_errors);
}
struct printbuf buf = PRINTBUF;
buf.human_readable_units = true;
- if (field_only >= 0) {
- struct bch_sb_field *f = bch2_sb_field_get_id(sb.sb, field_only);
-
- if (f)
- __bch2_sb_field_to_text(&buf, sb.sb, f);
- } else {
- printbuf_tabstop_push(&buf, 44);
-
- char *model = fd_to_dev_model(sb.bdev->bd_fd);
- prt_str(&buf, "Device:");
- prt_tab(&buf);
- prt_str(&buf, model);
- prt_newline(&buf);
- free(model);
-
- bch2_sb_to_text(&buf, sb.sb, print_layout, fields);
- }
+ bch2_sb_to_text_with_names(&buf, sb.sb, print_layout, fields, field_only);
printf("%s", buf.buf);
bch2_free_super(&sb);
diff --git a/c_src/cmd_super.h b/c_src/cmd_super.h
new file mode 100644
index 00000000..78f71967
--- /dev/null
+++ b/c_src/cmd_super.h
@@ -0,0 +1,8 @@
+#ifndef _TOOLS_CMD_SHOW_SUPER_H
+#define _TOOLS_CMD_SHOW_SUPER_H
+
+#include "libbcachefs/super-io.h"
+
+void bch2_sb_to_text_with_names(struct printbuf *, struct bch_sb *, bool, unsigned, int);
+
+#endif /* _TOOLS_CMD_SHOW_SUPER_H */
diff --git a/c_src/libbcachefs.c b/c_src/libbcachefs.c
index 6b31d56f..2b5ca211 100644
--- a/c_src/libbcachefs.c
+++ b/c_src/libbcachefs.c
@@ -79,14 +79,25 @@ void bch2_sb_layout_init(struct bch_sb_layout *l,
}
}
-static u64 dev_max_bucket_size(struct bch_opts fs_opts, u64 dev_size)
+static u64 dev_bucket_size_clamp(struct bch_opts fs_opts, u64 dev_size, u64 fs_bucket_size)
{
- u64 size = rounddown_pow_of_two(dev_size / (BCH_MIN_NR_NBUCKETS * 4));
+ u64 max_size = rounddown_pow_of_two(dev_size / (BCH_MIN_NR_NBUCKETS * 4));
if (opt_defined(fs_opts, btree_node_size))
- size = max(size, fs_opts.btree_node_size);
- if (size * BCH_MIN_NR_NBUCKETS > dev_size)
- die("bucket size %llu too big for device size", size);
- return size;
+ max_size = max(max_size, fs_opts.btree_node_size);
+ if (max_size * BCH_MIN_NR_NBUCKETS > dev_size)
+ die("bucket size %llu too big for device size", max_size);
+
+ u64 dev_bucket_size = min(max_size, fs_bucket_size);
+
+ /*
+ * Use encoded_extent_max instead of 64k?
+ */
+
+ while (dev_bucket_size < 64 << 10 &&
+ dev_size / (dev_bucket_size * 2) >= BCH_MIN_NR_NBUCKETS)
+ dev_bucket_size *= 2;
+
+ return dev_bucket_size;
}
u64 bch2_pick_bucket_size(struct bch_opts opts, dev_opts_list devs)
@@ -214,7 +225,7 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs,
darray_for_each(devs, i)
if (!opt_defined(i->opts, bucket_size))
opt_set(i->opts, bucket_size,
- min(fs_bucket_size, dev_max_bucket_size(fs_opts, i->fs_size)));
+ dev_bucket_size_clamp(fs_opts, i->fs_size, fs_bucket_size));
darray_for_each(devs, i) {
i->nbuckets = i->fs_size / i->opts.bucket_size;
diff --git a/c_src/tools-util.c b/c_src/tools-util.c
index 5a15f306..f48d3f21 100644
--- a/c_src/tools-util.c
+++ b/c_src/tools-util.c
@@ -22,6 +22,7 @@
#include "linux/sort.h"
#include "tools-util.h"
#include "libbcachefs/util.h"
+#include "src/rust_to_c.h"
void die(const char *fmt, ...)
{
@@ -777,7 +778,9 @@ darray_const_str get_or_split_cmdline_devs(int argc, char *argv[])
darray_const_str ret = {};
if (argc == 1) {
- bch2_split_devs(argv[0], &ret);
+ char *dev = bch2_scan_devices(argv[0]);
+
+ bch2_split_devs(dev, &ret);
} else {
for (unsigned i = 0; i < argc; i++)
darray_push(&ret, strdup(argv[i]));