aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/ocfs2/dlmglue.c4
-rw-r--r--fs/ocfs2/heartbeat.c33
-rw-r--r--fs/ocfs2/heartbeat.h1
-rw-r--r--fs/ocfs2/ioctl.c1
-rw-r--r--fs/ocfs2/ocfs2.h4
-rw-r--r--fs/ocfs2/stackglue.c50
-rw-r--r--fs/ocfs2/stackglue.h1
-rw-r--r--fs/ocfs2/super.c23
8 files changed, 62 insertions, 55 deletions
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c
index 6652a48cbe0f..05fd016ba4bf 100644
--- a/fs/ocfs2/dlmglue.c
+++ b/fs/ocfs2/dlmglue.c
@@ -32,10 +32,6 @@
32#include <linux/debugfs.h> 32#include <linux/debugfs.h>
33#include <linux/seq_file.h> 33#include <linux/seq_file.h>
34 34
35#include <cluster/heartbeat.h>
36#include <cluster/nodemanager.h>
37#include <cluster/tcp.h>
38
39#define MLOG_MASK_PREFIX ML_DLM_GLUE 35#define MLOG_MASK_PREFIX ML_DLM_GLUE
40#include <cluster/masklog.h> 36#include <cluster/masklog.h>
41 37
diff --git a/fs/ocfs2/heartbeat.c b/fs/ocfs2/heartbeat.c
index dcac1a487288..c6e7213db868 100644
--- a/fs/ocfs2/heartbeat.c
+++ b/fs/ocfs2/heartbeat.c
@@ -28,7 +28,6 @@
28#include <linux/types.h> 28#include <linux/types.h>
29#include <linux/slab.h> 29#include <linux/slab.h>
30#include <linux/highmem.h> 30#include <linux/highmem.h>
31#include <linux/kmod.h>
32 31
33#define MLOG_MASK_PREFIX ML_SUPER 32#define MLOG_MASK_PREFIX ML_SUPER
34#include <cluster/masklog.h> 33#include <cluster/masklog.h>
@@ -83,38 +82,6 @@ void ocfs2_do_node_down(int node_num, void *data)
83 ocfs2_recovery_thread(osb, node_num); 82 ocfs2_recovery_thread(osb, node_num);
84} 83}
85 84
86void ocfs2_stop_heartbeat(struct ocfs2_super *osb)
87{
88 int ret;
89 char *argv[5], *envp[3];
90
91 if (ocfs2_mount_local(osb))
92 return;
93
94 if (!osb->uuid_str) {
95 /* This can happen if we don't get far enough in mount... */
96 mlog(0, "No UUID with which to stop heartbeat!\n\n");
97 return;
98 }
99
100 argv[0] = (char *)o2nm_get_hb_ctl_path();
101 argv[1] = "-K";
102 argv[2] = "-u";
103 argv[3] = osb->uuid_str;
104 argv[4] = NULL;
105
106 mlog(0, "Run: %s %s %s %s\n", argv[0], argv[1], argv[2], argv[3]);
107
108 /* minimal command environment taken from cpu_run_sbin_hotplug */
109 envp[0] = "HOME=/";
110 envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
111 envp[2] = NULL;
112
113 ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
114 if (ret < 0)
115 mlog_errno(ret);
116}
117
118static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map, 85static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map,
119 int bit) 86 int bit)
120{ 87{
diff --git a/fs/ocfs2/heartbeat.h b/fs/ocfs2/heartbeat.h
index 38e2450bf14c..74b9c5dda28d 100644
--- a/fs/ocfs2/heartbeat.h
+++ b/fs/ocfs2/heartbeat.h
@@ -29,7 +29,6 @@
29void ocfs2_init_node_maps(struct ocfs2_super *osb); 29void ocfs2_init_node_maps(struct ocfs2_super *osb);
30 30
31void ocfs2_do_node_down(int node_num, void *data); 31void ocfs2_do_node_down(int node_num, void *data);
32void ocfs2_stop_heartbeat(struct ocfs2_super *osb);
33 32
34/* node map functions - used to keep track of mounted and in-recovery 33/* node map functions - used to keep track of mounted and in-recovery
35 * nodes. */ 34 * nodes. */
diff --git a/fs/ocfs2/ioctl.c b/fs/ocfs2/ioctl.c
index 5177fba5162b..ab1c2167d7f4 100644
--- a/fs/ocfs2/ioctl.c
+++ b/fs/ocfs2/ioctl.c
@@ -7,6 +7,7 @@
7 7
8#include <linux/fs.h> 8#include <linux/fs.h>
9#include <linux/mount.h> 9#include <linux/mount.h>
10#include <linux/smp_lock.h>
10 11
11#define MLOG_MASK_PREFIX ML_INODE 12#define MLOG_MASK_PREFIX ML_INODE
12#include <cluster/masklog.h> 13#include <cluster/masklog.h>
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h
index 7006abaffd47..31dc28b48392 100644
--- a/fs/ocfs2/ocfs2.h
+++ b/fs/ocfs2/ocfs2.h
@@ -36,10 +36,6 @@
36#include <linux/mutex.h> 36#include <linux/mutex.h>
37#include <linux/jbd.h> 37#include <linux/jbd.h>
38 38
39#include "cluster/nodemanager.h"
40#include "cluster/heartbeat.h"
41#include "cluster/tcp.h"
42
43/* For union ocfs2_dlm_lksb */ 39/* For union ocfs2_dlm_lksb */
44#include "stackglue.h" 40#include "stackglue.h"
45 41
diff --git a/fs/ocfs2/stackglue.c b/fs/ocfs2/stackglue.c
index 814686356cc6..670fa945c212 100644
--- a/fs/ocfs2/stackglue.c
+++ b/fs/ocfs2/stackglue.c
@@ -20,12 +20,14 @@
20 20
21#include <linux/slab.h> 21#include <linux/slab.h>
22#include <linux/crc32.h> 22#include <linux/crc32.h>
23#include <linux/kmod.h>
23 24
24/* Needed for AOP_TRUNCATED_PAGE in mlog_errno() */ 25/* Needed for AOP_TRUNCATED_PAGE in mlog_errno() */
25#include <linux/fs.h> 26#include <linux/fs.h>
26 27
27#include "cluster/masklog.h" 28#include "cluster/masklog.h"
28#include "cluster/nodemanager.h" 29#include "cluster/nodemanager.h"
30#include "cluster/heartbeat.h"
29 31
30#include "stackglue.h" 32#include "stackglue.h"
31 33
@@ -301,6 +303,13 @@ int ocfs2_cluster_connect(const char *group,
301 goto out; 303 goto out;
302 } 304 }
303 305
306 /* for now we only have one cluster/node, make sure we see it
307 * in the heartbeat universe */
308 if (!o2hb_check_local_node_heartbeating()) {
309 rc = -EINVAL;
310 goto out;
311 }
312
304 new_conn = kzalloc(sizeof(struct ocfs2_cluster_connection), 313 new_conn = kzalloc(sizeof(struct ocfs2_cluster_connection),
305 GFP_KERNEL); 314 GFP_KERNEL);
306 if (!new_conn) { 315 if (!new_conn) {
@@ -359,6 +368,7 @@ out:
359 return rc; 368 return rc;
360} 369}
361 370
371
362int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn) 372int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn)
363{ 373{
364 struct dlm_ctxt *dlm = conn->cc_lockspace; 374 struct dlm_ctxt *dlm = conn->cc_lockspace;
@@ -373,6 +383,46 @@ int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn)
373 return 0; 383 return 0;
374} 384}
375 385
386static void o2hb_stop(const char *group)
387{
388 int ret;
389 char *argv[5], *envp[3];
390
391 argv[0] = (char *)o2nm_get_hb_ctl_path();
392 argv[1] = "-K";
393 argv[2] = "-u";
394 argv[3] = (char *)group;
395 argv[4] = NULL;
396
397 mlog(0, "Run: %s %s %s %s\n", argv[0], argv[1], argv[2], argv[3]);
398
399 /* minimal command environment taken from cpu_run_sbin_hotplug */
400 envp[0] = "HOME=/";
401 envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
402 envp[2] = NULL;
403
404 ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
405 if (ret < 0)
406 mlog_errno(ret);
407}
408
409/*
410 * Hangup is a hack for tools compatibility. Older ocfs2-tools software
411 * expects the filesystem to call "ocfs2_hb_ctl" during unmount. This
412 * happens regardless of whether the DLM got started, so we can't do it
413 * in ocfs2_cluster_disconnect(). We bring the o2hb_stop() function into
414 * the glue and provide a "hangup" API for super.c to call.
415 *
416 * Other stacks will eventually provide a NULL ->hangup() pointer.
417 */
418void ocfs2_cluster_hangup(const char *group, int grouplen)
419{
420 BUG_ON(group == NULL);
421 BUG_ON(group[grouplen] != '\0');
422
423 o2hb_stop(group);
424}
425
376int ocfs2_cluster_this_node(unsigned int *node) 426int ocfs2_cluster_this_node(unsigned int *node)
377{ 427{
378 int node_num; 428 int node_num;
diff --git a/fs/ocfs2/stackglue.h b/fs/ocfs2/stackglue.h
index ccb03991b514..22af77b9a690 100644
--- a/fs/ocfs2/stackglue.h
+++ b/fs/ocfs2/stackglue.h
@@ -74,6 +74,7 @@ int ocfs2_cluster_connect(const char *group,
74 void *recovery_data, 74 void *recovery_data,
75 struct ocfs2_cluster_connection **conn); 75 struct ocfs2_cluster_connection **conn);
76int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn); 76int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn);
77void ocfs2_cluster_hangup(const char *group, int grouplen);
77int ocfs2_cluster_this_node(unsigned int *node); 78int ocfs2_cluster_this_node(unsigned int *node);
78 79
79int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn, 80int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn,
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index d3c4d323fab5..8f536b39ce5b 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -40,8 +40,7 @@
40#include <linux/crc32.h> 40#include <linux/crc32.h>
41#include <linux/debugfs.h> 41#include <linux/debugfs.h>
42#include <linux/mount.h> 42#include <linux/mount.h>
43 43#include <linux/seq_file.h>
44#include <cluster/nodemanager.h>
45 44
46#define MLOG_MASK_PREFIX ML_SUPER 45#define MLOG_MASK_PREFIX ML_SUPER
47#include <cluster/masklog.h> 46#include <cluster/masklog.h>
@@ -579,15 +578,6 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent)
579 goto read_super_error; 578 goto read_super_error;
580 } 579 }
581 580
582 /* for now we only have one cluster/node, make sure we see it
583 * in the heartbeat universe */
584 if (parsed_options.mount_opt & OCFS2_MOUNT_HB_LOCAL) {
585 if (!o2hb_check_local_node_heartbeating()) {
586 status = -EINVAL;
587 goto read_super_error;
588 }
589 }
590
591 /* probe for superblock */ 581 /* probe for superblock */
592 status = ocfs2_sb_probe(sb, &bh, &sector_size); 582 status = ocfs2_sb_probe(sb, &bh, &sector_size);
593 if (status < 0) { 583 if (status < 0) {
@@ -1275,8 +1265,15 @@ static void ocfs2_dismount_volume(struct super_block *sb, int mnt_err)
1275 1265
1276 debugfs_remove(osb->osb_debug_root); 1266 debugfs_remove(osb->osb_debug_root);
1277 1267
1278 if (!mnt_err) 1268 /*
1279 ocfs2_stop_heartbeat(osb); 1269 * This is a small hack to move ocfs2_hb_ctl into stackglue.
1270 * If we're dismounting due to mount error, mount.ocfs2 will clean
1271 * up heartbeat. If we're a local mount, there is no heartbeat.
1272 * If we failed before we got a uuid_str yet, we can't stop
1273 * heartbeat. Otherwise, do it.
1274 */
1275 if (!mnt_err && !ocfs2_mount_local(osb) && osb->uuid_str)
1276 ocfs2_cluster_hangup(osb->uuid_str, strlen(osb->uuid_str));
1280 1277
1281 atomic_set(&osb->vol_state, VOLUME_DISMOUNTED); 1278 atomic_set(&osb->vol_state, VOLUME_DISMOUNTED);
1282 1279