[Ocfs2-tools-devel] [PATCH] ocfs2_hb_ctl: Make it knows device mapper.
Tao Ma
tao.ma at oracle.com
Wed Apr 14 19:28:34 PDT 2010
Sunil Mushran wrote:
> sob.
>
> Please add this only to the tools 1.4 branch.
done.
>
> 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.
btw, please also update mounted.ocfs2 since it uses the same schema as
this patch does.
Regards,
Tao
>
> 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