On Mon, Oct 15, 2018 at 11:47 PM Luis Henriques <lhenriques@xxxxxxxx> wrote: > > Add a new mount option 'nocopyfrom' that will prevent the usage of the > RADOS 'copy-from' operation in cephfs. This could be useful, for example, > for an administrator to temporarily mitigate any possible bugs in the > 'copy-from' implementation. > > Currently, only copy_file_range uses this RADOS operation. Setting this > mount option will result in this syscall reverting to the default VFS > implementation, i.e. to perform the copies locally instead of doing remote > object copies. > > Signed-off-by: Luis Henriques <lhenriques@xxxxxxxx> > --- > Documentation/filesystems/ceph.txt | 5 +++++ > fs/ceph/file.c | 3 +++ > fs/ceph/super.c | 13 +++++++++++++ > fs/ceph/super.h | 1 + > 4 files changed, 22 insertions(+) > > diff --git a/Documentation/filesystems/ceph.txt b/Documentation/filesystems/ceph.txt > index 8bf62240e10d..1177052701e1 100644 > --- a/Documentation/filesystems/ceph.txt > +++ b/Documentation/filesystems/ceph.txt > @@ -151,6 +151,11 @@ Mount Options > Report overall filesystem usage in statfs instead of using the root > directory quota. > > + nocopyfrom > + Don't use the RADOS 'copy-from' operation to perform remote object > + copies. Currently, it's only used in copy_file_range, which will revert > + to the default VFS implementation if this option is used. > + > More Information > ================ > > diff --git a/fs/ceph/file.c b/fs/ceph/file.c > index 0942f45995a1..4af12f5d679f 100644 > --- a/fs/ceph/file.c > +++ b/fs/ceph/file.c > @@ -1951,6 +1951,9 @@ static ssize_t ceph_copy_file_range(struct file *src_file, loff_t src_off, > * efficient). > */ > > + if (ceph_test_mount_opt(ceph_inode_to_client(src_inode), NOCOPYFROM)) > + return -EOPNOTSUPP; > + > if ((src_ci->i_layout.stripe_unit != dst_ci->i_layout.stripe_unit) || > (src_ci->i_layout.stripe_count != dst_ci->i_layout.stripe_count) || > (src_ci->i_layout.object_size != dst_ci->i_layout.object_size)) > diff --git a/fs/ceph/super.c b/fs/ceph/super.c > index eab1359d0553..b5ecd6f50360 100644 > --- a/fs/ceph/super.c > +++ b/fs/ceph/super.c > @@ -165,6 +165,8 @@ enum { > Opt_noacl, > Opt_quotadf, > Opt_noquotadf, > + Opt_copyfrom, > + Opt_nocopyfrom, > }; > > static match_table_t fsopt_tokens = { > @@ -203,6 +205,8 @@ static match_table_t fsopt_tokens = { > {Opt_noacl, "noacl"}, > {Opt_quotadf, "quotadf"}, > {Opt_noquotadf, "noquotadf"}, > + {Opt_copyfrom, "copyfrom"}, > + {Opt_nocopyfrom, "nocopyfrom"}, > {-1, NULL} > }; > > @@ -355,6 +359,12 @@ static int parse_fsopt_token(char *c, void *private) > case Opt_noquotadf: > fsopt->flags |= CEPH_MOUNT_OPT_NOQUOTADF; > break; > + case Opt_copyfrom: > + fsopt->flags &= ~CEPH_MOUNT_OPT_NOCOPYFROM; > + break; > + case Opt_nocopyfrom: > + fsopt->flags |= CEPH_MOUNT_OPT_NOCOPYFROM; > + break; > #ifdef CONFIG_CEPH_FS_POSIX_ACL > case Opt_acl: > fsopt->sb_flags |= SB_POSIXACL; > @@ -553,6 +563,9 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root) > seq_puts(m, ",noacl"); > #endif > > + if (fsopt->flags & CEPH_MOUNT_OPT_NOCOPYFROM) > + seq_puts(m, ",nocopyfrom"); > + > if (fsopt->mds_namespace) > seq_show_option(m, "mds_namespace", fsopt->mds_namespace); > if (fsopt->wsize != CEPH_MAX_WRITE_SIZE) > diff --git a/fs/ceph/super.h b/fs/ceph/super.h > index 91b13400badd..c005a5400f2e 100644 > --- a/fs/ceph/super.h > +++ b/fs/ceph/super.h > @@ -40,6 +40,7 @@ > #define CEPH_MOUNT_OPT_NOPOOLPERM (1<<11) /* no pool permission check */ > #define CEPH_MOUNT_OPT_MOUNTWAIT (1<<12) /* mount waits if no mds is up */ > #define CEPH_MOUNT_OPT_NOQUOTADF (1<<13) /* no root dir quota in statfs */ > +#define CEPH_MOUNT_OPT_NOCOPYFROM (1<<14) /* don't use RADOS 'copy-from' op */ > > #define CEPH_MOUNT_OPT_DEFAULT CEPH_MOUNT_OPT_DCACHE > Looks good to me Regards Yan, Zheng