Message ID | 20181015154600.13251-5-lhenriques@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | copy_file_range in cephfs kernel client | expand |
On Mon, Oct 15, 2018 at 11:47 PM Luis Henriques <lhenriques@suse.com> 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@suse.com> > --- > 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
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
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@suse.com> --- 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(+)