Re: [PATCH v7 4/4] ceph: new mount option to disable usage of RADOS 'copy-from' op

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux