--- /dev/null
+From a0ec1ded22e6a6bc41981fae22406835b006a66e Mon Sep 17 00:00:00 2001
+From: Martin Brandenburg <martin@omnibond.com>
+Date: Mon, 22 Jan 2018 15:44:52 -0500
+Subject: orangefs: initialize op on loop restart in orangefs_devreq_read
+
+From: Martin Brandenburg <martin@omnibond.com>
+
+commit a0ec1ded22e6a6bc41981fae22406835b006a66e upstream.
+
+In orangefs_devreq_read, there is a loop which picks an op off the list
+of pending ops. If the loop fails to find an op, there is nothing to
+read, and it returns EAGAIN. If the op has been given up on, the loop
+is restarted via a goto. The bug is that the variable which the found
+op is written to is not reinitialized, so if there are no more eligible
+ops on the list, the code runs again on the already handled op.
+
+This is triggered by interrupting a process while the op is being copied
+to the client-core. It's a fairly small window, but it's there.
+
+Signed-off-by: Martin Brandenburg <martin@omnibond.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/orangefs/devorangefs-req.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/fs/orangefs/devorangefs-req.c
++++ b/fs/orangefs/devorangefs-req.c
+@@ -162,7 +162,7 @@ static ssize_t orangefs_devreq_read(stru
+ struct orangefs_kernel_op_s *op, *temp;
+ __s32 proto_ver = ORANGEFS_KERNEL_PROTO_VERSION;
+ static __s32 magic = ORANGEFS_DEVREQ_MAGIC;
+- struct orangefs_kernel_op_s *cur_op = NULL;
++ struct orangefs_kernel_op_s *cur_op;
+ unsigned long ret;
+
+ /* We do not support blocking IO. */
+@@ -186,6 +186,7 @@ static ssize_t orangefs_devreq_read(stru
+ return -EAGAIN;
+
+ restart:
++ cur_op = NULL;
+ /* Get next op (if any) from top of list. */
+ spin_lock(&orangefs_request_list_lock);
+ list_for_each_entry_safe(op, temp, &orangefs_request_list, list) {
--- /dev/null
+From 0afc0decf247f65b7aba666a76a0a68adf4bc435 Mon Sep 17 00:00:00 2001
+From: Martin Brandenburg <martin@omnibond.com>
+Date: Mon, 22 Jan 2018 15:44:51 -0500
+Subject: orangefs: use list_for_each_entry_safe in purge_waiting_ops
+
+From: Martin Brandenburg <martin@omnibond.com>
+
+commit 0afc0decf247f65b7aba666a76a0a68adf4bc435 upstream.
+
+set_op_state_purged can delete the op.
+
+Signed-off-by: Martin Brandenburg <martin@omnibond.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/orangefs/waitqueue.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/fs/orangefs/waitqueue.c
++++ b/fs/orangefs/waitqueue.c
+@@ -29,10 +29,10 @@ static void orangefs_clean_up_interrupte
+ */
+ void purge_waiting_ops(void)
+ {
+- struct orangefs_kernel_op_s *op;
++ struct orangefs_kernel_op_s *op, *tmp;
+
+ spin_lock(&orangefs_request_list_lock);
+- list_for_each_entry(op, &orangefs_request_list, list) {
++ list_for_each_entry_safe(op, tmp, &orangefs_request_list, list) {
+ gossip_debug(GOSSIP_WAIT_DEBUG,
+ "pvfs2-client-core: purging op tag %llu %s\n",
+ llu(op->tag),