]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/journal_sb.c
Update bcachefs sources to 799716df00 bcachefs: Delete an incorrect bch2_trans_unlock()
[bcachefs-tools-debian] / libbcachefs / journal_sb.c
index cfdbd92d2164f4360983c2ed47773e0e8272bfb5..fcefbbe7eda8de8fce336380fb7e97cc4eefd50b 100644 (file)
@@ -22,7 +22,7 @@ static int bch2_sb_journal_validate(struct bch_sb *sb,
 {
        struct bch_sb_field_journal *journal = field_to_type(f, journal);
        struct bch_member *m = bch2_sb_get_members(sb)->members + sb->dev_idx;
-       int ret = -EINVAL;
+       int ret = -BCH_ERR_invalid_sb_journal;
        unsigned nr;
        unsigned i;
        u64 *b;
@@ -31,9 +31,9 @@ static int bch2_sb_journal_validate(struct bch_sb *sb,
        if (!nr)
                return 0;
 
-       b = kmalloc_array(sizeof(u64), nr, GFP_KERNEL);
+       b = kmalloc_array(nr, sizeof(u64), GFP_KERNEL);
        if (!b)
-               return -ENOMEM;
+               return -BCH_ERR_ENOMEM_sb_journal_validate;
 
        for (i = 0; i < nr; i++)
                b[i] = le64_to_cpu(journal->buckets[i]);
@@ -105,7 +105,7 @@ static int bch2_sb_journal_v2_validate(struct bch_sb *sb,
 {
        struct bch_sb_field_journal_v2 *journal = field_to_type(f, journal_v2);
        struct bch_member *m = bch2_sb_get_members(sb)->members + sb->dev_idx;
-       int ret = -EINVAL;
+       int ret = -BCH_ERR_invalid_sb_journal;
        unsigned nr;
        unsigned i;
        struct u64_range *b;
@@ -114,9 +114,9 @@ static int bch2_sb_journal_v2_validate(struct bch_sb *sb,
        if (!nr)
                return 0;
 
-       b = kmalloc_array(sizeof(*b), nr, GFP_KERNEL);
+       b = kmalloc_array(nr, sizeof(*b), GFP_KERNEL);
        if (!b)
-               return -ENOMEM;
+               return -BCH_ERR_ENOMEM_sb_journal_v2_validate;
 
        for (i = 0; i < nr; i++) {
                b[i].start = le64_to_cpu(journal->d[i].start);
@@ -175,46 +175,45 @@ const struct bch_sb_field_ops bch_sb_field_ops_journal_v2 = {
        .to_text        = bch2_sb_journal_v2_to_text,
 };
 
-int bch2_journal_buckets_to_sb(struct bch_fs *c, struct bch_dev *ca)
+int bch2_journal_buckets_to_sb(struct bch_fs *c, struct bch_dev *ca,
+                              u64 *buckets, unsigned nr)
 {
-       struct journal_device *ja = &ca->journal;
        struct bch_sb_field_journal_v2 *j;
-       unsigned i, dst = 0, nr = 1;
+       unsigned i, dst = 0, nr_compacted = 1;
 
        if (c)
                lockdep_assert_held(&c->sb_lock);
 
-       if (!ja->nr) {
+       if (!nr) {
                bch2_sb_field_delete(&ca->disk_sb, BCH_SB_FIELD_journal);
                bch2_sb_field_delete(&ca->disk_sb, BCH_SB_FIELD_journal_v2);
                return 0;
        }
 
-       for (i = 0; i + 1 < ja->nr; i++)
-               if (ja->buckets[i] + 1 != ja->buckets[i + 1])
-                       nr++;
+       for (i = 0; i + 1 < nr; i++)
+               if (buckets[i] + 1 != buckets[i + 1])
+                       nr_compacted++;
 
        j = bch2_sb_resize_journal_v2(&ca->disk_sb,
-                                (sizeof(*j) + sizeof(j->d[0]) * nr) / sizeof(u64));
+                        (sizeof(*j) + sizeof(j->d[0]) * nr_compacted) / sizeof(u64));
        if (!j)
                return -BCH_ERR_ENOSPC_sb_journal;
 
        bch2_sb_field_delete(&ca->disk_sb, BCH_SB_FIELD_journal);
 
-       j->d[dst].start = le64_to_cpu(ja->buckets[0]);
+       j->d[dst].start = le64_to_cpu(buckets[0]);
        j->d[dst].nr    = le64_to_cpu(1);
 
-       for (i = 1; i < ja->nr; i++) {
-               if (ja->buckets[i] == ja->buckets[i - 1] + 1) {
+       for (i = 1; i < nr; i++) {
+               if (buckets[i] == buckets[i - 1] + 1) {
                        le64_add_cpu(&j->d[dst].nr, 1);
                } else {
                        dst++;
-                       j->d[dst].start = le64_to_cpu(ja->buckets[i]);
+                       j->d[dst].start = le64_to_cpu(buckets[i]);
                        j->d[dst].nr    = le64_to_cpu(1);
                }
        }
 
-       BUG_ON(dst + 1 != nr);
-
+       BUG_ON(dst + 1 != nr_compacted);
        return 0;
 }