diff options
Diffstat (limited to 'kernel/sched/wait.c')
| -rw-r--r-- | kernel/sched/wait.c | 30 | 
1 files changed, 24 insertions, 6 deletions
diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c index 0ffa20ae657b..15cab1a4f84e 100644 --- a/kernel/sched/wait.c +++ b/kernel/sched/wait.c @@ -319,14 +319,14 @@ EXPORT_SYMBOL(wake_bit_function);   */  int __sched  __wait_on_bit(wait_queue_head_t *wq, struct wait_bit_queue *q, -			int (*action)(void *), unsigned mode) +	      wait_bit_action_f *action, unsigned mode)  {  	int ret = 0;  	do {  		prepare_to_wait(wq, &q->wait, mode);  		if (test_bit(q->key.bit_nr, q->key.flags)) -			ret = (*action)(q->key.flags); +			ret = (*action)(&q->key);  	} while (test_bit(q->key.bit_nr, q->key.flags) && !ret);  	finish_wait(wq, &q->wait);  	return ret; @@ -334,7 +334,7 @@ __wait_on_bit(wait_queue_head_t *wq, struct wait_bit_queue *q,  EXPORT_SYMBOL(__wait_on_bit);  int __sched out_of_line_wait_on_bit(void *word, int bit, -					int (*action)(void *), unsigned mode) +				    wait_bit_action_f *action, unsigned mode)  {  	wait_queue_head_t *wq = bit_waitqueue(word, bit);  	DEFINE_WAIT_BIT(wait, word, bit); @@ -345,7 +345,7 @@ EXPORT_SYMBOL(out_of_line_wait_on_bit);  int __sched  __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q, -			int (*action)(void *), unsigned mode) +			wait_bit_action_f *action, unsigned mode)  {  	do {  		int ret; @@ -353,7 +353,7 @@ __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q,  		prepare_to_wait_exclusive(wq, &q->wait, mode);  		if (!test_bit(q->key.bit_nr, q->key.flags))  			continue; -		ret = action(q->key.flags); +		ret = action(&q->key);  		if (!ret)  			continue;  		abort_exclusive_wait(wq, &q->wait, mode, &q->key); @@ -365,7 +365,7 @@ __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q,  EXPORT_SYMBOL(__wait_on_bit_lock);  int __sched out_of_line_wait_on_bit_lock(void *word, int bit, -					int (*action)(void *), unsigned mode) +					 wait_bit_action_f *action, unsigned mode)  {  	wait_queue_head_t *wq = bit_waitqueue(word, bit);  	DEFINE_WAIT_BIT(wait, word, bit); @@ -502,3 +502,21 @@ void wake_up_atomic_t(atomic_t *p)  	__wake_up_bit(atomic_t_waitqueue(p), p, WAIT_ATOMIC_T_BIT_NR);  }  EXPORT_SYMBOL(wake_up_atomic_t); + +__sched int bit_wait(struct wait_bit_key *word) +{ +	if (signal_pending_state(current->state, current)) +		return 1; +	schedule(); +	return 0; +} +EXPORT_SYMBOL(bit_wait); + +__sched int bit_wait_io(struct wait_bit_key *word) +{ +	if (signal_pending_state(current->state, current)) +		return 1; +	io_schedule(); +	return 0; +} +EXPORT_SYMBOL(bit_wait_io);  | 
