]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/9p/trans_fd.c
staging: comedi: ni_660x: fix missing break in switch statement
[mirror_ubuntu-bionic-kernel.git] / net / 9p / trans_fd.c
index 80f5c79053a4d2eac267f555fd732b7c1687ba36..774ff67f4dec3a90e7dd3d4f67e163f902375a03 100644 (file)
@@ -185,6 +185,8 @@ static void p9_mux_poll_stop(struct p9_conn *m)
        spin_lock_irqsave(&p9_poll_lock, flags);
        list_del_init(&m->poll_pending_link);
        spin_unlock_irqrestore(&p9_poll_lock, flags);
+
+       flush_work(&p9_poll_work);
 }
 
 /**
@@ -197,15 +199,14 @@ static void p9_mux_poll_stop(struct p9_conn *m)
 static void p9_conn_cancel(struct p9_conn *m, int err)
 {
        struct p9_req_t *req, *rtmp;
-       unsigned long flags;
        LIST_HEAD(cancel_list);
 
        p9_debug(P9_DEBUG_ERROR, "mux %p err %d\n", m, err);
 
-       spin_lock_irqsave(&m->client->lock, flags);
+       spin_lock(&m->client->lock);
 
        if (m->err) {
-               spin_unlock_irqrestore(&m->client->lock, flags);
+               spin_unlock(&m->client->lock);
                return;
        }
 
@@ -217,7 +218,6 @@ static void p9_conn_cancel(struct p9_conn *m, int err)
        list_for_each_entry_safe(req, rtmp, &m->unsent_req_list, req_list) {
                list_move(&req->req_list, &cancel_list);
        }
-       spin_unlock_irqrestore(&m->client->lock, flags);
 
        list_for_each_entry_safe(req, rtmp, &cancel_list, req_list) {
                p9_debug(P9_DEBUG_ERROR, "call back req %p\n", req);
@@ -226,6 +226,7 @@ static void p9_conn_cancel(struct p9_conn *m, int err)
                        req->t_err = err;
                p9_client_cb(m->client, req, REQ_STATUS_ERROR);
        }
+       spin_unlock(&m->client->lock);
 }
 
 static int
@@ -383,8 +384,9 @@ static void p9_read_work(struct work_struct *work)
                if (m->req->status != REQ_STATUS_ERROR)
                        status = REQ_STATUS_RCVD;
                list_del(&m->req->req_list);
-               spin_unlock(&m->client->lock);
+               /* update req->status while holding client->lock  */
                p9_client_cb(m->client, m->req, status);
+               spin_unlock(&m->client->lock);
                m->rc.sdata = NULL;
                m->rc.offset = 0;
                m->rc.capacity = 0;
@@ -950,7 +952,7 @@ p9_fd_create_tcp(struct p9_client *client, const char *addr, char *args)
        if (err < 0)
                return err;
 
-       if (valid_ipaddr4(addr) < 0)
+       if (addr == NULL || valid_ipaddr4(addr) < 0)
                return -EINVAL;
 
        csocket = NULL;
@@ -1000,6 +1002,9 @@ p9_fd_create_unix(struct p9_client *client, const char *addr, char *args)
 
        csocket = NULL;
 
+       if (addr == NULL)
+               return -EINVAL;
+
        if (strlen(addr) >= UNIX_PATH_MAX) {
                pr_err("%s (%d): address too long: %s\n",
                       __func__, task_pid_nr(current), addr);