-static int u64_cmp(const void *_l, const void *_r)
-{
- u64 l = *((const u64 *) _l), r = *((const u64 *) _r);
-
- return l < r ? -1 : l > r ? 1 : 0;
-}
-
-const char *bch2_sb_validate_journal(struct bch_sb *sb,
- struct bch_member_cpu mi)
-{
- struct bch_sb_field_journal *journal;
- const char *err;
- unsigned nr;
- unsigned i;
- u64 *b;
-
- journal = bch2_sb_get_journal(sb);
- if (!journal)
- return NULL;
-
- nr = bch2_nr_journal_buckets(journal);
- if (!nr)
- return NULL;
-
- b = kmalloc_array(sizeof(u64), nr, GFP_KERNEL);
- if (!b)
- return "cannot allocate memory";
-
- for (i = 0; i < nr; i++)
- b[i] = le64_to_cpu(journal->buckets[i]);
-
- sort(b, nr, sizeof(u64), u64_cmp, NULL);
-
- err = "journal bucket at sector 0";
- if (!b[0])
- goto err;
-
- err = "journal bucket before first bucket";
- if (b[0] < mi.first_bucket)
- goto err;
-
- err = "journal bucket past end of device";
- if (b[nr - 1] >= mi.nbuckets)
- goto err;
-
- err = "duplicate journal buckets";
- for (i = 0; i + 1 < nr; i++)
- if (b[i] == b[i + 1])
- goto err;
-
- err = NULL;
-err:
- kfree(b);
- return err;
-}
-
-static const char *bch2_sb_validate_members(struct bch_sb *sb)
-{
- struct bch_sb_field_members *mi;
- unsigned i;
-
- mi = bch2_sb_get_members(sb);
- if (!mi)
- return "Invalid superblock: member info area missing";
-
- if ((void *) (mi->members + sb->nr_devices) >
- vstruct_end(&mi->field))
- return "Invalid superblock: bad member info";
-
- for (i = 0; i < sb->nr_devices; i++) {
- if (!bch2_dev_exists(sb, mi, i))
- continue;
-
- if (le16_to_cpu(mi->members[i].bucket_size) <
- BCH_SB_BTREE_NODE_SIZE(sb))
- return "bucket size smaller than btree node size";
- }
-
- return NULL;
-}
-