[libvirt] [PATCH 0/2] Fix vmware driver for VMware Fusion 10

These changes were required to get VMware Fusion working at all. I tested with VMware Fusion 10.1.1 on macOS 10.12 Sierra. I am not sure whether calling virCapabilitiesInitCaches() makes sense at all on macOS. This function looks highly specific to Linux as it relies on /sys/devices/system, so it should probably be wrapped with an appropriate #ifdef. I do not feel proficient enough with the libvirt internals to make this change, though. Rainer Müller (2): vmware: Fix initialization of VMware Fusion vmware: Failures in cache info init are non-fatal src/vmware/vmware_conf.c | 7 ++++++- src/vmware/vmware_driver.c | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) -- 2.16.3

The vmware driver wants to execute vmware-vmx from the same directory in which vmrun was found. However, on VMware Fusion 10 vmrun at /Applications/VMware Fusion.app/Contents/Public/vmrun is a symlink pointing to ../Library/vmrun. vmware-vmx cannot be found, as it is not in PATH, but only in this Library directory. Therefore, follow the vmrun symlink and use the resulting path. Then the assumption that vmware-vmx is right next to it will still work. Signed-off-by: Rainer Müller <raimue@codingfarm.de> --- src/vmware/vmware_driver.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index 8b487c4a7..60e1c1abc 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -127,6 +127,7 @@ vmwareConnectOpen(virConnectPtr conn, struct vmware_driver *driver; size_t i; char *tmp; + char *vmrun = NULL; virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR); @@ -164,7 +165,12 @@ vmwareConnectOpen(virConnectPtr conn, * for auto detection of the backend */ for (i = 0; i < ARRAY_CARDINALITY(vmrun_candidates); i++) { - driver->vmrun = virFindFileInPath(vmrun_candidates[i]); + vmrun = virFindFileInPath(vmrun_candidates[i]); + if (virFileResolveLink(vmrun, &driver->vmrun) < 0) { + virReportSystemError(errno, _("unable to resolve symlink '%s'"), vmrun); + goto cleanup; + } + VIR_FREE(vmrun); /* If we found one, we can stop looking */ if (driver->vmrun) break; @@ -215,6 +221,7 @@ vmwareConnectOpen(virConnectPtr conn, cleanup: vmwareFreeDriver(driver); + VIR_FREE(vmrun); return VIR_DRV_OPEN_ERROR; }; -- 2.16.3

On 04/03/2018 05:32 AM, Rainer Müller wrote:
The vmware driver wants to execute vmware-vmx from the same directory in which vmrun was found. However, on VMware Fusion 10 vmrun at /Applications/VMware Fusion.app/Contents/Public/vmrun is a symlink pointing to ../Library/vmrun. vmware-vmx cannot be found, as it is not in PATH, but only in this Library directory.
Therefore, follow the vmrun symlink and use the resulting path. Then the assumption that vmware-vmx is right next to it will still work.
Signed-off-by: Rainer Müller <raimue@codingfarm.de> --- src/vmware/vmware_driver.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index 8b487c4a7..60e1c1abc 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -127,6 +127,7 @@ vmwareConnectOpen(virConnectPtr conn, struct vmware_driver *driver; size_t i; char *tmp; + char *vmrun = NULL;
virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
@@ -164,7 +165,12 @@ vmwareConnectOpen(virConnectPtr conn, * for auto detection of the backend */ for (i = 0; i < ARRAY_CARDINALITY(vmrun_candidates); i++) { - driver->vmrun = virFindFileInPath(vmrun_candidates[i]); + vmrun = virFindFileInPath(vmrun_candidates[i]);
What if this returns NULL?
+ if (virFileResolveLink(vmrun, &driver->vmrun) < 0) {
I doubt this will be very happy...
+ virReportSystemError(errno, _("unable to resolve symlink '%s'"), vmrun); + goto cleanup; + } + VIR_FREE(vmrun);
Prior to this change - if @vmrun wasn't found in the path of vmrun_candidates, we'd try the "next one" in the list. With this change if @vmrun returned from virFindFileInPath is NULL, then virFileResolveLink would fail, and we wouldn't try the next one in the list. There is also virFileIsLink which you may want to consider - as in, what we got back is a link, so let's resolve to save it; otherwise, use what was found in path. John
/* If we found one, we can stop looking */ if (driver->vmrun) break; @@ -215,6 +221,7 @@ vmwareConnectOpen(virConnectPtr conn,
cleanup: vmwareFreeDriver(driver); + VIR_FREE(vmrun); return VIR_DRV_OPEN_ERROR; };

On 2018-04-11 14:02, John Ferlan wrote:
On 04/03/2018 05:32 AM, Rainer Müller wrote:
The vmware driver wants to execute vmware-vmx from the same directory in which vmrun was found. However, on VMware Fusion 10 vmrun at /Applications/VMware Fusion.app/Contents/Public/vmrun is a symlink pointing to ../Library/vmrun. vmware-vmx cannot be found, as it is not in PATH, but only in this Library directory.
Therefore, follow the vmrun symlink and use the resulting path. Then the assumption that vmware-vmx is right next to it will still work.
Signed-off-by: Rainer Müller <raimue@codingfarm.de> --- src/vmware/vmware_driver.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index 8b487c4a7..60e1c1abc 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -127,6 +127,7 @@ vmwareConnectOpen(virConnectPtr conn, struct vmware_driver *driver; size_t i; char *tmp; + char *vmrun = NULL;
virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
@@ -164,7 +165,12 @@ vmwareConnectOpen(virConnectPtr conn, * for auto detection of the backend */ for (i = 0; i < ARRAY_CARDINALITY(vmrun_candidates); i++) { - driver->vmrun = virFindFileInPath(vmrun_candidates[i]); + vmrun = virFindFileInPath(vmrun_candidates[i]);
What if this returns NULL?
+ if (virFileResolveLink(vmrun, &driver->vmrun) < 0) {
I doubt this will be very happy...
+ virReportSystemError(errno, _("unable to resolve symlink '%s'"), vmrun); + goto cleanup; + } + VIR_FREE(vmrun);
Prior to this change - if @vmrun wasn't found in the path of vmrun_candidates, we'd try the "next one" in the list.> With this change if @vmrun returned from virFindFileInPath is NULL, then virFileResolveLink would fail, and we wouldn't try the next one in the list.
Thank you for the review. Indeed, this was sloppy testing on my end. I will prepare a v2.
There is also virFileIsLink which you may want to consider - as in, what we got back is a link, so let's resolve to save it; otherwise, use what was found in path.
virFileResolveLink already calls lstat(2) to check whether the given path is actually link. If it is not, the output is a copy of the input. So this will already work in the way you describe. Rainer
John
/* If we found one, we can stop looking */ if (driver->vmrun) break; @@ -215,6 +221,7 @@ vmwareConnectOpen(virConnectPtr conn,
cleanup: vmwareFreeDriver(driver); + VIR_FREE(vmrun); return VIR_DRV_OPEN_ERROR; };
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

This is also not fatal on other drivers. Signed-off-by: Rainer Müller <raimue@codingfarm.de> --- src/vmware/vmware_conf.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index 891d9a47f..b9f18e6ac 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -33,6 +33,11 @@ #include "vmx.h" #include "vmware_conf.h" #include "virstring.h" +#include "virlog.h" + +#define VIR_FROM_THIS VIR_FROM_VMWARE + +VIR_LOG_INIT("vmware.vmware_conf"); VIR_ENUM_IMPL(vmwareDriver, VMWARE_DRIVER_LAST, "player", @@ -69,7 +74,7 @@ vmwareCapsInit(void) goto error; if (virCapabilitiesInitCaches(caps) < 0) - goto error; + VIR_WARN("Failed to get host CPU cache info"); /* i686 guests are always supported */ if ((guest = virCapabilitiesAddGuest(caps, -- 2.16.3

On 04/03/2018 05:32 AM, Rainer Müller wrote:
This is also not fatal on other drivers.
Signed-off-by: Rainer Müller <raimue@codingfarm.de> --- src/vmware/vmware_conf.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
Reviewed-by: John Ferlan <jferlan@redhat.com> John
participants (2)
-
John Ferlan
-
Rainer Müller