summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/bcachefs/bcachefs_format.h2
-rw-r--r--fs/bcachefs/fs-io.c3
-rw-r--r--fs/bcachefs/opts.h5
-rw-r--r--fs/bcachefs/reflink.c3
4 files changed, 13 insertions, 0 deletions
diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h
index f0f8964a98b1..14eca567a10d 100644
--- a/fs/bcachefs/bcachefs_format.h
+++ b/fs/bcachefs/bcachefs_format.h
@@ -1266,6 +1266,8 @@ LE64_BITMASK(BCH_SB_PRJQUOTA, struct bch_sb, flags[0], 59, 60);
LE64_BITMASK(BCH_SB_HAS_ERRORS, struct bch_sb, flags[0], 60, 61);
+LE64_BITMASK(BCH_SB_REFLINK, struct bch_sb, flags[0], 61, 62);
+
/* 61-64 unused */
LE64_BITMASK(BCH_SB_STR_HASH_TYPE, struct bch_sb, flags[1], 0, 4);
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c
index 7ce6d71aca29..98fe1ec7867d 100644
--- a/fs/bcachefs/fs-io.c
+++ b/fs/bcachefs/fs-io.c
@@ -2812,6 +2812,9 @@ loff_t bch2_remap_file_range(struct file *file_src, loff_t pos_src,
u64 aligned_len;
loff_t ret = 0;
+ if (!c->opts.reflink)
+ return -EOPNOTSUPP;
+
if (remap_flags & ~(REMAP_FILE_DEDUP|REMAP_FILE_ADVISORY))
return -EINVAL;
diff --git a/fs/bcachefs/opts.h b/fs/bcachefs/opts.h
index 1e579f67346a..fe457117bf89 100644
--- a/fs/bcachefs/opts.h
+++ b/fs/bcachefs/opts.h
@@ -207,6 +207,11 @@ enum opt_type {
OPT_BOOL(), \
BCH_SB_PRJQUOTA, false, \
NULL, "Enable project quotas") \
+ x(reflink, u8, \
+ OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
+ OPT_BOOL(), \
+ BCH_SB_REFLINK, true, \
+ NULL, "Enable reflink support") \
x(degraded, u8, \
OPT_MOUNT, \
OPT_BOOL(), \
diff --git a/fs/bcachefs/reflink.c b/fs/bcachefs/reflink.c
index 2f223be74926..3c473f1380a6 100644
--- a/fs/bcachefs/reflink.c
+++ b/fs/bcachefs/reflink.c
@@ -167,6 +167,9 @@ s64 bch2_remap_range(struct bch_fs *c,
u64 src_done, dst_done;
int ret = 0, ret2 = 0;
+ if (!c->opts.reflink)
+ return -EOPNOTSUPP;
+
if (!percpu_ref_tryget(&c->writes))
return -EROFS;