]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/journal_io.c
Fix building on musl
[bcachefs-tools-debian] / libbcachefs / journal_io.c
index 56950049e8929c7e9ff66b01e776323f1b61e69d..39bb2154cce19df860823fb32f657ffef644e2dd 100644 (file)
@@ -1,5 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
 #include "bcachefs.h"
 #include "alloc_foreground.h"
+#include "btree_io.h"
 #include "buckets.h"
 #include "checksum.h"
 #include "error.h"
@@ -137,7 +139,8 @@ static void journal_entry_null_range(void *start, void *end)
 
 static int journal_validate_key(struct bch_fs *c, struct jset *jset,
                                struct jset_entry *entry,
-                               struct bkey_i *k, enum btree_node_type key_type,
+                               unsigned level, enum btree_id btree_id,
+                               struct bkey_i *k,
                                const char *type, int write)
 {
        void *next = vstruct_next(entry);
@@ -170,14 +173,13 @@ static int journal_validate_key(struct bch_fs *c, struct jset *jset,
                return 0;
        }
 
-       if (JSET_BIG_ENDIAN(jset) != CPU_BIG_ENDIAN)
-               bch2_bkey_swab(NULL, bkey_to_packed(k));
+       if (!write)
+               bch2_bkey_compat(level, btree_id, version,
+                           JSET_BIG_ENDIAN(jset), write,
+                           NULL, bkey_to_packed(k));
 
-       if (!write &&
-           version < bcachefs_metadata_version_bkey_renumber)
-               bch2_bkey_renumber(key_type, bkey_to_packed(k), write);
-
-       invalid = bch2_bkey_invalid(c, bkey_i_to_s_c(k), key_type);
+       invalid = bch2_bkey_invalid(c, bkey_i_to_s_c(k),
+                                   __btree_node_type(level, btree_id));
        if (invalid) {
                char buf[160];
 
@@ -191,9 +193,10 @@ static int journal_validate_key(struct bch_fs *c, struct jset *jset,
                return 0;
        }
 
-       if (write &&
-           version < bcachefs_metadata_version_bkey_renumber)
-               bch2_bkey_renumber(key_type, bkey_to_packed(k), write);
+       if (write)
+               bch2_bkey_compat(level, btree_id, version,
+                           JSET_BIG_ENDIAN(jset), write,
+                           NULL, bkey_to_packed(k));
 fsck_err:
        return ret;
 }
@@ -206,10 +209,10 @@ static int journal_entry_validate_btree_keys(struct bch_fs *c,
        struct bkey_i *k;
 
        vstruct_for_each(entry, k) {
-               int ret = journal_validate_key(c, jset, entry, k,
-                               __btree_node_type(entry->level,
-                                                 entry->btree_id),
-                               "key", write);
+               int ret = journal_validate_key(c, jset, entry,
+                                              entry->level,
+                                              entry->btree_id,
+                                              k, "key", write);
                if (ret)
                        return ret;
        }
@@ -239,7 +242,7 @@ static int journal_entry_validate_btree_root(struct bch_fs *c,
                return 0;
        }
 
-       return journal_validate_key(c, jset, entry, k, BKEY_TYPE_BTREE,
+       return journal_validate_key(c, jset, entry, 1, entry->btree_id, k,
                                    "btree root", write);
 fsck_err:
        return ret;
@@ -494,9 +497,8 @@ reread:
                                                    sectors_read << 9));
                        bio_set_dev(bio, ca->disk_sb.bdev);
                        bio->bi_iter.bi_sector  = offset;
-                       bio->bi_iter.bi_size    = sectors_read << 9;
                        bio_set_op_attrs(bio, REQ_OP_READ, 0);
-                       bch2_bio_map(bio, buf->data);
+                       bch2_bio_map(bio, buf->data, sectors_read << 9);
 
                        ret = submit_bio_wait(bio);
                        bio_put(bio);
@@ -1016,8 +1018,7 @@ void bch2_journal_write(struct closure *cl)
        if (bch2_csum_type_is_encryption(JSET_CSUM_TYPE(jset)))
                validate_before_checksum = true;
 
-       if (le32_to_cpu(jset->version) <
-           bcachefs_metadata_version_bkey_renumber)
+       if (le32_to_cpu(jset->version) < bcachefs_metadata_version_max)
                validate_before_checksum = true;
 
        if (validate_before_checksum &&
@@ -1041,9 +1042,16 @@ void bch2_journal_write(struct closure *cl)
        bytes = vstruct_bytes(jset);
        memset((void *) jset + bytes, 0, (sectors << 9) - bytes);
 
+retry_alloc:
        spin_lock(&j->lock);
        ret = journal_write_alloc(j, w, sectors);
 
+       if (ret && j->can_discard) {
+               spin_unlock(&j->lock);
+               bch2_journal_do_discards(j);
+               goto retry_alloc;
+       }
+
        /*
         * write is allocated, no longer need to account for it in
         * bch2_journal_space_available():
@@ -1086,12 +1094,11 @@ void bch2_journal_write(struct closure *cl)
                bio_reset(bio);
                bio_set_dev(bio, ca->disk_sb.bdev);
                bio->bi_iter.bi_sector  = ptr->offset;
-               bio->bi_iter.bi_size    = sectors << 9;
                bio->bi_end_io          = journal_write_endio;
                bio->bi_private         = ca;
                bio_set_op_attrs(bio, REQ_OP_WRITE,
                                 REQ_SYNC|REQ_META|REQ_PREFLUSH|REQ_FUA);
-               bch2_bio_map(bio, jset);
+               bch2_bio_map(bio, jset, sectors << 9);
 
                trace_journal_write(bio);
                closure_bio_submit(bio, cl);
@@ -1101,7 +1108,7 @@ void bch2_journal_write(struct closure *cl)
 
        for_each_rw_member(ca, c, i)
                if (journal_flushes_device(ca) &&
-                   !bch2_extent_has_device(bkey_i_to_s_c_extent(&w->key), i)) {
+                   !bch2_bkey_has_device(bkey_i_to_s_c(&w->key), i)) {
                        percpu_ref_get(&ca->io_ref);
 
                        bio = ca->journal.bio;