View | Details | Raw Unified | Return to bug 50541 | Differences between
and this patch

Collapse All | Expand All

(-)linux-3.7.0.orig/net/bluetooth/hidp/core.c (-7 / +13 lines)
Lines 680-695 static int hidp_session(void *arg) Link Here
680
	struct sock *intr_sk = session->intr_sock->sk;
680
	struct sock *intr_sk = session->intr_sock->sk;
681
	struct sk_buff *skb;
681
	struct sk_buff *skb;
682
	wait_queue_t ctrl_wait, intr_wait;
682
	wait_queue_t ctrl_wait, intr_wait;
683
	struct socket_wq *ctrl_wq, *intr_wq;
683
684
684
	BT_DBG("session %p", session);
685
	BT_DBG("session %p", session);
685
686
686
	__module_get(THIS_MODULE);
687
	__module_get(THIS_MODULE);
687
	set_user_nice(current, -15);
688
	set_user_nice(current, -15);
688
689
690
	ctrl_wq = ctrl_sk->sk_wq;
691
	intr_wq = intr_sk->sk_wq;
689
	init_waitqueue_entry(&ctrl_wait, current);
692
	init_waitqueue_entry(&ctrl_wait, current);
690
	init_waitqueue_entry(&intr_wait, current);
693
	init_waitqueue_entry(&intr_wait, current);
691
	add_wait_queue(sk_sleep(ctrl_sk), &ctrl_wait);
694
	add_wait_queue(&rcu_dereference_raw(ctrl_wq)->wait, &ctrl_wait);
692
	add_wait_queue(sk_sleep(intr_sk), &intr_wait);
695
	add_wait_queue(&rcu_dereference_raw(intr_wq)->wait, &intr_wait);
693
	session->waiting_for_startup = 0;
696
	session->waiting_for_startup = 0;
694
	wake_up_interruptible(&session->startup_queue);
697
	wake_up_interruptible(&session->startup_queue);
695
	set_current_state(TASK_INTERRUPTIBLE);
698
	set_current_state(TASK_INTERRUPTIBLE);
Lines 722-729 static int hidp_session(void *arg) Link Here
722
		set_current_state(TASK_INTERRUPTIBLE);
725
		set_current_state(TASK_INTERRUPTIBLE);
723
	}
726
	}
724
	set_current_state(TASK_RUNNING);
727
	set_current_state(TASK_RUNNING);
725
	remove_wait_queue(sk_sleep(intr_sk), &intr_wait);
728
	remove_wait_queue(&rcu_dereference_raw(intr_wq)->wait, &intr_wait);
726
	remove_wait_queue(sk_sleep(ctrl_sk), &ctrl_wait);
729
	remove_wait_queue(&rcu_dereference_raw(ctrl_wq)->wait, &ctrl_wait);
727
730
728
	clear_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags);
731
	clear_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags);
729
	clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags);
732
	clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags);
Lines 747-758 static int hidp_session(void *arg) Link Here
747
	session->intr_sock->sk->sk_err = EUNATCH;
750
	session->intr_sock->sk->sk_err = EUNATCH;
748
	session->ctrl_sock->sk->sk_err = EUNATCH;
751
	session->ctrl_sock->sk->sk_err = EUNATCH;
749
752
750
	hidp_schedule(session);
753
	wake_up_interruptible(&rcu_dereference_raw(ctrl_wq)->wait);
754
	wake_up_interruptible(&rcu_dereference_raw(intr_wq)->wait);
751
755
752
	fput(session->intr_sock->file);
756
	fput(session->intr_sock->file);
753
757
754
	wait_event_timeout(*(sk_sleep(ctrl_sk)),
758
	/* By now ctrl_sk might have been orphaned already */
755
		(ctrl_sk->sk_state == BT_CLOSED), msecs_to_jiffies(500));
759
	if (ctrl_wq == ctrl_sk->sk_wq)
760
		wait_event_timeout(rcu_dereference_raw(ctrl_wq)->wait,
761
			(ctrl_sk->sk_state == BT_CLOSED), msecs_to_jiffies(500));
756
762
757
	fput(session->ctrl_sock->file);
763
	fput(session->ctrl_sock->file);
758
764

Return to bug 50541