1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

Improve error logging

Log errors instead of plain return 0.
Check for f->private strdup result.
This commit is contained in:
Zdenek Kabelac 2012-03-01 10:30:48 +00:00
parent f874903a35
commit 3bd9048854
2 changed files with 48 additions and 24 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.94 - Version 2.02.94 -
==================================== ====================================
Improve error logging from mpath filter.
Check for allocation failure in hold_lock() in clvmd. Check for allocation failure in hold_lock() in clvmd.
Use set_lv() (wipe initial 4KiB) for non zeroed thin volume. Use set_lv() (wipe initial 4KiB) for non zeroed thin volume.
Allow cluster mirrors to handle the absence of the checkpoint lib (libSaCkpt). Allow cluster mirrors to handle the absence of the checkpoint lib (libSaCkpt).

View File

@ -26,13 +26,16 @@ static const char *get_sysfs_name(struct device *dev)
{ {
const char *name; const char *name;
name = strrchr(dev_name(dev), '/'); if (!(name = strrchr(dev_name(dev), '/'))) {
if (!name) log_error("Cannot find '/' in device name.");
return NULL; return NULL;
}
name++; name++;
if (!*name) if (!*name) {
log_error("Device name is not valid.");
return NULL; return NULL;
}
return name; return name;
} }
@ -42,16 +45,18 @@ static int get_sysfs_string(const char *path, char *buffer, int max_size)
FILE *fp; FILE *fp;
int r = 0; int r = 0;
if (!(fp = fopen(path, "r"))) if (!(fp = fopen(path, "r"))) {
return_0; log_sys_error("fopen", path);
return 0;
}
if (!fgets(buffer, max_size, fp)) if (!fgets(buffer, max_size, fp))
stack; log_sys_error("fgets", path);
else else
r = 1; r = 1;
if (fclose(fp)) if (fclose(fp))
stack; log_sys_error("fclose", path);
return r; return r;
} }
@ -60,14 +65,18 @@ static int get_sysfs_get_major_minor(const char *sysfs_dir, const char *kname, i
{ {
char path[PATH_MAX], buffer[64]; char path[PATH_MAX], buffer[64];
if (dm_snprintf(path, sizeof(path), "%s/block/%s/dev", sysfs_dir, kname) < 0) if (dm_snprintf(path, sizeof(path), "%s/block/%s/dev", sysfs_dir, kname) < 0) {
return_0; log_error("Sysfs path string is too long.");
return 0;
}
if (!get_sysfs_string(path, buffer, sizeof(buffer))) if (!get_sysfs_string(path, buffer, sizeof(buffer)))
return 0; return_0;
if (sscanf(buffer, "%d:%d", major, minor) != 2) if (sscanf(buffer, "%d:%d", major, minor) != 2) {
log_error("Failed to parse major minor from %s", buffer);
return 0; return 0;
}
return 1; return 1;
} }
@ -78,8 +87,10 @@ static int get_parent_mpath(const char *dir, char *name, int max_size)
DIR *dr; DIR *dr;
int r = 0; int r = 0;
if (!(dr = opendir(dir))) if (!(dr = opendir(dir))) {
return_0; log_sys_error("opendir", dir);
return 0;
}
*name = '\0'; *name = '\0';
while ((d = readdir(dr))) { while ((d = readdir(dr))) {
@ -97,7 +108,7 @@ static int get_parent_mpath(const char *dir, char *name, int max_size)
} }
if (closedir(dr)) if (closedir(dr))
stack; log_sys_error("closedir", dir);
return r; return r;
} }
@ -109,32 +120,39 @@ static int dev_is_mpath(struct dev_filter *f, struct device *dev)
char parent_name[PATH_MAX+1]; char parent_name[PATH_MAX+1];
struct stat info; struct stat info;
const char *sysfs_dir = f->private; const char *sysfs_dir = f->private;
int major, minor, r; int major, minor;
/* Limit this filter only to SCSI devices */ /* Limit this filter only to SCSI devices */
if (!major_is_scsi_device(MAJOR(dev->dev))) if (!major_is_scsi_device(MAJOR(dev->dev)))
return 0; return 0;
name = get_sysfs_name(dev); if (!(name = get_sysfs_name(dev)))
if (!name)
return_0; return_0;
r = dm_snprintf(path, PATH_MAX, "%s/block/%s/holders", sysfs_dir, name); if (dm_snprintf(path, PATH_MAX, "%s/block/%s/holders", sysfs_dir, name) < 0) {
if (r < 0) log_error("Sysfs path to check mpath is too long.");
return_0; return 0;
}
/* also will filter out partitions */ /* also will filter out partitions */
if (stat(path, &info) == -1 || !S_ISDIR(info.st_mode)) if (stat(path, &info))
return 0; return 0;
if (!S_ISDIR(info.st_mode)) {
log_error("Path %s is not a directory.", path);
return 0;
}
if (!get_parent_mpath(path, parent_name, PATH_MAX)) if (!get_parent_mpath(path, parent_name, PATH_MAX))
return 0; return 0;
if (!get_sysfs_get_major_minor(sysfs_dir, parent_name, &major, &minor)) if (!get_sysfs_get_major_minor(sysfs_dir, parent_name, &major, &minor))
return 0; return_0;
if (major != dm_major()) if (major != dm_major()) {
log_error("mpath major %d is not dm major %d.", major, dm_major());
return 0; return 0;
}
return lvm_dm_prefix_check(major, minor, MPATH_PREFIX); return lvm_dm_prefix_check(major, minor, MPATH_PREFIX);
} }
@ -175,7 +193,12 @@ struct dev_filter *mpath_filter_create(const char *sysfs_dir)
f->passes_filter = _ignore_mpath; f->passes_filter = _ignore_mpath;
f->destroy = _destroy; f->destroy = _destroy;
f->use_count = 0; f->use_count = 0;
f->private = dm_strdup(sysfs_dir);
if (!(f->private = dm_strdup(sysfs_dir))) {
log_error("Cannot duplicate sysfs dir.");
dm_free(f);
return NULL;
}
return f; return f;
} }