[Ocfs2-tools-devel] [PATCH] ocfs2_hb_ctl: Make it knows device mapper.

Sunil Mushran sunil.mushran at oracle.com
Wed Apr 14 18:37:32 PDT 2010


sob.

Please add this only to the tools 1.4 branch.

In short, the logic here assumes that there is a dev/mapper
device. That may not always be true. We have a better solution.
But I am still testing it.

Tao Ma wrote:
> The old ocfs2_hb_ctl scan /proc/partitions and generate
> device name according to it. So this patch try to use
> device mapper device. It borrowed the function
> scan_dir_for_dev from mounted.c which is committed in
> b26f968befed03862bde95d9df60b20922d00c79.
>
> The main change includes:
> 1. Make compare_dev accepts a full device name so that
>    it won't generate it by itself now.
> 2. copy scan_dir_for_dev from mounted.c, I tried to add
>    it to libocfs2, but as it is really application related,
>    I gave up finally.
> 3. Change scan_devices so that it can generate the full
>    device name and the device mapper name now.
> 4. Fix a bug which set 'rc' while return 'err' in scan_devices.
>
> Signed-off-by: Tao Ma <tao.ma at oracle.com>
> ---
>  ocfs2_hb_ctl/ocfs2_hb_ctl.c |   91 +++++++++++++++++++++++++++++++-----------
>  1 files changed, 67 insertions(+), 24 deletions(-)
>
> diff --git a/ocfs2_hb_ctl/ocfs2_hb_ctl.c b/ocfs2_hb_ctl/ocfs2_hb_ctl.c
> index 3fe45ed..7cc9c1b 100644
> --- a/ocfs2_hb_ctl/ocfs2_hb_ctl.c
> +++ b/ocfs2_hb_ctl/ocfs2_hb_ctl.c
> @@ -39,10 +39,13 @@
>  #include <string.h>
>  #include <sys/stat.h>
>  #include <signal.h>
> +#include <dirent.h>
> +#include <ctype.h>
>  
>  #include "ocfs2/ocfs2.h"
>  
>  #define DEV_PREFIX      "/dev/"
> +#define DEV_MAPPER_DIR      "/dev/mapper"
>  #define PROC_IDE_FORMAT "/proc/ide/%s/media"
>  #define IONICE_PATH	"/usr/bin/ionice"
>  
> @@ -182,39 +185,28 @@ static errcode_t get_uuid(char *dev, char *uuid)
>  	return ret;
>  }
>  
> -static errcode_t compare_dev(const char *dev,
> +static errcode_t compare_dev(const char *device,
>  			     struct hb_ctl_options *hbo)
>  {
>  	errcode_t err;
> -	int len;
> -	char *device;
>  
>  	if (region_desc) {
>  		fprintf(stderr, "We have a descriptor already!\n");
>  		free_desc();
>  	}
>  	
> -	len = strlen(DEV_PREFIX) + strlen(dev) + 1;
> -	device = malloc(sizeof(char) * len);
> -	if (!device)
> -		return OCFS2_ET_NO_MEMORY;
> -	snprintf(device, len, DEV_PREFIX "%s", dev);
> -
>  	/* Any problem with getting the descriptor is NOT FOUND */
>  	err = OCFS2_ET_FILE_NOT_FOUND;
>  	if (get_desc(device))
>  		goto out;
>  
>  	if (!strcmp(region_desc->r_name, hbo->uuid_str)) {
> -		hbo->dev_str = device;
> +		hbo->dev_str = strdup(device);
>  		err = 0;
>  	} else
>  		free_desc();
>  
>  out:
> -	if (err && device)
> -		free(device);
> -
>  	return err;
>  }
>  
> @@ -252,31 +244,68 @@ static int as_ide_disk(const char *dev_name)
>  }  /* as_ide_disk() */
>  
>  
> +static void scan_dir_for_dev(char *dirname, dev_t devno,
> +			     char *devname, int len)
> +{
> +	DIR *dir;
> +	struct dirent *dp;
> +	char path[PATH_MAX];
> +	int dirlen;
> +	struct stat st;
> +
> +	dir = opendir(dirname);
> +	if (dir == NULL)
> +		return;
> +	dirlen = strlen(dirname) + 2;
> +	while ((dp = readdir(dir)) != 0) {
> +		if (dirlen + strlen(dp->d_name) >= sizeof(path))
> +			continue;
> +
> +		if (dp->d_name[0] == '.' &&
> +		    ((dp->d_name[1] == 0) ||
> +		     ((dp->d_name[1] == '.') && (dp->d_name[2] == 0))))
> +			continue;
> +
> +		sprintf(path, "%s/%s", dirname, dp->d_name);
> +		if (stat(path, &st) < 0)
> +			continue;
> +
> +		if (S_ISBLK(st.st_mode) && st.st_rdev == devno) {
> +			snprintf(devname, len, "%s", path);
> +			break;
> +		}
> +	}
> +	closedir(dir);
> +	return;
> +}
> +
>  /* Um, wow, this is, like, one big hardcode */
>  static errcode_t scan_devices(errcode_t (*func)(const char *,
>  						struct hb_ctl_options *),
>  			      struct hb_ctl_options *hbo)
>  {
>  	errcode_t err = 0;
> -	int rc, major, minor;
> +	int major, minor;
>  	FILE *f;
> -	char *buffer, *name;
> +	char *buffer = NULL, *name = NULL, *device = NULL;
> +
> +	err = OCFS2_ET_NO_MEMORY;
> +	device = (char *)malloc(sizeof(char) * (PATH_MAX + 1));
> +	if (!device)
> +		goto out_free;
>  
>  	buffer = (char *)malloc(sizeof(char) * (PATH_MAX + 1));
>  	if (!buffer)
> -		return OCFS2_ET_NO_MEMORY;
> +		goto out_free;
>  
>  	name = (char *)malloc(sizeof(char) * (PATH_MAX + 1));
>  	if (!name)
> -	{
> -		free(buffer);
> -		return OCFS2_ET_NO_MEMORY;
> -	}
> +		goto out_free;
>  
>  	f = fopen("/proc/partitions", "r");
>  	if (!f)
>  	{
> -		rc = -errno;
> +		err = -errno;
>  		goto out_free;
>  	}
>  
> @@ -299,7 +328,17 @@ static errcode_t scan_devices(errcode_t (*func)(const char *,
>  			if (!as_ide_disk(name))
>  				continue;
>  			
> -			err = func(name, hbo);
> +			snprintf(device, PATH_MAX + 1,
> +				 DEV_PREFIX "%s", name);
> +			/* Try to translate private device-mapper dm-<N> names
> +			 * to standard /dev/mapper/<name>.
> +			 */
> +			if (!strncmp(name, "dm-", 3) && isdigit(name[3]))
> +				scan_dir_for_dev(DEV_MAPPER_DIR,
> +						 makedev(major, minor),
> +						 device, PATH_MAX + 1);
> +
> +			err = func(device, hbo);
>  			if (!err || (err != OCFS2_ET_FILE_NOT_FOUND))
>  				break;
>  		}
> @@ -308,8 +347,12 @@ static errcode_t scan_devices(errcode_t (*func)(const char *,
>  	fclose(f);
>  
>  out_free:
> -	free(buffer);
> -	free(name);
> +	if (device)
> +		free(device);
> +	if (buffer)
> +		free(buffer);
> +	if (name)
> +		free(name);
>  
>  	return err;
>  }  /* scan_devices() */
>   




More information about the Ocfs2-tools-devel mailing list