summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bcachefs_revision2
-rw-r--r--libbcachefs/alloc.c5
-rw-r--r--libbcachefs/bcachefs.h1
-rw-r--r--libbcachefs/btree_io.c2
-rw-r--r--libbcachefs/buckets.c5
-rw-r--r--libbcachefs/io.c6
-rw-r--r--libbcachefs/super.c7
7 files changed, 23 insertions, 5 deletions
diff --git a/.bcachefs_revision b/.bcachefs_revision
index f0ec32ef..e8975f4c 100644
--- a/.bcachefs_revision
+++ b/.bcachefs_revision
@@ -1 +1 @@
-d37e2bb6dca5e4decf6b5918737c719fa6f17cc6
+c07073eb3b218df0ea107a3e04d2431703f0c07b
diff --git a/libbcachefs/alloc.c b/libbcachefs/alloc.c
index 3067181c..fc2a4ab4 100644
--- a/libbcachefs/alloc.c
+++ b/libbcachefs/alloc.c
@@ -384,6 +384,11 @@ int bch2_prio_read(struct bch_dev *ca)
size_t b;
int ret = 0;
+ if (ca->prio_read_done)
+ return 0;
+
+ ca->prio_read_done = true;
+
spin_lock(&c->journal.lock);
bucket = le64_to_cpu(c->journal.prio_buckets[ca->dev_idx]);
spin_unlock(&c->journal.lock);
diff --git a/libbcachefs/bcachefs.h b/libbcachefs/bcachefs.h
index 9bc6210f..90d40986 100644
--- a/libbcachefs/bcachefs.h
+++ b/libbcachefs/bcachefs.h
@@ -378,6 +378,7 @@ struct bch_dev {
u64 *prio_last_buckets;
spinlock_t prio_buckets_lock;
struct bio *bio_prio;
+ bool prio_read_done;
/*
* free: Buckets that are ready to be used
diff --git a/libbcachefs/btree_io.c b/libbcachefs/btree_io.c
index 728cbcd9..bb8cee15 100644
--- a/libbcachefs/btree_io.c
+++ b/libbcachefs/btree_io.c
@@ -1187,7 +1187,7 @@ void bch2_btree_node_read(struct bch_fs *c, struct btree *b)
pick = bch2_btree_pick_ptr(c, b);
if (bch2_fs_fatal_err_on(!pick.ca, c,
- "no cache device for btree node")) {
+ "btree node read error: no device to read from")) {
set_btree_node_read_error(b);
return;
}
diff --git a/libbcachefs/buckets.c b/libbcachefs/buckets.c
index f9d41ffc..184a29f9 100644
--- a/libbcachefs/buckets.c
+++ b/libbcachefs/buckets.c
@@ -458,7 +458,10 @@ static void bch2_mark_pointer(struct bch_fs *c,
if (gc_will_visit) {
if (journal_seq)
- bucket_cmpxchg(g, new, new.journal_seq = journal_seq);
+ bucket_cmpxchg(g, new, ({
+ new.journal_seq_valid = 1;
+ new.journal_seq = journal_seq;
+ }));
goto out;
}
diff --git a/libbcachefs/io.c b/libbcachefs/io.c
index da06845c..d3494611 100644
--- a/libbcachefs/io.c
+++ b/libbcachefs/io.c
@@ -93,10 +93,12 @@ static void bch2_submit_wbio(struct bch_fs *c, struct bch_write_bio *wbio,
wbio->bio.bi_iter.bi_sector = ptr->offset;
wbio->bio.bi_bdev = ca ? ca->disk_sb.bdev : NULL;
- if (!ca)
+ if (unlikely(!ca)) {
bcache_io_error(c, &wbio->bio, "device has been removed");
- else
+ bio_endio(&wbio->bio);
+ } else {
generic_make_request(&wbio->bio);
+ }
}
void bch2_submit_wbio_replicas(struct bch_write_bio *wbio, struct bch_fs *c,
diff --git a/libbcachefs/super.c b/libbcachefs/super.c
index 366fa672..b8139742 100644
--- a/libbcachefs/super.c
+++ b/libbcachefs/super.c
@@ -1554,6 +1554,7 @@ int bch2_dev_online(struct bch_fs *c, const char *path)
struct bch_dev *ca;
unsigned dev_idx;
const char *err;
+ int ret;
mutex_lock(&c->state_lock);
@@ -1576,6 +1577,12 @@ int bch2_dev_online(struct bch_fs *c, const char *path)
mutex_unlock(&c->sb_lock);
ca = c->devs[dev_idx];
+ ret = bch2_prio_read(ca);
+ if (ret) {
+ err = "error reading priorities";
+ goto err;
+ }
+
if (ca->mi.state == BCH_MEMBER_STATE_RW) {
err = __bch2_dev_read_write(c, ca);
if (err)