From 6d8881705872edbc2c8fe539312aa40eaa8f281d Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Fri, 31 Mar 2017 05:12:36 -0800 Subject: [PATCH] Update bcachefs sources --- .bcachefs_revision | 2 +- libbcachefs/alloc.c | 5 +++++ libbcachefs/bcachefs.h | 1 + libbcachefs/btree_io.c | 2 +- libbcachefs/buckets.c | 5 ++++- libbcachefs/io.c | 6 ++++-- libbcachefs/super.c | 7 +++++++ 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)