@@ -193,24 +193,28 @@ static int announce_servers(struct sockaddr_qrtr *sq)
193
193
struct qrtr_server * srv ;
194
194
struct qrtr_node * node ;
195
195
void __rcu * * slot ;
196
- int ret ;
196
+ int ret = 0 ;
197
197
198
198
node = node_get (qrtr_ns .local_node );
199
199
if (!node )
200
200
return 0 ;
201
201
202
+ rcu_read_lock ();
202
203
/* Announce the list of servers registered in this node */
203
204
radix_tree_for_each_slot (slot , & node -> servers , & iter , 0 ) {
204
205
srv = radix_tree_deref_slot (slot );
205
206
206
207
ret = service_announce_new (sq , srv );
207
208
if (ret < 0 ) {
208
209
pr_err ("failed to announce new service\n" );
209
- return ret ;
210
+ goto err_out ;
210
211
}
211
212
}
212
213
213
- return 0 ;
214
+ err_out :
215
+ rcu_read_unlock ();
216
+
217
+ return ret ;
214
218
}
215
219
216
220
static struct qrtr_server * server_add (unsigned int service ,
@@ -335,7 +339,7 @@ static int ctrl_cmd_bye(struct sockaddr_qrtr *from)
335
339
struct qrtr_node * node ;
336
340
void __rcu * * slot ;
337
341
struct kvec iv ;
338
- int ret ;
342
+ int ret = 0 ;
339
343
340
344
iv .iov_base = & pkt ;
341
345
iv .iov_len = sizeof (pkt );
@@ -344,11 +348,13 @@ static int ctrl_cmd_bye(struct sockaddr_qrtr *from)
344
348
if (!node )
345
349
return 0 ;
346
350
351
+ rcu_read_lock ();
347
352
/* Advertise removal of this client to all servers of remote node */
348
353
radix_tree_for_each_slot (slot , & node -> servers , & iter , 0 ) {
349
354
srv = radix_tree_deref_slot (slot );
350
355
server_del (node , srv -> port );
351
356
}
357
+ rcu_read_unlock ();
352
358
353
359
/* Advertise the removal of this client to all local servers */
354
360
local_node = node_get (qrtr_ns .local_node );
@@ -359,6 +365,7 @@ static int ctrl_cmd_bye(struct sockaddr_qrtr *from)
359
365
pkt .cmd = cpu_to_le32 (QRTR_TYPE_BYE );
360
366
pkt .client .node = cpu_to_le32 (from -> sq_node );
361
367
368
+ rcu_read_lock ();
362
369
radix_tree_for_each_slot (slot , & local_node -> servers , & iter , 0 ) {
363
370
srv = radix_tree_deref_slot (slot );
364
371
@@ -372,11 +379,14 @@ static int ctrl_cmd_bye(struct sockaddr_qrtr *from)
372
379
ret = kernel_sendmsg (qrtr_ns .sock , & msg , & iv , 1 , sizeof (pkt ));
373
380
if (ret < 0 ) {
374
381
pr_err ("failed to send bye cmd\n" );
375
- return ret ;
382
+ goto err_out ;
376
383
}
377
384
}
378
385
379
- return 0 ;
386
+ err_out :
387
+ rcu_read_unlock ();
388
+
389
+ return ret ;
380
390
}
381
391
382
392
static int ctrl_cmd_del_client (struct sockaddr_qrtr * from ,
@@ -394,7 +404,7 @@ static int ctrl_cmd_del_client(struct sockaddr_qrtr *from,
394
404
struct list_head * li ;
395
405
void __rcu * * slot ;
396
406
struct kvec iv ;
397
- int ret ;
407
+ int ret = 0 ;
398
408
399
409
iv .iov_base = & pkt ;
400
410
iv .iov_len = sizeof (pkt );
@@ -434,6 +444,7 @@ static int ctrl_cmd_del_client(struct sockaddr_qrtr *from,
434
444
pkt .client .node = cpu_to_le32 (node_id );
435
445
pkt .client .port = cpu_to_le32 (port );
436
446
447
+ rcu_read_lock ();
437
448
radix_tree_for_each_slot (slot , & local_node -> servers , & iter , 0 ) {
438
449
srv = radix_tree_deref_slot (slot );
439
450
@@ -447,11 +458,14 @@ static int ctrl_cmd_del_client(struct sockaddr_qrtr *from,
447
458
ret = kernel_sendmsg (qrtr_ns .sock , & msg , & iv , 1 , sizeof (pkt ));
448
459
if (ret < 0 ) {
449
460
pr_err ("failed to send del client cmd\n" );
450
- return ret ;
461
+ goto err_out ;
451
462
}
452
463
}
453
464
454
- return 0 ;
465
+ err_out :
466
+ rcu_read_unlock ();
467
+
468
+ return ret ;
455
469
}
456
470
457
471
static int ctrl_cmd_new_server (struct sockaddr_qrtr * from ,
@@ -554,6 +568,7 @@ static int ctrl_cmd_new_lookup(struct sockaddr_qrtr *from,
554
568
filter .service = service ;
555
569
filter .instance = instance ;
556
570
571
+ rcu_read_lock ();
557
572
radix_tree_for_each_slot (node_slot , & nodes , & node_iter , 0 ) {
558
573
node = radix_tree_deref_slot (node_slot );
559
574
@@ -568,6 +583,7 @@ static int ctrl_cmd_new_lookup(struct sockaddr_qrtr *from,
568
583
lookup_notify (from , srv , true);
569
584
}
570
585
}
586
+ rcu_read_unlock ();
571
587
572
588
/* Empty notification, to indicate end of listing */
573
589
lookup_notify (from , NULL , true);
0 commit comments