From: Dave Chinner <david@fromorbit.com>
To: Peng Tao <tao.peng@primarydata.com>
Cc: linux-fsdevel@vger.kernel.org,
Trond Myklebust <trond.myklebust@primarydata.com>,
Anna Schumaker <anna.schumaker@netapp.com>,
Christoph Hellwig <hch@infradead.org>, Zach Brown <zab@zabbo.net>,
Darren Hart <dvhart@linux.intel.com>,
bfields@fieldses.org, Jeff Layton <jeff.layton@primarydata.com>,
linux-nfs@vger.kernel.org,
"Darrick J. Wong" <darrick.wong@oracle.com>,
linux-btrfs@vger.kernel.org
Subject: Re: [PATCH-RFC-RESEND 5/9] nfs42: add .copy_range file operation
Date: Thu, 27 Aug 2015 08:48:53 +1000 [thread overview]
Message-ID: <20150826224853.GW714@dastard> (raw)
In-Reply-To: <1440577010-122867-6-git-send-email-tao.peng@primarydata.com>
On Wed, Aug 26, 2015 at 04:16:46PM +0800, Peng Tao wrote:
> Signed-off-by: Peng Tao <tao.peng@primarydata.com>
> ---
> fs/nfs/nfs4file.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 50 insertions(+)
>
> diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c
> index dcd39d4..c335cb0 100644
> --- a/fs/nfs/nfs4file.c
> +++ b/fs/nfs/nfs4file.c
> @@ -4,6 +4,7 @@
> * Copyright (C) 1992 Rick Sladkey
> */
> #include <linux/fs.h>
> +#include <linux/file.h>
> #include <linux/falloc.h>
> #include <linux/nfs_fs.h>
> #include "internal.h"
> @@ -166,6 +167,54 @@ static long nfs42_fallocate(struct file *filep, int mode, loff_t offset, loff_t
> return nfs42_proc_deallocate(filep, offset, len);
> return nfs42_proc_allocate(filep, offset, len);
> }
> +
> +static noinline int
> +nfs42_file_clone_range(struct file *src_file, struct file *dst_file,
> + loff_t src_off, size_t dst_off, loff_t count)
> +{
> + struct inode *dst_inode = file_inode(dst_file);
> + struct inode *src_inode = file_inode(src_file);
> + int ret;
> +
> + /* src and dst must be different files */
> + if (src_inode == dst_inode)
> + return -EINVAL;
> +
> + /* XXX: do we lock at all? what if server needs CB_RECALL_LAYOUT? */
> + if (dst_inode < src_inode) {
> + mutex_lock_nested(&dst_inode->i_mutex, I_MUTEX_PARENT);
> + mutex_lock_nested(&src_inode->i_mutex, I_MUTEX_CHILD);
> + } else {
> + mutex_lock_nested(&src_inode->i_mutex, I_MUTEX_PARENT);
> + mutex_lock_nested(&dst_inode->i_mutex, I_MUTEX_CHILD);
> + }
Is that safe? Between two operations, the inode code be reclaimed
and re-instantiated, resulting in the second operation having a
different locking order for the same files compared to the
first operation...
> +out_unlock:
> + if (dst_inode < src_inode) {
> + mutex_unlock(&src_inode->i_mutex);
> + mutex_unlock(&dst_inode->i_mutex);
> + } else {
> + mutex_unlock(&dst_inode->i_mutex);
> + mutex_unlock(&src_inode->i_mutex);
> + }
You don't have to care about lock order on unlock.
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
WARNING: multiple messages have this Message-ID (diff)
From: Dave Chinner <david-FqsqvQoI3Ljby3iVrkZq2A@public.gmane.org>
To: Peng Tao <tao.peng-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>
Cc: linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Trond Myklebust
<trond.myklebust-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>,
Anna Schumaker
<anna.schumaker-HgOvQuBEEgTQT0dZR+AlfA@public.gmane.org>,
Christoph Hellwig <hch-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
Zach Brown <zab-ugsP4Wv/S6ZeoWH0uzbU5w@public.gmane.org>,
Darren Hart <dvhart-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>,
bfields-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org,
Jeff Layton <jeff.layton-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>,
linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
"Darrick J. Wong"
<darrick.wong-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>,
linux-btrfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH-RFC-RESEND 5/9] nfs42: add .copy_range file operation
Date: Thu, 27 Aug 2015 08:48:53 +1000 [thread overview]
Message-ID: <20150826224853.GW714@dastard> (raw)
In-Reply-To: <1440577010-122867-6-git-send-email-tao.peng-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>
On Wed, Aug 26, 2015 at 04:16:46PM +0800, Peng Tao wrote:
> Signed-off-by: Peng Tao <tao.peng-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>
> ---
> fs/nfs/nfs4file.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 50 insertions(+)
>
> diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c
> index dcd39d4..c335cb0 100644
> --- a/fs/nfs/nfs4file.c
> +++ b/fs/nfs/nfs4file.c
> @@ -4,6 +4,7 @@
> * Copyright (C) 1992 Rick Sladkey
> */
> #include <linux/fs.h>
> +#include <linux/file.h>
> #include <linux/falloc.h>
> #include <linux/nfs_fs.h>
> #include "internal.h"
> @@ -166,6 +167,54 @@ static long nfs42_fallocate(struct file *filep, int mode, loff_t offset, loff_t
> return nfs42_proc_deallocate(filep, offset, len);
> return nfs42_proc_allocate(filep, offset, len);
> }
> +
> +static noinline int
> +nfs42_file_clone_range(struct file *src_file, struct file *dst_file,
> + loff_t src_off, size_t dst_off, loff_t count)
> +{
> + struct inode *dst_inode = file_inode(dst_file);
> + struct inode *src_inode = file_inode(src_file);
> + int ret;
> +
> + /* src and dst must be different files */
> + if (src_inode == dst_inode)
> + return -EINVAL;
> +
> + /* XXX: do we lock at all? what if server needs CB_RECALL_LAYOUT? */
> + if (dst_inode < src_inode) {
> + mutex_lock_nested(&dst_inode->i_mutex, I_MUTEX_PARENT);
> + mutex_lock_nested(&src_inode->i_mutex, I_MUTEX_CHILD);
> + } else {
> + mutex_lock_nested(&src_inode->i_mutex, I_MUTEX_PARENT);
> + mutex_lock_nested(&dst_inode->i_mutex, I_MUTEX_CHILD);
> + }
Is that safe? Between two operations, the inode code be reclaimed
and re-instantiated, resulting in the second operation having a
different locking order for the same files compared to the
first operation...
> +out_unlock:
> + if (dst_inode < src_inode) {
> + mutex_unlock(&src_inode->i_mutex);
> + mutex_unlock(&dst_inode->i_mutex);
> + } else {
> + mutex_unlock(&dst_inode->i_mutex);
> + mutex_unlock(&src_inode->i_mutex);
> + }
You don't have to care about lock order on unlock.
Cheers,
Dave.
--
Dave Chinner
david-FqsqvQoI3Ljby3iVrkZq2A@public.gmane.org
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2015-08-26 22:49 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-26 8:16 [PATCH-RFC-RESEND 0/9] NFS/NFSD: add NFSv42 CLONE operation support Peng Tao
2015-08-26 8:16 ` [PATCH-RFC-RESEND 1/9] vfs: pull btrfs clone API to vfs layer Peng Tao
2015-08-26 13:37 ` David Sterba
2015-08-26 13:37 ` David Sterba
2015-08-26 16:21 ` Darrick J. Wong
2015-08-26 16:36 ` David Sterba
2015-08-26 16:36 ` David Sterba
2015-08-28 3:09 ` Peng Tao
2015-08-28 3:09 ` Peng Tao
2015-08-26 22:52 ` Dave Chinner
2015-08-26 22:52 ` Dave Chinner
2015-08-27 6:23 ` Peng Tao
2015-08-27 6:23 ` Peng Tao
2015-08-26 8:16 ` [PATCH-RFC-RESEND 2/9] vfs/btrfs: add .clone_range file operation Peng Tao
2015-08-26 13:17 ` Christoph Hellwig
2015-08-27 6:15 ` Peng Tao
2015-08-26 8:16 ` [PATCH-RFC-RESEND 3/9] nfs42: add CLONE xdr functions Peng Tao
2015-08-26 8:16 ` [PATCH-RFC-RESEND 4/9] nfs42: add CLONE proc functions Peng Tao
2015-08-26 8:16 ` [PATCH-RFC-RESEND 5/9] nfs42: add .copy_range file operation Peng Tao
2015-08-26 22:48 ` Dave Chinner [this message]
2015-08-26 22:48 ` Dave Chinner
2015-08-27 6:17 ` Peng Tao
2015-08-27 6:17 ` Peng Tao
2015-08-26 8:16 ` [PATCH-RFC-RESEND 6/9] nfs: get clone_blksize when probing fsinfo Peng Tao
2015-08-26 8:16 ` [PATCH-RFC-RESEND 7/9] nfs42: respect clone_blksize Peng Tao
2015-08-26 8:16 ` [PATCH-RFC-RESEND 8/9] nfsd: Pass filehandle to nfs4_preprocess_stateid_op() Peng Tao
2015-08-26 8:16 ` [PATCH-RFC-RESEND 9/9] NFSD: Implement the CLONE call Peng Tao
2015-08-26 8:16 ` Peng Tao
2015-08-26 13:11 ` [PATCH-RFC-RESEND 0/9] NFS/NFSD: add NFSv42 CLONE operation support Christoph Hellwig
2015-08-26 13:11 ` Christoph Hellwig
2015-08-27 6:24 ` Peng Tao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150826224853.GW714@dastard \
--to=david@fromorbit.com \
--cc=anna.schumaker@netapp.com \
--cc=bfields@fieldses.org \
--cc=darrick.wong@oracle.com \
--cc=dvhart@linux.intel.com \
--cc=hch@infradead.org \
--cc=jeff.layton@primarydata.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=tao.peng@primarydata.com \
--cc=trond.myklebust@primarydata.com \
--cc=zab@zabbo.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.