]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/reflink.c
Update bcachefs sources to 386f00b639 bcachefs: Snapshot creation, deletion
[bcachefs-tools-debian] / libbcachefs / reflink.c
index 576cfbccf5b537b2d000935d739476b278fe58b7..92ff609453b8349e3ce6a25277bcaeece461d388 100644 (file)
@@ -7,6 +7,7 @@
 #include "inode.h"
 #include "io.h"
 #include "reflink.h"
+#include "subvolume.h"
 
 #include <linux/sched/signal.h>
 
@@ -197,7 +198,8 @@ static struct bkey_s_c get_next_src(struct btree_iter *iter, struct bpos end)
 }
 
 s64 bch2_remap_range(struct bch_fs *c,
-                    struct bpos dst_start, struct bpos src_start,
+                    subvol_inum dst_inum, u64 dst_offset,
+                    subvol_inum src_inum, u64 src_offset,
                     u64 remap_sectors, u64 *journal_seq,
                     u64 new_i_size, s64 *i_sectors_delta)
 {
@@ -205,9 +207,12 @@ s64 bch2_remap_range(struct bch_fs *c,
        struct btree_iter dst_iter, src_iter;
        struct bkey_s_c src_k;
        struct bkey_buf new_dst, new_src;
+       struct bpos dst_start = POS(dst_inum.inum, dst_offset);
+       struct bpos src_start = POS(src_inum.inum, src_offset);
        struct bpos dst_end = dst_start, src_end = src_start;
        struct bpos src_want;
        u64 dst_done;
+       u32 dst_snapshot, src_snapshot;
        int ret = 0, ret2 = 0;
 
        if (!percpu_ref_tryget(&c->writes))
@@ -238,6 +243,20 @@ s64 bch2_remap_range(struct bch_fs *c,
                        break;
                }
 
+               ret = bch2_subvolume_get_snapshot(&trans, src_inum.subvol,
+                                                 &src_snapshot);
+               if (ret)
+                       continue;
+
+               bch2_btree_iter_set_snapshot(&src_iter, src_snapshot);
+
+               ret = bch2_subvolume_get_snapshot(&trans, dst_inum.subvol,
+                                                 &dst_snapshot);
+               if (ret)
+                       continue;
+
+               bch2_btree_iter_set_snapshot(&dst_iter, dst_snapshot);
+
                dst_done = dst_iter.pos.offset - dst_start.offset;
                src_want = POS(src_start.inode, src_start.offset + dst_done);
                bch2_btree_iter_set_pos(&src_iter, src_want);
@@ -248,11 +267,11 @@ s64 bch2_remap_range(struct bch_fs *c,
                        continue;
 
                if (bkey_cmp(src_want, src_iter.pos) < 0) {
-                       ret = bch2_fpunch_at(&trans, &dst_iter,
-                                       bpos_min(dst_end,
-                                                POS(dst_iter.pos.inode, dst_iter.pos.offset +
-                                                    src_iter.pos.offset - src_want.offset)),
-                                                journal_seq, i_sectors_delta);
+                       ret = bch2_fpunch_at(&trans, &dst_iter, dst_inum,
+                                       min(dst_end.offset,
+                                           dst_iter.pos.offset +
+                                           src_iter.pos.offset - src_want.offset),
+                                       journal_seq, i_sectors_delta);
                        continue;
                }
 
@@ -289,8 +308,9 @@ s64 bch2_remap_range(struct bch_fs *c,
                bch2_key_resize(&new_dst.k->k,
                                min(src_k.k->p.offset - src_want.offset,
                                    dst_end.offset - dst_iter.pos.offset));
-               ret = bch2_extent_update(&trans, &dst_iter, new_dst.k,
-                                        &disk_res, journal_seq,
+
+               ret = bch2_extent_update(&trans, dst_inum, &dst_iter,
+                                        new_dst.k, &disk_res, journal_seq,
                                         new_i_size, i_sectors_delta,
                                         true);
                bch2_disk_reservation_put(c, &disk_res);
@@ -311,7 +331,7 @@ s64 bch2_remap_range(struct bch_fs *c,
                bch2_trans_begin(&trans);
 
                ret2 = bch2_inode_peek(&trans, &inode_iter, &inode_u,
-                               dst_start.inode, BTREE_ITER_INTENT);
+                                      dst_inum, BTREE_ITER_INTENT);
 
                if (!ret2 &&
                    inode_u.bi_size < new_i_size) {