@@ -407,6 +407,8 @@ EXPORT_SYMBOL_GPL(vsock_enqueue_accept);
407407
408408static bool vsock_use_local_transport (unsigned int remote_cid )
409409{
410+ lockdep_assert_held (& vsock_register_mutex );
411+
410412 if (!transport_local )
411413 return false;
412414
@@ -464,6 +466,8 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
464466
465467 remote_flags = vsk -> remote_addr .svm_flags ;
466468
469+ mutex_lock (& vsock_register_mutex );
470+
467471 switch (sk -> sk_type ) {
468472 case SOCK_DGRAM :
469473 new_transport = transport_dgram ;
@@ -479,12 +483,15 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
479483 new_transport = transport_h2g ;
480484 break ;
481485 default :
482- return - ESOCKTNOSUPPORT ;
486+ ret = - ESOCKTNOSUPPORT ;
487+ goto err ;
483488 }
484489
485490 if (vsk -> transport ) {
486- if (vsk -> transport == new_transport )
487- return 0 ;
491+ if (vsk -> transport == new_transport ) {
492+ ret = 0 ;
493+ goto err ;
494+ }
488495
489496 /* transport->release() must be called with sock lock acquired.
490497 * This path can only be taken during vsock_connect(), where we
@@ -499,8 +506,16 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
499506 /* We increase the module refcnt to prevent the transport unloading
500507 * while there are open sockets assigned to it.
501508 */
502- if (!new_transport || !try_module_get (new_transport -> module ))
503- return - ENODEV ;
509+ if (!new_transport || !try_module_get (new_transport -> module )) {
510+ ret = - ENODEV ;
511+ goto err ;
512+ }
513+
514+ /* It's safe to release the mutex after a successful try_module_get().
515+ * Whichever transport `new_transport` points at, it won't go away until
516+ * the last module_put() below or in vsock_deassign_transport().
517+ */
518+ mutex_unlock (& vsock_register_mutex );
504519
505520 if (sk -> sk_type == SOCK_SEQPACKET ) {
506521 if (!new_transport -> seqpacket_allow ||
@@ -519,6 +534,9 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
519534 vsk -> transport = new_transport ;
520535
521536 return 0 ;
537+ err :
538+ mutex_unlock (& vsock_register_mutex );
539+ return ret ;
522540}
523541EXPORT_SYMBOL_GPL (vsock_assign_transport );
524542
0 commit comments