|
@@ -88,8 +88,10 @@ static void bch_data_insert_keys(struct closure *cl)
|
|
|
if (journal_ref)
|
|
|
atomic_dec_bug(journal_ref);
|
|
|
|
|
|
- if (!op->insert_data_done)
|
|
|
+ if (!op->insert_data_done) {
|
|
|
continue_at(cl, bch_data_insert_start, op->wq);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
bch_keylist_free(&op->insert_keys);
|
|
|
closure_return(cl);
|
|
@@ -216,8 +218,10 @@ static void bch_data_insert_start(struct closure *cl)
|
|
|
/* 1 for the device pointer and 1 for the chksum */
|
|
|
if (bch_keylist_realloc(&op->insert_keys,
|
|
|
3 + (op->csum ? 1 : 0),
|
|
|
- op->c))
|
|
|
+ op->c)) {
|
|
|
continue_at(cl, bch_data_insert_keys, op->wq);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
k = op->insert_keys.top;
|
|
|
bkey_init(k);
|
|
@@ -255,6 +259,7 @@ static void bch_data_insert_start(struct closure *cl)
|
|
|
|
|
|
op->insert_data_done = true;
|
|
|
continue_at(cl, bch_data_insert_keys, op->wq);
|
|
|
+ return;
|
|
|
err:
|
|
|
/* bch_alloc_sectors() blocks if s->writeback = true */
|
|
|
BUG_ON(op->writeback);
|
|
@@ -576,8 +581,10 @@ static void cache_lookup(struct closure *cl)
|
|
|
ret = bch_btree_map_keys(&s->op, s->iop.c,
|
|
|
&KEY(s->iop.inode, bio->bi_iter.bi_sector, 0),
|
|
|
cache_lookup_fn, MAP_END_KEY);
|
|
|
- if (ret == -EAGAIN)
|
|
|
+ if (ret == -EAGAIN) {
|
|
|
continue_at(cl, cache_lookup, bcache_wq);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
closure_return(cl);
|
|
|
}
|
|
@@ -1085,6 +1092,7 @@ static void flash_dev_make_request(struct request_queue *q, struct bio *bio)
|
|
|
continue_at_nobarrier(&s->cl,
|
|
|
flash_dev_nodata,
|
|
|
bcache_wq);
|
|
|
+ return;
|
|
|
} else if (rw) {
|
|
|
bch_keybuf_check_overlapping(&s->iop.c->moving_gc_keys,
|
|
|
&KEY(d->id, bio->bi_iter.bi_sector, 0),
|