[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