[Cluster-devel] cluster/gfs2/tool gfs2_tool.h misc.c util.c

rpeterso at sourceware.org rpeterso at sourceware.org
Wed Nov 7 14:58:00 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	rpeterso at sourceware.org	2007-11-07 14:58:00

Modified files:
	gfs2/tool      : gfs2_tool.h misc.c util.c 

Log message:
	Resolves: bz 352581: GFS2: implement gfs2_tool lockdump

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/gfs2_tool.h.diff?cvsroot=cluster&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/misc.c.diff?cvsroot=cluster&r1=1.11&r2=1.12
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/util.c.diff?cvsroot=cluster&r1=1.7&r2=1.8

--- cluster/gfs2/tool/gfs2_tool.h	2007/10/30 14:06:06	1.8
+++ cluster/gfs2/tool/gfs2_tool.h	2007/11/07 14:57:59	1.9
@@ -95,7 +95,7 @@
 
 char *get_list(void);
 char **str2lines(char *str);
-const char *find_debugfs_mount(void);
+char *find_debugfs_mount(void);
 char *mp2fsname(char *mp);
 char *name2value(char *str, char *name);
 uint32_t name2u32(char *str, char *name);
--- cluster/gfs2/tool/misc.c	2007/10/30 14:06:06	1.11
+++ cluster/gfs2/tool/misc.c	2007/11/07 14:57:59	1.12
@@ -28,6 +28,7 @@
 
 #define __user
 #include <linux/gfs2_ondisk.h>
+#include <sys/mount.h>
 #include <linux/fs.h>
 
 #include "libgfs2.h"
@@ -110,7 +111,67 @@
 void
 print_lockdump(int argc, char **argv)
 {
-	die("lockdump not implemented: use debugfs instead.  \ne.g. cat /sys/kernel/debug/gfs2/clustname\\:fsname/glocks\n");
+	char path[PATH_MAX];
+	char *name, line[PATH_MAX];
+	char *debugfs;
+	FILE *file;
+	int rc = -1, debug_dir_existed = 1;
+
+	/* See if debugfs is mounted, and if not, mount it. */
+	debugfs = find_debugfs_mount();
+	if (!debugfs) {
+		debugfs = malloc(20);
+		if (!debugfs)
+			die("Can't allocate memory for debugfs.\n");
+		memset(debugfs, 0, 20);
+		strcpy(debugfs, "/tmp/debugfs");
+
+		if (access(debugfs, F_OK)) {
+			debug_dir_existed = mkdir(debugfs, 644);
+			if (debug_dir_existed) {
+				fprintf(stderr,
+					"Can't create %s mount point.\n",
+					debugfs);
+				free(debugfs);
+				exit(-1);
+			}
+		}
+		rc = mount("none", debugfs, "debugfs", 0, NULL);
+		if (rc) {
+			fprintf(stderr,
+				"Can't mount debugfs.  "
+				"Maybe your kernel doesn't support it.\n");
+				free(debugfs);
+				exit(-1);
+		}
+	}
+	name = mp2fsname(argv[optind]);
+	if (name) {
+		sprintf(path, "%s/gfs2/%s/glocks", debugfs, name);
+		free(name);
+		file = fopen(path, "rt");
+		if (file) {
+			while (fgets(line, PATH_MAX, file)) {
+				printf(line);
+			}
+			fclose(file);
+		} else {
+			fprintf(stderr, "Can't open %s: %s\n", path,
+				strerror(errno));
+		}
+	} else {
+		fprintf(stderr, "Unable to locate sysfs for mount point %s.\n",
+			argv[optind]);
+	}
+	/* Check if we mounted the debugfs and if so, unmount it. */
+	if (!rc) {
+		umount(debugfs);
+		/* Check if we created the debugfs mount point and if so,
+		   delete it. */
+		if (!debug_dir_existed)
+			rmdir(debugfs);
+	}
+	free(debugfs);
 }
 
 /**
--- cluster/gfs2/tool/util.c	2007/11/06 20:22:55	1.7
+++ cluster/gfs2/tool/util.c	2007/11/07 14:57:59	1.8
@@ -283,6 +283,36 @@
 	return name;
 }
 
+char *
+find_debugfs_mount(void)
+{
+	FILE *file;
+	char line[PATH_MAX];
+	char device[PATH_MAX], type[PATH_MAX];
+	char *path;
+
+	file = fopen("/proc/mounts", "rt");
+	if (!file)
+		die("can't open /proc/mounts: %s\n", strerror(errno));
+
+	path = malloc(PATH_MAX);
+	if (!path)
+		die("Can't allocate memory for debugfs.\n");
+	while (fgets(line, PATH_MAX, file)) {
+
+		if (sscanf(line, "%s %s %s", device, path, type) != 3)
+			continue;
+		if (!strcmp(type, "debugfs")) {
+			fclose(file);
+			return path;
+		}
+	}
+
+	free(path);
+	fclose(file);
+	return NULL;
+}
+
 /* The fsname can be substituted for the mountpoint on the command line.
    This is necessary when we can't resolve a devname from /proc/mounts
    to a fsname. */




More information about the Cluster-devel mailing list