diff options
-rw-r--r-- | include/net/sock.h | 8 | ||||
-rw-r--r-- | net/bluetooth/l2cap.c | 4 | ||||
-rw-r--r-- | net/core/sock.c | 6 |
3 files changed, 12 insertions, 6 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index 9cdbae2a53a3..35ffbdd35d3e 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -745,7 +745,13 @@ static inline int sk_stream_wmem_schedule(struct sock *sk, int size) | |||
745 | */ | 745 | */ |
746 | #define sock_owned_by_user(sk) ((sk)->sk_lock.owner) | 746 | #define sock_owned_by_user(sk) ((sk)->sk_lock.owner) |
747 | 747 | ||
748 | extern void FASTCALL(lock_sock(struct sock *sk)); | 748 | extern void FASTCALL(lock_sock_nested(struct sock *sk, int subclass)); |
749 | |||
750 | static inline void lock_sock(struct sock *sk) | ||
751 | { | ||
752 | lock_sock_nested(sk, 0); | ||
753 | } | ||
754 | |||
749 | extern void FASTCALL(release_sock(struct sock *sk)); | 755 | extern void FASTCALL(release_sock(struct sock *sk)); |
750 | 756 | ||
751 | /* BH context may only use the following locking interface. */ | 757 | /* BH context may only use the following locking interface. */ |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index bbf78e6a7bc3..29a8fa4d3728 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -770,7 +770,7 @@ static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int fl | |||
770 | long timeo; | 770 | long timeo; |
771 | int err = 0; | 771 | int err = 0; |
772 | 772 | ||
773 | lock_sock(sk); | 773 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
774 | 774 | ||
775 | if (sk->sk_state != BT_LISTEN) { | 775 | if (sk->sk_state != BT_LISTEN) { |
776 | err = -EBADFD; | 776 | err = -EBADFD; |
@@ -792,7 +792,7 @@ static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int fl | |||
792 | 792 | ||
793 | release_sock(sk); | 793 | release_sock(sk); |
794 | timeo = schedule_timeout(timeo); | 794 | timeo = schedule_timeout(timeo); |
795 | lock_sock(sk); | 795 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
796 | 796 | ||
797 | if (sk->sk_state != BT_LISTEN) { | 797 | if (sk->sk_state != BT_LISTEN) { |
798 | err = -EBADFD; | 798 | err = -EBADFD; |
diff --git a/net/core/sock.c b/net/core/sock.c index ee6cd2541d35..32ff1c551d69 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1527,7 +1527,7 @@ void sock_init_data(struct socket *sock, struct sock *sk) | |||
1527 | atomic_set(&sk->sk_refcnt, 1); | 1527 | atomic_set(&sk->sk_refcnt, 1); |
1528 | } | 1528 | } |
1529 | 1529 | ||
1530 | void fastcall lock_sock(struct sock *sk) | 1530 | void fastcall lock_sock_nested(struct sock *sk, int subclass) |
1531 | { | 1531 | { |
1532 | might_sleep(); | 1532 | might_sleep(); |
1533 | spin_lock_bh(&sk->sk_lock.slock); | 1533 | spin_lock_bh(&sk->sk_lock.slock); |
@@ -1538,11 +1538,11 @@ void fastcall lock_sock(struct sock *sk) | |||
1538 | /* | 1538 | /* |
1539 | * The sk_lock has mutex_lock() semantics here: | 1539 | * The sk_lock has mutex_lock() semantics here: |
1540 | */ | 1540 | */ |
1541 | mutex_acquire(&sk->sk_lock.dep_map, 0, 0, _RET_IP_); | 1541 | mutex_acquire(&sk->sk_lock.dep_map, subclass, 0, _RET_IP_); |
1542 | local_bh_enable(); | 1542 | local_bh_enable(); |
1543 | } | 1543 | } |
1544 | 1544 | ||
1545 | EXPORT_SYMBOL(lock_sock); | 1545 | EXPORT_SYMBOL(lock_sock_nested); |
1546 | 1546 | ||
1547 | void fastcall release_sock(struct sock *sk) | 1547 | void fastcall release_sock(struct sock *sk) |
1548 | { | 1548 | { |