[PATCH 2/2] Make cmap_* also has same policy as dlm_*

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Let libcmap lib and related funs also only need one-time
setup during mdadm running period.

Signed-off-by: Guoqing Jiang <gqjiang@xxxxxxxx>
---
 mdadm.c | 23 +++++++++++--------
 mdadm.h | 20 ++++++++++++++++
 util.c  | 81 +++++++++++++++++++++++++++++++++++++++--------------------------
 3 files changed, 82 insertions(+), 42 deletions(-)

diff --git a/mdadm.c b/mdadm.c
index d8032c1..4812fc5 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -1293,18 +1293,22 @@ int main(int argc, char *argv[])
 		c.require_homehost = 0;
 	}
 
+	set_hookers(); /* set hookers from libs */
+
 	if (c.homecluster == NULL && (c.nodes > 0)) {
 		c.homecluster = conf_get_homecluster();
 		if (c.homecluster == NULL)
 			rv = get_cluster_name(&c.homecluster);
 		if (rv != 0) {
 			pr_err("The md can't get cluster name\n");
+			free_hookers();
 			exit(1);
 		}
 	}
 
 	if (c.backup_file && data_offset != INVALID_SECTORS) {
 		pr_err("--backup-file and --data-offset are incompatible\n");
+		free_hookers();
 		exit(2);
 	}
 
@@ -1313,6 +1317,7 @@ int main(int argc, char *argv[])
 		/* Anyone may try this */;
 	else if (geteuid() != 0) {
 		pr_err("must be super-user to perform this action\n");
+		free_hookers();
 		exit(1);
 	}
 
@@ -1322,8 +1327,6 @@ int main(int argc, char *argv[])
 		/* --scan implied --brief unless -vv */
 		c.brief = 1;
 
-	set_dlm_hookers(); /* get dlm funcs from libdlm_lt.so.3 */
-
 	rv = 0;
 	switch(mode) {
 	case MANAGE:
@@ -1364,12 +1367,12 @@ int main(int argc, char *argv[])
 		else if (devs_found > 0) {
 			if (c.update && devs_found > 1) {
 				pr_err("can only update a single array at a time\n");
-				free_dlm_hookers(); /* close dlm stuffs */
+				free_hookers(); /* close dlm stuffs */
 				exit(1);
 			}
 			if (c.backup_file && devs_found > 1) {
 				pr_err("can only assemble a single array when providing a backup file.\n");
-				free_dlm_hookers(); /* close dlm stuffs */
+				free_hookers(); /* close dlm stuffs */
 				exit(1);
 			}
 			for (dv = devlist ; dv ; dv=dv->next) {
@@ -1388,12 +1391,12 @@ int main(int argc, char *argv[])
 		} else {
 			if (c.update) {
 				pr_err("--update not meaningful with a --scan assembly.\n");
-				free_dlm_hookers(); /* close dlm stuffs */
+				free_hookers(); /* close dlm stuffs */
 				exit(1);
 			}
 			if (c.backup_file) {
 				pr_err("--backup_file not meaningful with a --scan assembly.\n");
-				free_dlm_hookers(); /* close dlm stuffs */
+				free_hookers(); /* close dlm stuffs */
 				exit(1);
 			}
 			rv = scan_assemble(ss, &c, &ident);
@@ -1461,14 +1464,14 @@ int main(int argc, char *argv[])
 		if (devmode == 'E') {
 			if (devlist == NULL && !c.scan) {
 				pr_err("No devices to examine\n");
-				free_dlm_hookers(); /* close dlm stuffs */
+				free_hookers(); /* close dlm stuffs */
 				exit(2);
 			}
 			if (devlist == NULL)
 				devlist = conf_get_devs();
 			if (devlist == NULL) {
 				pr_err("No devices listed in %s\n", configfile?configfile:DefaultConfFile);
-				free_dlm_hookers(); /* close dlm stuffs */
+				free_hookers(); /* close dlm stuffs */
 				exit(1);
 			}
 			rv = Examine(devlist, &c, ss);
@@ -1485,7 +1488,7 @@ int main(int argc, char *argv[])
 				rv = Write_rules(udev_filename);
 			else {
 				pr_err("No devices given.\n");
-				free_dlm_hookers(); /* close dlm stuffs */
+				free_hookers(); /* close dlm stuffs */
 				exit(2);
 			}
 		} else
@@ -1625,7 +1628,7 @@ int main(int argc, char *argv[])
 		break;
 	}
 
-	free_dlm_hookers(); /* close dlm stuffs */
+	free_hookers(); /* close dlm stuffs */
 	exit(rv);
 }
 
diff --git a/mdadm.h b/mdadm.h
index c53adc5..dd7fef4 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -52,6 +52,12 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 #define srandom srand
 #endif
 
+#ifdef NO_COROSYNC
+#define CS_OK 1
+#else
+#include	<corosync/cmap.h>
+#endif
+
 #ifndef NO_DLM
 #include	<libdlm.h>
 #include	<errno.h>
@@ -1449,6 +1455,16 @@ extern char *fd2devnm(int fd);
 
 extern int in_initrd(void);
 
+struct cmap_hookers {
+	void *cmap_handle;	/* corosync lib related */
+
+	int (*initialize)(cmap_handle_t *handle);
+	int (*get_string)(cmap_handle_t handle,
+			  const char *string,
+			  char **name);
+	int (*finalize)(cmap_handle_t handle);
+};
+
 struct dlm_hookers {
 	void *dlm_handle;	/* dlm lib related */
 
@@ -1475,6 +1491,10 @@ extern int cluster_get_dlmlock(struct supertype *st, int *lockid);
 extern int cluster_release_dlmlock(struct supertype *st, int lockid);
 extern void set_dlm_hookers(void);
 extern void free_dlm_hookers(void);
+extern void set_cmap_hookers(void);
+extern void free_cmap_hookers(void);
+extern void set_hookers(void);
+extern void free_hookers(void);
 
 #define _ROUND_UP(val, base)	(((val) + (base) - 1) & ~(base - 1))
 #define ROUND_UP(val, base)	_ROUND_UP(val, (typeof(val))(base))
diff --git a/util.c b/util.c
index 19ecf9f..1c87eb5 100644
--- a/util.c
+++ b/util.c
@@ -36,13 +36,6 @@
 #include	<dirent.h>
 #include	<signal.h>
 #include	<dlfcn.h>
-#include	<stdint.h>
-#ifdef NO_COROSYNC
- typedef uint64_t cmap_handle_t;
- #define CS_OK 1
-#else
- #include	<corosync/cmap.h>
-#endif
 
 
 /*
@@ -2126,40 +2119,53 @@ void reopen_mddev(int mdfd)
 		dup2(fd, mdfd);
 }
 
-int get_cluster_name(char **cluster_name)
+static struct cmap_hookers *cmap_hookers = NULL;
+static int is_cmap_hookers_ready = 0;
+
+void set_cmap_hookers(void)
 {
-        void *lib_handle = NULL;
-        int rv = -1;
+	cmap_hookers = xmalloc(sizeof(struct cmap_hookers));
+	if (!cmap_hookers)
+		return;
 
-        cmap_handle_t handle;
-        static int (*initialize)(cmap_handle_t *handle);
-        static int (*get_string)(cmap_handle_t handle,
-				 const char *string,
-				 char **name);
-        static int (*finalize)(cmap_handle_t handle);
+	cmap_hookers->cmap_handle = dlopen("libcmap.so.4", RTLD_NOW | RTLD_LOCAL);
+	if (!cmap_hookers->cmap_handle)
+		return;
 
+	cmap_hookers->initialize = dlsym(cmap_hookers->cmap_handle, "cmap_initialize");
+	cmap_hookers->get_string = dlsym(cmap_hookers->cmap_handle, "cmap_get_string");
+	cmap_hookers->finalize = dlsym(cmap_hookers->cmap_handle, "cmap_finalize");
 
-        lib_handle = dlopen("libcmap.so.4", RTLD_NOW | RTLD_LOCAL);
-        if (!lib_handle)
-                return rv;
+	if (!cmap_hookers->initialize || !cmap_hookers->get_string ||
+	    !cmap_hookers->finalize)
+		dlclose(cmap_hookers->cmap_handle);
+	else
+		is_cmap_hookers_ready = 1;
+}
 
-        initialize = dlsym(lib_handle, "cmap_initialize");
-        if (!initialize)
-                goto out;
+void free_cmap_hookers(void)
+{
+	if (is_cmap_hookers_ready) {
+		dlclose(cmap_hookers->cmap_handle);
+		is_cmap_hookers_ready = 0;
+	}
+	if (cmap_hookers)
+		free(cmap_hookers);
+}
 
-        get_string = dlsym(lib_handle, "cmap_get_string");
-        if (!get_string)
-                goto out;
+int get_cluster_name(char **cluster_name)
+{
+        int rv = -1;
+	cmap_handle_t handle;
 
-        finalize = dlsym(lib_handle, "cmap_finalize");
-        if (!finalize)
-                goto out;
+	if (!is_cmap_hookers_ready)
+		return rv;
 
-        rv = initialize(&handle);
+        rv = cmap_hookers->initialize(&handle);
         if (rv != CS_OK)
                 goto out;
 
-        rv = get_string(handle, "totem.cluster_name", cluster_name);
+        rv = cmap_hookers->get_string(handle, "totem.cluster_name", cluster_name);
         if (rv != CS_OK) {
                 free(*cluster_name);
                 rv = -1;
@@ -2168,9 +2174,8 @@ int get_cluster_name(char **cluster_name)
 
         rv = 0;
 name_err:
-        finalize(handle);
+        cmap_hookers->finalize(handle);
 out:
-        dlclose(lib_handle);
         return rv;
 }
 
@@ -2208,3 +2213,15 @@ void free_dlm_hookers(void)
 	if (dlm_hookers)
 		free(dlm_hookers);
 }
+
+void set_hookers(void)
+{
+	set_dlm_hookers();
+	set_cmap_hookers();
+}
+
+void free_hookers(void)
+{
+	free_dlm_hookers();
+	free_cmap_hookers();
+}
-- 
1.7.12.4

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux