orangefs: initialize op on loop restart in orangefs_devreq_read

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
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Martin Brandenburg and committed by Linus Torvalds a0ec1ded 0afc0dec

Changed files
+2 -1
fs
+2 -1
fs/orangefs/devorangefs-req.c
··· 162 162 struct orangefs_kernel_op_s *op, *temp; 163 163 __s32 proto_ver = ORANGEFS_KERNEL_PROTO_VERSION; 164 164 static __s32 magic = ORANGEFS_DEVREQ_MAGIC; 165 - struct orangefs_kernel_op_s *cur_op = NULL; 165 + struct orangefs_kernel_op_s *cur_op; 166 166 unsigned long ret; 167 167 168 168 /* We do not support blocking IO. */ ··· 186 186 return -EAGAIN; 187 187 188 188 restart: 189 + cur_op = NULL; 189 190 /* Get next op (if any) from top of list. */ 190 191 spin_lock(&orangefs_request_list_lock); 191 192 list_for_each_entry_safe(op, temp, &orangefs_request_list, list) {