@@ -55,6 +55,8 @@ static void rxrpc_call_timer_expired(unsigned long _call)
55
55
rxrpc_set_timer (call , rxrpc_timer_expired , ktime_get_real ());
56
56
}
57
57
58
+ static struct lock_class_key rxrpc_call_user_mutex_lock_class_key ;
59
+
58
60
/*
59
61
* find an extant server call
60
62
* - called in process context with IRQs enabled
@@ -95,7 +97,7 @@ struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *rx,
95
97
/*
96
98
* allocate a new call
97
99
*/
98
- struct rxrpc_call * rxrpc_alloc_call (gfp_t gfp )
100
+ struct rxrpc_call * rxrpc_alloc_call (struct rxrpc_sock * rx , gfp_t gfp )
99
101
{
100
102
struct rxrpc_call * call ;
101
103
@@ -114,6 +116,14 @@ struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
114
116
goto nomem_2 ;
115
117
116
118
mutex_init (& call -> user_mutex );
119
+
120
+ /* Prevent lockdep reporting a deadlock false positive between the afs
121
+ * filesystem and sys_sendmsg() via the mmap sem.
122
+ */
123
+ if (rx -> sk .sk_kern_sock )
124
+ lockdep_set_class (& call -> user_mutex ,
125
+ & rxrpc_call_user_mutex_lock_class_key );
126
+
117
127
setup_timer (& call -> timer , rxrpc_call_timer_expired ,
118
128
(unsigned long )call );
119
129
INIT_WORK (& call -> processor , & rxrpc_process_call );
@@ -150,15 +160,16 @@ struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
150
160
/*
151
161
* Allocate a new client call.
152
162
*/
153
- static struct rxrpc_call * rxrpc_alloc_client_call (struct sockaddr_rxrpc * srx ,
163
+ static struct rxrpc_call * rxrpc_alloc_client_call (struct rxrpc_sock * rx ,
164
+ struct sockaddr_rxrpc * srx ,
154
165
gfp_t gfp )
155
166
{
156
167
struct rxrpc_call * call ;
157
168
ktime_t now ;
158
169
159
170
_enter ("" );
160
171
161
- call = rxrpc_alloc_call (gfp );
172
+ call = rxrpc_alloc_call (rx , gfp );
162
173
if (!call )
163
174
return ERR_PTR (- ENOMEM );
164
175
call -> state = RXRPC_CALL_CLIENT_AWAIT_CONN ;
@@ -209,7 +220,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
209
220
210
221
_enter ("%p,%lx" , rx , user_call_ID );
211
222
212
- call = rxrpc_alloc_client_call (srx , gfp );
223
+ call = rxrpc_alloc_client_call (rx , srx , gfp );
213
224
if (IS_ERR (call )) {
214
225
release_sock (& rx -> sk );
215
226
_leave (" = %ld" , PTR_ERR (call ));
0 commit comments