1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-03 05:18:29 +03:00

pvscan: enhance _count_pvid_files_from_lookup_file

Ensure all vars are always properly defined in all paths.
This commit is contained in:
Zdenek Kabelac 2021-01-22 22:27:05 +01:00
parent 3acf6040b5
commit a9fd207192
2 changed files with 26 additions and 32 deletions

View File

@ -3015,7 +3015,7 @@ int pvck(struct cmd_context *cmd, int argc, char **argv)
struct device *dev = NULL; struct device *dev = NULL;
struct devicefile *def = NULL; struct devicefile *def = NULL;
const char *dump, *repair; const char *dump, *repair;
const char *pv_name; const char *pv_name = "";
uint64_t labelsector = 1; uint64_t labelsector = 1;
int bad = 0; int bad = 0;
int ret = 0; int ret = 0;

View File

@ -517,14 +517,13 @@ static int _lookup_file_contains_pvid(FILE *fp, char *pvid)
static void _lookup_file_count_pvid_files(FILE *fp, const char *vgname, int *pvs_online, int *pvs_offline) static void _lookup_file_count_pvid_files(FILE *fp, const char *vgname, int *pvs_online, int *pvs_offline)
{ {
char line[64]; char line[64];
char pvid[ID_LEN+1]; char pvid[ID_LEN+1] = { 0 };
log_debug("checking all pvid files using lookup file for %s", vgname); log_debug("checking all pvid files using lookup file for %s", vgname);
rewind(fp); rewind(fp);
while (fgets(line, sizeof(line), fp)) { while (fgets(line, sizeof(line), fp)) {
memset(pvid, 0, sizeof(pvid));
memcpy(pvid, line, ID_LEN); memcpy(pvid, line, ID_LEN);
if (strlen(pvid) != ID_LEN) { if (strlen(pvid) != ID_LEN) {
@ -583,65 +582,60 @@ static int _count_pvid_files_from_lookup_file(struct cmd_context *cmd, struct de
int *pvs_online, int *pvs_offline, int *pvs_online, int *pvs_offline,
const char **vgname_out) const char **vgname_out)
{ {
char path[PATH_MAX]; char path[PATH_MAX] = { 0 };
FILE *fp; FILE *fp;
DIR *dir; DIR *dir;
struct dirent *de; struct dirent *de;
const char *vgname = NULL; const char *vgname = NULL;
int online = 0, offline = 0;
*vgname_out = NULL;
*pvs_online = 0; *pvs_online = 0;
*pvs_offline = 0; *pvs_offline = 0;
if (!(dir = opendir(_pvs_lookup_dir))) if (!(dir = opendir(_pvs_lookup_dir))) {
goto_bad; log_sys_debug("opendir", _pvs_lookup_dir);
return 0;
}
/* /*
* Read each file in pvs_lookup to find dev->pvid, and if it's * Read each file in pvs_lookup to find dev->pvid, and if it's
* found save the vgname of the file it's found in. * found save the vgname of the file it's found in.
*/ */
while ((de = readdir(dir))) { while (!vgname && (de = readdir(dir))) {
if (de->d_name[0] == '.') if (de->d_name[0] == '.')
continue; continue;
memset(path, 0, sizeof(path)); if (dm_snprintf(path, sizeof(path), "%s/%s", _pvs_lookup_dir, de->d_name) < 0) {
snprintf(path, sizeof(path), "%s/%s", _pvs_lookup_dir, de->d_name); log_warn("WARNING: Path %s/%s is too long.", _pvs_lookup_dir, de->d_name);
continue;
}
if (!(fp = fopen(path, "r"))) { if (!(fp = fopen(path, "r"))) {
log_warn("Failed to open %s", path); log_warn("WARNING: Failed to open %s.", path);
continue; continue;
} }
if (_lookup_file_contains_pvid(fp, dev->pvid)) { if (_lookup_file_contains_pvid(fp, dev->pvid)) {
vgname = dm_pool_strdup(cmd->mem, de->d_name); if ((vgname = dm_pool_strdup(cmd->mem, de->d_name)))
break;
}
if (fclose(fp))
stack;
}
if (closedir(dir))
log_sys_debug("closedir", _pvs_lookup_dir);
if (!vgname)
goto_bad;
/* /*
* stat pvid online file of each pvid listed in this file * stat pvid online file of each pvid listed in this file
* the list of pvids from the file is the alternative to * the list of pvids from the file is the alternative to
* using vg->pvs * using vg->pvs
*/ */
_lookup_file_count_pvid_files(fp, vgname, &online, &offline); _lookup_file_count_pvid_files(fp, vgname, pvs_online, pvs_offline);
else
log_warn("WARNING: Failed to strdup vgname.");
}
if (fclose(fp)) if (fclose(fp))
stack; log_sys_debug("fclose", path);
}
if (closedir(dir))
log_sys_debug("closedir", _pvs_lookup_dir);
*pvs_online = online;
*pvs_offline = offline;
*vgname_out = vgname; *vgname_out = vgname;
return 1;
bad: return (vgname) ? 1 : 0;
return 0;
} }
static void _online_dir_setup(void) static void _online_dir_setup(void)