DLM: fix to use sock_mutex correctly in xxx_accept_from_sock
authortsutomu.owa@toshiba.co.jp <tsutomu.owa@toshiba.co.jp>
Tue, 12 Sep 2017 08:56:00 +0000 (08:56 +0000)
committerDavid Teigland <teigland@redhat.com>
Mon, 25 Sep 2017 17:45:21 +0000 (12:45 -0500)
In the current implementation, we think that exclusion control
for othercon in tcp_accept_from_sock() and sctp_accept_from_sock()
was not enough. We fix them.

Signed-off-by: Tadashi Miyauchi <miyauchi@toshiba-tops.co.jp>
Signed-off-by: Tsutomu Owa <tsutomu.owa@toshiba.co.jp>
Signed-off-by: David Teigland <teigland@redhat.com>
fs/dlm/lowcomms.c

index 420946dcb7caba705e8ee1ebea40e0b97fd34cfa..b275813c99013af8f488c2c9bc270ee17e5d2bbf 100644 (file)
@@ -801,16 +801,19 @@ static int tcp_accept_from_sock(struct connection *con)
                        INIT_WORK(&othercon->rwork, process_recv_sockets);
                        set_bit(CF_IS_OTHERCON, &othercon->flags);
                }
+               mutex_lock_nested(&othercon->sock_mutex, 2);
                if (!othercon->sock) {
                        newcon->othercon = othercon;
                        othercon->sock = newsock;
                        newsock->sk->sk_user_data = othercon;
                        add_sock(newsock, othercon);
                        addcon = othercon;
+                       mutex_unlock(&othercon->sock_mutex);
                }
                else {
                        printk("Extra connection from node %d attempted\n", nodeid);
                        result = -EAGAIN;
+                       mutex_unlock(&othercon->sock_mutex);
                        mutex_unlock(&newcon->sock_mutex);
                        goto accept_err;
                }
@@ -918,15 +921,18 @@ static int sctp_accept_from_sock(struct connection *con)
                        INIT_WORK(&othercon->rwork, process_recv_sockets);
                        set_bit(CF_IS_OTHERCON, &othercon->flags);
                }
+               mutex_lock_nested(&othercon->sock_mutex, 2);
                if (!othercon->sock) {
                        newcon->othercon = othercon;
                        othercon->sock = newsock;
                        newsock->sk->sk_user_data = othercon;
                        add_sock(newsock, othercon);
                        addcon = othercon;
+                       mutex_unlock(&othercon->sock_mutex);
                } else {
                        printk("Extra connection from node %d attempted\n", nodeid);
                        ret = -EAGAIN;
+                       mutex_unlock(&othercon->sock_mutex);
                        mutex_unlock(&newcon->sock_mutex);
                        goto accept_err;
                }