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:
parent
f874903a35
commit
3bd9048854
@ -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).
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user