summarylogtreecommitdiffstats
path: root/0003-Linux-4.4-Do-not-use-splice.patch
blob: 4eef0bcc2a0ae225b5b335bb20c2bcc9f933516c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
From c664b14959c366ff5fb36ce9b7934df61f44828d Mon Sep 17 00:00:00 2001
From: Stephan Wiesand <stephan.wiesand@desy.de>
Date: Tue, 8 Mar 2016 14:15:17 +0100
Subject: [PATCH 3/3] Linux 4.4: Do not use splice()

splice() may return -ERESTARTSYS if there are pending signals, and
it's not even clear how this should be dealt with. This potential
problem has been present for a long time, but as of Linux 4.4
(commit c725bfce7968009756ed2836a8cd7ba4dc163011) seems much more
likely to happen.

Until resources are available to fix the code to handle such errors,
avoid the riskier uses of splice().

If there is a default implementation of file_splice_{write,read},
use that; on somewhat older kernels where it is not available,
use the generic version instead.

[kaduk@mit.edu: add test for default_file_splice_write]

Reviewed-on: https://gerrit.openafs.org/12217
Reviewed-by: Chas Williams <3chas3@gmail.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
(cherry picked from commit ae5f411c3b374367ab8ae69488f78f8e0484ce48)

Change-Id: I40dd0d60caece6379a62674defb8d46a2bfadad6
---
 acinclude.m4                   | 3 +++
 src/afs/LINUX/osi_fetchstore.c | 6 ++++--
 src/afs/LINUX/osi_vnodeops.c   | 2 +-
 src/afs/afs_fetchstore.c       | 2 +-
 4 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/acinclude.m4 b/acinclude.m4
index afad50b..09ae278 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -1010,6 +1010,9 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
 		 AC_CHECK_LINUX_FUNC([splice_direct_to_actor],
 				     [#include <linux/splice.h>],
 				     [splice_direct_to_actor(NULL,NULL,NULL);])
+		 AC_CHECK_LINUX_FUNC([default_file_splice_read],
+				     [#include <linux/fs.h>],
+				     [default_file_splice_read(NULL,NULL,NULL, 0, 0);])
 		 AC_CHECK_LINUX_FUNC([svc_addr_in],
 				     [#include <linux/sunrpc/svc.h>],
 				     [svc_addr_in(NULL);])
diff --git a/src/afs/LINUX/osi_fetchstore.c b/src/afs/LINUX/osi_fetchstore.c
index 4089bbb..997c1aa 100644
--- a/src/afs/LINUX/osi_fetchstore.c
+++ b/src/afs/LINUX/osi_fetchstore.c
@@ -38,7 +38,7 @@
 #include "afs/param.h"
 
 #include <linux/fs.h>
-#if defined(HAVE_LINUX_SPLICE_DIRECT_TO_ACTOR)
+#if 0 && defined(HAVE_LINUX_SPLICE_DIRECT_TO_ACTOR)
 # include <linux/splice.h>
 #else
 # include <linux/pipe_fs_i.h>
@@ -47,7 +47,7 @@
 #include "afs/sysincludes.h"
 #include "afsincludes.h"
 
-#if defined(HAVE_LINUX_SPLICE_DIRECT_TO_ACTOR)
+#if 0 && defined(HAVE_LINUX_SPLICE_DIRECT_TO_ACTOR)
 static int
 afs_linux_splice_actor(struct pipe_inode_info *pipe,
 		       struct pipe_buffer *buf,
@@ -151,6 +151,7 @@ afs_linux_read_actor(read_descriptor_t *desc, struct page *page,
     return size;
 }
 
+#if 0
 afs_int32
 afs_linux_storeproc(struct storeOps *ops, void *rock, struct dcache *tdc,
                     int *shouldwake, afs_size_t *bytesXferred)
@@ -184,5 +185,6 @@ afs_linux_storeproc(struct storeOps *ops, void *rock, struct dcache *tdc,
 
     return code;
 }
+#endif
 
 #endif
diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
index ae0513c..2a83fc0 100644
--- a/src/afs/LINUX/osi_vnodeops.c
+++ b/src/afs/LINUX/osi_vnodeops.c
@@ -834,7 +834,7 @@ struct file_operations afs_file_fops = {
 #if defined(STRUCT_FILE_OPERATIONS_HAS_SENDFILE)
   .sendfile =   generic_file_sendfile,
 #endif
-#if defined(STRUCT_FILE_OPERATIONS_HAS_SPLICE)
+#if defined(STRUCT_FILE_OPERATIONS_HAS_SPLICE) && !defined(HAVE_LINUX_DEFAULT_FILE_SPLICE_READ)
 # if defined(HAVE_LINUX_ITER_FILE_SPLICE_WRITE)
   .splice_write = iter_file_splice_write,
 # else
diff --git a/src/afs/afs_fetchstore.c b/src/afs/afs_fetchstore.c
index 38b064c..98544fe 100644
--- a/src/afs/afs_fetchstore.c
+++ b/src/afs/afs_fetchstore.c
@@ -329,7 +329,7 @@ struct storeOps rxfs_storeUfsOps = {
     .padd =	rxfs_storePadd,
     .close =	rxfs_storeClose,
     .destroy =	rxfs_storeDestroy,
-#ifdef AFS_LINUX26_ENV
+#if 0 && defined(AFS_LINUX26_ENV)
     .storeproc = afs_linux_storeproc
 #else
     .storeproc = afs_GenericStoreProc
-- 
2.7.4