r_v->v.refcount = 0;
memcpy(r_v->v.start, e->v.start, bkey_val_bytes(&e->k));
- bch2_trans_update(trans, reflink_iter, &r_v->k_i);
+ bch2_trans_update(trans, reflink_iter, &r_v->k_i, 0);
r_p = bch2_trans_kmalloc(trans, sizeof(*r_p));
if (IS_ERR(r_p))
set_bkey_val_bytes(&r_p->k, sizeof(r_p->v));
r_p->v.idx = cpu_to_le64(bkey_start_offset(&r_v->k));
- bch2_trans_update(trans, extent_iter, &r_p->k_i);
+ bch2_trans_update(trans, extent_iter, &r_p->k_i, 0);
err:
- if (!IS_ERR(reflink_iter)) {
+ if (!IS_ERR(reflink_iter))
c->reflink_hint = reflink_iter->pos.offset;
- bch2_trans_iter_put(trans, reflink_iter);
- }
+ bch2_trans_iter_put(trans, reflink_iter);
return ret;
}
u64 src_done, dst_done;
int ret = 0, ret2 = 0;
+ if (!c->opts.reflink)
+ return -EOPNOTSUPP;
+
if (!percpu_ref_tryget(&c->writes))
return -EROFS;
- if (!(c->sb.features & (1ULL << BCH_FEATURE_REFLINK))) {
- mutex_lock(&c->sb_lock);
- if (!(c->sb.features & (1ULL << BCH_FEATURE_REFLINK))) {
- c->disk_sb.sb->features[0] |=
- cpu_to_le64(1ULL << BCH_FEATURE_REFLINK);
-
- bch2_write_super(c);
- }
- mutex_unlock(&c->sb_lock);
- }
+ bch2_check_set_feature(c, BCH_FEATURE_reflink);
dst_end.offset += remap_sectors;
src_end.offset += remap_sectors;
BTREE_ITER_INTENT);
while (1) {
- bch2_trans_begin_updates(&trans);
+ bch2_trans_begin(&trans);
+
trans.mem_top = 0;
if (fatal_signal_pending(current)) {
break;
if (src_k.k->type == KEY_TYPE_extent) {
- bkey_on_stack_realloc(&new_src, c, src_k.k->u64s);
- bkey_reassemble(new_src.k, src_k);
+ bkey_on_stack_reassemble(&new_src, c, src_k);
src_k = bkey_i_to_s_c(new_src.k);
bch2_cut_front(src_iter->pos, new_src.k);
inode_u.bi_size < new_i_size) {
inode_u.bi_size = new_i_size;
ret2 = bch2_inode_write(&trans, inode_iter, &inode_u) ?:
- bch2_trans_commit(&trans, NULL, journal_seq,
- BTREE_INSERT_ATOMIC);
+ bch2_trans_commit(&trans, NULL, journal_seq, 0);
}
} while (ret2 == -EINTR);