All of lore.kernel.org
 help / color / mirror / Atom feed
From: Amir Goldstein <amir73il@gmail.com>
To: Miklos Szeredi <miklos@szeredi.hu>,
	Dave Chinner <david@fromorbit.com>,
	linux-unionfs@vger.kernel.org
Cc: Christoph Hellwig <hch@lst.de>,
	linux-xfs@vger.kernel.org,
	"Darrick J . Wong" <darrick.wong@oracle.com>,
	linux-fsdevel@vger.kernel.org
Subject: [PATCH v3 3/4] vfs: allow vfs_copy_file_range() across file systems
Date: Wed, 14 Sep 2016 15:43:13 +0300	[thread overview]
Message-ID: <1473856994-27463-4-git-send-email-amir73il@gmail.com> (raw)
In-Reply-To: <1473856994-27463-1-git-send-email-amir73il@gmail.com>

copy_file_range syscall returns -EXDEV if src and dest
file are not on the same file system.
The vfs_copy_file_range() helper, however, knows how to copy
across file systems with do_splice_direct().

Move the enforcement of same file system from the vfs helper
to the syscall code.

A following patch is going to use the vfs_copy_file_range()
helper in overlayfs to copy up between lower and upper
not on the same file system.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 fs/read_write.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/fs/read_write.c b/fs/read_write.c
index 9dc6e52..6975fe8 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -1502,10 +1502,6 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in,
 	    (file_out->f_flags & O_APPEND))
 		return -EBADF;
 
-	/* this could be relaxed once a method supports cross-fs copies */
-	if (inode_in->i_sb != inode_out->i_sb)
-		return -EXDEV;
-
 	if (len == 0)
 		return 0;
 
@@ -1514,7 +1510,9 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in,
 		return ret;
 
 	ret = -EOPNOTSUPP;
-	if (file_out->f_op->copy_file_range)
+	/* copy_file_range() method does not support cross-fs copies */
+	if (inode_in->i_sb == inode_out->i_sb &&
+	    file_out->f_op->copy_file_range)
 		ret = file_out->f_op->copy_file_range(file_in, pos_in, file_out,
 						      pos_out, len, flags);
 	if (ret == -EOPNOTSUPP)
@@ -1569,6 +1567,14 @@ SYSCALL_DEFINE6(copy_file_range, int, fd_in, loff_t __user *, off_in,
 		pos_out = f_out.file->f_pos;
 	}
 
+	/*
+	 * vfs_copy_file_range() can do cross-fs copy, but we want to
+	 * fulfill the guaranty to userland that copy_file_range syscall
+	 * does not allow cross-fs copy
+	 */
+	if (file_inode(f_in.file)->i_sb != file_inode(f_out.file)->i_sb)
+		return -EXDEV;
+
 	ret = vfs_copy_file_range(f_in.file, pos_in, f_out.file, pos_out, len,
 				  flags);
 	if (ret > 0) {
-- 
2.7.4

  parent reply	other threads:[~2016-09-14 12:43 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-14 12:43 [PATCH v3 0/4] ovl: efficient copy up by reflink Amir Goldstein
2016-09-14 12:43 ` [PATCH v3 1/4] vfs: allow vfs_clone_file_range() across mount points Amir Goldstein
2016-09-14 12:43 ` [PATCH v3 2/4] ovl: use vfs_clone_file_range() for copy up if possible Amir Goldstein
2016-09-21 15:09   ` Miklos Szeredi
2016-09-21 17:01     ` Amir Goldstein
2016-09-21 18:29       ` Miklos Szeredi
2016-09-29  9:00         ` Amir Goldstein
2016-09-30 11:14           ` Miklos Szeredi
2016-09-21 21:48       ` Dave Chinner
2016-09-21 21:57         ` Al Viro
2016-09-21 22:33           ` Dave Chinner
2016-09-22  2:25             ` Darrick J. Wong
2016-09-22  2:52               ` Amir Goldstein
2016-09-14 12:43 ` Amir Goldstein [this message]
2016-09-23  7:57   ` [PATCH v3 3/4] vfs: allow vfs_copy_file_range() across file systems Amir Goldstein
2016-09-23 15:19     ` Darrick J. Wong
2016-09-23 16:13     ` Darrick J. Wong
2016-09-23 18:52       ` Amir Goldstein
2016-09-24 15:06         ` Darrick J. Wong
2016-09-26 16:33         ` Darrick J. Wong
2016-09-26 18:12           ` Amir Goldstein
2016-09-26 18:16             ` Darrick J. Wong
2016-09-14 12:43 ` [PATCH v3 4/4] ovl: use vfs_copy_file_range() to copy up file data Amir Goldstein
2016-09-22  8:49   ` Amir Goldstein
2016-09-22 14:49     ` Miklos Szeredi
2016-09-22 15:44       ` Amir Goldstein
2016-09-22 17:21         ` Amir Goldstein
2016-09-19 18:55 ` [PATCH v3 0/4] ovl: efficient copy up by reflink Amir Goldstein

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=1473856994-27463-4-git-send-email-amir73il@gmail.com \
    --to=amir73il@gmail.com \
    --cc=darrick.wong@oracle.com \
    --cc=david@fromorbit.com \
    --cc=hch@lst.de \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-unionfs@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    /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.