summaryrefslogtreecommitdiff
path: root/fs/dlm
diff options
context:
space:
mode:
Diffstat (limited to 'fs/dlm')
-rw-r--r--fs/dlm/lowcomms.c67
1 files changed, 32 insertions, 35 deletions
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 193a4c91c4d8..30cd53fa2f77 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -170,29 +170,12 @@ static struct connection *__find_con(int nodeid)
return NULL;
}
-/*
- * If 'allocation' is zero then we don't attempt to create a new
- * connection structure for this node.
- */
-static struct connection *nodeid2con(int nodeid, gfp_t alloc)
+static int dlm_con_init(struct connection *con, int nodeid)
{
- struct connection *con, *tmp;
- int r;
-
- con = __find_con(nodeid);
- if (con || !alloc)
- return con;
-
- con = kzalloc(sizeof(*con), alloc);
- if (!con)
- return NULL;
-
con->rx_buflen = dlm_config.ci_buffer_size;
con->rx_buf = kmalloc(con->rx_buflen, GFP_NOFS);
- if (!con->rx_buf) {
- kfree(con);
- return NULL;
- }
+ if (!con->rx_buf)
+ return -ENOMEM;
con->nodeid = nodeid;
mutex_init(&con->sock_mutex);
@@ -211,6 +194,32 @@ static struct connection *nodeid2con(int nodeid, gfp_t alloc)
con->rx_action = zerocon->rx_action;
}
+ return 0;
+}
+
+/*
+ * If 'allocation' is zero then we don't attempt to create a new
+ * connection structure for this node.
+ */
+static struct connection *nodeid2con(int nodeid, gfp_t alloc)
+{
+ struct connection *con, *tmp;
+ int r, ret;
+
+ con = __find_con(nodeid);
+ if (con || !alloc)
+ return con;
+
+ con = kzalloc(sizeof(*con), alloc);
+ if (!con)
+ return NULL;
+
+ ret = dlm_con_init(con, nodeid);
+ if (ret) {
+ kfree(con);
+ return NULL;
+ }
+
r = nodeid_hash(nodeid);
spin_lock(&connections_lock);
@@ -849,32 +858,20 @@ static int accept_from_sock(struct connection *con)
goto accept_err;
}
- othercon->rx_buflen = dlm_config.ci_buffer_size;
- othercon->rx_buf = kmalloc(othercon->rx_buflen, GFP_NOFS);
- if (!othercon->rx_buf) {
- mutex_unlock(&newcon->sock_mutex);
+ result = dlm_con_init(othercon, nodeid);
+ if (result < 0) {
kfree(othercon);
- log_print("failed to allocate incoming socket receive buffer");
- result = -ENOMEM;
goto accept_err;
}
- othercon->nodeid = nodeid;
- othercon->rx_action = receive_from_sock;
- mutex_init(&othercon->sock_mutex);
- INIT_LIST_HEAD(&othercon->writequeue);
- spin_lock_init(&othercon->writequeue_lock);
- INIT_WORK(&othercon->swork, process_send_sockets);
- INIT_WORK(&othercon->rwork, process_recv_sockets);
- init_waitqueue_head(&othercon->shutdown_wait);
set_bit(CF_IS_OTHERCON, &othercon->flags);
+ newcon->othercon = othercon;
} else {
/* close other sock con if we have something new */
close_connection(othercon, false, true, false);
}
mutex_lock_nested(&othercon->sock_mutex, 2);
- newcon->othercon = othercon;
add_sock(newsock, othercon);
addcon = othercon;
mutex_unlock(&othercon->sock_mutex);