@@ -126,7 +126,7 @@ static struct proto vsock_proto = {
126126 */
127127#define VSOCK_DEFAULT_CONNECT_TIMEOUT (2 * HZ)
128128
129- static const struct vsock_transport * transport ;
129+ static const struct vsock_transport * transport_single ;
130130static DEFINE_MUTEX (vsock_register_mutex );
131131
132132/**** UTILS ****/
@@ -408,7 +408,9 @@ static bool vsock_is_pending(struct sock *sk)
408408
409409static int vsock_send_shutdown (struct sock * sk , int mode )
410410{
411- return transport -> shutdown (vsock_sk (sk ), mode );
411+ struct vsock_sock * vsk = vsock_sk (sk );
412+
413+ return vsk -> transport -> shutdown (vsk , mode );
412414}
413415
414416static void vsock_pending_work (struct work_struct * work )
@@ -518,7 +520,7 @@ static int __vsock_bind_stream(struct vsock_sock *vsk,
518520static int __vsock_bind_dgram (struct vsock_sock * vsk ,
519521 struct sockaddr_vm * addr )
520522{
521- return transport -> dgram_bind (vsk , addr );
523+ return vsk -> transport -> dgram_bind (vsk , addr );
522524}
523525
524526static int __vsock_bind (struct sock * sk , struct sockaddr_vm * addr )
@@ -536,7 +538,7 @@ static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr)
536538 * like AF_INET prevents binding to a non-local IP address (in most
537539 * cases), we only allow binding to the local CID.
538540 */
539- cid = transport -> get_local_cid ();
541+ cid = vsk -> transport -> get_local_cid ();
540542 if (addr -> svm_cid != cid && addr -> svm_cid != VMADDR_CID_ANY )
541543 return - EADDRNOTAVAIL ;
542544
@@ -586,6 +588,7 @@ struct sock *__vsock_create(struct net *net,
586588 sk -> sk_type = type ;
587589
588590 vsk = vsock_sk (sk );
591+ vsk -> transport = transport_single ;
589592 vsock_addr_init (& vsk -> local_addr , VMADDR_CID_ANY , VMADDR_PORT_ANY );
590593 vsock_addr_init (& vsk -> remote_addr , VMADDR_CID_ANY , VMADDR_PORT_ANY );
591594
@@ -616,7 +619,7 @@ struct sock *__vsock_create(struct net *net,
616619 vsk -> connect_timeout = VSOCK_DEFAULT_CONNECT_TIMEOUT ;
617620 }
618621
619- if (transport -> init (vsk , psk ) < 0 ) {
622+ if (vsk -> transport -> init (vsk , psk ) < 0 ) {
620623 sk_free (sk );
621624 return NULL ;
622625 }
@@ -640,7 +643,7 @@ static void __vsock_release(struct sock *sk, int level)
640643 /* The release call is supposed to use lock_sock_nested()
641644 * rather than lock_sock(), if a sock lock should be acquired.
642645 */
643- transport -> release (vsk );
646+ vsk -> transport -> release (vsk );
644647
645648 /* When "level" is SINGLE_DEPTH_NESTING, use the nested
646649 * version to avoid the warning "possible recursive locking
@@ -668,7 +671,7 @@ static void vsock_sk_destruct(struct sock *sk)
668671{
669672 struct vsock_sock * vsk = vsock_sk (sk );
670673
671- transport -> destruct (vsk );
674+ vsk -> transport -> destruct (vsk );
672675
673676 /* When clearing these addresses, there's no need to set the family and
674677 * possibly register the address family with the kernel.
@@ -692,13 +695,13 @@ static int vsock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
692695
693696s64 vsock_stream_has_data (struct vsock_sock * vsk )
694697{
695- return transport -> stream_has_data (vsk );
698+ return vsk -> transport -> stream_has_data (vsk );
696699}
697700EXPORT_SYMBOL_GPL (vsock_stream_has_data );
698701
699702s64 vsock_stream_has_space (struct vsock_sock * vsk )
700703{
701- return transport -> stream_has_space (vsk );
704+ return vsk -> transport -> stream_has_space (vsk );
702705}
703706EXPORT_SYMBOL_GPL (vsock_stream_has_space );
704707
@@ -867,6 +870,7 @@ static __poll_t vsock_poll(struct file *file, struct socket *sock,
867870 mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND ;
868871
869872 } else if (sock -> type == SOCK_STREAM ) {
873+ const struct vsock_transport * transport = vsk -> transport ;
870874 lock_sock (sk );
871875
872876 /* Listening sockets that have connections in their accept
@@ -942,6 +946,7 @@ static int vsock_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
942946 struct sock * sk ;
943947 struct vsock_sock * vsk ;
944948 struct sockaddr_vm * remote_addr ;
949+ const struct vsock_transport * transport ;
945950
946951 if (msg -> msg_flags & MSG_OOB )
947952 return - EOPNOTSUPP ;
@@ -950,6 +955,7 @@ static int vsock_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
950955 err = 0 ;
951956 sk = sock -> sk ;
952957 vsk = vsock_sk (sk );
958+ transport = vsk -> transport ;
953959
954960 lock_sock (sk );
955961
@@ -1034,8 +1040,8 @@ static int vsock_dgram_connect(struct socket *sock,
10341040 if (err )
10351041 goto out ;
10361042
1037- if (!transport -> dgram_allow (remote_addr -> svm_cid ,
1038- remote_addr -> svm_port )) {
1043+ if (!vsk -> transport -> dgram_allow (remote_addr -> svm_cid ,
1044+ remote_addr -> svm_port )) {
10391045 err = - EINVAL ;
10401046 goto out ;
10411047 }
@@ -1051,7 +1057,9 @@ static int vsock_dgram_connect(struct socket *sock,
10511057static int vsock_dgram_recvmsg (struct socket * sock , struct msghdr * msg ,
10521058 size_t len , int flags )
10531059{
1054- return transport -> dgram_dequeue (vsock_sk (sock -> sk ), msg , len , flags );
1060+ struct vsock_sock * vsk = vsock_sk (sock -> sk );
1061+
1062+ return vsk -> transport -> dgram_dequeue (vsk , msg , len , flags );
10551063}
10561064
10571065static const struct proto_ops vsock_dgram_ops = {
@@ -1077,6 +1085,8 @@ static const struct proto_ops vsock_dgram_ops = {
10771085
10781086static int vsock_transport_cancel_pkt (struct vsock_sock * vsk )
10791087{
1088+ const struct vsock_transport * transport = vsk -> transport ;
1089+
10801090 if (!transport -> cancel_pkt )
10811091 return - EOPNOTSUPP ;
10821092
@@ -1113,13 +1123,15 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
11131123 int err ;
11141124 struct sock * sk ;
11151125 struct vsock_sock * vsk ;
1126+ const struct vsock_transport * transport ;
11161127 struct sockaddr_vm * remote_addr ;
11171128 long timeout ;
11181129 DEFINE_WAIT (wait );
11191130
11201131 err = 0 ;
11211132 sk = sock -> sk ;
11221133 vsk = vsock_sk (sk );
1134+ transport = vsk -> transport ;
11231135
11241136 lock_sock (sk );
11251137
@@ -1363,6 +1375,7 @@ static int vsock_stream_setsockopt(struct socket *sock,
13631375 int err ;
13641376 struct sock * sk ;
13651377 struct vsock_sock * vsk ;
1378+ const struct vsock_transport * transport ;
13661379 u64 val ;
13671380
13681381 if (level != AF_VSOCK )
@@ -1383,6 +1396,7 @@ static int vsock_stream_setsockopt(struct socket *sock,
13831396 err = 0 ;
13841397 sk = sock -> sk ;
13851398 vsk = vsock_sk (sk );
1399+ transport = vsk -> transport ;
13861400
13871401 lock_sock (sk );
13881402
@@ -1440,6 +1454,7 @@ static int vsock_stream_getsockopt(struct socket *sock,
14401454 int len ;
14411455 struct sock * sk ;
14421456 struct vsock_sock * vsk ;
1457+ const struct vsock_transport * transport ;
14431458 u64 val ;
14441459
14451460 if (level != AF_VSOCK )
@@ -1463,6 +1478,7 @@ static int vsock_stream_getsockopt(struct socket *sock,
14631478 err = 0 ;
14641479 sk = sock -> sk ;
14651480 vsk = vsock_sk (sk );
1481+ transport = vsk -> transport ;
14661482
14671483 switch (optname ) {
14681484 case SO_VM_SOCKETS_BUFFER_SIZE :
@@ -1507,6 +1523,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
15071523{
15081524 struct sock * sk ;
15091525 struct vsock_sock * vsk ;
1526+ const struct vsock_transport * transport ;
15101527 ssize_t total_written ;
15111528 long timeout ;
15121529 int err ;
@@ -1515,6 +1532,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
15151532
15161533 sk = sock -> sk ;
15171534 vsk = vsock_sk (sk );
1535+ transport = vsk -> transport ;
15181536 total_written = 0 ;
15191537 err = 0 ;
15201538
@@ -1646,6 +1664,7 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
16461664{
16471665 struct sock * sk ;
16481666 struct vsock_sock * vsk ;
1667+ const struct vsock_transport * transport ;
16491668 int err ;
16501669 size_t target ;
16511670 ssize_t copied ;
@@ -1656,6 +1675,7 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
16561675
16571676 sk = sock -> sk ;
16581677 vsk = vsock_sk (sk );
1678+ transport = vsk -> transport ;
16591679 err = 0 ;
16601680
16611681 lock_sock (sk );
@@ -1870,7 +1890,7 @@ static long vsock_dev_do_ioctl(struct file *filp,
18701890
18711891 switch (cmd ) {
18721892 case IOCTL_VM_SOCKETS_GET_LOCAL_CID :
1873- if (put_user (transport -> get_local_cid (), p ) != 0 )
1893+ if (put_user (transport_single -> get_local_cid (), p ) != 0 )
18741894 retval = - EFAULT ;
18751895 break ;
18761896
@@ -1917,7 +1937,7 @@ int __vsock_core_init(const struct vsock_transport *t, struct module *owner)
19171937 if (err )
19181938 return err ;
19191939
1920- if (transport ) {
1940+ if (transport_single ) {
19211941 err = - EBUSY ;
19221942 goto err_busy ;
19231943 }
@@ -1926,7 +1946,7 @@ int __vsock_core_init(const struct vsock_transport *t, struct module *owner)
19261946 * unload while there are open sockets.
19271947 */
19281948 vsock_proto .owner = owner ;
1929- transport = t ;
1949+ transport_single = t ;
19301950
19311951 vsock_device .minor = MISC_DYNAMIC_MINOR ;
19321952 err = misc_register (& vsock_device );
@@ -1956,7 +1976,7 @@ int __vsock_core_init(const struct vsock_transport *t, struct module *owner)
19561976err_deregister_misc :
19571977 misc_deregister (& vsock_device );
19581978err_reset_transport :
1959- transport = NULL ;
1979+ transport_single = NULL ;
19601980err_busy :
19611981 mutex_unlock (& vsock_register_mutex );
19621982 return err ;
@@ -1973,7 +1993,7 @@ void vsock_core_exit(void)
19731993
19741994 /* We do not want the assignment below re-ordered. */
19751995 mb ();
1976- transport = NULL ;
1996+ transport_single = NULL ;
19771997
19781998 mutex_unlock (& vsock_register_mutex );
19791999}
@@ -1984,7 +2004,7 @@ const struct vsock_transport *vsock_core_get_transport(void)
19842004 /* vsock_register_mutex not taken since only the transport uses this
19852005 * function and only while registered.
19862006 */
1987- return transport ;
2007+ return transport_single ;
19882008}
19892009EXPORT_SYMBOL_GPL (vsock_core_get_transport );
19902010
0 commit comments