summary refs log tree commit diff
path: root/kernel
diff options
context:
space:
mode:
authorTom Zanussi <zanussi@comcast.net>2008-12-09 13:14:10 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2008-12-10 08:01:52 -0800
commitfbb5b7ae4b442f1923513dc6165a66c7a7f29073 (patch)
treee49f1c838a58912a36d03e12d1dab44d2df439d6 /kernel
parent361371201b60ffd686a694c848c1d5ad6061725f (diff)
downloadlinux-fbb5b7ae4b442f1923513dc6165a66c7a7f29073.tar.gz
relayfs: fix infinite loop with splice()
Running kmemtraced, which uses splice() on relayfs, causes a hard lock on
x86-64 SMP.  As described by Tom Zanussi:

  It looks like you hit the same problem as described here:

  commit 8191ecd1d14c6914c660dfa007154860a7908857

      splice: fix infinite loop in generic_file_splice_read()

  relay uses the same loop but it never got noticed or fixed.

Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Tested-by: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/relay.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/kernel/relay.c b/kernel/relay.c
index 32b0befdcb6a..09ac2008f77b 100644
--- a/kernel/relay.c
+++ b/kernel/relay.c
@@ -1317,12 +1317,9 @@ static ssize_t relay_file_splice_read(struct file *in,
 		if (ret < 0)
 			break;
 		else if (!ret) {
-			if (spliced)
-				break;
-			if (flags & SPLICE_F_NONBLOCK) {
+			if (flags & SPLICE_F_NONBLOCK)
 				ret = -EAGAIN;
-				break;
-			}
+			break;
 		}
 
 		*ppos += ret;