From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Price Date: Thu, 21 Jun 2012 14:30:38 +0100 Subject: [Cluster-devel] [PATCH v2] mkfs.gfs2: Check for symlinks before reporting device contents Message-ID: <1340285438-12445-1-git-send-email-anprice@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit (Patch updated to report symlinks similar to Fabio's suggestion) 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 --- 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(); } -- 1.7.7.6