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