ocfs2: Move o2hb functionality into the stack glue.
authorJoel Becker <joel.becker@oracle.com>
Wed, 30 Jan 2008 00:59:56 +0000 (16:59 -0800)
committerMark Fasheh <mfasheh@suse.com>
Fri, 18 Apr 2008 15:56:04 +0000 (08:56 -0700)
The last bit of classic stack used directly in ocfs2 code is o2hb.
Specifically, the check for heartbeat during mount and the call to
ocfs2_hb_ctl during unmount.

We create an extra API, ocfs2_cluster_hangup(), to encapsulate the call
to ocfs2_hb_ctl.  Other stacks will just leave hangup() empty.

The check for heartbeat is moved into ocfs2_cluster_connect().  It will
be matched by a similar check for other stacks.

With this change, only stackglue.c includes cluster/ headers.

Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
fs/ocfs2/dlmglue.c
fs/ocfs2/heartbeat.c
fs/ocfs2/heartbeat.h
fs/ocfs2/ioctl.c
fs/ocfs2/ocfs2.h
fs/ocfs2/stackglue.c
fs/ocfs2/stackglue.h
fs/ocfs2/super.c

index 6652a48cbe0fc0da97da83aa6c2e3c6334a7ab81..05fd016ba4bf4a327336acb556659ce1b8fbda1d 100644 (file)
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
 
-#include <cluster/heartbeat.h>
-#include <cluster/nodemanager.h>
-#include <cluster/tcp.h>
-
 #define MLOG_MASK_PREFIX ML_DLM_GLUE
 #include <cluster/masklog.h>
 
index dcac1a48728816d7027f5ede17fa2af0c22eb611..c6e7213db8688744bdd21d05d5f6296a5e7dcc91 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/types.h>
 #include <linux/slab.h>
 #include <linux/highmem.h>
-#include <linux/kmod.h>
 
 #define MLOG_MASK_PREFIX ML_SUPER
 #include <cluster/masklog.h>
@@ -83,38 +82,6 @@ void ocfs2_do_node_down(int node_num, void *data)
        ocfs2_recovery_thread(osb, node_num);
 }
 
-void ocfs2_stop_heartbeat(struct ocfs2_super *osb)
-{
-       int ret;
-       char *argv[5], *envp[3];
-
-       if (ocfs2_mount_local(osb))
-               return;
-
-       if (!osb->uuid_str) {
-               /* This can happen if we don't get far enough in mount... */
-               mlog(0, "No UUID with which to stop heartbeat!\n\n");
-               return;
-       }
-
-       argv[0] = (char *)o2nm_get_hb_ctl_path();
-       argv[1] = "-K";
-       argv[2] = "-u";
-       argv[3] = osb->uuid_str;
-       argv[4] = NULL;
-
-       mlog(0, "Run: %s %s %s %s\n", argv[0], argv[1], argv[2], argv[3]);
-
-       /* minimal command environment taken from cpu_run_sbin_hotplug */
-       envp[0] = "HOME=/";
-       envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
-       envp[2] = NULL;
-
-       ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
-       if (ret < 0)
-               mlog_errno(ret);
-}
-
 static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map,
                                            int bit)
 {
index 38e2450bf14c191ba41de7acdde9fffd397203d4..74b9c5dda28d307a7c0d571f7ae5f3f173730716 100644 (file)
@@ -29,7 +29,6 @@
 void ocfs2_init_node_maps(struct ocfs2_super *osb);
 
 void ocfs2_do_node_down(int node_num, void *data);
-void ocfs2_stop_heartbeat(struct ocfs2_super *osb);
 
 /* node map functions - used to keep track of mounted and in-recovery
  * nodes. */
index 5177fba5162b55616c77d8a1a2db7b5c28842297..ab1c2167d7f40552c464a06e65298f36a8bf0a04 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <linux/fs.h>
 #include <linux/mount.h>
+#include <linux/smp_lock.h>
 
 #define MLOG_MASK_PREFIX ML_INODE
 #include <cluster/masklog.h>
index 7006abaffd471f67c0ad8bae151d0a7416f5bd92..31dc28b48392cf7d754ef1ffce0dc6b80317af81 100644 (file)
 #include <linux/mutex.h>
 #include <linux/jbd.h>
 
-#include "cluster/nodemanager.h"
-#include "cluster/heartbeat.h"
-#include "cluster/tcp.h"
-
 /* For union ocfs2_dlm_lksb */
 #include "stackglue.h"
 
index 814686356cc6cee37e909d85b66a71ad0ed2cc3d..670fa945c212bd872ba224a545f6b21c9d0eda48 100644 (file)
 
 #include <linux/slab.h>
 #include <linux/crc32.h>
+#include <linux/kmod.h>
 
 /* Needed for AOP_TRUNCATED_PAGE in mlog_errno() */
 #include <linux/fs.h>
 
 #include "cluster/masklog.h"
 #include "cluster/nodemanager.h"
+#include "cluster/heartbeat.h"
 
 #include "stackglue.h"
 
@@ -301,6 +303,13 @@ int ocfs2_cluster_connect(const char *group,
                goto out;
        }
 
+       /* for now we only have one cluster/node, make sure we see it
+        * in the heartbeat universe */
+       if (!o2hb_check_local_node_heartbeating()) {
+               rc = -EINVAL;
+               goto out;
+       }
+
        new_conn = kzalloc(sizeof(struct ocfs2_cluster_connection),
                           GFP_KERNEL);
        if (!new_conn) {
@@ -359,6 +368,7 @@ out:
        return rc;
 }
 
+
 int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn)
 {
        struct dlm_ctxt *dlm = conn->cc_lockspace;
@@ -373,6 +383,46 @@ int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn)
        return 0;
 }
 
+static void o2hb_stop(const char *group)
+{
+       int ret;
+       char *argv[5], *envp[3];
+
+       argv[0] = (char *)o2nm_get_hb_ctl_path();
+       argv[1] = "-K";
+       argv[2] = "-u";
+       argv[3] = (char *)group;
+       argv[4] = NULL;
+
+       mlog(0, "Run: %s %s %s %s\n", argv[0], argv[1], argv[2], argv[3]);
+
+       /* minimal command environment taken from cpu_run_sbin_hotplug */
+       envp[0] = "HOME=/";
+       envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
+       envp[2] = NULL;
+
+       ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
+       if (ret < 0)
+               mlog_errno(ret);
+}
+
+/*
+ * Hangup is a hack for tools compatibility.  Older ocfs2-tools software
+ * expects the filesystem to call "ocfs2_hb_ctl" during unmount.  This
+ * happens regardless of whether the DLM got started, so we can't do it
+ * in ocfs2_cluster_disconnect().  We bring the o2hb_stop() function into
+ * the glue and provide a "hangup" API for super.c to call.
+ *
+ * Other stacks will eventually provide a NULL ->hangup() pointer.
+ */
+void ocfs2_cluster_hangup(const char *group, int grouplen)
+{
+       BUG_ON(group == NULL);
+       BUG_ON(group[grouplen] != '\0');
+
+       o2hb_stop(group);
+}
+
 int ocfs2_cluster_this_node(unsigned int *node)
 {
        int node_num;
index ccb03991b5142681627bd1026b39fc54412da2fa..22af77b9a6909caf364e352a114dacc3272c6ec3 100644 (file)
@@ -74,6 +74,7 @@ int ocfs2_cluster_connect(const char *group,
                          void *recovery_data,
                          struct ocfs2_cluster_connection **conn);
 int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn);
+void ocfs2_cluster_hangup(const char *group, int grouplen);
 int ocfs2_cluster_this_node(unsigned int *node);
 
 int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn,
index d3c4d323fab53113e964e1c6e06e52d4be99e529..8f536b39ce5b2d34de31b6af9d4e69a3a8301513 100644 (file)
@@ -40,8 +40,7 @@
 #include <linux/crc32.h>
 #include <linux/debugfs.h>
 #include <linux/mount.h>
-
-#include <cluster/nodemanager.h>
+#include <linux/seq_file.h>
 
 #define MLOG_MASK_PREFIX ML_SUPER
 #include <cluster/masklog.h>
@@ -579,15 +578,6 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent)
                goto read_super_error;
        }
 
-       /* for now we only have one cluster/node, make sure we see it
-        * in the heartbeat universe */
-       if (parsed_options.mount_opt & OCFS2_MOUNT_HB_LOCAL) {
-               if (!o2hb_check_local_node_heartbeating()) {
-                       status = -EINVAL;
-                       goto read_super_error;
-               }
-       }
-
        /* probe for superblock */
        status = ocfs2_sb_probe(sb, &bh, &sector_size);
        if (status < 0) {
@@ -1275,8 +1265,15 @@ static void ocfs2_dismount_volume(struct super_block *sb, int mnt_err)
 
        debugfs_remove(osb->osb_debug_root);
 
-       if (!mnt_err)
-               ocfs2_stop_heartbeat(osb);
+       /*
+        * This is a small hack to move ocfs2_hb_ctl into stackglue.
+        * If we're dismounting due to mount error, mount.ocfs2 will clean
+        * up heartbeat.  If we're a local mount, there is no heartbeat.
+        * If we failed before we got a uuid_str yet, we can't stop
+        * heartbeat.  Otherwise, do it.
+        */
+       if (!mnt_err && !ocfs2_mount_local(osb) && osb->uuid_str)
+               ocfs2_cluster_hangup(osb->uuid_str, strlen(osb->uuid_str));
 
        atomic_set(&osb->vol_state, VOLUME_DISMOUNTED);