diff options
Diffstat (limited to 'libbcachefs/btree_io.c')
-rw-r--r-- | libbcachefs/btree_io.c | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/libbcachefs/btree_io.c b/libbcachefs/btree_io.c index 6638bb1f..6abc9f17 100644 --- a/libbcachefs/btree_io.c +++ b/libbcachefs/btree_io.c @@ -2080,11 +2080,6 @@ static void btree_node_write_work(struct work_struct *work) container_of(work, struct btree_write_bio, work); struct bch_fs *c = wbio->wbio.c; struct btree *b = wbio->wbio.bio.bi_private; - unsigned commit_flags = - BCH_WATERMARK_interior_updates| - BCH_TRANS_COMMIT_journal_reclaim| - BCH_TRANS_COMMIT_no_enospc| - BCH_TRANS_COMMIT_no_check_rw; u64 start_time = wbio->start_time; int ret = 0; @@ -2093,24 +2088,38 @@ static void btree_node_write_work(struct work_struct *work) wbio->wbio.used_mempool, wbio->data); - if (wbio->wbio.failed.nr) { - ret = bch2_trans_do(c, - bch2_btree_node_rewrite_key_get_iter(trans, b, - commit_flags)); - } else if (!wbio->wbio.first_btree_write) { - ret = bch2_trans_do(c, - bch2_btree_node_update_key_get_iter(trans, b, &wbio->key, - commit_flags, true)); - } + bch2_bkey_drop_ptrs(bkey_i_to_s(&wbio->key), ptr, + bch2_dev_list_has_dev(wbio->wbio.failed, ptr->dev)); - if (ret) { - set_btree_node_noevict(b); - bch2_fs_fatal_err_on(!bch2_err_matches(ret, EROFS), c, - "writing btree node: %s", bch2_err_str(ret)); + if (!bch2_bkey_nr_ptrs(bkey_i_to_s_c(&wbio->key))) { + ret = -BCH_ERR_btree_node_write_all_failed; + goto err; } + if (wbio->wbio.first_btree_write) { + if (wbio->wbio.failed.nr) { + + } + } else { + ret = bch2_trans_do(c, + bch2_btree_node_update_key_get_iter(trans, b, &wbio->key, + BCH_WATERMARK_interior_updates| + BCH_TRANS_COMMIT_journal_reclaim| + BCH_TRANS_COMMIT_no_enospc| + BCH_TRANS_COMMIT_no_check_rw, + !wbio->wbio.failed.nr)); + if (ret) + goto err; + } +out: bio_put(&wbio->wbio.bio); btree_node_write_done(c, b, start_time); + return; +err: + set_btree_node_noevict(b); + bch2_fs_fatal_err_on(!bch2_err_matches(ret, EROFS), c, + "writing btree node: %s", bch2_err_str(ret)); + goto out; } static void btree_node_write_endio(struct bio *bio) |