]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs.c
Update bcachefs sources to ea3414eed5 fixup! bcachefs: Improve diagnostics when journ...
[bcachefs-tools-debian] / libbcachefs.c
index 89c203a15b677dfa2a22d793efcd290f942979cc..e7c1ca23224ca721217e4ae14a7ec456c4df9ac3 100644 (file)
@@ -21,6 +21,7 @@
 #include "libbcachefs/btree_cache.h"
 #include "libbcachefs/checksum.h"
 #include "libbcachefs/disk_groups.h"
+#include "libbcachefs/journal_seq_blacklist.h"
 #include "libbcachefs/opts.h"
 #include "libbcachefs/replicas.h"
 #include "libbcachefs/super-io.h"
@@ -241,8 +242,6 @@ struct bch_sb *bch2_format(struct bch_opt_strs      fs_opt_strs,
        sb.sb->time_base_lo     = cpu_to_le64(now.tv_sec * NSEC_PER_SEC + now.tv_nsec);
        sb.sb->time_precision   = cpu_to_le32(1);
 
-       sb.sb->features[0] |= 1ULL << BCH_FEATURE_NEW_SIPHASH;
-
        /* Member info: */
        mi = bch2_sb_resize_members(&sb,
                        (sizeof(*mi) + sizeof(struct bch_member) *
@@ -620,11 +619,29 @@ static void bch2_sb_print_disk_groups(struct bch_sb *sb, struct bch_sb_field *f,
 static void bch2_sb_print_clean(struct bch_sb *sb, struct bch_sb_field *f,
                                enum units units)
 {
+       struct bch_sb_field_clean *clean = field_to_type(f, clean);
+
+
+       printf("  flags:       %x", le32_to_cpu(clean->flags));
+       printf("  read clock:  %x", le16_to_cpu(clean->read_clock));
+       printf("  write clock: %x", le16_to_cpu(clean->write_clock));
+       printf("  journal seq: %llx", le64_to_cpu(clean->journal_seq));
 }
 
 static void bch2_sb_print_journal_seq_blacklist(struct bch_sb *sb, struct bch_sb_field *f,
                                enum units units)
 {
+       struct bch_sb_field_journal_seq_blacklist *bl = field_to_type(f, journal_seq_blacklist);
+       unsigned i, nr = blacklist_nr_entries(bl);
+
+       for (i = 0; i < nr; i++) {
+               struct journal_seq_blacklist_entry *e =
+                       bl->start + i;
+
+               printf("  %llu-%llu\n",
+                      le64_to_cpu(e->start),
+                      le64_to_cpu(e->end));
+       }
 }
 
 typedef void (*sb_field_print_fn)(struct bch_sb *, struct bch_sb_field *, enum units);
@@ -659,6 +676,7 @@ void bch2_sb_print(struct bch_sb *sb, bool print_layout,
 {
        struct bch_sb_field_members *mi;
        char user_uuid_str[40], internal_uuid_str[40];
+       char features_str[500];
        char fields_have_str[200];
        char label[BCH_SB_LABEL_SIZE + 1];
        char time_str[64];
@@ -704,6 +722,10 @@ void bch2_sb_print(struct bch_sb *sb, bool print_layout,
        bch2_sb_get_target(sb, promote_str, sizeof(promote_str),
                BCH_SB_PROMOTE_TARGET(sb));
 
+       bch2_flags_to_text(&PBUF(features_str),
+                          bch2_sb_features,
+                          le64_to_cpu(sb->features[0]));
+
        vstruct_for_each(sb, f)
                fields_have |= 1 << le32_to_cpu(f->type);
        bch2_flags_to_text(&PBUF(fields_have_str),
@@ -711,13 +733,16 @@ void bch2_sb_print(struct bch_sb *sb, bool print_layout,
 
        printf("External UUID:                  %s\n"
               "Internal UUID:                  %s\n"
+              "Device index:                   %u\n"
               "Label:                          %s\n"
               "Version:                        %llu\n"
               "Created:                        %s\n"
+              "Squence number:                 %llu\n"
               "Block_size:                     %s\n"
               "Btree node size:                %s\n"
               "Error action:                   %s\n"
               "Clean:                          %llu\n"
+              "Features:                       %s\n"
 
               "Metadata replicas:              %llu\n"
               "Data replicas:                  %llu\n"
@@ -740,9 +765,11 @@ void bch2_sb_print(struct bch_sb *sb, bool print_layout,
               "Superblock size:                %llu\n",
               user_uuid_str,
               internal_uuid_str,
+              sb->dev_idx,
               label,
               le64_to_cpu(sb->version),
               time_str,
+              le64_to_cpu(sb->seq),
               pr_units(le16_to_cpu(sb->block_size), units),
               pr_units(BCH_SB_BTREE_NODE_SIZE(sb), units),
 
@@ -751,22 +778,23 @@ void bch2_sb_print(struct bch_sb *sb, bool print_layout,
               : "unknown",
 
               BCH_SB_CLEAN(sb),
+              features_str,
 
               BCH_SB_META_REPLICAS_WANT(sb),
               BCH_SB_DATA_REPLICAS_WANT(sb),
 
               BCH_SB_META_CSUM_TYPE(sb) < BCH_CSUM_OPT_NR
-              ? bch2_csum_types[BCH_SB_META_CSUM_TYPE(sb)]
+              ? bch2_csum_opts[BCH_SB_META_CSUM_TYPE(sb)]
               : "unknown",
               BCH_SB_META_CSUM_TYPE(sb),
 
               BCH_SB_DATA_CSUM_TYPE(sb) < BCH_CSUM_OPT_NR
-              ? bch2_csum_types[BCH_SB_DATA_CSUM_TYPE(sb)]
+              ? bch2_csum_opts[BCH_SB_DATA_CSUM_TYPE(sb)]
               : "unknown",
               BCH_SB_DATA_CSUM_TYPE(sb),
 
               BCH_SB_COMPRESSION_TYPE(sb) < BCH_COMPRESSION_OPT_NR
-              ? bch2_compression_types[BCH_SB_COMPRESSION_TYPE(sb)]
+              ? bch2_compression_opts[BCH_SB_COMPRESSION_TYPE(sb)]
               : "unknown",
               BCH_SB_COMPRESSION_TYPE(sb),
 
@@ -941,14 +969,15 @@ int bchu_data(struct bchfs_handle fs, struct bch_ioctl_data cmd)
                       bch2_data_types[e.p.data_type]);
 
                switch (e.p.data_type) {
-               case BCH_DATA_BTREE:
-               case BCH_DATA_USER:
+               case BCH_DATA_btree:
+               case BCH_DATA_user:
                        printf(" %s:%llu:%llu",
                               bch2_btree_ids[e.p.btree_id],
                               e.p.pos.inode,
                               e.p.pos.offset);
                }
 
+               fflush(stdout);
                sleep(1);
        }
        printf("\nDone\n");
@@ -1032,7 +1061,9 @@ struct bch_opts bch2_parse_opts(struct bch_opt_strs strs)
                ret = bch2_opt_parse(NULL, &bch2_opt_table[i],
                                     strs.by_id[i], &v);
                if (ret < 0)
-                       die("Invalid %s: %s", strs.by_id[i], strerror(-ret));
+                       die("Invalid %s: %s",
+                           bch2_opt_table[i].attr.name,
+                           strerror(-ret));
 
                bch2_opt_set_by_id(&opts, i, v);
        }
@@ -1114,7 +1145,7 @@ dev_names bchu_fs_get_devices(struct bchfs_handle fs)
        darray_init(devs);
 
        while ((errno = 0), (d = readdir(dir))) {
-               struct dev_name n;
+               struct dev_name n = { 0, NULL, NULL };
 
                if (sscanf(d->d_name, "dev-%u", &n.idx) != 1)
                        continue;
@@ -1122,9 +1153,12 @@ dev_names bchu_fs_get_devices(struct bchfs_handle fs)
                char *block_attr = mprintf("dev-%u/block", n.idx);
 
                char sysfs_block_buf[4096];
-               if (readlinkat(fs.sysfs_fd, block_attr,
-                              sysfs_block_buf, sizeof(sysfs_block_buf)) > 0)
+               ssize_t r = readlinkat(fs.sysfs_fd, block_attr,
+                                      sysfs_block_buf, sizeof(sysfs_block_buf));
+               if (r > 0) {
+                       sysfs_block_buf[r] = '\0';
                        n.dev = strdup(basename(sysfs_block_buf));
+               }
 
                free(block_attr);