From: Amir Goldstein <amir73il@gmail.com>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: Dave Chinner <david@fromorbit.com>,
Christoph Hellwig <hch@lst.de>,
linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org,
"Darrick J . Wong" <darrick.wong@oracle.com>,
linux-fsdevel@vger.kernel.org,
Amir Goldstein <amir73il@gmail.com>
Subject: [PATCH v1] ovl: use copy_file_clone for copy up if possible
Date: Sun, 11 Sep 2016 13:50:21 +0300 [thread overview]
Message-ID: <1473591021-26915-1-git-send-email-amir73il@gmail.com> (raw)
When copying up within the same fs, try to use f_op->clone_file_range().
This becomes very efficient when lower and upper are on the same fs
with file reflink support.
Tested correct behavior when lower and upper are on:
1. same ext4 (copy)
2. same xfs + reflink patches + mkfs.xfs (copy)
3. same xfs + reflink patches + mkfs.xfs -m reflink=1 (clone)
4. different xfs + reflink patches + mkfs.xfs -m reflink=1 (copy)
Verified that all the overlay xfstests pass in the 'same fs'
setups.
For comparison, on my laptop, xfstest overlay/001 (copy up of large
sparse files) takes less than 1 second in the xfs reflink setup vs.
25 seconds on the rest of the setups.
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
Notes:
V1:
- Replace iteravite call to copy_file_range() with
a single atomic call to clone_file_range()
- Add a TODO comment to consider calling vfs_copy_file_range()
instead of do_splice_direct() (*)
(*) Changes suggested by Dave Chinner:
1. Move the cross-fs check from vfs_copy_file_range()
helper up to the copy_file_range syscall
2. Allow vfs_copy_file_range() to handle cross-fs copy
by falling back directly to do_splice_direct(),
without attempting copy_file_range()
3. Replace copy_up call to do_splice_direct()
with call to vfs_copy_file_range()
The benefits of these extra changes to real world use case
have not been demonstrated. In theory, these changes should benefit
a setup of lower and upper dirs both on the same nfs/cifs mount.
fs/overlayfs/copy_up.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
index 43fdc27..a3fd658 100644
--- a/fs/overlayfs/copy_up.c
+++ b/fs/overlayfs/copy_up.c
@@ -136,6 +136,21 @@ static int ovl_copy_up_data(struct path *old, struct path *new, loff_t len)
goto out_fput;
}
+ /*
+ * When copying up within the same fs, try to use clone_file_range
+ */
+ if (file_inode(old_file)->i_sb == file_inode(new_file)->i_sb &&
+ new_file->f_op->clone_file_range) {
+ error = new_file->f_op->clone_file_range(old_file, 0,
+ new_file, 0,
+ len);
+ /* on failure to clone entire len, fallback to splice loop */
+ if (error)
+ error = 0;
+ else
+ len = 0;
+ }
+
/* FIXME: copy up sparse files efficiently */
while (len) {
size_t this_len = OVL_COPY_UP_CHUNK_SIZE;
@@ -149,6 +164,7 @@ static int ovl_copy_up_data(struct path *old, struct path *new, loff_t len)
break;
}
+ /* TODO: consider calling vfs_copy_file_range() instead */
bytes = do_splice_direct(old_file, &old_pos,
new_file, &new_pos,
this_len, SPLICE_F_MOVE);
--
2.7.4
reply other threads:[~2016-09-11 10:51 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=1473591021-26915-1-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).