fs: dlm: replace use of socket sk_callback_lock with sock_lock
authorAlexander Aring <aahringo@redhat.com>
Mon, 15 Nov 2021 13:57:06 +0000 (08:57 -0500)
committerDavid Teigland <teigland@redhat.com>
Mon, 15 Nov 2021 17:49:18 +0000 (11:49 -0600)
This patch will replace the use of socket sk_callback_lock lock and uses
socket lock instead. Some users like sunrpc, see commit ea9afca88bbe
("SUNRPC: Replace use of socket sk_callback_lock with sock_lock") moving
from sk_callback_lock to sock_lock which seems to be held when the socket
callbacks are called.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
fs/dlm/lowcomms.c

index c7750849c495460eceb5d6894a4e00c282aaf76f..203470189011102d111318ac233b45e36b54e2a4 100644 (file)
@@ -488,11 +488,9 @@ static void lowcomms_data_ready(struct sock *sk)
 {
        struct connection *con;
 
-       read_lock_bh(&sk->sk_callback_lock);
        con = sock2con(sk);
        if (con && !test_and_set_bit(CF_READ_PENDING, &con->flags))
                queue_work(recv_workqueue, &con->rwork);
-       read_unlock_bh(&sk->sk_callback_lock);
 }
 
 static void lowcomms_listen_data_ready(struct sock *sk)
@@ -507,15 +505,14 @@ static void lowcomms_write_space(struct sock *sk)
 {
        struct connection *con;
 
-       read_lock_bh(&sk->sk_callback_lock);
        con = sock2con(sk);
        if (!con)
-               goto out;
+               return;
 
        if (!test_and_set_bit(CF_CONNECTED, &con->flags)) {
                log_print("successful connected to node %d", con->nodeid);
                queue_work(send_workqueue, &con->swork);
-               goto out;
+               return;
        }
 
        clear_bit(SOCK_NOSPACE, &con->sock->flags);
@@ -526,8 +523,6 @@ static void lowcomms_write_space(struct sock *sk)
        }
 
        queue_work(send_workqueue, &con->swork);
-out:
-       read_unlock_bh(&sk->sk_callback_lock);
 }
 
 static inline void lowcomms_connect_sock(struct connection *con)
@@ -597,7 +592,6 @@ static void lowcomms_error_report(struct sock *sk)
        void (*orig_report)(struct sock *) = NULL;
        struct inet_sock *inet;
 
-       read_lock_bh(&sk->sk_callback_lock);
        con = sock2con(sk);
        if (con == NULL)
                goto out;
@@ -646,7 +640,6 @@ static void lowcomms_error_report(struct sock *sk)
                queue_work(send_workqueue, &con->swork);
 
 out:
-       read_unlock_bh(&sk->sk_callback_lock);
        if (orig_report)
                orig_report(sk);
 }
@@ -666,20 +659,20 @@ static void restore_callbacks(struct socket *sock)
 {
        struct sock *sk = sock->sk;
 
-       write_lock_bh(&sk->sk_callback_lock);
+       lock_sock(sk);
        sk->sk_user_data = NULL;
        sk->sk_data_ready = listen_sock.sk_data_ready;
        sk->sk_state_change = listen_sock.sk_state_change;
        sk->sk_write_space = listen_sock.sk_write_space;
        sk->sk_error_report = listen_sock.sk_error_report;
-       write_unlock_bh(&sk->sk_callback_lock);
+       release_sock(sk);
 }
 
 static void add_listen_sock(struct socket *sock, struct listen_connection *con)
 {
        struct sock *sk = sock->sk;
 
-       write_lock_bh(&sk->sk_callback_lock);
+       lock_sock(sk);
        save_listen_callbacks(sock);
        con->sock = sock;
 
@@ -687,7 +680,7 @@ static void add_listen_sock(struct socket *sock, struct listen_connection *con)
        sk->sk_allocation = GFP_NOFS;
        /* Install a data_ready callback */
        sk->sk_data_ready = lowcomms_listen_data_ready;
-       write_unlock_bh(&sk->sk_callback_lock);
+       release_sock(sk);
 }
 
 /* Make a socket active */
@@ -695,7 +688,7 @@ static void add_sock(struct socket *sock, struct connection *con)
 {
        struct sock *sk = sock->sk;
 
-       write_lock_bh(&sk->sk_callback_lock);
+       lock_sock(sk);
        con->sock = sock;
 
        sk->sk_user_data = con;
@@ -705,7 +698,7 @@ static void add_sock(struct socket *sock, struct connection *con)
        sk->sk_state_change = lowcomms_state_change;
        sk->sk_allocation = GFP_NOFS;
        sk->sk_error_report = lowcomms_error_report;
-       write_unlock_bh(&sk->sk_callback_lock);
+       release_sock(sk);
 }
 
 /* Add the port number to an IPv6 or 4 sockaddr and return the address
@@ -1680,9 +1673,9 @@ static void _stop_conn(struct connection *con, bool and_other)
        set_bit(CF_READ_PENDING, &con->flags);
        set_bit(CF_WRITE_PENDING, &con->flags);
        if (con->sock && con->sock->sk) {
-               write_lock_bh(&con->sock->sk->sk_callback_lock);
+               lock_sock(con->sock->sk);
                con->sock->sk->sk_user_data = NULL;
-               write_unlock_bh(&con->sock->sk->sk_callback_lock);
+               release_sock(con->sock->sk);
        }
        if (con->othercon && and_other)
                _stop_conn(con->othercon, false);