linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] orangefs: bugfixes for 4.15
@ 2018-01-22 20:44 Martin Brandenburg
  2018-01-22 20:44 ` [PATCH 1/2] orangefs: use list_for_each_entry_safe in purge_waiting_ops Martin Brandenburg
  2018-01-22 20:44 ` [PATCH 2/2] orangefs: initialize op on loop restart in orangefs_devreq_read Martin Brandenburg
  0 siblings, 2 replies; 3+ messages in thread
From: Martin Brandenburg @ 2018-01-22 20:44 UTC (permalink / raw)
  To: torvalds, hubcap, linux-kernel, linux-fsdevel, devel; +Cc: Martin Brandenburg

Linus, I'd appreciate it if these can make it into 4.15 if possible.

Both fix concurrency bugs I've found within the last week.

Martin Brandenburg (2):
  orangefs: use list_for_each_entry_safe in purge_waiting_ops
  orangefs: initialize op on loop restart in orangefs_devreq_read

 fs/orangefs/devorangefs-req.c | 3 ++-
 fs/orangefs/waitqueue.c       | 4 ++--
 2 files changed, 4 insertions(+), 3 deletions(-)

-- 
2.15.1

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] orangefs: use list_for_each_entry_safe in purge_waiting_ops
  2018-01-22 20:44 [PATCH 0/2] orangefs: bugfixes for 4.15 Martin Brandenburg
@ 2018-01-22 20:44 ` Martin Brandenburg
  2018-01-22 20:44 ` [PATCH 2/2] orangefs: initialize op on loop restart in orangefs_devreq_read Martin Brandenburg
  1 sibling, 0 replies; 3+ messages in thread
From: Martin Brandenburg @ 2018-01-22 20:44 UTC (permalink / raw)
  To: torvalds, hubcap, linux-kernel, linux-fsdevel, devel
  Cc: Martin Brandenburg, stable

set_op_state_purged can delete the op.

Signed-off-by: Martin Brandenburg <martin@omnibond.com>
Cc: stable@vger.kernel.org
---
 fs/orangefs/waitqueue.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/orangefs/waitqueue.c b/fs/orangefs/waitqueue.c
index 835c6e148afc..0577d6dba8c8 100644
--- a/fs/orangefs/waitqueue.c
+++ b/fs/orangefs/waitqueue.c
@@ -29,10 +29,10 @@ static void orangefs_clean_up_interrupted_operation(struct orangefs_kernel_op_s
  */
 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),
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] orangefs: initialize op on loop restart in orangefs_devreq_read
  2018-01-22 20:44 [PATCH 0/2] orangefs: bugfixes for 4.15 Martin Brandenburg
  2018-01-22 20:44 ` [PATCH 1/2] orangefs: use list_for_each_entry_safe in purge_waiting_ops Martin Brandenburg
@ 2018-01-22 20:44 ` Martin Brandenburg
  1 sibling, 0 replies; 3+ messages in thread
From: Martin Brandenburg @ 2018-01-22 20:44 UTC (permalink / raw)
  To: torvalds, hubcap, linux-kernel, linux-fsdevel, devel
  Cc: Martin Brandenburg, stable

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>
Cc: stable@vger.kernel.org
---
 fs/orangefs/devorangefs-req.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/fs/orangefs/devorangefs-req.c b/fs/orangefs/devorangefs-req.c
index ded456f17de6..c584ad8d023c 100644
--- a/fs/orangefs/devorangefs-req.c
+++ b/fs/orangefs/devorangefs-req.c
@@ -162,7 +162,7 @@ static ssize_t orangefs_devreq_read(struct file *file,
 	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(struct file *file,
 		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) {
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-01-22 20:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-22 20:44 [PATCH 0/2] orangefs: bugfixes for 4.15 Martin Brandenburg
2018-01-22 20:44 ` [PATCH 1/2] orangefs: use list_for_each_entry_safe in purge_waiting_ops Martin Brandenburg
2018-01-22 20:44 ` [PATCH 2/2] orangefs: initialize op on loop restart in orangefs_devreq_read Martin Brandenburg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).