Bug 1278896 - VMware Workstation 12 not starting On Fedora 23
VMware Workstation 12 not starting On Fedora 23
Status: CLOSED CANTFIX
Product: Fedora
Classification: Fedora
Component: 0ad (Show other bugs)
23
x86_64 Linux
unspecified Severity high
: ---
: ---
Assigned To: Paulo Andrade
Fedora Extras Quality Assurance
http://forums.fedoraforum.org/showthr...
:
Depends On:
Blocks:
  Show dependency treegraph
 
Reported: 2015-11-06 11:55 EST by Yann Golanski
Modified: 2016-10-11 16:09 EDT (History)
12 users (show)

See Also:
Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of:
Environment:
Last Closed: 2015-11-08 05:13:11 EST
Type: Bug
Regression: ---
Mount Type: ---
Documentation: ---
CRM:
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---


Attachments (Terms of Use)

  None (edit)
Description Yann Golanski 2015-11-06 11:55:32 EST
Description of problem:

VMware Workstation 12 not starts On Fedora 23

Version-Release number of selected component (if applicable):

Lastest install of F23 as of today, VMware Workstation 12 installed today from VMware-Player-12.0.0-2985596.x86_64.bundle

How reproducible:


Steps to Reproduce:
1. Install the bundle.
2. Start vmplayer.
3. Nothing happens, no errors, no nuffing.

Actual results:

Nothing gets started, no errors.


Expected results:

VMPlayer starts.

Additional info:
Comment 1 Yann Golanski 2015-11-06 11:57:36 EST
Forgot to add this link to the forums:

http://forums.fedoraforum.org/showthread.php?p=1746930&posted=1#post1746930

It's not just me.
Comment 2 Franck 2015-11-07 04:13:27 EST
A thread exist on VMWARE forum:
https://communities.vmware.com/thread/523835
Comment 3 Vincent S. Cojot 2015-11-07 11:03:25 EST
Hi,
After VM 12 stopped working, I almost reverted back to FC22.

This is a chicken and egg issue with the bundled VMWare libs missing some symbols that used to be present in FC22 and the bundled libs (from VMWare) are missing some symbols as well.

I got it working by doing this:


Become root:

$ sudo su -


Force rebuild of VMWare modules:

# vmware-modconfig --console --install-all  


Replace the vmware glib version with the fedora version:

# cd /usr/lib/vmware/lib
# for mylib in $(ls /usr/lib64/*4600*); do /bin/cp -afv $mylib $(basename $mylib .4600.1 )/$(basename $mylib .4600.1 ); done

This basically does the following:
# pwd
/usr/lib/vmware/lib
# /bin/cp -afv /usr/lib64/libgio-2.0.so.0.4600.1 libgio-2.0.so.0/libgio-2.0.so.0
# /bin/cp -afv /usr/lib64/libglib-2.0.so.0.4600.1 libglib-2.0.so.0/libglib-2.0.so.0
# /bin/cp -afv /usr/lib64/libgmodule-2.0.so.0.4600.1 libgmodule-2.0.so.0/libgmodule-2.0.so.0
# /bin/cp -afv /usr/lib64/libgobject-2.0.so.0.4600.1 libgobject-2.0.so.0/libgobject-2.0.so.0
# /bin/cp -afv /usr/lib64/libgthread-2.0.so.0.4600.1 libgthread-2.0.so.0/libgthread-2.0.so.0


Start VMware or VMplayer:

$ VMWARE_USE_SHIPPED_LIBS=force vmware
or:
$ VMWARE_USE_SHIPPED_LIBS=force vmplayer



For ease of use/convenience, you might also want to do this:

# cd /usr/bin/
# mv -iv vmplayer vmplayer.bin
# mv -iv vmware vmware.bin

Then create two scripts replacing the previous scripts/tools:
$ cat /usr/bin/vmplayer
#!/bin/bash
export VMWARE_USE_SHIPPED_LIBS=force
/usr/bin/vmplayer.bin $*

$ cat /usr/bin/vmware
#!/bin/bash
export VMWARE_USE_SHIPPED_LIBS=force
/usr/bin/vmware.bin $*
Comment 4 Igor Gnatenko 2015-11-08 05:13:11 EST
Please stop flooding for PROPRIETARY in OPEN-SOURCE component in bugzilla.
Comment 5 Vincent S. Cojot 2015-11-09 09:56:33 EST
As much as I understand your concern here, I still feel this is something that could/should be addressed by Fedora to make the transition easier.

VM12 fails on FC23 due to missing symbols. Those symbols were present on FC22 and below.

This makes (as noted on the multiple reports out there) many users unhappy and Fedora gets the blame. That's why I documented a workaround: to help the Fedora users out.
Comment 6 Yann Golanski 2015-11-09 10:12:03 EST
(In reply to Vincent S. Cojot from comment #5)
> As much as I understand your concern here, I still feel this is something
> that could/should be addressed by Fedora to make the transition easier.
> 
> VM12 fails on FC23 due to missing symbols. Those symbols were present on
> FC22 and below.
> 
> This makes (as noted on the multiple reports out there) many users unhappy
> and Fedora gets the blame. That's why I documented a workaround: to help the
> Fedora users out.

This is indeed my take on the matter.  Clearly, there is something that was changed between F22 and F23 that stopped VMWare working.  Of course, the right fix is for VMWare to get it right and send a patch.

However, if there is a work around this allows people to actually do work.  Further more, the fedora forum suggested (rightly or wrongly) opening a bug here.
Comment 7 Jens Kuehnel 2015-12-19 16:04:08 EST
If someone finds this and is looking for a fix, see for a simple fix:
http://vcojot.blogspot.ca/2015/11/vmware-worksation-12-on-fedora-core-23.html
Comment 8 Alexsandr Prochakovsky 2016-05-25 04:49:49 EDT
after kernel 4.4 (VMWare Workstation 12) need some changes in c code:
/usr/lib/vmware/modules/source

1) vmmon.tar
   - untar
   - change ./vmmon-only/linux/hostif.c
   - replace  all:
     "get_user_pages"   to   "get_user_pages_remote" 
   - tar and replace original
2) vmnet.tar
   - untar
   - change ./vmnet-only/userif.c
   - replace  all:
     "get_user_pages"   to   "get_user_pages_remote" 
   - tar and replace original

Successful compiled on FC23 FC24, FC25 (kernel 4.7)
Comment 9 Vincent S. Cojot 2016-05-25 10:06:58 EDT
Hi Alexsandr,
Is this enough?
I just tried it on Workstation 12.1.1 on F23 (Kernel 4.4.9) and I get this after applying your patch:

tmp/modconfig-WjqQAa/vmnet-only/userif.c: In function ‘UserifLockPage’:
/tmp/modconfig-WjqQAa/vmnet-only/userif.c:116:13: error: implicit declaration of function ‘get_user_pages_remote’ [-Werror=implicit-function-declaration]
    retval = get_user_pages_remote(current, current->mm, addr,
             ^
Comment 10 Mihamina Rakotomandimby 2016-06-09 02:24:12 EDT
Editing "vmmon-only/linux/hostif.c" and "vmnet-only/userif.c" made it for me. Thank you.
Comment 11 felix.almeida 2016-09-10 21:40:41 EDT
With newer kernels (e.g. 4.7.2) it might fail with the following error inside VNetNetifStartXmit() in netif.c:

  ‘struct net_device’ has no member named ‘trans_start’.

Simply replace the line:

  dev->trans_start = jiffies;

By:

  netif_trans_update(dev);
Comment 12 Vincent S. Cojot 2016-09-11 13:23:05 EDT
Yes that's true.
For future reference (for people who stumble onto that bug), please see the tooling provided on this page:
http://vcojot.blogspot.ca/2015/11/vmware-worksation-12-on-fedora-core-23.html
The user-friendly patch provided on that page will do everything for the end user.
Regards,
Vincent
The complete patch I'm using is:
cat <<'EOF1' > modules.patch
diff -ur vmw_mods.orig/vmblock-only/linux/control.c vmw_mods/vmblock-only/linux/control.c
--- vmw_mods.orig/vmblock-only/linux/control.c	2016-04-14 19:31:30.000000000 -0400
+++ vmw_mods/vmblock-only/linux/control.c	2016-09-05 15:13:34.526217167 -0400
@@ -208,9 +208,11 @@
    VMBlockSetProcEntryOwner(controlProcMountpoint);
 
    /* Create /proc/fs/vmblock/dev */
-   controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME,
-                                        VMBLOCK_CONTROL_MODE,
-                                        controlProcDirEntry);
+   controlProcEntry = proc_create(VMBLOCK_CONTROL_DEVNAME, 
+				  VMBLOCK_CONTROL_MODE,
+                                  controlProcDirEntry, 
+				  &ControlFileOps);
+
    if (!controlProcEntry) {
       Warning("SetupProcDevice: could not create " VMBLOCK_DEVICE "\n");
       remove_proc_entry(VMBLOCK_CONTROL_MOUNTPOINT, controlProcDirEntry);
@@ -218,7 +220,10 @@
       return -EINVAL;
    }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
    controlProcEntry->proc_fops = &ControlFileOps;
+#endif
+
    return 0;
 }
 
@@ -282,18 +287,24 @@
    int i;
    int retval;
 
-   name = getname(buf);
+   name = __getname();
    if (IS_ERR(name)) {
       return PTR_ERR(name);
    }
 
+   i = strncpy_from_user(name, buf, PATH_MAX);
+   if (i < 0 || i == PATH_MAX) {
+      __putname(name);
+      return -EINVAL;
+   }
+
    for (i = strlen(name) - 1; i >= 0 && name[i] == '/'; i--) {
       name[i] = '\0';
    }
 
    retval = i < 0 ? -EINVAL : blockOp(name, blocker);
 
-   putname(name);
+   __putname(name);
 
    return retval;
 }
diff -ur vmw_mods.orig/vmblock-only/linux/dentry.c vmw_mods/vmblock-only/linux/dentry.c
--- vmw_mods.orig/vmblock-only/linux/dentry.c	2016-04-14 19:31:30.000000000 -0400
+++ vmw_mods/vmblock-only/linux/dentry.c	2016-09-05 15:13:34.528217197 -0400
@@ -63,7 +63,7 @@
                    struct nameidata *nd)   // IN: lookup flags & intent
 {
    VMBlockInodeInfo *iinfo;
-   struct nameidata actualNd;
+   struct path actualNd;
    struct dentry *actualDentry;
    int ret;
 
diff -ur vmw_mods.orig/vmblock-only/linux/file.c vmw_mods/vmblock-only/linux/file.c
--- vmw_mods.orig/vmblock-only/linux/file.c	2016-04-14 19:31:30.000000000 -0400
+++ vmw_mods/vmblock-only/linux/file.c	2016-09-05 15:13:34.528217197 -0400
@@ -132,7 +132,7 @@
     * and that would try to acquire the inode's semaphore; if the two inodes
     * are the same we'll deadlock.
     */
-   if (actualFile->f_dentry && inode == actualFile->f_dentry->d_inode) {
+   if (actualFile->f_path.dentry && inode == actualFile->f_path.dentry->d_inode) {
       Warning("FileOpOpen: identical inode encountered, open cannot succeed.\n");
       if (filp_close(actualFile, current->files) < 0) {
          Warning("FileOpOpen: unable to close opened file.\n");
@@ -166,11 +166,9 @@
 
 static int
 FileOpReaddir(struct file *file,  // IN
-              void *dirent,       // IN
-              filldir_t filldir)  // IN
+		struct dir_context *ctx)
 {
    int ret;
-   FilldirInfo info;
    struct file *actualFile;
 
    if (!file) {
@@ -184,11 +182,8 @@
       return -EINVAL;
    }
 
-   info.filldir = filldir;
-   info.dirent = dirent;
-
    actualFile->f_pos = file->f_pos;
-   ret = vfs_readdir(actualFile, Filldir, &info);
+   ret = iterate_dir(actualFile, ctx);
    file->f_pos = actualFile->f_pos;
 
    return ret;
@@ -237,7 +232,7 @@
 
 
 struct file_operations RootFileOps = {
-   .readdir = FileOpReaddir,
+   .iterate = FileOpReaddir,
    .open    = FileOpOpen,
    .release = FileOpRelease,
 };
diff -ur vmw_mods.orig/vmblock-only/linux/filesystem.c vmw_mods/vmblock-only/linux/filesystem.c
--- vmw_mods.orig/vmblock-only/linux/filesystem.c	2016-04-14 19:31:30.000000000 -0400
+++ vmw_mods/vmblock-only/linux/filesystem.c	2016-09-05 15:13:34.529217212 -0400
@@ -322,7 +322,7 @@
 {
    VMBlockInodeInfo *iinfo;
    struct inode *inode;
-   struct nameidata actualNd;
+   struct path actualNd;
 
    ASSERT(sb);
 
diff -ur vmw_mods.orig/vmblock-only/linux/inode.c vmw_mods/vmblock-only/linux/inode.c
--- vmw_mods.orig/vmblock-only/linux/inode.c	2016-04-14 19:31:30.000000000 -0400
+++ vmw_mods/vmblock-only/linux/inode.c	2016-09-05 15:13:34.530217227 -0400
@@ -35,10 +35,18 @@
 
 
 /* Inode operations */
-static struct dentry *InodeOpLookup(struct inode *dir,
-                                    struct dentry *dentry, struct nameidata *nd);
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
+static struct dentry *InodeOpLookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd);
 static int InodeOpReadlink(struct dentry *dentry, char __user *buffer, int buflen);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
+#else
+static struct dentry *InodeOpLookup(struct inode *, struct dentry *, unsigned int);
+static int InodeOpReadlink(struct dentry *, char __user *, int);
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
+static const char *InodeOpFollowlink(struct dentry *dentry, void **cookie);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
 static void *InodeOpFollowlink(struct dentry *dentry, struct nameidata *nd);
 #else
 static int InodeOpFollowlink(struct dentry *dentry, struct nameidata *nd);
@@ -49,12 +57,15 @@
    .lookup = InodeOpLookup,
 };
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
 static struct inode_operations LinkInodeOps = {
+#else
+struct inode_operations LinkInodeOps = {
+#endif
    .readlink    = InodeOpReadlink,
    .follow_link = InodeOpFollowlink,
 };
 
-
 /*
  *----------------------------------------------------------------------------
  *
@@ -75,7 +86,11 @@
 static struct dentry *
 InodeOpLookup(struct inode *dir,      // IN: parent directory's inode
               struct dentry *dentry,  // IN: dentry to lookup
-              struct nameidata *nd)   // IN: lookup intent and information
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
+	      struct nameidata *nd)   // IN: lookup intent and information
+#else
+              unsigned int flags)
+#endif
 {
    char *filename;
    struct inode *inode;
@@ -135,7 +150,12 @@
    inode->i_size = INODE_TO_IINFO(inode)->nameLen;
    inode->i_version = 1;
    inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
    inode->i_uid = inode->i_gid = 0;
+#else
+   inode->i_gid = make_kgid(current_user_ns(), 0);
+   inode->i_uid = make_kuid(current_user_ns(), 0);
+#endif
    inode->i_op = &LinkInodeOps;
 
    d_add(dentry, inode);
@@ -177,7 +197,12 @@
       return -EINVAL;
    }
 
-   return vfs_readlink(dentry, buffer, buflen, iinfo->name);
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 14, 99)
+	return vfs_readlink(dentry, buffer, buflen, iinfo->name);
+#else
+       return readlink_copy(buffer, buflen, iinfo->name);
+#endif
+
 }
 
 
@@ -198,13 +223,20 @@
  *----------------------------------------------------------------------------
  */
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
+static const char *
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
 static void *
 #else
 static int
 #endif
 InodeOpFollowlink(struct dentry *dentry,  // IN : dentry of symlink
-                  struct nameidata *nd)   // OUT: stores result
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
+		  void **cookie
+#else
+		  struct nameidata *nd
+#endif
+		  )   // OUT: stores result
 {
    int ret;
    VMBlockInodeInfo *iinfo;
@@ -221,7 +253,11 @@
       goto out;
    }
 
-   ret = vfs_follow_link(nd, iinfo->name);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
+   return *cookie = (char *)(iinfo->name);
+#else
+   nd_set_link(nd, iinfo->name);
+#endif
 
 out:
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
@@ -230,3 +266,4 @@
    return ret;
 #endif
 }
+
diff -ur vmw_mods.orig/vmblock-only/shared/compat_namei.h vmw_mods/vmblock-only/shared/compat_namei.h
--- vmw_mods.orig/vmblock-only/shared/compat_namei.h	2016-04-14 19:31:30.000000000 -0400
+++ vmw_mods/vmblock-only/shared/compat_namei.h	2016-09-05 15:13:34.530217227 -0400
@@ -26,21 +26,21 @@
  * struct. They were both replaced with a struct path.
  */
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)
-#define compat_vmw_nd_to_dentry(nd) (nd).path.dentry
+#define compat_vmw_nd_to_dentry(nd) (nd).dentry
 #else
 #define compat_vmw_nd_to_dentry(nd) (nd).dentry
 #endif
 
 /* In 2.6.25-rc2, path_release(&nd) was replaced with path_put(&nd.path). */
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)
-#define compat_path_release(nd) path_put(&(nd)->path)
+#define compat_path_release(nd) path_put(nd)
 #else
 #define compat_path_release(nd) path_release(nd)
 #endif
 
 /* path_lookup was removed in 2.6.39 merge window VFS merge */
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)
-#define compat_path_lookup(name, flags, nd)     kern_path(name, flags, &((nd)->path))
+#define compat_path_lookup(name, flags, nd)     kern_path(name, flags, nd)
 #else
 #define compat_path_lookup(name, flags, nd)     path_lookup(name, flags, nd)
 #endif
diff -ur vmw_mods.orig/vmmon-only/linux/hostif.c vmw_mods/vmmon-only/linux/hostif.c
--- vmw_mods.orig/vmmon-only/linux/hostif.c	2016-04-14 19:48:44.000000000 -0400
+++ vmw_mods/vmmon-only/linux/hostif.c	2016-09-05 15:33:03.514131550 -0400
@@ -1162,8 +1162,13 @@
    int retval;
 
    down_read(&current->mm->mmap_sem);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
+   retval = get_user_pages_remote(current, current->mm, (unsigned long)uvAddr,
+   numPages, 0, 0, ppages, NULL);
+#else
    retval = get_user_pages(current, current->mm, (unsigned long)uvAddr,
-                           numPages, 0, 0, ppages, NULL);
+   numPages, 0, 0, ppages, NULL);
+#endif
    up_read(&current->mm->mmap_sem);
 
    return retval != numPages;
diff -ur vmw_mods.orig/vmnet-only/netif.c vmw_mods/vmnet-only/netif.c
--- vmw_mods.orig/vmnet-only/netif.c	2016-04-14 19:48:47.000000000 -0400
+++ vmw_mods/vmnet-only/netif.c	2016-09-05 15:25:32.794994960 -0400
@@ -39,8 +39,8 @@
 #include <linux/proc_fs.h>
 #include <linux/file.h>
 
-#include "vnetInt.h"
 #include "compat_netdevice.h"
+#include "vnetInt.h"
 #include "vmnetInt.h"
 
 
@@ -465,7 +465,11 @@
    VNetSend(&netIf->port.jack, skb);
 
    netIf->stats.tx_packets++;
+   #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
+   netif_trans_update(dev);
+   #else
    dev->trans_start = jiffies;
+   #endif
 
    return 0;
 }
diff -ur vmw_mods.orig/vmnet-only/userif.c vmw_mods/vmnet-only/userif.c
--- vmw_mods.orig/vmnet-only/userif.c	2016-04-14 19:48:47.000000000 -0400
+++ vmw_mods/vmnet-only/userif.c	2016-09-05 15:33:55.618911804 -0400
@@ -113,8 +113,12 @@
    int retval;
 
    down_read(&current->mm->mmap_sem);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
+   retval = get_user_pages_remote(current, current->mm, addr, 1, 1, 0, &page, NULL);
+#else
    retval = get_user_pages(current, current->mm, addr,
-			   1, 1, 0, &page, NULL);
+   1, 1, 0, &page, NULL);
+#endif
    up_read(&current->mm->mmap_sem);
 
    if (retval != 1) {
diff -ur vmw_mods.orig/vmnet-only/vm_device_version.h vmw_mods/vmnet-only/vm_device_version.h
--- vmw_mods.orig/vmnet-only/vm_device_version.h	2016-04-14 19:48:47.000000000 -0400
+++ vmw_mods/vmnet-only/vm_device_version.h	2016-09-05 15:13:34.532217257 -0400
@@ -53,7 +53,9 @@
  *    VMware HD Audio codec
  *    VMware HD Audio controller
  */
+#ifndef PCI_VENDOR_ID_VMWARE
 #define PCI_VENDOR_ID_VMWARE                    0x15AD
+#endif
 #define PCI_DEVICE_ID_VMWARE_SVGA2              0x0405
 #define PCI_DEVICE_ID_VMWARE_SVGA               0x0710
 #define PCI_DEVICE_ID_VMWARE_VGA                0x0711
EOF1

cat <<'EOF2' > util.patch
--- scripts/util.sh.orig	2015-12-09 16:07:06.000000000 -0500
+++ scripts/util.sh	2016-03-02 14:35:04.000000000 -0500
@@ -362,7 +362,7 @@
     echo no
   else
     if [ "$vmdb_VMBLOCK_CONFED" = 'yes' ]; then
-      echo yes
+      echo no
     else
       echo no
     fi
EOF2
Comment 13 Mirko Predosin 2016-10-11 16:09:38 EDT
I realize that the bug has been closed.  But, I wanted to provide a simple fix in case anyone stumbles here while searching for a solution for this issue.

I just upgraded to FC23 (from FC22) and had the same issue.   The simplest fix is to uninstall vmware and install the latest version from VMWare.

Uninstall vmware:
https://pubs.vmware.com/workstation-9/topic/com.vmware.ws.get_started.doc/GUID-05E4C876-F32C-49D2-82B4-8C759691E7F5.html

Get latest version (Workstation Player 12.5):
https://www.vmware.com/products/player/playerpro-evaluation.html

Note You need to log in before you can comment on or make changes to this bug.