mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-10 23:07:44 +00:00
network: Fix upgrade from libvirt older than 1.2.4
Starting from libvirt-1.2.4, network state XML files moved to another
directory (see commit b9e95491
) and libvirt automatically migrates the
network state files to a new location. However, the code used
dirent.d_type which is not supported by all filesystems. Thus, when
libvirt was upgraded on a host which used such filesystem, network state
XMLs were not properly moved and running networks disappeared from
libvirt.
This patch falls back to lstat() whenever dirent.d_type is DT_UNKNOWN to
fix this issue.
https://bugzilla.redhat.com/show_bug.cgi?id=1167145
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
f37627ee72
commit
dabb23e6d9
@ -499,15 +499,34 @@ networkMigrateStateFiles(void)
|
||||
}
|
||||
|
||||
while ((direrr = virDirRead(dir, &entry, oldStateDir)) > 0) {
|
||||
if (entry->d_type != DT_UNKNOWN &&
|
||||
entry->d_type != DT_REG)
|
||||
continue;
|
||||
|
||||
if (entry->d_type != DT_REG ||
|
||||
STREQ(entry->d_name, ".") ||
|
||||
if (STREQ(entry->d_name, ".") ||
|
||||
STREQ(entry->d_name, ".."))
|
||||
continue;
|
||||
|
||||
if (virAsprintf(&oldPath, "%s/%s",
|
||||
oldStateDir, entry->d_name) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (entry->d_type == DT_UNKNOWN) {
|
||||
struct stat st;
|
||||
|
||||
if (lstat(oldPath, &st) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("failed to stat network status file '%s'"),
|
||||
oldPath);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!S_ISREG(st.st_mode)) {
|
||||
VIR_FREE(oldPath);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (virFileReadAll(oldPath, 1024*1024, &contents) < 0)
|
||||
goto cleanup;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user