mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-26 15:45:28 +00:00
util: Don't check if entries under /sys/fs/resctrl/(info/) are directories
We are skipping non-directories under /sys/fs/resctrl/(info/) since those are not interesting for us. However in tests it can sometimes happen that ent->d_type is 0 instead of 4 (DT_DIR) for directories. I've seen it fail on two machines. Different machines, different systems, I cannot reproduce it even using the same setup. So one of the ways how to work around this is call stat() on it. The other one is not checking if it is a directory since we'll find out eventually when we want to read some files underneath it. Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
parent
e28ccd2643
commit
f2e16994f7
@ -410,10 +410,6 @@ virResctrlGetInfo(virResctrlInfoPtr resctrl)
|
|||||||
|
|
||||||
while ((rv = virDirRead(dirp, &ent, SYSFS_RESCTRL_PATH "/info")) > 0) {
|
while ((rv = virDirRead(dirp, &ent, SYSFS_RESCTRL_PATH "/info")) > 0) {
|
||||||
VIR_DEBUG("Parsing info type '%s'", ent->d_name);
|
VIR_DEBUG("Parsing info type '%s'", ent->d_name);
|
||||||
|
|
||||||
if (ent->d_type != DT_DIR)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (ent->d_name[0] != 'L')
|
if (ent->d_name[0] != 'L')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -436,19 +432,29 @@ virResctrlGetInfo(virResctrlInfoPtr resctrl)
|
|||||||
rv = virFileReadValueUint(&i_type->control.max_allocation,
|
rv = virFileReadValueUint(&i_type->control.max_allocation,
|
||||||
SYSFS_RESCTRL_PATH "/info/%s/num_closids",
|
SYSFS_RESCTRL_PATH "/info/%s/num_closids",
|
||||||
ent->d_name);
|
ent->d_name);
|
||||||
if (rv == -2)
|
if (rv == -2) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
/* The file doesn't exist, so it's unusable for us,
|
||||||
_("Cannot get num_closids from resctrl cache info"));
|
* but we can scan further */
|
||||||
if (rv < 0)
|
VIR_WARN("The path '" SYSFS_RESCTRL_PATH "/info/%s/num_closids' "
|
||||||
|
"does not exist",
|
||||||
|
ent->d_name);
|
||||||
|
} else if (rv < 0) {
|
||||||
|
/* Other failures are fatal, so just quit */
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
rv = virFileReadValueString(&i_type->cbm_mask,
|
rv = virFileReadValueString(&i_type->cbm_mask,
|
||||||
SYSFS_RESCTRL_PATH
|
SYSFS_RESCTRL_PATH
|
||||||
"/info/%s/cbm_mask",
|
"/info/%s/cbm_mask",
|
||||||
ent->d_name);
|
ent->d_name);
|
||||||
if (rv == -2)
|
if (rv == -2) {
|
||||||
|
/* If the previous file exists, so should this one. Hence -2 is
|
||||||
|
* fatal in this case as well (errors out in next condition) - the
|
||||||
|
* kernel interface might've changed too much or something else is
|
||||||
|
* wrong. */
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("Cannot get cbm_mask from resctrl cache info"));
|
_("Cannot get cbm_mask from resctrl cache info"));
|
||||||
|
}
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -1169,9 +1175,6 @@ virResctrlAllocGetUnused(virResctrlInfoPtr resctrl)
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
while ((rv = virDirRead(dirp, &ent, SYSFS_RESCTRL_PATH)) > 0) {
|
while ((rv = virDirRead(dirp, &ent, SYSFS_RESCTRL_PATH)) > 0) {
|
||||||
if (ent->d_type != DT_DIR)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (STREQ(ent->d_name, "info"))
|
if (STREQ(ent->d_name, "info"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user