fs: dlm: replace use of socket sk_callback_lock with sock_lock
This patch will replace the use of socket sk_callback_lock lock and uses
socket lock instead. Some users like sunrpc, see commit ea9afca88b
("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>
This commit is contained in:
Родитель
4c3d90570b
Коммит
92c4460538
|
@ -488,11 +488,9 @@ static void lowcomms_data_ready(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct connection *con;
|
struct connection *con;
|
||||||
|
|
||||||
read_lock_bh(&sk->sk_callback_lock);
|
|
||||||
con = sock2con(sk);
|
con = sock2con(sk);
|
||||||
if (con && !test_and_set_bit(CF_READ_PENDING, &con->flags))
|
if (con && !test_and_set_bit(CF_READ_PENDING, &con->flags))
|
||||||
queue_work(recv_workqueue, &con->rwork);
|
queue_work(recv_workqueue, &con->rwork);
|
||||||
read_unlock_bh(&sk->sk_callback_lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lowcomms_listen_data_ready(struct sock *sk)
|
static void lowcomms_listen_data_ready(struct sock *sk)
|
||||||
|
@ -507,15 +505,14 @@ static void lowcomms_write_space(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct connection *con;
|
struct connection *con;
|
||||||
|
|
||||||
read_lock_bh(&sk->sk_callback_lock);
|
|
||||||
con = sock2con(sk);
|
con = sock2con(sk);
|
||||||
if (!con)
|
if (!con)
|
||||||
goto out;
|
return;
|
||||||
|
|
||||||
if (!test_and_set_bit(CF_CONNECTED, &con->flags)) {
|
if (!test_and_set_bit(CF_CONNECTED, &con->flags)) {
|
||||||
log_print("successful connected to node %d", con->nodeid);
|
log_print("successful connected to node %d", con->nodeid);
|
||||||
queue_work(send_workqueue, &con->swork);
|
queue_work(send_workqueue, &con->swork);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
clear_bit(SOCK_NOSPACE, &con->sock->flags);
|
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);
|
queue_work(send_workqueue, &con->swork);
|
||||||
out:
|
|
||||||
read_unlock_bh(&sk->sk_callback_lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void lowcomms_connect_sock(struct connection *con)
|
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;
|
void (*orig_report)(struct sock *) = NULL;
|
||||||
struct inet_sock *inet;
|
struct inet_sock *inet;
|
||||||
|
|
||||||
read_lock_bh(&sk->sk_callback_lock);
|
|
||||||
con = sock2con(sk);
|
con = sock2con(sk);
|
||||||
if (con == NULL)
|
if (con == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -646,7 +640,6 @@ static void lowcomms_error_report(struct sock *sk)
|
||||||
queue_work(send_workqueue, &con->swork);
|
queue_work(send_workqueue, &con->swork);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
read_unlock_bh(&sk->sk_callback_lock);
|
|
||||||
if (orig_report)
|
if (orig_report)
|
||||||
orig_report(sk);
|
orig_report(sk);
|
||||||
}
|
}
|
||||||
|
@ -666,20 +659,20 @@ static void restore_callbacks(struct socket *sock)
|
||||||
{
|
{
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
|
|
||||||
write_lock_bh(&sk->sk_callback_lock);
|
lock_sock(sk);
|
||||||
sk->sk_user_data = NULL;
|
sk->sk_user_data = NULL;
|
||||||
sk->sk_data_ready = listen_sock.sk_data_ready;
|
sk->sk_data_ready = listen_sock.sk_data_ready;
|
||||||
sk->sk_state_change = listen_sock.sk_state_change;
|
sk->sk_state_change = listen_sock.sk_state_change;
|
||||||
sk->sk_write_space = listen_sock.sk_write_space;
|
sk->sk_write_space = listen_sock.sk_write_space;
|
||||||
sk->sk_error_report = listen_sock.sk_error_report;
|
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)
|
static void add_listen_sock(struct socket *sock, struct listen_connection *con)
|
||||||
{
|
{
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
|
|
||||||
write_lock_bh(&sk->sk_callback_lock);
|
lock_sock(sk);
|
||||||
save_listen_callbacks(sock);
|
save_listen_callbacks(sock);
|
||||||
con->sock = 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;
|
sk->sk_allocation = GFP_NOFS;
|
||||||
/* Install a data_ready callback */
|
/* Install a data_ready callback */
|
||||||
sk->sk_data_ready = lowcomms_listen_data_ready;
|
sk->sk_data_ready = lowcomms_listen_data_ready;
|
||||||
write_unlock_bh(&sk->sk_callback_lock);
|
release_sock(sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make a socket active */
|
/* Make a socket active */
|
||||||
|
@ -695,7 +688,7 @@ static void add_sock(struct socket *sock, struct connection *con)
|
||||||
{
|
{
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
|
|
||||||
write_lock_bh(&sk->sk_callback_lock);
|
lock_sock(sk);
|
||||||
con->sock = sock;
|
con->sock = sock;
|
||||||
|
|
||||||
sk->sk_user_data = con;
|
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_state_change = lowcomms_state_change;
|
||||||
sk->sk_allocation = GFP_NOFS;
|
sk->sk_allocation = GFP_NOFS;
|
||||||
sk->sk_error_report = lowcomms_error_report;
|
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
|
/* 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_READ_PENDING, &con->flags);
|
||||||
set_bit(CF_WRITE_PENDING, &con->flags);
|
set_bit(CF_WRITE_PENDING, &con->flags);
|
||||||
if (con->sock && con->sock->sk) {
|
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;
|
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)
|
if (con->othercon && and_other)
|
||||||
_stop_conn(con->othercon, false);
|
_stop_conn(con->othercon, false);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче