gfs2-utils: master - mkfs.gfs2: Check for symlinks before reporting device contents

Andrew Price andyp at fedoraproject.org
Fri Jun 29 09:51:32 UTC 2012


Gitweb:        http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=954ccb986b9a18204e7d3137f4fae97bbcb2be8a
Commit:        954ccb986b9a18204e7d3137f4fae97bbcb2be8a
Parent:        9803f25df8f32c8eb4b99957097017df52bdd6fd
Author:        Andrew Price <anprice at redhat.com>
AuthorDate:    Thu Jun 21 14:14:27 2012 +0100
Committer:     Andrew Price <anprice at redhat.com>
CommitterDate: Thu Jun 21 14:14:27 2012 +0100

mkfs.gfs2: Check for symlinks before reporting device contents

When using symlinks with mkfs.gfs2 it reports what the symlink points
to instead of the contents of the device, like so:

 # ./mkfs.gfs2 -p lock_nolock /dev/vg/test
 This will destroy any data on /dev/vg/test.
 It appears to contain: symbolic link to `../dm-3'

This patch resolves symlinks before checking the device contents to make
the output more informative:

 # ./mkfs.gfs2 -p lock_nolock /dev/vg/test
 /dev/vg/test is a symlink to /dev/dm-3
 This will destroy any data on /dev/dm-3.
 It appears to contain: GFS2 Filesystem (blocksize 4096, lockproto lock_nolock)

Signed-off-by: Andrew Price <anprice at redhat.com>
---
 gfs2/mkfs/main_mkfs.c |   35 ++++++++++++++++++++++++++++++++---
 1 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
index e6b00a0..957b144 100644
--- a/gfs2/mkfs/main_mkfs.c
+++ b/gfs2/mkfs/main_mkfs.c
@@ -518,19 +518,46 @@ print_results(struct gfs2_sbd *sdp, uint64_t real_device_size,
 	printf("\n");
 }
 
+
+/**
+ * If path is a symlink, return 1 with *abspath pointing to the absolute path,
+ * otherwise return 0. Exit on errors. The caller must free the memory pointed
+ * to by *abspath.
+ */
+static int is_symlink(char *path, char **abspath)
+{
+	struct stat lnkstat;
+
+	if (lstat(path, &lnkstat) == -1) {
+		perror("Failed to lstat the device");
+		exit(EXIT_FAILURE);
+	}
+	if (!S_ISLNK(lnkstat.st_mode)) {
+		return 0;
+	}
+	*abspath = canonicalize_file_name(path);
+	if (*abspath == NULL) {
+		perror(_("Could not find the absolute path of the device"));
+		exit(EXIT_FAILURE);
+	}
+	printf( _("%s is a symlink to %s\n"), path, *abspath);
+	return 1;
+}
+
 /**
  * main_mkfs - do everything
  * @argc:
  * @argv:
  *
  */
-
 void main_mkfs(int argc, char *argv[])
 {
 	struct gfs2_sbd sbd, *sdp = &sbd;
 	int error;
 	int rgsize_specified = 0;
 	unsigned char uuid[16];
+	char *absname = NULL;
+	int islnk = 0;
 
 	memset(sdp, 0, sizeof(struct gfs2_sbd));
 	sdp->bsize = -1;
@@ -561,8 +588,10 @@ void main_mkfs(int argc, char *argv[])
 	}
 
 	if (!sdp->override) {
-		printf( _("This will destroy any data on %s.\n"), sdp->device_name);
-		check_dev_content(sdp->device_name);
+		islnk = is_symlink(sdp->device_name, &absname);
+		printf(_("This will destroy any data on %s.\n"), islnk ? absname : sdp->device_name);
+		check_dev_content(islnk ? absname : sdp->device_name);
+		free(absname);
 		are_you_sure();
 	}
 


More information about the cluster-commits mailing list