diff options
-rw-r--r-- | fs/ocfs2/dlmglue.c | 4 | ||||
-rw-r--r-- | fs/ocfs2/heartbeat.c | 33 | ||||
-rw-r--r-- | fs/ocfs2/heartbeat.h | 1 | ||||
-rw-r--r-- | fs/ocfs2/ioctl.c | 1 | ||||
-rw-r--r-- | fs/ocfs2/ocfs2.h | 4 | ||||
-rw-r--r-- | fs/ocfs2/stackglue.c | 50 | ||||
-rw-r--r-- | fs/ocfs2/stackglue.h | 1 | ||||
-rw-r--r-- | fs/ocfs2/super.c | 23 |
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 | ||
86 | void 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 | |||
118 | static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map, | 85 | static 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 @@ | |||
29 | void ocfs2_init_node_maps(struct ocfs2_super *osb); | 29 | void ocfs2_init_node_maps(struct ocfs2_super *osb); |
30 | 30 | ||
31 | void ocfs2_do_node_down(int node_num, void *data); | 31 | void ocfs2_do_node_down(int node_num, void *data); |
32 | void 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 | |||
362 | int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn) | 372 | int 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 | ||
386 | static 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 | */ | ||
418 | void 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 | |||
376 | int ocfs2_cluster_this_node(unsigned int *node) | 426 | int 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); |
76 | int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn); | 76 | int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn); |
77 | void ocfs2_cluster_hangup(const char *group, int grouplen); | ||
77 | int ocfs2_cluster_this_node(unsigned int *node); | 78 | int ocfs2_cluster_this_node(unsigned int *node); |
78 | 79 | ||
79 | int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn, | 80 | int 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, §or_size); | 582 | status = ocfs2_sb_probe(sb, &bh, §or_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 | ||