use less confusing names for iov_iter direction initializers
[linux-block.git] / net / tipc / topsrv.c
index 14fd05fd6107df848b992a03fa810bfecb021425..d7166d84a7b2a9051a1ead887da59b085ed36171 100644 (file)
@@ -394,7 +394,7 @@ static int tipc_conn_rcv_from_sock(struct tipc_conn *con)
        iov.iov_base = &s;
        iov.iov_len = sizeof(s);
        msg.msg_name = NULL;
-       iov_iter_kvec(&msg.msg_iter, READ, &iov, 1, iov.iov_len);
+       iov_iter_kvec(&msg.msg_iter, ITER_DEST, &iov, 1, iov.iov_len);
        ret = sock_recvmsg(con->sock, &msg, MSG_DONTWAIT);
        if (ret == -EWOULDBLOCK)
                return -EWOULDBLOCK;
@@ -450,12 +450,19 @@ static void tipc_conn_data_ready(struct sock *sk)
 static void tipc_topsrv_accept(struct work_struct *work)
 {
        struct tipc_topsrv *srv = container_of(work, struct tipc_topsrv, awork);
-       struct socket *lsock = srv->listener;
-       struct socket *newsock;
+       struct socket *newsock, *lsock;
        struct tipc_conn *con;
        struct sock *newsk;
        int ret;
 
+       spin_lock_bh(&srv->idr_lock);
+       if (!srv->listener) {
+               spin_unlock_bh(&srv->idr_lock);
+               return;
+       }
+       lsock = srv->listener;
+       spin_unlock_bh(&srv->idr_lock);
+
        while (1) {
                ret = kernel_accept(lsock, &newsock, O_NONBLOCK);
                if (ret < 0)
@@ -489,7 +496,7 @@ static void tipc_topsrv_listener_data_ready(struct sock *sk)
 
        read_lock_bh(&sk->sk_callback_lock);
        srv = sk->sk_user_data;
-       if (srv->listener)
+       if (srv)
                queue_work(srv->rcv_wq, &srv->awork);
        read_unlock_bh(&sk->sk_callback_lock);
 }
@@ -699,8 +706,9 @@ static void tipc_topsrv_stop(struct net *net)
        __module_get(lsock->sk->sk_prot_creator->owner);
        srv->listener = NULL;
        spin_unlock_bh(&srv->idr_lock);
-       sock_release(lsock);
+
        tipc_topsrv_work_stop(srv);
+       sock_release(lsock);
        idr_destroy(&srv->conn_idr);
        kfree(srv);
 }