[PATCH 3/3] ovl: Use splice_with_holes in copy_up

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

 



From: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx>

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx>
---
 fs/overlayfs/copy_up.c |  2 +-
 fs/read_write.c        | 10 ++++++----
 include/linux/fs.h     |  2 ++
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
index 8bede0742619..6634a85255ae 100644
--- a/fs/overlayfs/copy_up.c
+++ b/fs/overlayfs/copy_up.c
@@ -175,7 +175,7 @@ static int ovl_copy_up_data(struct path *old, struct path *new, loff_t len)
 			break;
 		}
 
-		bytes = do_splice_direct(old_file, &old_pos,
+		bytes = splice_with_holes(old_file, &old_pos,
 					 new_file, &new_pos,
 					 this_len, SPLICE_F_MOVE);
 		if (bytes <= 0) {
diff --git a/fs/read_write.c b/fs/read_write.c
index 6866e2a27594..0aa8390d4d39 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -1543,8 +1543,9 @@ COMPAT_SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd,
 #endif
 
 
-static ssize_t splice_with_holes(struct file *file_in, loff_t *pos_in,
-		struct file *file_out, loff_t *pos_out,	size_t len)
+ssize_t splice_with_holes(struct file *file_in, loff_t *pos_in,
+		struct file *file_out, loff_t *pos_out,	size_t len,
+		unsigned int flags)
 {
 	ssize_t ret = 0, total = 0;
 	loff_t size, end;
@@ -1556,7 +1557,7 @@ static ssize_t splice_with_holes(struct file *file_in, loff_t *pos_in,
 		size = end - *pos_in;
 splice:
 		ret = do_splice_direct(file_in, pos_in, file_out, pos_out,
-				size, 0);
+				size, flags);
 		if (ret < 0)
 			goto out;
 		total += ret;
@@ -1598,6 +1599,7 @@ static ssize_t splice_with_holes(struct file *file_in, loff_t *pos_in,
 out:
 	return total ? total : ret;
 }
+EXPORT_SYMBOL(splice_with_holes);
 
 /*
  * copy_file_range() differs from regular file read and write in that it
@@ -1663,7 +1665,7 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in,
 
 do_splice:
 	ret = splice_with_holes(file_in, &pos_in, file_out, &pos_out,
-			len > MAX_RW_COUNT ? MAX_RW_COUNT : len);
+			len > MAX_RW_COUNT ? MAX_RW_COUNT : len, 0);
 
 done:
 	if (ret > 0) {
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 760d8da1b6c7..8f96400ab944 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1799,6 +1799,8 @@ extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
 extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
 extern ssize_t vfs_readv(struct file *, const struct iovec __user *,
 		unsigned long, loff_t *, rwf_t);
+extern ssize_t splice_with_holes(struct file *, loff_t *, struct file *,
+				   loff_t *, size_t, unsigned int);
 extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *,
 				   loff_t, size_t, unsigned int);
 extern int vfs_clone_file_prep_inodes(struct inode *inode_in, loff_t pos_in,
-- 
2.16.3




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux