static noinline void __down(struct semaphore *sem);
static noinline int __down_interruptible(struct semaphore *sem);
static noinline void __down(struct semaphore *sem);
static noinline int __down_interruptible(struct semaphore *sem);
- if (state == TASK_INTERRUPTIBLE && signal_pending(task)) {
- ret = -EINTR;
- break;
- }
- if (state == TASK_KILLABLE && fatal_signal_pending(task)) {
- ret = -EINTR;
- break;
- }
- if (timeout <= 0) {
- ret = -ETIME;
- break;
- }
+ if (state == TASK_INTERRUPTIBLE && signal_pending(task))
+ goto interrupted;
+ if (state == TASK_KILLABLE && fatal_signal_pending(task))
+ goto interrupted;
+ if (timeout <= 0)
+ goto timed_out;
__set_task_state(task, state);
spin_unlock_irq(&sem->lock);
timeout = schedule_timeout(timeout);
spin_lock_irq(&sem->lock);
__set_task_state(task, state);
spin_unlock_irq(&sem->lock);
timeout = schedule_timeout(timeout);
spin_lock_irq(&sem->lock);
{
struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,
struct semaphore_waiter, list);
{
struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,
struct semaphore_waiter, list);