From: Steven Whitehouse <swhiteho@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [DLM PATCH 6/6] DLM: save / restore all socket callbacks
Date: Thu, 11 Feb 2016 15:31:04 +0000 [thread overview]
Message-ID: <56BCA938.8030208@redhat.com> (raw)
In-Reply-To: <1455130532-9317-7-git-send-email-rpeterso@redhat.com>
Hi,
On 10/02/16 18:55, Bob Peterson wrote:
> Before this patch, DLM was saving off the original error report
> callback before setting its own, but it never restored it. Instead,
> we should be saving off all four socket callbacks before changing
> them, and then restore them once we're done.
>
> Signed-off-by: Bob Peterson <rpeterso@redhat.com>
> ---
> fs/dlm/lowcomms.c | 40 +++++++++++++++++++++++++++++++++++++---
> 1 file changed, 37 insertions(+), 3 deletions(-)
>
> diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
> index 4e82285..c196c16 100644
> --- a/fs/dlm/lowcomms.c
> +++ b/fs/dlm/lowcomms.c
> @@ -124,7 +124,10 @@ struct connection {
> struct connection *othercon;
> struct work_struct rwork; /* Receive workqueue */
> struct work_struct swork; /* Send workqueue */
> - void (*orig_error_report)(struct sock *sk);
> + void (*orig_error_report)(struct sock *);
> + void (*orig_data_ready)(struct sock *);
> + void (*orig_state_change)(struct sock *);
> + void (*orig_write_space)(struct sock *);
> };
> #define sock2con(x) ((struct connection *)(x)->sk_user_data)
>
> @@ -513,6 +516,34 @@ out:
> orig_report(sk);
> }
>
> +/* Note: sk_callback_lock must be locked before calling this function. */
> +static void save_callbacks(struct connection *con, struct sock *sk)
> +{
> + if (test_bit(CF_IS_OTHERCON, &con->flags))
> + return;
> + lock_sock(sk);
> + con->orig_data_ready = sk->sk_data_ready;
> + con->orig_state_change = sk->sk_state_change;
> + con->orig_write_space = sk->sk_write_space;
> + con->orig_error_report = sk->sk_error_report;
> + release_sock(sk);
> +}
> +
> +static void restore_callbacks(struct connection *con, struct sock *sk)
> +{
> + if (test_bit(CF_IS_OTHERCON, &con->flags))
> + return;
> + write_lock_bh(&sk->sk_callback_lock);
> + lock_sock(sk);
> + sk->sk_user_data = NULL;
> + sk->sk_data_ready = con->orig_data_ready;
> + sk->sk_state_change = con->orig_state_change;
> + sk->sk_write_space = con->orig_write_space;
> + sk->sk_error_report = con->orig_error_report;
> + release_sock(sk);
> + write_unlock_bh(&sk->sk_callback_lock);
> +}
> +
Might be clearer to move the test for CF_IS_OTHERCON outside of these
functions and into the callers?
Otherwise these patches look like a good set of clean ups,
Steve.
> /* Make a socket active */
> static void add_sock(struct socket *sock, struct connection *con)
> {
> @@ -521,13 +552,13 @@ static void add_sock(struct socket *sock, struct connection *con)
> write_lock_bh(&sk->sk_callback_lock);
> con->sock = sock;
>
> + sk->sk_user_data = con;
> + save_callbacks(con, sk);
> /* Install a data_ready callback */
> sk->sk_data_ready = lowcomms_data_ready;
> sk->sk_write_space = lowcomms_write_space;
> sk->sk_state_change = lowcomms_state_change;
> - sk->sk_user_data = con;
> sk->sk_allocation = GFP_NOFS;
> - con->orig_error_report = sk->sk_error_report;
> sk->sk_error_report = lowcomms_error_report;
> write_unlock_bh(&sk->sk_callback_lock);
> }
> @@ -564,6 +595,7 @@ static void close_connection(struct connection *con, bool and_other,
>
> mutex_lock(&con->sock_mutex);
> if (con->sock) {
> + restore_callbacks(con, con->sock->sk);
> sock_release(con->sock);
> con->sock = NULL;
> }
> @@ -1205,6 +1237,8 @@ static struct socket *tcp_create_listen_sock(struct connection *con,
> if (result < 0) {
> log_print("Failed to set SO_REUSEADDR on socket: %d", result);
> }
> + sock->sk->sk_user_data = con;
> +
> con->rx_action = tcp_accept_from_sock;
> con->connect_action = tcp_connect_to_sock;
>
next prev parent reply other threads:[~2016-02-11 15:31 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-10 18:55 [Cluster-devel] [DLM PATCH 0/6] Misc DLM Improvements Regarding Socket Errors Bob Peterson
2016-02-10 18:55 ` [Cluster-devel] [DLM PATCH 1/6] DLM: Don't create kernel socket until we have valid node address Bob Peterson
2016-02-10 18:55 ` [Cluster-devel] [DLM PATCH 2/6] DLM: Call original error report when socket is NULL Bob Peterson
2016-02-11 16:43 ` Andreas Gruenbacher
2016-02-10 18:55 ` [Cluster-devel] [DLM PATCH 3/6] DLM: Make consistent error path through tcp_create_listen_sock Bob Peterson
2016-02-11 16:52 ` Andreas Gruenbacher
2016-02-11 17:59 ` Bob Peterson
2016-02-11 21:09 ` [Cluster-devel] [DLM PATCH 3/6] DLM: Make consistent error path Andreas Gruenbacher
2016-02-10 18:55 ` [Cluster-devel] [DLM PATCH 4/6] DLM: Eliminate useless goto Bob Peterson
2016-02-11 16:53 ` Andreas Gruenbacher
2016-02-10 18:55 ` [Cluster-devel] [DLM PATCH 5/6] DLM: Add locking to protect save callback assignments Bob Peterson
2016-02-11 17:04 ` Andreas Gruenbacher
2016-02-10 18:55 ` [Cluster-devel] [DLM PATCH 6/6] DLM: save / restore all socket callbacks Bob Peterson
2016-02-11 15:31 ` Steven Whitehouse [this message]
2016-02-11 16:43 ` [Cluster-devel] [DLM PATCH 6/6][try #2] " Bob Peterson
2016-02-11 17:10 ` Andreas Gruenbacher
2016-02-11 17:05 ` [Cluster-devel] [DLM PATCH 0/6] Misc DLM Improvements Regarding Socket Errors Andreas Gruenbacher
2016-02-11 17:22 ` David Teigland
2016-02-11 18:39 ` Bob Peterson
2016-02-11 18:59 ` David Teigland
2016-02-15 21:16 ` Bob Peterson
2016-02-15 21:24 ` David Teigland
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56BCA938.8030208@redhat.com \
--to=swhiteho@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).