Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 30 Dec 2019 18:11:07 +0000 (UTC)
From:      Pawel Biernacki <kaktus@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r356206 - in head/sys: amd64/linux amd64/linux32 arm64/linux compat/linux i386/linux
Message-ID:  <201912301811.xBUIB7iV063402@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kaktus
Date: Mon Dec 30 18:11:06 2019
New Revision: 356206
URL: https://svnweb.freebsd.org/changeset/base/356206

Log:
  linux(4): implement copy_file_range(2)
  
  copy_file_range(2) is implemented natively since r350315, make it available
  for Linux binaries too.
  
  Reviewed by:	kib (mentor), trasz (previous version)
  Approved by:	kib (mentor)
  Differential Revision:	https://reviews.freebsd.org/D22959

Modified:
  head/sys/amd64/linux/linux_dummy.c
  head/sys/amd64/linux32/linux32_dummy.c
  head/sys/arm64/linux/linux_dummy.c
  head/sys/compat/linux/linux_file.c
  head/sys/i386/linux/linux_dummy.c

Modified: head/sys/amd64/linux/linux_dummy.c
==============================================================================
--- head/sys/amd64/linux/linux_dummy.c	Mon Dec 30 17:18:50 2019	(r356205)
+++ head/sys/amd64/linux/linux_dummy.c	Mon Dec 30 18:11:06 2019	(r356206)
@@ -144,8 +144,6 @@ DUMMY(userfaultfd);
 DUMMY(membarrier);
 /* Linux 4.4: */
 DUMMY(mlock2);
-/* Linux 4.5: */
-DUMMY(copy_file_range);
 /* Linux 4.6: */
 DUMMY(preadv2);
 DUMMY(pwritev2);

Modified: head/sys/amd64/linux32/linux32_dummy.c
==============================================================================
--- head/sys/amd64/linux32/linux32_dummy.c	Mon Dec 30 17:18:50 2019	(r356205)
+++ head/sys/amd64/linux32/linux32_dummy.c	Mon Dec 30 18:11:06 2019	(r356206)
@@ -148,8 +148,6 @@ DUMMY(userfaultfd);
 DUMMY(membarrier);
 /* Linux 4.4: */
 DUMMY(mlock2);
-/* Linux 4.5: */
-DUMMY(copy_file_range);
 /* Linux 4.6: */
 DUMMY(preadv2);
 DUMMY(pwritev2);

Modified: head/sys/arm64/linux/linux_dummy.c
==============================================================================
--- head/sys/arm64/linux/linux_dummy.c	Mon Dec 30 17:18:50 2019	(r356205)
+++ head/sys/arm64/linux/linux_dummy.c	Mon Dec 30 18:11:06 2019	(r356206)
@@ -142,8 +142,6 @@ DUMMY(userfaultfd);
 DUMMY(membarrier);
 /* Linux 4.4: */
 DUMMY(mlock2);
-/* Linux 4.5: */
-DUMMY(copy_file_range);
 /* Linux 4.6: */
 DUMMY(preadv2);
 DUMMY(pwritev2);

Modified: head/sys/compat/linux/linux_file.c
==============================================================================
--- head/sys/compat/linux/linux_file.c	Mon Dec 30 17:18:50 2019	(r356205)
+++ head/sys/compat/linux/linux_file.c	Mon Dec 30 18:11:06 2019	(r356206)
@@ -1565,3 +1565,44 @@ linux_fallocate(struct thread *td, struct linux_falloc
 	return (kern_posix_fallocate(td, args->fd, args->offset,
 	    args->len));
 }
+
+int
+linux_copy_file_range(struct thread *td, struct linux_copy_file_range_args
+    *args)
+{
+	l_loff_t inoff, outoff, *inoffp, *outoffp;
+	int error, flags;
+
+	/*
+	 * copy_file_range(2) on Linux doesn't define any flags (yet), so is
+	 * the native implementation.  Enforce it.
+	 */
+	if (args->flags != 0) {
+		linux_msg(td, "copy_file_range unsupported flags 0x%x",
+		    args->flags);
+		return (EINVAL);
+	}
+	flags = 0;
+	inoffp = outoffp = NULL;
+	if (args->off_in != NULL) {
+		error = copyin(args->off_in, &inoff, sizeof(l_loff_t));
+		if (error != 0)
+			return (error);
+		inoffp = &inoff;
+	}
+	if (args->off_out != NULL) {
+		error = copyin(args->off_out, &outoff, sizeof(l_loff_t));
+		if (error != 0)
+			return (error);
+		outoffp = &outoff;
+	}
+
+	error = kern_copy_file_range(td, args->fd_in, inoffp, args->fd_out,
+	    outoffp, args->len, flags);
+	if (error == 0 && args->off_in != NULL)
+		error = copyout(inoffp, args->off_in, sizeof(l_loff_t));
+	if (error == 0 && args->off_out != NULL)
+		error = copyout(outoffp, args->off_out, sizeof(l_loff_t));
+	return (error);
+}
+

Modified: head/sys/i386/linux/linux_dummy.c
==============================================================================
--- head/sys/i386/linux/linux_dummy.c	Mon Dec 30 17:18:50 2019	(r356205)
+++ head/sys/i386/linux/linux_dummy.c	Mon Dec 30 18:11:06 2019	(r356206)
@@ -144,8 +144,6 @@ DUMMY(userfaultfd);
 DUMMY(membarrier);
 /* Linux 4.4: */
 DUMMY(mlock2);
-/* Linux 4.5: */
-DUMMY(copy_file_range);
 /* Linux 4.6: */
 DUMMY(preadv2);
 DUMMY(pwritev2);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201912301811.xBUIB7iV063402>