]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Jan 2018 09:11:46 +0000 (10:11 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Jan 2018 09:11:46 +0000 (10:11 +0100)
added patches:
orangefs-initialize-op-on-loop-restart-in-orangefs_devreq_read.patch
orangefs-use-list_for_each_entry_safe-in-purge_waiting_ops.patch

queue-4.14/orangefs-initialize-op-on-loop-restart-in-orangefs_devreq_read.patch [new file with mode: 0644]
queue-4.14/orangefs-use-list_for_each_entry_safe-in-purge_waiting_ops.patch [new file with mode: 0644]
queue-4.14/series

diff --git a/queue-4.14/orangefs-initialize-op-on-loop-restart-in-orangefs_devreq_read.patch b/queue-4.14/orangefs-initialize-op-on-loop-restart-in-orangefs_devreq_read.patch
new file mode 100644 (file)
index 0000000..a1076b9
--- /dev/null
@@ -0,0 +1,46 @@
+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) {
diff --git a/queue-4.14/orangefs-use-list_for_each_entry_safe-in-purge_waiting_ops.patch b/queue-4.14/orangefs-use-list_for_each_entry_safe-in-purge_waiting_ops.patch
new file mode 100644 (file)
index 0000000..0f729d3
--- /dev/null
@@ -0,0 +1,34 @@
+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),
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..57100f12fec722c3ce129888a83e86c6f27d4fa4 100644 (file)
@@ -0,0 +1,2 @@
+orangefs-use-list_for_each_entry_safe-in-purge_waiting_ops.patch
+orangefs-initialize-op-on-loop-restart-in-orangefs_devreq_read.patch