[Cluster-devel] cluster/gfs2 libgfs2/misc.c tool/Makefile tool ...

rpeterso at sourceware.org rpeterso at sourceware.org
Thu Oct 25 14:14:34 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	rpeterso at sourceware.org	2007-10-25 14:14:33

Modified files:
	gfs2/libgfs2   : misc.c 
	gfs2/tool      : Makefile counters.c df.c gfs2_tool.h layout.c 
	                 misc.c tune.c util.c 

Log message:
	Resolves: bz 345501: GFS2: gfs2 utils uses non-canonicalized names

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/libgfs2/misc.c.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/Makefile.diff?cvsroot=cluster&r1=1.13&r2=1.14
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/counters.c.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/df.c.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/gfs2_tool.h.diff?cvsroot=cluster&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/layout.c.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/misc.c.diff?cvsroot=cluster&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/tune.c.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/util.c.diff?cvsroot=cluster&r1=1.5&r2=1.6

--- cluster/gfs2/libgfs2/misc.c	2007/06/26 01:43:17	1.4
+++ cluster/gfs2/libgfs2/misc.c	2007/10/25 14:14:32	1.5
@@ -170,16 +170,18 @@
 check_for_gfs2(struct gfs2_sbd *sdp)
 {
 	FILE *fp = fopen("/proc/mounts", "r");
-	char *name = sdp->path_name;
 	char buffer[PATH_MAX];
 	char fstype[80];
 	int fsdump, fspass, ret;
 	char fspath[PATH_MAX];
 	char fsoptions[PATH_MAX];
+	char *realname;
 
-	if (name[strlen(name) - 1] == '/')
-		name[strlen(name) - 1] = '\0';
-
+	realname = realpath(sdp->path_name, NULL);
+	if (!realname) {
+		perror(sdp->path_name);
+		return;
+	}
 	if (fp == NULL) {
 		perror("open: /proc/mounts");
 		exit(EXIT_FAILURE);
@@ -199,19 +201,21 @@
 			continue;
 
 		/* Check if they specified the device instead of mnt point */
-		if (strcmp(sdp->device_name, name) == 0)
+		if (strcmp(sdp->device_name, realname) == 0)
 			strcpy(sdp->path_name, fspath); /* fix it */
-		else if (strcmp(fspath, name) != 0)
+		else if (strcmp(fspath, realname) != 0)
 			continue;
 
 		fclose(fp);
 		if (strncmp(sdp->device_name, "/dev/loop", 9) == 0)
 			die("Cannot perform this operation on a loopback GFS2 mount.\n");
 
+		free(realname);
 		return;
 	}
+	free(realname);
 	fclose(fp);
-	die("gfs2 Filesystem %s is not mounted.\n", name);
+	die("gfs2 Filesystem %s is not mounted.\n", sdp->path_name);
 }
 
 void 
--- cluster/gfs2/tool/Makefile	2007/08/28 04:35:44	1.13
+++ cluster/gfs2/tool/Makefile	2007/10/25 14:14:33	1.14
@@ -27,7 +27,7 @@
 
 CFLAGS += -D_FILE_OFFSET_BITS=64
 CFLAGS += -I${KERNEL_SRC}/fs/gfs2/ -I${KERNEL_SRC}/include/
-CFLAGS += -I../include
+CFLAGS += -I../include -I../libgfs2/
 CFLAGS += -I${incdir}
 
 LDFLAGS += -L../libgfs2 -lgfs2
--- cluster/gfs2/tool/counters.c	2006/05/05 18:06:09	1.3
+++ cluster/gfs2/tool/counters.c	2007/10/25 14:14:33	1.4
@@ -28,6 +28,7 @@
 #include "osi_list.h"
 
 #include "gfs2_tool.h"
+#include "libgfs2.h"
 
 #define SIZE (65536)
 
@@ -132,24 +133,19 @@
 print_counters(int argc, char **argv)
 {
 	unsigned int i = interval;
-	char *path, *fs;
-	int fd;
+	char *fs;
+	struct gfs2_sbd sbd;
 
 	interval = 1;
 
 	if (optind < argc)
-		path = argv[optind++];
+		sbd.path_name = argv[optind++];
 	else
 		die("Usage: gfs2_tool counters <mountpoint>\n");
 
-	fd = open(path, O_RDONLY);
-	if (fd < 0)
-		die("can't open file %s: %s\n", path, strerror(errno));
+	check_for_gfs2(&sbd);
 
-	check_for_gfs2(fd, path);
-	close(fd);
-
-	fs = mp2fsname(path);
+	fs = mp2fsname(sbd.path_name);
 
 	for (;;) {
 		print_line(fs, "glock_count", "locks", 0);
@@ -204,6 +200,4 @@
 			first = FALSE;
 		}
 	}
-
-	close(fd);
 }
--- cluster/gfs2/tool/df.c	2006/05/05 18:06:09	1.7
+++ cluster/gfs2/tool/df.c	2007/10/25 14:14:33	1.8
@@ -29,6 +29,7 @@
 #include <linux/gfs2_ondisk.h>
 
 #include "gfs2_tool.h"
+#include "libgfs2.h"
 
 #define SIZE (65536)
 
@@ -42,7 +43,6 @@
 static void
 do_df_one(char *path)
 {
-	int fd;
 	struct gfs2_ioctl gi;
 	/* char stat_gfs2[SIZE]; */
 	/* unsigned int percentage; */
@@ -53,14 +53,15 @@
 	unsigned int flags;
 	char *fs, *value;
  	int error;
+	struct gfs2_sbd sbd;
 
+	sbd.path_name = path;
+	check_for_gfs2(&sbd);
 
-	fd = open(path, O_RDONLY);
-	if (fd < 0)
+	sbd.device_fd = open(path, O_RDONLY);
+	if (sbd.device_fd < 0)
 		die("can't open %s: %s\n", path, strerror(errno));
 
-	check_for_gfs2(fd, path);
-
 	fs = mp2fsname(path);
 
 	/*
@@ -76,7 +77,7 @@
 		gi.gi_data = (char *)&sb;
 		gi.gi_size = sizeof(struct gfs2_sb);
 
-		error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+		error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 		if (error != gi.gi_size)
 			die("error doing get_super (%d): %s\n",
 			    error, strerror(errno));
@@ -90,7 +91,7 @@
 		gi.gi_data = (char *)&ji;
 		gi.gi_size = sizeof(struct gfs2_dinode);
 
-		error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+		error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 		if (error != gi.gi_size)
 			die("error doing get_hfile_stat for jindex (%d): %s\n",
 			    error, strerror(errno));
@@ -104,13 +105,13 @@
 		gi.gi_data = (char *)&ri;
 		gi.gi_size = sizeof(struct gfs2_dinode);
 
-		error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+		error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 		if (error != gi.gi_size)
 			die("error doing get_hfile_stat for rindex (%d): %s\n",
 			    error, strerror(errno));
 	}
 
-	close(fd);
+	close(sbd.device_fd);
 
 	journals = ji.di_entries - 2;
 
--- cluster/gfs2/tool/gfs2_tool.h	2007/05/10 15:47:45	1.6
+++ cluster/gfs2/tool/gfs2_tool.h	2007/10/25 14:14:33	1.7
@@ -92,7 +92,6 @@
 
 /* From util.c */
 
-void check_for_gfs2(int fd, char *path);
 char *get_list(void);
 char **str2lines(char *str);
 const char *find_debugfs_mount(void);
--- cluster/gfs2/tool/layout.c	2006/05/05 18:06:09	1.3
+++ cluster/gfs2/tool/layout.c	2007/10/25 14:14:33	1.4
@@ -32,6 +32,7 @@
 #include "linux_endian.h"
 
 #include "gfs2_tool.h"
+#include "libgfs2.h"
 
 #define LAYOUT_DATA_QUANTUM (4194304)
 
@@ -765,11 +766,10 @@
 print_layout(int argc, char **argv)
 {
 	world_t w;
-	char *path;
-	int fd;
 	int retry = TRUE;
 	struct gfs2_ioctl gi;
 	int error;
+	struct gfs2_sbd sbd;
 
 	memset(&w, 0, sizeof(world_t));
 	w.buf_size = LAYOUT_DATA_QUANTUM;
@@ -779,17 +779,17 @@
 	if (optind == argc)
 		die("Usage: gfs2_tool layout <filename> [buffersize]\n");
 
-	path = argv[optind++];
+	sbd.path_name = argv[optind++];
 	if (optind < argc ) {
 		w.buf_size = atoi(argv[3]);
 		retry = FALSE;
 	}
 
-	fd = open(path, O_RDONLY);
-	if (fd < 0)
-		die("can't open %s: %s\n", path, strerror(errno));
+	sbd.device_fd = open(sbd.path_name, O_RDONLY);
+	if (sbd.device_fd < 0)
+		die("can't open %s: %s\n", sbd.path_name, strerror(errno));
 
-	check_for_gfs2(fd, path);
+	check_for_gfs2(&sbd);
 
 	{
 		char *argv[] = { "get_super" };
@@ -799,7 +799,7 @@
 		gi.gi_data = (char *)&w.sb;
 		gi.gi_size = sizeof(struct gfs2_sb);
 
-		error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+		error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 		if (error != gi.gi_size)
 			die("error doing get_super (%d): %s\n",
 			    error, strerror(errno));
@@ -825,7 +825,7 @@
 		gi.gi_data = w.buf_data;
 		gi.gi_size = w.buf_size;
 
-		w.buf_count = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+		w.buf_count = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 		if (w.buf_count >= 0)
 			break;
 
@@ -855,7 +855,7 @@
 
 	check_for_untouched_buffers(&w);
 
-	close(fd);
+	close(sbd.device_fd);
 }
 #endif /* #if GFS2_TOOL_FEATURE_IMPLEMENTED */
 
--- cluster/gfs2/tool/misc.c	2006/10/26 18:42:25	1.8
+++ cluster/gfs2/tool/misc.c	2007/10/25 14:14:33	1.9
@@ -30,6 +30,7 @@
 #include <linux/gfs2_ondisk.h>
 #include <linux/fs.h>
 
+#include "libgfs2.h"
 #include "gfs2_tool.h"
 
 #if GFS2_TOOL_FEATURE_IMPLEMENTED
@@ -47,6 +48,7 @@
 	struct gfs2_ioctl gi;
 	int fd;
 	int error;
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool flush <filenames>\n");
@@ -59,7 +61,8 @@
 		if (fd < 0)
 			die("can't open %s: %s\n", argv[optind], strerror(errno));
 
-		check_for_gfs2(fd, argv[optind]);
+		sbd.path_name = argv[optind];
+		check_for_gfs2(&sbd);
 
 		error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
 		if (error)
@@ -107,7 +110,7 @@
 void
 print_lockdump(int argc, char **argv)
 {
-	die("lockdump not implemented\n");
+	die("lockdump not implemented: use debugfs instead.  \ne.g. cat /sys/kernel/debug/gfs2/clustname\:fsname/glocks\n");
 }
 
 /**
@@ -237,32 +240,33 @@
 void
 print_stat(int argc, char **argv)
 {
-	int fd;
 	char *gi_argv[] = { "get_file_stat" };
 	struct gfs2_ioctl gi;
 	struct gfs2_dinode di;
 	int error;
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool stat <filename>\n");
 
-	fd = open(argv[optind], O_RDONLY);
-	if (fd < 0)
+	sbd.device_fd = open(argv[optind], O_RDONLY);
+	if (sbd.device_fd < 0)
 		die("can't open %s: %s\n", argv[optind], strerror(errno));
 
-	check_for_gfs2(fd, argv[optind]);
+	sbd.path_name = argv[optind];
+	check_for_gfs2(&sbd);
 
 	gi.gi_argc = 1;
 	gi.gi_argv = gi_argv;
 	gi.gi_data = (char *)&di;
 	gi.gi_size = sizeof(struct gfs2_dinode);
 
-	error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+	error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 	if (error != gi.gi_size)
 		die("error doing get_file_stat (%d): %s\n",
 		    error, strerror(errno));
 
-	close(fd);
+	close(sbd.device_fd);
 
 	gfs2_dinode_print(&di);
 	printf("\n");
@@ -279,32 +283,33 @@
 void
 print_sb(int argc, char **argv)
 {
-	int fd;
 	char *gi_argv[] = { "get_super" };
 	struct gfs2_ioctl gi;
 	struct gfs2_sb sb;
 	int error;
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool getsb <mountpoint>\n");
 
-	fd = open(argv[optind], O_RDONLY);
-	if (fd < 0)
+	sbd.device_fd = open(argv[optind], O_RDONLY);
+	if (sbd.device_fd < 0)
 		die("can't open %s: %s\n", argv[optind], strerror(errno));
 	
-	check_for_gfs2(fd, argv[optind]);
+	sbd.path_name = argv[optind];
+	check_for_gfs2(&sbd);
 
 	gi.gi_argc = 1;
 	gi.gi_argv = gi_argv;
 	gi.gi_data = (char *)&sb;
 	gi.gi_size = sizeof(struct gfs2_sb);
 
-	error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+	error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 	if (error != gi.gi_size)
 		die("error doing get_super (%d): %s\n",
 		    error, strerror(errno));
 
-	close(fd);
+	close(sbd.device_fd);
 
 	gfs2_sb_print(&sb);
 }
@@ -321,22 +326,17 @@
 void
 print_args(int argc, char **argv)
 {
-	int fd;
 	char *fs;
 	DIR *d;
 	struct dirent *de;
 	char path[PATH_MAX];
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool getargs <mountpoint>\n");
 
-	fd = open(argv[optind], O_RDONLY);
-	if (fd < 0)
-		die("can't open %s: %s\n", argv[optind], strerror(errno));
-	
-	check_for_gfs2(fd, argv[optind]);
-
-	close(fd);
+	sbd.path_name = argv[optind];
+	check_for_gfs2(&sbd);
 	fs = mp2fsname(argv[optind]);
 
 	memset(path, 0, PATH_MAX);
@@ -369,19 +369,19 @@
 void
 print_jindex(int argc, char **argv)
 {
-	int fd;
 	struct gfs2_ioctl gi;
 	int error;
-
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool jindex <mountpoint>\n");
 
-	fd = open(argv[optind], O_RDONLY);
-	if (fd < 0)
+	sbd.device_fd = open(argv[optind], O_RDONLY);
+	if (sbd.device_fd < 0)
 		die("can't open %s: %s\n", argv[optind], strerror(errno));
 
-	check_for_gfs2(fd, argv[optind]);
+	sbd.path_name = argv[optind];
+	check_for_gfs2(&sdp);
 
 
 	{
@@ -394,7 +394,7 @@
 		gi.gi_data = (char *)&di;
 		gi.gi_size = sizeof(struct gfs2_dinode);
 
-		error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+		error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 		if (error != gi.gi_size)
 			die("error doing get_hfile_stat (%d): %s\n",
 			    error, strerror(errno));
@@ -404,7 +404,7 @@
 	}
 
 
-	close(fd);
+	close(sbd.device_fd);
 }
 
 /**
@@ -417,21 +417,21 @@
 void
 print_rindex(int argc, char **argv)
 {
-	int fd;
 	struct gfs2_ioctl gi;
 	uint64_t offset;
 	unsigned int x;
 	int error;
-
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool rindex <mountpoint>\n");
 
-	fd = open(argv[optind], O_RDONLY);
-	if (fd < 0)
+	sbd.device_fd = open(argv[optind], O_RDONLY);
+	if (sbd.device_fd < 0)
 		die("can't open %s: %s\n", argv[optind], strerror(errno));
 
-	check_for_gfs2(fd, argv[optind]);
+	sbd.path_name = argv[optind];
+	check_for_gfs2(&sdp);
 
 
 	{
@@ -444,7 +444,7 @@
 		gi.gi_data = (char *)&di;
 		gi.gi_size = sizeof(struct gfs2_dinode);
 
-		error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+		error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 		if (error != gi.gi_size)
 			die("error doing get_hfile_stat (%d): %s\n",
 			    error, strerror(errno));
@@ -465,7 +465,7 @@
 		gi.gi_size = sizeof(struct gfs2_rindex);
 		gi.gi_offset = offset;
 
-		error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+		error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 		if (!error)
 			break;
 		if (error != sizeof(struct gfs2_rindex))
@@ -479,7 +479,7 @@
 	}
 
 
-	close(fd);
+	close(sbd.device_fd);
 }
 
 /**
@@ -492,21 +492,21 @@
 void
 print_quota(int argc, char **argv)
 {
-	int fd;
 	struct gfs2_ioctl gi;
 	uint64_t offset;
 	unsigned int x;
 	int error;
-
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool quota <mountpoint>\n");
 
-	fd = open(argv[optind], O_RDONLY);
-	if (fd < 0)
+	sbd.device_fd = open(argv[optind], O_RDONLY);
+	if (sbd.device_fd < 0)
 		die("can't open %s: %s\n", argv[optind], strerror(errno));
 
-	check_for_gfs2(fd, argv[optind]);
+	sbd.path_name = argv[optind];
+	check_for_gfs2(&sdp);
 
 
 	{
@@ -519,7 +519,7 @@
 		gi.gi_data = (char *)&di;
 		gi.gi_size = sizeof(struct gfs2_dinode);
 
-		error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+		error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 		if (error != gi.gi_size)
 			die("error doing get_hfile_stat (%d): %s\n",
 			    error, strerror(errno));
@@ -540,7 +540,7 @@
 		gi.gi_size = sizeof(struct gfs2_quota);
 		gi.gi_offset = offset;
 
-		error = ioctl(fd, GFS2_IOCTL_SUPER, &gi);
+		error = ioctl(sbd.device_fd, GFS2_IOCTL_SUPER, &gi);
 		if (!error)
 			break;
 		if (error != sizeof(struct gfs2_quota))
@@ -556,7 +556,7 @@
 	}
 
 
-	close(fd);
+	close(sbd.device_fd);
 }
 #endif /* #if GFS2_TOOL_FEATURE_IMPLEMENTED */
 
@@ -582,19 +582,14 @@
 void
 do_shrink(int argc, char **argv)
 {
-	int fd;
 	char *fs;
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool shrink <mountpoint>\n");
 
-	fd = open(argv[optind], O_RDONLY);
-	if (fd < 0)
-		die("can't open %s: %s\n",
-		    argv[optind], strerror(errno));
-
-	check_for_gfs2(fd, argv[optind]);
-	close(fd);
+	sbd.path_name = argv[optind];
+	check_for_gfs2(&sbd);
 	fs = mp2fsname(argv[optind]);
 	
 	set_sysfs(fs, "shrink", "1");
@@ -611,10 +606,13 @@
 do_withdraw(int argc, char **argv)
 {
 	char *name;
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool withdraw <mountpoint>\n");
 
+	sbd.path_name = argv[optind];
+	check_for_gfs2(&sbd);
 	name = mp2fsname(argv[optind]);
 
 	set_sysfs(name, "withdraw", "1");
--- cluster/gfs2/tool/tune.c	2006/05/05 18:06:09	1.3
+++ cluster/gfs2/tool/tune.c	2007/10/25 14:14:33	1.4
@@ -29,6 +29,7 @@
 #define __user
 
 #include "gfs2_tool.h"
+#include "libgfs2.h"
 
 #define SIZE (65536)
 
@@ -42,24 +43,19 @@
 void
 get_tune(int argc, char **argv)
 {
-	int fd;
 	char path[PATH_MAX];
 	char *fs;
 	DIR *d;
 	struct dirent *de;
 	double ratio;
 	unsigned int num, den;
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool gettune <mountpoint>\n");
 
-	fd = open(argv[optind], O_RDONLY);
-	if (fd < 0)
-		die("can't open file %s: %s\n",
-		    argv[optind], strerror(errno));
-
-	check_for_gfs2(fd, argv[optind]);
-	close(fd);
+	sbd.path_name = argv[optind];
+	check_for_gfs2(&sbd);
 	fs = mp2fsname(argv[optind]);
 	memset(path, 0, PATH_MAX);
 	snprintf(path, PATH_MAX - 1, "%s/%s/tune", SYS_BASE, fs);
@@ -94,15 +90,15 @@
 void
 set_tune(int argc, char **argv)
 {
-	char *mp, *param, *value;
-	int fd;
+	char *param, *value;
 	char tune_base[SIZE] = "tune/";
 	char buf[256];
 	char *fs;
+	struct gfs2_sbd sbd;
 
 	if (optind == argc)
 		die("Usage: gfs2_tool settune <mountpoint> <parameter> <value>\n");
-	mp = argv[optind++];
+	sbd.path_name = argv[optind++];
 	if (optind == argc)
 		die("Usage: gfs2_tool settune <mountpoint> <parameter> <value>\n");
 	param = argv[optind++];
@@ -110,14 +106,8 @@
 		die("Usage: gfs2_tool settune <mountpoint> <parameter> <value>\n");
 	value = argv[optind++];
 
-	fd = open(mp, O_RDONLY);
-	if (fd < 0)
-		die("can't open file %s: %s\n",
-		    mp, strerror(errno));
-
-	check_for_gfs2(fd, mp);
-	close(fd);
-	fs = mp2fsname(mp);
+	check_for_gfs2(&sbd);
+	fs = mp2fsname(sbd.path_name);
 
 	if (strcmp(param, "quota_scale") == 0) {
 		float s;
--- cluster/gfs2/tool/util.c	2006/06/15 16:40:48	1.5
+++ cluster/gfs2/tool/util.c	2007/10/25 14:14:33	1.6
@@ -168,34 +168,6 @@
 }
 
 /**
- * check_for_gfs2 - Check to see if a descriptor is a file on a GFS2 filesystem
- * @fd: the file descriptor
- * @path: the path used to open the descriptor
- *
- */
-
-/* 
- * FIXME check_for_gfs2() uses an ioctl that's not supported by gfs2.
- * This function is used as a sanity check before performing certain
- * operations.
- */
-#if 0
-void
-check_for_gfs2(int fd, char *path)
-{
-	unsigned int magic = 0;
-	int error = 0;
-	error = ioctl(fd, GFS2_IOCTL_IDENTIFY, &magic);
-	if (error || magic != GFS2_MAGIC)
-		die("%s is not a GFS2 file/filesystem\n",
-		    path);
-}
-#else
-void check_for_gfs2(int fd, char *path) {}
-#endif /* #if 0 */
-
-
-/**
  * str2lines - parse a string into lines
  * @list: the list
  *
@@ -280,7 +252,11 @@
 	char line[PATH_MAX];
 	static char device[PATH_MAX];
 	char *name = NULL;
+	char *realname;
 
+	realname = realpath(mp, NULL);
+	if (!realname)
+		die("Unable to allocate memory for name resolution.\n");
 	file = fopen("/proc/mounts", "r");
 	if (!file)
 		die("can't open /proc/mounts: %s\n", strerror(errno));
@@ -290,7 +266,7 @@
 
 		if (sscanf(line, "%s %s %s", device, path, type) != 3)
 			continue;
-		if (strcmp(path, mp))
+		if (strcmp(path, realname))
 			continue;
 		if (strcmp(type, "gfs2"))
 			die("%s is not a GFS2 filesystem\n", mp);
@@ -300,6 +276,7 @@
 		break;
 	}
 
+	free(realname);
 	fclose(file);
 
 	return name;




More information about the Cluster-devel mailing list