diff options
Diffstat (limited to 'libbcachefs/data_update.c')
-rw-r--r-- | libbcachefs/data_update.c | 54 |
1 files changed, 26 insertions, 28 deletions
diff --git a/libbcachefs/data_update.c b/libbcachefs/data_update.c index de0575f6..e1467e11 100644 --- a/libbcachefs/data_update.c +++ b/libbcachefs/data_update.c @@ -98,8 +98,10 @@ static void bch2_bkey_mark_dev_cached(struct bkey_s k, unsigned dev) struct bch_extent_ptr *ptr; bkey_for_each_ptr(ptrs, ptr) - if (ptr->dev == dev) - ptr->cached = true; + if (ptr->dev == dev) { + bch2_extent_ptr_set_cached(k, ptr); + return; + } } static int __bch2_data_update_index_update(struct btree_trans *trans, @@ -295,15 +297,7 @@ out: int bch2_data_update_index_update(struct bch_write_op *op) { - struct bch_fs *c = op->c; - struct btree_trans trans; - int ret; - - bch2_trans_init(&trans, c, BTREE_ITER_MAX, 1024); - ret = __bch2_data_update_index_update(&trans, op); - bch2_trans_exit(&trans); - - return ret; + return bch2_trans_run(op->c, __bch2_data_update_index_update(&trans, op)); } void bch2_data_update_read_done(struct data_update *m, @@ -326,8 +320,9 @@ void bch2_data_update_exit(struct data_update *update) const struct bch_extent_ptr *ptr; bkey_for_each_ptr(ptrs, ptr) { - bch2_bucket_nocow_unlock(&c->nocow_locks, - PTR_BUCKET_POS(c, ptr), 0); + if (c->opts.nocow_enabled) + bch2_bucket_nocow_unlock(&c->nocow_locks, + PTR_BUCKET_POS(c, ptr), 0); percpu_ref_put(&bch_dev_bkey_exists(c, ptr->dev)->ref); } @@ -487,23 +482,26 @@ int bch2_data_update_init(struct btree_trans *trans, if (p.crc.compression_type == BCH_COMPRESSION_TYPE_incompressible) m->op.incompressible = true; - if (ctxt) { - move_ctxt_wait_event(ctxt, trans, - (locked = bch2_bucket_nocow_trylock(&c->nocow_locks, - PTR_BUCKET_POS(c, &p.ptr), 0)) || - !atomic_read(&ctxt->read_sectors)); - - if (!locked) - bch2_bucket_nocow_lock(&c->nocow_locks, - PTR_BUCKET_POS(c, &p.ptr), 0); - } else { - if (!bch2_bucket_nocow_trylock(&c->nocow_locks, - PTR_BUCKET_POS(c, &p.ptr), 0)) { - ret = -BCH_ERR_nocow_lock_blocked; - goto err; + if (c->opts.nocow_enabled) { + if (ctxt) { + move_ctxt_wait_event(ctxt, trans, + (locked = bch2_bucket_nocow_trylock(&c->nocow_locks, + PTR_BUCKET_POS(c, &p.ptr), 0)) || + !atomic_read(&ctxt->read_sectors)); + + if (!locked) + bch2_bucket_nocow_lock(&c->nocow_locks, + PTR_BUCKET_POS(c, &p.ptr), 0); + } else { + if (!bch2_bucket_nocow_trylock(&c->nocow_locks, + PTR_BUCKET_POS(c, &p.ptr), 0)) { + ret = -BCH_ERR_nocow_lock_blocked; + goto err; + } } + ptrs_locked |= (1U << i); } - ptrs_locked |= (1U << i); + i++; } |