summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bcachefs_revision2
-rw-r--r--libbcachefs/bset.c4
-rw-r--r--libbcachefs/extents.c8
-rw-r--r--libbcachefs/io.c3
-rw-r--r--libbcachefs/io.h5
-rw-r--r--libbcachefs/move.c3
-rw-r--r--libbcachefs/recovery.c7
7 files changed, 19 insertions, 13 deletions
diff --git a/.bcachefs_revision b/.bcachefs_revision
index 90b98582..70ff03f8 100644
--- a/.bcachefs_revision
+++ b/.bcachefs_revision
@@ -1 +1 @@
-4a4139a563c4ee59f22ef23219fc2a3bb990b7b8
+7e07e19c29a31d2c719eb16f7e9061ad5aba5099
diff --git a/libbcachefs/bset.c b/libbcachefs/bset.c
index abf87ebd..1efb7fb3 100644
--- a/libbcachefs/bset.c
+++ b/libbcachefs/bset.c
@@ -79,8 +79,8 @@ void bch2_dump_bset(struct btree *b, struct bset *i, unsigned set)
_n = bkey_next_skip_noops(_k, vstruct_last(i));
bch2_bkey_to_text(&PBUF(buf), &k);
- printk(KERN_ERR "block %u key %5u: %s\n", set,
- __btree_node_key_to_offset(b, _k), buf);
+ printk(KERN_ERR "block %u key %5zu: %s\n", set,
+ _k->_data - i->_data, buf);
if (_n == vstruct_last(i))
continue;
diff --git a/libbcachefs/extents.c b/libbcachefs/extents.c
index 10feb856..cb88dd15 100644
--- a/libbcachefs/extents.c
+++ b/libbcachefs/extents.c
@@ -345,7 +345,7 @@ enum merge_result bch2_extent_merge(struct bch_fs *c,
crc_r.uncompressed_size > c->sb.encoded_extent_max)
return BCH_MERGE_NOMERGE;
- if (crc_l.uncompressed_size + crc_r.uncompressed_size - 1 >
+ if (crc_l.uncompressed_size + crc_r.uncompressed_size >
bch2_crc_field_size_max[extent_entry_type(en_l)])
return BCH_MERGE_NOMERGE;
@@ -563,15 +563,15 @@ void bch2_extent_crc_append(struct bkey_i *k,
enum bch_extent_entry_type type;
if (bch_crc_bytes[new.csum_type] <= 4 &&
- new.uncompressed_size - 1 <= CRC32_SIZE_MAX &&
+ new.uncompressed_size <= CRC32_SIZE_MAX &&
new.nonce <= CRC32_NONCE_MAX)
type = BCH_EXTENT_ENTRY_crc32;
else if (bch_crc_bytes[new.csum_type] <= 10 &&
- new.uncompressed_size - 1 <= CRC64_SIZE_MAX &&
+ new.uncompressed_size <= CRC64_SIZE_MAX &&
new.nonce <= CRC64_NONCE_MAX)
type = BCH_EXTENT_ENTRY_crc64;
else if (bch_crc_bytes[new.csum_type] <= 16 &&
- new.uncompressed_size - 1 <= CRC128_SIZE_MAX &&
+ new.uncompressed_size <= CRC128_SIZE_MAX &&
new.nonce <= CRC128_NONCE_MAX)
type = BCH_EXTENT_ENTRY_crc128;
else
diff --git a/libbcachefs/io.c b/libbcachefs/io.c
index 7cc26af1..7312ab2a 100644
--- a/libbcachefs/io.c
+++ b/libbcachefs/io.c
@@ -1221,7 +1221,8 @@ void bch2_write(struct closure *cl)
if (c->opts.nochanges ||
!percpu_ref_tryget(&c->writes)) {
- __bcache_io_error(c, "read only");
+ if (!(op->flags & BCH_WRITE_FROM_INTERNAL))
+ __bcache_io_error(c, "read only");
op->error = -EROFS;
goto err;
}
diff --git a/libbcachefs/io.h b/libbcachefs/io.h
index 37f7fa61..e45dcf96 100644
--- a/libbcachefs/io.h
+++ b/libbcachefs/io.h
@@ -31,10 +31,11 @@ enum bch_write_flags {
BCH_WRITE_ONLY_SPECIFIED_DEVS = (1 << 6),
BCH_WRITE_NOPUT_RESERVATION = (1 << 7),
BCH_WRITE_WROTE_DATA_INLINE = (1 << 8),
+ BCH_WRITE_FROM_INTERNAL = (1 << 9),
/* Internal: */
- BCH_WRITE_JOURNAL_SEQ_PTR = (1 << 9),
- BCH_WRITE_SKIP_CLOSURE_PUT = (1 << 10),
+ BCH_WRITE_JOURNAL_SEQ_PTR = (1 << 10),
+ BCH_WRITE_SKIP_CLOSURE_PUT = (1 << 11),
};
static inline u64 *op_journal_seq(struct bch_write_op *op)
diff --git a/libbcachefs/move.c b/libbcachefs/move.c
index ecc74ebe..4afda95f 100644
--- a/libbcachefs/move.c
+++ b/libbcachefs/move.c
@@ -243,7 +243,8 @@ int bch2_migrate_write_init(struct bch_fs *c, struct migrate_write *m,
m->op.flags |= BCH_WRITE_ONLY_SPECIFIED_DEVS|
BCH_WRITE_PAGES_STABLE|
BCH_WRITE_PAGES_OWNED|
- BCH_WRITE_DATA_ENCODED;
+ BCH_WRITE_DATA_ENCODED|
+ BCH_WRITE_FROM_INTERNAL;
m->op.nr_replicas = 1;
m->op.nr_replicas_required = 1;
diff --git a/libbcachefs/recovery.c b/libbcachefs/recovery.c
index 1871485c..712a6b1f 100644
--- a/libbcachefs/recovery.c
+++ b/libbcachefs/recovery.c
@@ -417,14 +417,17 @@ static int __bch2_journal_replay_key(struct btree_trans *trans,
enum btree_id id, struct bkey_i *k)
{
struct btree_iter *iter;
+ int ret;
iter = bch2_trans_get_iter(trans, id, bkey_start_pos(&k->k),
BTREE_ITER_INTENT);
if (IS_ERR(iter))
return PTR_ERR(iter);
- bch2_trans_update(trans, iter, k, BTREE_TRIGGER_NORUN);
- return 0;
+ ret = bch2_btree_iter_traverse(iter) ?:
+ bch2_trans_update(trans, iter, k, BTREE_TRIGGER_NORUN);
+ bch2_trans_iter_put(trans, iter);
+ return ret;
}
static int bch2_journal_replay_key(struct bch_fs *c, enum btree_id id,