@@ -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 );
@@ -151,15 +161,16 @@ struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
151
161
/*
152
162
* Allocate a new client call.
153
163
*/
154
- static struct rxrpc_call * rxrpc_alloc_client_call (struct sockaddr_rxrpc * srx ,
164
+ static struct rxrpc_call * rxrpc_alloc_client_call (struct rxrpc_sock * rx ,
165
+ struct sockaddr_rxrpc * srx ,
155
166
gfp_t gfp )
156
167
{
157
168
struct rxrpc_call * call ;
158
169
ktime_t now ;
159
170
160
171
_enter ("" );
161
172
162
- call = rxrpc_alloc_call (gfp );
173
+ call = rxrpc_alloc_call (rx , gfp );
163
174
if (!call )
164
175
return ERR_PTR (- ENOMEM );
165
176
call -> state = RXRPC_CALL_CLIENT_AWAIT_CONN ;
@@ -210,7 +221,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
210
221
211
222
_enter ("%p,%lx" , rx , user_call_ID );
212
223
213
- call = rxrpc_alloc_client_call (srx , gfp );
224
+ call = rxrpc_alloc_client_call (rx , srx , gfp );
214
225
if (IS_ERR (call )) {
215
226
release_sock (& rx -> sk );
216
227
_leave (" = %ld" , PTR_ERR (call ));
0 commit comments