Skip to content

Commit a0ec1de

Browse files
Martin Brandenburgtorvalds
authored andcommitted
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 <[email protected]> Cc: [email protected] Signed-off-by: Linus Torvalds <[email protected]>
1 parent 0afc0de commit a0ec1de

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

fs/orangefs/devorangefs-req.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ static ssize_t orangefs_devreq_read(struct file *file,
162162
struct orangefs_kernel_op_s *op, *temp;
163163
__s32 proto_ver = ORANGEFS_KERNEL_PROTO_VERSION;
164164
static __s32 magic = ORANGEFS_DEVREQ_MAGIC;
165-
struct orangefs_kernel_op_s *cur_op = NULL;
165+
struct orangefs_kernel_op_s *cur_op;
166166
unsigned long ret;
167167

168168
/* We do not support blocking IO. */
@@ -186,6 +186,7 @@ static ssize_t orangefs_devreq_read(struct file *file,
186186
return -EAGAIN;
187187

188188
restart:
189+
cur_op = NULL;
189190
/* Get next op (if any) from top of list. */
190191
spin_lock(&orangefs_request_list_lock);
191192
list_for_each_entry_safe(op, temp, &orangefs_request_list, list) {

0 commit comments

Comments
 (0)