Commit 19d37ce2 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'dlm-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm

Pull dlm fixes from David Teigland:
 "This set fixes error reporting for dlm sockets, removes the unbound
  property on the dlm callback workqueue to improve performance, and
  includes a couple trivial changes"

* tag 'dlm-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm:
  dlm: fix error return code in sctp_accept_from_sock()
  dlm: don't specify WQ_UNBOUND for the ast callback workqueue
  dlm: remove lock_sock to avoid scheduling while atomic
  dlm: don't save callbacks after accept
  dlm: audit and remove any unnecessary uses of module.h
  dlm: make genl_ops const
parents 3e5cecf2 26c1ec2f
...@@ -268,7 +268,7 @@ void dlm_callback_work(struct work_struct *work) ...@@ -268,7 +268,7 @@ void dlm_callback_work(struct work_struct *work)
int dlm_callback_start(struct dlm_ls *ls) int dlm_callback_start(struct dlm_ls *ls)
{ {
ls->ls_callback_wq = alloc_workqueue("dlm_callback", ls->ls_callback_wq = alloc_workqueue("dlm_callback",
WQ_UNBOUND | WQ_MEM_RECLAIM, 0); WQ_HIGHPRI | WQ_MEM_RECLAIM, 0);
if (!ls->ls_callback_wq) { if (!ls->ls_callback_wq) {
log_print("can't start dlm_callback workqueue"); log_print("can't start dlm_callback workqueue");
return -ENOMEM; return -ENOMEM;
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
******************************************************************************/ ******************************************************************************/
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/init.h>
#include <linux/configfs.h> #include <linux/configfs.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/in.h> #include <linux/in.h>
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/module.h> #include <linux/init.h>
#include <linux/ctype.h> #include <linux/ctype.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/slab.h> #include <linux/slab.h>
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
* This is the main header file to be included in each DLM source file. * This is the main header file to be included in each DLM source file.
*/ */
#include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/types.h> #include <linux/types.h>
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
******************************************************************************* *******************************************************************************
******************************************************************************/ ******************************************************************************/
#include <linux/module.h>
#include "dlm_internal.h" #include "dlm_internal.h"
#include "lockspace.h" #include "lockspace.h"
#include "member.h" #include "member.h"
......
...@@ -519,29 +519,25 @@ static void lowcomms_error_report(struct sock *sk) ...@@ -519,29 +519,25 @@ static void lowcomms_error_report(struct sock *sk)
/* Note: sk_callback_lock must be locked before calling this function. */ /* Note: sk_callback_lock must be locked before calling this function. */
static void save_callbacks(struct connection *con, struct sock *sk) static void save_callbacks(struct connection *con, struct sock *sk)
{ {
lock_sock(sk);
con->orig_data_ready = sk->sk_data_ready; con->orig_data_ready = sk->sk_data_ready;
con->orig_state_change = sk->sk_state_change; con->orig_state_change = sk->sk_state_change;
con->orig_write_space = sk->sk_write_space; con->orig_write_space = sk->sk_write_space;
con->orig_error_report = sk->sk_error_report; con->orig_error_report = sk->sk_error_report;
release_sock(sk);
} }
static void restore_callbacks(struct connection *con, struct sock *sk) static void restore_callbacks(struct connection *con, struct sock *sk)
{ {
write_lock_bh(&sk->sk_callback_lock); write_lock_bh(&sk->sk_callback_lock);
lock_sock(sk);
sk->sk_user_data = NULL; sk->sk_user_data = NULL;
sk->sk_data_ready = con->orig_data_ready; sk->sk_data_ready = con->orig_data_ready;
sk->sk_state_change = con->orig_state_change; sk->sk_state_change = con->orig_state_change;
sk->sk_write_space = con->orig_write_space; sk->sk_write_space = con->orig_write_space;
sk->sk_error_report = con->orig_error_report; sk->sk_error_report = con->orig_error_report;
release_sock(sk);
write_unlock_bh(&sk->sk_callback_lock); write_unlock_bh(&sk->sk_callback_lock);
} }
/* Make a socket active */ /* Make a socket active */
static void add_sock(struct socket *sock, struct connection *con) static void add_sock(struct socket *sock, struct connection *con, bool save_cb)
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
...@@ -549,7 +545,7 @@ static void add_sock(struct socket *sock, struct connection *con) ...@@ -549,7 +545,7 @@ static void add_sock(struct socket *sock, struct connection *con)
con->sock = sock; con->sock = sock;
sk->sk_user_data = con; sk->sk_user_data = con;
if (!test_bit(CF_IS_OTHERCON, &con->flags)) if (save_cb)
save_callbacks(con, sk); save_callbacks(con, sk);
/* Install a data_ready callback */ /* Install a data_ready callback */
sk->sk_data_ready = lowcomms_data_ready; sk->sk_data_ready = lowcomms_data_ready;
...@@ -806,7 +802,7 @@ static int tcp_accept_from_sock(struct connection *con) ...@@ -806,7 +802,7 @@ static int tcp_accept_from_sock(struct connection *con)
newcon->othercon = othercon; newcon->othercon = othercon;
othercon->sock = newsock; othercon->sock = newsock;
newsock->sk->sk_user_data = othercon; newsock->sk->sk_user_data = othercon;
add_sock(newsock, othercon); add_sock(newsock, othercon, false);
addcon = othercon; addcon = othercon;
} }
else { else {
...@@ -819,7 +815,10 @@ static int tcp_accept_from_sock(struct connection *con) ...@@ -819,7 +815,10 @@ static int tcp_accept_from_sock(struct connection *con)
else { else {
newsock->sk->sk_user_data = newcon; newsock->sk->sk_user_data = newcon;
newcon->rx_action = receive_from_sock; newcon->rx_action = receive_from_sock;
add_sock(newsock, newcon); /* accept copies the sk after we've saved the callbacks, so we
don't want to save them a second time or comm errors will
result in calling sk_error_report recursively. */
add_sock(newsock, newcon, false);
addcon = newcon; addcon = newcon;
} }
...@@ -880,7 +879,8 @@ static int sctp_accept_from_sock(struct connection *con) ...@@ -880,7 +879,8 @@ static int sctp_accept_from_sock(struct connection *con)
} }
make_sockaddr(&prim.ssp_addr, 0, &addr_len); make_sockaddr(&prim.ssp_addr, 0, &addr_len);
if (addr_to_nodeid(&prim.ssp_addr, &nodeid)) { ret = addr_to_nodeid(&prim.ssp_addr, &nodeid);
if (ret) {
unsigned char *b = (unsigned char *)&prim.ssp_addr; unsigned char *b = (unsigned char *)&prim.ssp_addr;
log_print("reject connect from unknown addr"); log_print("reject connect from unknown addr");
...@@ -919,7 +919,7 @@ static int sctp_accept_from_sock(struct connection *con) ...@@ -919,7 +919,7 @@ static int sctp_accept_from_sock(struct connection *con)
newcon->othercon = othercon; newcon->othercon = othercon;
othercon->sock = newsock; othercon->sock = newsock;
newsock->sk->sk_user_data = othercon; newsock->sk->sk_user_data = othercon;
add_sock(newsock, othercon); add_sock(newsock, othercon, false);
addcon = othercon; addcon = othercon;
} else { } else {
printk("Extra connection from node %d attempted\n", nodeid); printk("Extra connection from node %d attempted\n", nodeid);
...@@ -930,7 +930,7 @@ static int sctp_accept_from_sock(struct connection *con) ...@@ -930,7 +930,7 @@ static int sctp_accept_from_sock(struct connection *con)
} else { } else {
newsock->sk->sk_user_data = newcon; newsock->sk->sk_user_data = newcon;
newcon->rx_action = receive_from_sock; newcon->rx_action = receive_from_sock;
add_sock(newsock, newcon); add_sock(newsock, newcon, false);
addcon = newcon; addcon = newcon;
} }
...@@ -1058,7 +1058,7 @@ static void sctp_connect_to_sock(struct connection *con) ...@@ -1058,7 +1058,7 @@ static void sctp_connect_to_sock(struct connection *con)
sock->sk->sk_user_data = con; sock->sk->sk_user_data = con;
con->rx_action = receive_from_sock; con->rx_action = receive_from_sock;
con->connect_action = sctp_connect_to_sock; con->connect_action = sctp_connect_to_sock;
add_sock(sock, con); add_sock(sock, con, true);
/* Bind to all addresses. */ /* Bind to all addresses. */
if (sctp_bind_addrs(con, 0)) if (sctp_bind_addrs(con, 0))
...@@ -1146,7 +1146,7 @@ static void tcp_connect_to_sock(struct connection *con) ...@@ -1146,7 +1146,7 @@ static void tcp_connect_to_sock(struct connection *con)
sock->sk->sk_user_data = con; sock->sk->sk_user_data = con;
con->rx_action = receive_from_sock; con->rx_action = receive_from_sock;
con->connect_action = tcp_connect_to_sock; con->connect_action = tcp_connect_to_sock;
add_sock(sock, con); add_sock(sock, con, true);
/* Bind to our cluster-known address connecting to avoid /* Bind to our cluster-known address connecting to avoid
routing problems */ routing problems */
...@@ -1366,7 +1366,7 @@ static int tcp_listen_for_all(void) ...@@ -1366,7 +1366,7 @@ static int tcp_listen_for_all(void)
sock = tcp_create_listen_sock(con, dlm_local_addr[0]); sock = tcp_create_listen_sock(con, dlm_local_addr[0]);
if (sock) { if (sock) {
add_sock(sock, con); add_sock(sock, con, true);
result = 0; result = 0;
} }
else { else {
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
******************************************************************************* *******************************************************************************
******************************************************************************/ ******************************************************************************/
#include <linux/module.h>
#include "dlm_internal.h" #include "dlm_internal.h"
#include "lockspace.h" #include "lockspace.h"
#include "lock.h" #include "lock.h"
......
...@@ -65,7 +65,7 @@ static int user_cmd(struct sk_buff *skb, struct genl_info *info) ...@@ -65,7 +65,7 @@ static int user_cmd(struct sk_buff *skb, struct genl_info *info)
return 0; return 0;
} }
static struct genl_ops dlm_nl_ops[] = { static const struct genl_ops dlm_nl_ops[] = {
{ {
.cmd = DLM_CMD_HELLO, .cmd = DLM_CMD_HELLO,
.doit = user_cmd, .doit = user_cmd,
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include <linux/miscdevice.h> #include <linux/miscdevice.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/module.h>
#include <linux/file.h> #include <linux/file.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/poll.h> #include <linux/poll.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment