diff options
author | Alexander Aring <aahringo@redhat.com> | 2020-09-24 10:31:22 -0400 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2020-09-29 14:00:32 -0500 |
commit | 0461e0db941f8f49dcfd0576c4449f2e5beda2f6 (patch) | |
tree | a6a75397a874a1d8f41c7896745b02c40eac8126 /fs/dlm | |
parent | 7ae0451e2e6c29ff9fc17754b1129d9491177634 (diff) | |
download | linux-0461e0db941f8f49dcfd0576c4449f2e5beda2f6.tar.bz2 |
fs: dlm: remove lock dependency warning
During my experiments to make dlm robust against tcpkill application I
was able to run sometimes in a circular lock dependency warning between
clusters_root.subsys.su_mutex and con->sock_mutex. We don't need to
held the sock_mutex when getting the mark value which held the
clusters_root.subsys.su_mutex. This patch moves the specific handling
just before the sock_mutex will be held.
Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
Diffstat (limited to 'fs/dlm')
-rw-r--r-- | fs/dlm/lowcomms.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index 1bf1808bfa6b..24f5e55313d8 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c @@ -971,6 +971,10 @@ static void sctp_connect_to_sock(struct connection *con) return; } + result = dlm_comm_mark(con->nodeid, &mark); + if (result < 0) + return; + mutex_lock(&con->sock_mutex); /* Some odd races can cause double-connects, ignore them */ @@ -995,11 +999,6 @@ static void sctp_connect_to_sock(struct connection *con) if (result < 0) goto socket_err; - /* set skb mark */ - result = dlm_comm_mark(con->nodeid, &mark); - if (result < 0) - goto bind_err; - sock_set_mark(sock->sk, mark); con->rx_action = receive_from_sock; @@ -1072,6 +1071,10 @@ static void tcp_connect_to_sock(struct connection *con) return; } + result = dlm_comm_mark(con->nodeid, &mark); + if (result < 0) + return; + mutex_lock(&con->sock_mutex); if (con->retries++ > MAX_CONNECT_RETRIES) goto out; @@ -1086,11 +1089,6 @@ static void tcp_connect_to_sock(struct connection *con) if (result < 0) goto out_err; - /* set skb mark */ - result = dlm_comm_mark(con->nodeid, &mark); - if (result < 0) - goto out_err; - sock_set_mark(sock->sk, mark); memset(&saddr, 0, sizeof(saddr)); |