Bug 1278896
Summary: | VMware Workstation 12 not starting On Fedora 23 | ||
---|---|---|---|
Product: | [Fedora] Fedora | Reporter: | Yann Golanski <yann> |
Component: | 0ad | Assignee: | Paulo Andrade <paulo.cesar.pereira.de.andrade> |
Status: | CLOSED CANTFIX | QA Contact: | Fedora Extras Quality Assurance <extras-qa> |
Severity: | high | Docs Contact: | |
Priority: | unspecified | ||
Version: | 23 | CC: | bioinfornatics, bugzilla-redhat, cheese, felix.almeida, franck.lartigue, ignatenko, mihamina-rakotomandimby, mpredosin, paulo.cesar.pereira.de.andrade, prochakovsky, redhat-bugs, vcojot |
Target Milestone: | --- | ||
Target Release: | --- | ||
Hardware: | x86_64 | ||
OS: | Linux | ||
URL: | http://forums.fedoraforum.org/showthread.php?p=1746930&posted=1#post1746930 | ||
Whiteboard: | |||
Fixed In Version: | Doc Type: | Bug Fix | |
Doc Text: | Story Points: | --- | |
Clone Of: | Environment: | ||
Last Closed: | 2015-11-08 10:13:11 UTC | Type: | Bug |
Regression: | --- | Mount Type: | --- |
Documentation: | --- | CRM: | |
Verified Versions: | Category: | --- | |
oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
Cloudforms Team: | --- | Target Upstream Version: | |
Embargoed: |
Description
Yann Golanski
2015-11-06 16:55:32 UTC
Forgot to add this link to the forums: http://forums.fedoraforum.org/showthread.php?p=1746930&posted=1#post1746930 It's not just me. A thread exist on VMWARE forum: https://communities.vmware.com/thread/523835 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 $* Please stop flooding for PROPRIETARY in OPEN-SOURCE component in bugzilla. 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. (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. 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 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) 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, ^ Editing "vmmon-only/linux/hostif.c" and "vmnet-only/userif.c" made it for me. Thank you. 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); 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(¤t->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(¤t->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(¤t->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(¤t->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 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 |