@@ -636,7 +636,7 @@ static struct proto netlink_proto = {
636
636
};
637
637
638
638
static int __netlink_create (struct net * net , struct socket * sock ,
639
- struct mutex * dump_cb_mutex , int protocol ,
639
+ struct mutex * cb_mutex , int protocol ,
640
640
int kern )
641
641
{
642
642
struct sock * sk ;
@@ -651,11 +651,15 @@ static int __netlink_create(struct net *net, struct socket *sock,
651
651
sock_init_data (sock , sk );
652
652
653
653
nlk = nlk_sk (sk );
654
- mutex_init (& nlk -> nl_cb_mutex );
655
- lockdep_set_class_and_name (& nlk -> nl_cb_mutex ,
654
+ if (cb_mutex ) {
655
+ nlk -> cb_mutex = cb_mutex ;
656
+ } else {
657
+ nlk -> cb_mutex = & nlk -> cb_def_mutex ;
658
+ mutex_init (nlk -> cb_mutex );
659
+ lockdep_set_class_and_name (nlk -> cb_mutex ,
656
660
nlk_cb_mutex_keys + protocol ,
657
661
nlk_cb_mutex_key_strings [protocol ]);
658
- nlk -> dump_cb_mutex = dump_cb_mutex ;
662
+ }
659
663
init_waitqueue_head (& nlk -> wait );
660
664
661
665
sk -> sk_destruct = netlink_sock_destruct ;
@@ -2207,7 +2211,7 @@ static int netlink_dump(struct sock *sk, bool lock_taken)
2207
2211
int alloc_size ;
2208
2212
2209
2213
if (!lock_taken )
2210
- mutex_lock (& nlk -> nl_cb_mutex );
2214
+ mutex_lock (nlk -> cb_mutex );
2211
2215
if (!nlk -> cb_running ) {
2212
2216
err = - EINVAL ;
2213
2217
goto errout_skb ;
@@ -2259,22 +2263,14 @@ static int netlink_dump(struct sock *sk, bool lock_taken)
2259
2263
netlink_skb_set_owner_r (skb , sk );
2260
2264
2261
2265
if (nlk -> dump_done_errno > 0 ) {
2262
- struct mutex * extra_mutex = nlk -> dump_cb_mutex ;
2263
-
2264
2266
cb -> extack = & extack ;
2265
-
2266
- if (extra_mutex )
2267
- mutex_lock (extra_mutex );
2268
2267
nlk -> dump_done_errno = cb -> dump (skb , cb );
2269
- if (extra_mutex )
2270
- mutex_unlock (extra_mutex );
2271
-
2272
2268
cb -> extack = NULL ;
2273
2269
}
2274
2270
2275
2271
if (nlk -> dump_done_errno > 0 ||
2276
2272
skb_tailroom (skb ) < nlmsg_total_size (sizeof (nlk -> dump_done_errno ))) {
2277
- mutex_unlock (& nlk -> nl_cb_mutex );
2273
+ mutex_unlock (nlk -> cb_mutex );
2278
2274
2279
2275
if (sk_filter (sk , skb ))
2280
2276
kfree_skb (skb );
@@ -2308,13 +2304,13 @@ static int netlink_dump(struct sock *sk, bool lock_taken)
2308
2304
WRITE_ONCE (nlk -> cb_running , false);
2309
2305
module = cb -> module ;
2310
2306
skb = cb -> skb ;
2311
- mutex_unlock (& nlk -> nl_cb_mutex );
2307
+ mutex_unlock (nlk -> cb_mutex );
2312
2308
module_put (module );
2313
2309
consume_skb (skb );
2314
2310
return 0 ;
2315
2311
2316
2312
errout_skb :
2317
- mutex_unlock (& nlk -> nl_cb_mutex );
2313
+ mutex_unlock (nlk -> cb_mutex );
2318
2314
kfree_skb (skb );
2319
2315
return err ;
2320
2316
}
@@ -2337,7 +2333,7 @@ int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
2337
2333
}
2338
2334
2339
2335
nlk = nlk_sk (sk );
2340
- mutex_lock (& nlk -> nl_cb_mutex );
2336
+ mutex_lock (nlk -> cb_mutex );
2341
2337
/* A dump is in progress... */
2342
2338
if (nlk -> cb_running ) {
2343
2339
ret = - EBUSY ;
@@ -2388,7 +2384,7 @@ int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
2388
2384
module_put (control -> module );
2389
2385
error_unlock :
2390
2386
sock_put (sk );
2391
- mutex_unlock (& nlk -> nl_cb_mutex );
2387
+ mutex_unlock (nlk -> cb_mutex );
2392
2388
error_free :
2393
2389
kfree_skb (skb );
2394
2390
return ret ;
0 commit comments