Commit 391fbdc5 authored by Christine Caulfield's avatar Christine Caulfield Committed by David Teigland

dlm: connect to nodes earlier

Make network connections to other nodes earlier, in the context of
dlm_recoverd.  This avoids connecting to nodes from dlm_send where we
try to avoid allocations which could possibly deadlock if memory reclaim
goes into the cluster fs which may try to do a dlm operation.
Signed-off-by: default avatarChristine Caulfield <ccaulfie@redhat.com>
Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
parent 8511a272
...@@ -309,6 +309,20 @@ static void lowcomms_state_change(struct sock *sk) ...@@ -309,6 +309,20 @@ static void lowcomms_state_change(struct sock *sk)
lowcomms_write_space(sk); lowcomms_write_space(sk);
} }
int dlm_lowcomms_connect_node(int nodeid)
{
struct connection *con;
if (nodeid == dlm_our_nodeid())
return 0;
con = nodeid2con(nodeid, GFP_NOFS);
if (!con)
return -ENOMEM;
lowcomms_connect_sock(con);
return 0;
}
/* Make a socket active */ /* Make a socket active */
static int add_sock(struct socket *sock, struct connection *con) static int add_sock(struct socket *sock, struct connection *con)
{ {
...@@ -1421,7 +1435,7 @@ static int work_start(void) ...@@ -1421,7 +1435,7 @@ static int work_start(void)
static void stop_conn(struct connection *con) static void stop_conn(struct connection *con)
{ {
con->flags |= 0x0F; con->flags |= 0x0F;
if (con->sock) if (con->sock && con->sock->sk)
con->sock->sk->sk_user_data = NULL; con->sock->sk->sk_user_data = NULL;
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
******************************************************************************* *******************************************************************************
** **
** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. ** Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved.
** **
** This copyrighted material is made available to anyone wishing to use, ** This copyrighted material is made available to anyone wishing to use,
** modify, copy, or redistribute it subject to the terms and conditions ** modify, copy, or redistribute it subject to the terms and conditions
...@@ -19,6 +19,7 @@ void dlm_lowcomms_stop(void); ...@@ -19,6 +19,7 @@ void dlm_lowcomms_stop(void);
int dlm_lowcomms_close(int nodeid); int dlm_lowcomms_close(int nodeid);
void *dlm_lowcomms_get_buffer(int nodeid, int len, gfp_t allocation, char **ppc); void *dlm_lowcomms_get_buffer(int nodeid, int len, gfp_t allocation, char **ppc);
void dlm_lowcomms_commit_buffer(void *mh); void dlm_lowcomms_commit_buffer(void *mh);
int dlm_lowcomms_connect_node(int nodeid);
#endif /* __LOWCOMMS_DOT_H__ */ #endif /* __LOWCOMMS_DOT_H__ */
/****************************************************************************** /******************************************************************************
******************************************************************************* *******************************************************************************
** **
** Copyright (C) 2005-2008 Red Hat, Inc. All rights reserved. ** Copyright (C) 2005-2009 Red Hat, Inc. All rights reserved.
** **
** This copyrighted material is made available to anyone wishing to use, ** This copyrighted material is made available to anyone wishing to use,
** modify, copy, or redistribute it subject to the terms and conditions ** modify, copy, or redistribute it subject to the terms and conditions
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "recover.h" #include "recover.h"
#include "rcom.h" #include "rcom.h"
#include "config.h" #include "config.h"
#include "lowcomms.h"
static void add_ordered_member(struct dlm_ls *ls, struct dlm_member *new) static void add_ordered_member(struct dlm_ls *ls, struct dlm_member *new)
{ {
...@@ -45,7 +46,7 @@ static void add_ordered_member(struct dlm_ls *ls, struct dlm_member *new) ...@@ -45,7 +46,7 @@ static void add_ordered_member(struct dlm_ls *ls, struct dlm_member *new)
static int dlm_add_member(struct dlm_ls *ls, int nodeid) static int dlm_add_member(struct dlm_ls *ls, int nodeid)
{ {
struct dlm_member *memb; struct dlm_member *memb;
int w; int w, error;
memb = kzalloc(sizeof(struct dlm_member), GFP_KERNEL); memb = kzalloc(sizeof(struct dlm_member), GFP_KERNEL);
if (!memb) if (!memb)
...@@ -57,6 +58,12 @@ static int dlm_add_member(struct dlm_ls *ls, int nodeid) ...@@ -57,6 +58,12 @@ static int dlm_add_member(struct dlm_ls *ls, int nodeid)
return w; return w;
} }
error = dlm_lowcomms_connect_node(nodeid);
if (error < 0) {
kfree(memb);
return error;
}
memb->nodeid = nodeid; memb->nodeid = nodeid;
memb->weight = w; memb->weight = w;
add_ordered_member(ls, memb); add_ordered_member(ls, memb);
......
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