mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 15:49:42 -04:00
staging/lustre: Only set INTERRUPTIBLE state before calling schedule
In __l_wait_event the condition could be a complicated function that does allocations and other potentialy blocking activities, so it sohuld not be called in a task state other than RUNNABLE Signed-off-by: Oleg Drokin <green@linuxhacker.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e630eb48ff
commit
65609bd672
@@ -549,19 +549,13 @@ do { \
|
||||
__blocked = cfs_block_sigsinv(0); \
|
||||
\
|
||||
for (;;) { \
|
||||
unsigned __wstate; \
|
||||
\
|
||||
__wstate = info->lwi_on_signal != NULL && \
|
||||
(__timeout == 0 || __allow_intr) ? \
|
||||
TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE; \
|
||||
\
|
||||
set_current_state(TASK_INTERRUPTIBLE); \
|
||||
\
|
||||
if (condition) \
|
||||
break; \
|
||||
\
|
||||
set_current_state(TASK_INTERRUPTIBLE); \
|
||||
\
|
||||
if (__timeout == 0) { \
|
||||
schedule(); \
|
||||
schedule(); \
|
||||
} else { \
|
||||
long interval = info->lwi_interval? \
|
||||
min_t(long, \
|
||||
@@ -582,6 +576,8 @@ do { \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
set_current_state(TASK_RUNNING); \
|
||||
\
|
||||
if (condition) \
|
||||
break; \
|
||||
if (cfs_signal_pending()) { \
|
||||
@@ -605,7 +601,6 @@ do { \
|
||||
\
|
||||
cfs_restore_sigs(__blocked); \
|
||||
\
|
||||
set_current_state(TASK_RUNNING); \
|
||||
remove_wait_queue(&wq, &__wait); \
|
||||
} while (0)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user