aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSunil Mushran <sunil.mushran@oracle.com>2010-12-14 17:14:27 -0500
committerJoel Becker <joel.becker@oracle.com>2010-12-16 03:46:09 -0500
commit2b190ce9bf923fb1fd8ccff18e9bab72da40da06 (patch)
tree450147f679106040fcd0f40008cb7fe7c05904d6
parent66f4500573fe5a1b455e5f7b30068a623a94117f (diff)
ocfs2/cluster: Pin the remote node item in configfs
o2net pins the node item of the remote node in configfs before initiating the connection. It is unpinned on disconnect. This is to prevent the node item from being unlinked while it is still in use. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com>
-rw-r--r--fs/ocfs2/cluster/tcp.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c
index 9aa426e42123..92de96cd247d 100644
--- a/fs/ocfs2/cluster/tcp.c
+++ b/fs/ocfs2/cluster/tcp.c
@@ -355,6 +355,7 @@ static void sc_kref_release(struct kref *kref)
355 sc->sc_sock = NULL; 355 sc->sc_sock = NULL;
356 } 356 }
357 357
358 o2nm_undepend_item(&sc->sc_node->nd_item);
358 o2nm_node_put(sc->sc_node); 359 o2nm_node_put(sc->sc_node);
359 sc->sc_node = NULL; 360 sc->sc_node = NULL;
360 361
@@ -376,6 +377,7 @@ static struct o2net_sock_container *sc_alloc(struct o2nm_node *node)
376{ 377{
377 struct o2net_sock_container *sc, *ret = NULL; 378 struct o2net_sock_container *sc, *ret = NULL;
378 struct page *page = NULL; 379 struct page *page = NULL;
380 int status = 0;
379 381
380 page = alloc_page(GFP_NOFS); 382 page = alloc_page(GFP_NOFS);
381 sc = kzalloc(sizeof(*sc), GFP_NOFS); 383 sc = kzalloc(sizeof(*sc), GFP_NOFS);
@@ -386,6 +388,13 @@ static struct o2net_sock_container *sc_alloc(struct o2nm_node *node)
386 o2nm_node_get(node); 388 o2nm_node_get(node);
387 sc->sc_node = node; 389 sc->sc_node = node;
388 390
391 /* pin the node item of the remote node */
392 status = o2nm_depend_item(&node->nd_item);
393 if (status) {
394 mlog_errno(status);
395 o2nm_node_put(node);
396 goto out;
397 }
389 INIT_WORK(&sc->sc_connect_work, o2net_sc_connect_completed); 398 INIT_WORK(&sc->sc_connect_work, o2net_sc_connect_completed);
390 INIT_WORK(&sc->sc_rx_work, o2net_rx_until_empty); 399 INIT_WORK(&sc->sc_rx_work, o2net_rx_until_empty);
391 INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc); 400 INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc);