ncpfs: Lock socket in ncpfs while setting its callbacks

Otherwise partially updated pointers could be seen if
pointer update is not atomic.

Signed-off-by: Petr Vandrovec <petr@vandrovec.name>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

authored by Petr Vandrovec and committed by Arnd Bergmann 2a4df5d3 b89f4321

+9 -5
+9 -5
fs/ncpfs/inode.c
··· 303 304 static void ncp_stop_tasks(struct ncp_server *server) { 305 struct sock* sk = server->ncp_sock->sk; 306 - 307 sk->sk_error_report = server->error_report; 308 sk->sk_data_ready = server->data_ready; 309 sk->sk_write_space = server->write_space; 310 del_timer_sync(&server->timeout_tm); 311 flush_scheduled_work(); 312 } ··· 607 mutex_init(&server->rcv.creq_mutex); 608 server->tx.creq = NULL; 609 server->rcv.creq = NULL; 610 - server->data_ready = sock->sk->sk_data_ready; 611 - server->write_space = sock->sk->sk_write_space; 612 - server->error_report = sock->sk->sk_error_report; 613 - sock->sk->sk_user_data = server; 614 615 init_timer(&server->timeout_tm); 616 #undef NCP_PACKET_SIZE ··· 623 if (server->rxbuf == NULL) 624 goto out_txbuf; 625 626 sock->sk->sk_data_ready = ncp_tcp_data_ready; 627 sock->sk->sk_error_report = ncp_tcp_error_report; 628 if (sock->type == SOCK_STREAM) { ··· 643 server->timeout_tm.data = (unsigned long)server; 644 server->timeout_tm.function = ncpdgram_timeout_call; 645 } 646 647 ncp_lock_server(server); 648 error = ncp_connect(server);
··· 303 304 static void ncp_stop_tasks(struct ncp_server *server) { 305 struct sock* sk = server->ncp_sock->sk; 306 + 307 + lock_sock(sk); 308 sk->sk_error_report = server->error_report; 309 sk->sk_data_ready = server->data_ready; 310 sk->sk_write_space = server->write_space; 311 + release_sock(sk); 312 del_timer_sync(&server->timeout_tm); 313 flush_scheduled_work(); 314 } ··· 605 mutex_init(&server->rcv.creq_mutex); 606 server->tx.creq = NULL; 607 server->rcv.creq = NULL; 608 609 init_timer(&server->timeout_tm); 610 #undef NCP_PACKET_SIZE ··· 625 if (server->rxbuf == NULL) 626 goto out_txbuf; 627 628 + lock_sock(sock->sk); 629 + server->data_ready = sock->sk->sk_data_ready; 630 + server->write_space = sock->sk->sk_write_space; 631 + server->error_report = sock->sk->sk_error_report; 632 + sock->sk->sk_user_data = server; 633 sock->sk->sk_data_ready = ncp_tcp_data_ready; 634 sock->sk->sk_error_report = ncp_tcp_error_report; 635 if (sock->type == SOCK_STREAM) { ··· 640 server->timeout_tm.data = (unsigned long)server; 641 server->timeout_tm.function = ncpdgram_timeout_call; 642 } 643 + release_sock(sock->sk); 644 645 ncp_lock_server(server); 646 error = ncp_connect(server);