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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to